Objekterkennung und Posen-Schätzung auf Mobilgeräten mit YOLOv8

Erfahren Sie, wie Sie ONNX-Modelle auf Mobilgeräten mit integrierter Vor- und Nachverarbeitung für Objekterkennung und Posen-Schätzung erstellen und ausführen.

Inhalt

Objekterkennung mit YOLOv8

Sie finden den vollständigen Quellcode für die Android-App im ONNX Runtime-Inferenzbeispiel-Repository.

Erstellen des ONNX-Modells mit integrierter Vor- und Nachverarbeitung

Dieser Schritt ist optional, da das Modell in den obigen Anwendungsordnern im Beispiel-Repository verfügbar ist. Wenn Sie interessiert sind, zeigen Ihnen die folgenden Schritte, wie Sie das Modell selbst erstellen können.

Erstellen Sie eine Python-Umgebung und installieren Sie die folgenden Pakete.

pip install --upgrade onnx onnxruntime onnxruntime-extensions pillow

Laden Sie das folgende Skript herunter, um das Modell zu erstellen.

curl https://raw.githubusercontent.com/microsoft/onnxruntime-extensions/main/tutorials/yolo_e2e.py > yolo_e2e.py

Führen Sie das Skript aus.

python yolo_e2e.py [--test_image <image to test on>]

Nachdem das Skript ausgeführt wurde, sehen Sie ein PyTorch-Modell und zwei ONNX-Modelle

  • yolov8n.pt: Das ursprüngliche YOLOv8 PyTorch-Modell
  • yolov8n.onnx: Das exportierte YOLOv8 ONNX-Modell
  • yolov8n.with_pre_post_processing.onnx: Das ONNX-Modell mit integrierter Vor- und Nachverarbeitung im Modell
  • <Testbild>.out.jpg: Ihr Testbild mit den erkannten Begrenzungsrahmen.

Zum Beispiel das Wolf-Testbild im Erweiterungs-Repository

Image of three white wolves with red bounding boxes

Erstellen einer Android-Anwendung

Laden Sie die Android-Anwendung in Android Developer Studio.

Der Hauptinferenzcode befindet sich in ObjectDetector.kt. Es ist so einfach wie das Laden des Bildes in ein Byte-Array und dessen Ausführung durch das Modell mit ONNX Runtime, um das Originalbild mit den erkannten Objekten zu erhalten.

    fun detect(inputStream: InputStream, ortEnv: OrtEnvironment, ortSession: OrtSession): Result {
        // Step 1: convert image into byte array (raw image bytes)
        val rawImageBytes = inputStream.readBytes()

        // Step 2: get the shape of the byte array and make ort tensor
        val shape = longArrayOf(rawImageBytes.size.toLong())

        val inputTensor = OnnxTensor.createTensor(
            ortEnv,
            ByteBuffer.wrap(rawImageBytes),
            shape,
            OnnxJavaType.UINT8
        )
        inputTensor.use {
            // Step 3: call ort inferenceSession run
            val output = ortSession.run(Collections.singletonMap("image", inputTensor),
                setOf("image_out","scaled_box_out_next")
            )

            // Step 4: output analysis
            output.use {
                val rawOutput = (output?.get(0)?.value) as ByteArray
                val boxOutput = (output?.get(1)?.value) as Array<FloatArray>
                val outputImageBitmap = byteArrayToBitmap(rawOutput)

                // Step 5: set output result
                var result = Result(outputImageBitmap,boxOutput)
                return result
            }
        }
    }

Image of person with bicycle

Posen-Schätzung mit YOLOv8

Erstellen des Posen-Schätzungsmodells

Hinweis: Dieser Teil des Tutorials verwendet Python. Android- und iOS-Beispiele folgen in Kürze!

Erstellen Sie eine Python-Umgebung und installieren Sie die folgenden Pakete.

pip install --upgrade onnx onnxruntime onnxruntime-extensions pillow

Laden Sie das folgende Skript herunter, um das Modell zu erstellen.

curl https://raw.githubusercontent.com/microsoft/onnxruntime-extensions/main/tutorials/yolov8_pose_e2e.py > yolov8_pose_e2e.py

Führen Sie das Skript aus.

python yolov8_pose_e2e.py 

Nachdem das Skript ausgeführt wurde, sehen Sie ein PyTorch-Modell und zwei ONNX-Modelle

  • yolov8n-pose.pt: Das ursprüngliche YOLOv8 PyTorch-Modell
  • yolov8n-pose.onnx: Das exportierte YOLOv8 ONNX-Modell
  • yolov8n-pose.with_pre_post_processing.onnx: Das ONNX-Modell mit integrierter Vor- und Nachverarbeitung im Modell

Ausführen von Posen-Schätzungsbeispielen

Sie können dasselbe Skript verwenden, um das Modell auszuführen, und dabei Ihr eigenes Bild zur Erkennung von Posen bereitstellen.

python yolov8_pose_e2e.py --test_image person.jpg --run_model

Und die Ausgabe wird auf das Originalbild gezeichnet!

Person with pose drawn

Entwicklung Ihrer mobilen Anwendung

Sie können den Python-Inferenżcode als Grundlage für die Entwicklung Ihrer mobilen Anwendung verwenden.

Zusätzliche Ressourcen

ONNX Runtime Beispiele-Repository ONNX Runtime Erweiterungen-Repository