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-Modellyolov8n.onnx: Das exportierte YOLOv8 ONNX-Modellyolov8n.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

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
}
}
}

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-Modellyolov8n-pose.onnx: Das exportierte YOLOv8 ONNX-Modellyolov8n-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!

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