Mein Open-Source-Projekt – Verwenden Sie OnnxRuntime, um RTMPose auf der CPU-Seite für eine 2D-Posenschätzung in Echtzeit bereitzustellen

1 RTMPose

Adresse des RTMPose-Papiers: https://arxiv.org/abs/2303.07399 .

RTMPose ist ein 2D-Posenschätzungs-Framework im Top-Down-Paradigma. Momomomo hat Simcc modifiziert, um es leichter und effektiver sowie spezifischer für industrielle Anwendungen zu machen.

Das Highlight von RTMPose ist seine industrietaugliche Argumentationsgeschwindigkeit und -genauigkeit, die auch in der Zusammenfassung seiner Arbeit hervorgehoben wird. Sie können die Zusammenfassung seiner Arbeit sorgfältig lesen.

Aktuelle Studien zur 2D-Posenschätzung haben bei öffentlichen Benchmarks hervorragende Ergebnisse erzielt, ihre Anwendung in der Industrie leidet jedoch immer noch unter schweren Modellparametern und hoher Latenz. Um diese Lücke zu schließen, untersuchen wir empirisch Schlüsselfaktoren bei der Posenschätzung, einschließlich Paradigma, Modellarchitektur, Trainingsstrategie und Einsatz, und präsentieren ein leistungsstarkes Echtzeit-Framework zur Posenschätzung für mehrere Personen, RTMPose, basierend auf MMPose. Unser RTMPose-m erreicht 75,8 % AP auf COCO mit 90+ FPS auf einer Intel i7-11700-CPU und 430+ FPS auf einer NVIDIA GTX 1660 Ti GPU, und RTMPose-l erreicht 67,0 % AP auf COCO-WholeBody mit 130+ FPS. Um die Leistungsfähigkeit von RTMPose in kritischen Echtzeitanwendungen weiter zu bewerten, berichten wir auch über die Leistung nach der Bereitstellung auf dem Mobilgerät. Unser RTMPose-s erreicht 72. 2 % AP auf COCO mit 70+ FPS auf einem Snapdragon 865-Chip, was bestehende Open-Source-Bibliotheken übertrifft. Code und Modelle werden unter veröffentlichtdiese https-URL .

Aus der Einführung der Papierzusammenfassung geht hervor, dass das RTMPose-m-Modell zwar 75,8 % AP auf COCO erreicht, mit ONNXRuntime auf der Intel i7-11700-CPU jedoch über 90 FPS und mit TensorRT auf der NVIDIA GTX 1660 Ti-GPU über **430 FPS erreichen kann . . **RTMPose-s erreicht 70+FPS mit ncnn-Bereitstellung auf dem Mobiltelefon-Snapdragon865-Chip mit einer Leistung von 72,2 % AP .

So stark, dass ich es unbedingt haben möchte! ! ! !

RTMPose wurde in MMPose integriert, Github-Adresse: https://github.com/open-mmlab/mmpose/tree/dev-1.x/projects/rtmpose

Damals habe ich mir das README.md-Dokument von RTMPose genauer angesehen. Das Tutorial zur Modellbereitstellung basiert stark auf MMDeploy, und ich persönlich denke, dass die tiefgreifende Integration von MMDeploy entmutigend sein wird (das ist natürlich nur eine persönliche Meinung, Don). Ich kritisiere mich nicht) und ich habe mehr Wir haben Erfahrung mit lokalen Bereitstellungs- und Serverbereitstellungsmodellen, daher verlassen wir uns in diesem Artikel nicht auf MMDeploy, sondern verwenden das OnnxRuntime CPU C++ SDK, um das von RTMDetnano+RTMPose-m exportierte ONNX-Modell bereitzustellen zur lokalen CPU. Eine Echtzeit-2D-Lageschätzung kann immer noch ohne GPU durchgeführt werden. Der altmodische i5-7400 4H, den ich getestet habe, kann auch eine Echtzeitschätzung durchführen. Beeilen Sie sich!

Ich möchte mich auch bei Jinglao, dem Autor von RTMPose ( Homepage von Jinglao Zhihu ), für sein Lightspeed Merge of Pr für dieses Beispiel von mir bedanken.

2 Verwenden Sie OnnxRuntime, um RTMDetnano+RTMPose auf der CPU-Seite bereitzustellen

Nun, in diesem Abschnitt stellen wir detailliert vor, wie man OnnxRuntime verwendet, um das RTMDetnano+RTMPose-Modell auf der CPU-Seite bereitzustellen. In diesem Tutorial werden wir ein Top-Down-2D-Posenschätzungsbeispiel basierend auf RTMDetnano+RTMPose implementieren und verwenden RTMDetnano zur Erkennung von Personen. Anschließend wird der entsprechende Bildbereich entsprechend dem Erkennungsrahmen zugeschnitten und zur Posenschätzung an RTMPose weitergeleitet. Anschließend wird eine einfache C++-Klasse zur Echtzeit-2D-Posenschätzung der Frame-Skipping-Erkennung ausgeführt. Okay, fangen wir fröhlich an .

Die Codebeispiele in diesem Artikel sind Open Source: https://github.com/HW140701/RTMPose-Deploy . Es wird ein vorkompiliertes Paket bereitgestellt. Wenn Sie zu faul zum Kompilieren sind, können Sie das vorkompilierte Paket direkt herunterladen und ausführen. Natürlich muss auf Ihrem Windows-Computer die VC-Laufzeitumgebung vorhanden sein. Wer Interesse hat, kann auf einen Stern klicken , vielen Dank.

Der Code in diesem Artikel zeigt hauptsächlich die Datenvor- und -nachbearbeitungsmethoden basierend auf RTMDetnano + RTMPose. Jeder, der interessiert ist, kann daraus lernen.

Der Beispielcode in diesem Artikel wurde an MMPose dev1.x übermittelt: https://github.com/open-mmlab/mmpose/pull/2316 .

2.1 Onnx-Modell herunterladen, Onnx-Modell konvertieren

Finden Sie das bereitgestellte standardmäßig exportierte ONNX-Modellbeispiel im README.md- Dokument von RTMPose . Die Download-Adresse lautet:

https://download.openmmlab.com/mmpose/v1/projects/rtmpose/rtmpose-cpu.zip

Nachdem die Dekomprimierung abgeschlossen ist, sehen Sie das ONNX-Modell von RTMDetnano+RTMPose mit dem Namen end2end.onnx.

Allerdings stellt RTMPose hier die 17 Schlüsselpunkte des menschlichen Körpers im coco17-Datensatz dar. Wenn Sie andere RTMPose-Onnx-Modelle benötigen, lesen Sie bitte die README.md von RTMPose, um das Onnx-Modell zu exportieren.

Dann ist der Zieldetektor RTMDetnano. Natürlich können Sie auch andere Zieldetektoren verwenden, z. B. verschiedene YOOOOOOOOOOOO. Ich persönlich denke, dass der Zieldetektor nur einen geringen Einfluss auf die anschließende Posenschätzung hat. Natürlich ist dieser Zieldetektor kein verzögerter Detektor .

2.2 Implementierung eines Top-Down-2D-Posenschätzungsbeispiels basierend auf RTMDetnano+RTMPose

2.2.1 Zielerkennung basierend auf RTMDetnano

Da der im obigen Link bereitgestellte RTMDetnano dynamische Abmessungen in „batch_size“, „image_height“ und „image_width“ aufweist, werden Breite und Höhe des Eingabebilds während der Implementierung nicht festgelegt.

Die Werte von image_mean und image_std, die für die Normalisierung des Eingabebildes verwendet werden, stammen aus den Pipeline.json- Dateien , die jedem Modell in der komprimierten Datei https://download.openmmlab.com/mmpose/v1/projects/rtmpose/rtmpose-cpu.zip entsprechen Paket. .

Weitere Einzelheiten entnehmen Sie bitte dem Lagercode.

Nach der Eingabe des Bildes wird nach Überlegungen der Erkennungsrahmen mit der Kategorie 0 und der höchsten Konfidenz in diesem Lager als zu erkennender Bereich für die nachfolgende Posenschätzung ausgewählt. Mit anderen Worten, dieses Beispiel führt derzeit nur Posen an der Person mit aus Höchste Zielerkennungswahrscheinlichkeit im Bild. Es wird geschätzt, aber die Posenschätzung für mehrere Personen ist auch relativ einfach zu erweitern und es gibt keine große Menge an Aufgaben.

2.2.2 Posenschätzung basierend auf RTMPose

Nachdem die Zielerkennung abgeschlossen ist, wird der Bereich des Erkennungsrahmens entsprechend dem Erkennungsrahmen und der affinen Transformation zugeschnitten, da die für RTMPose erforderliche Eingabeabmessung 1x3x256x192 beträgt. Anschließend wird das zugeschnittene Bild vorverarbeitet und zur Erkennung an RTMPose weitergeleitet. und 17 Schlüssel erhalten die Koordinaten des Punktes auf 256x192 und kehren dann die Koordinaten durch Anti-Affin-Transformation in das ursprüngliche Eingabebild um, um die richtigen Koordinaten zu erhalten.

Weitere Einzelheiten entnehmen Sie bitte dem Lagercode.

2.2.3 Echtzeit-Videostream-Poseschätzung: RTMPoseTracker

Nachdem die Inferenzklassen von RTMDetnano und RTMPoseTracker erstellt wurden, haben wir einen einfachen RTMPoseTracker erstellt, der die Erkennung von Videostreams in Echtzeit übernimmt. Standardmäßig führt RTMPoseTracker die Zielerkennung nur alle 10 Frames durch, wodurch die Verzögerung der Einzelframe-Inferenz erheblich reduziert werden kann. In der Reihenfolge um die Leistung einer 2D-Posenschätzung in Echtzeit zu erreichen.

Bei Interesse können Sie meine persönliche Website besuchen: https://www.stubbornhuang.com/

Acho que você gosta

Origin blog.csdn.net/HW140701/article/details/130431418
Recomendado
Clasificación