使用 YOLOv8 在移動裝置上進行物件檢測和姿態估計

瞭解如何在移動裝置上構建和執行具有內建預處理和後處理功能的 ONNX 模型,以實現物件檢測和姿態估計。

目錄

使用 YOLOv8 進行物件檢測

您可以在 ONNX Runtime 推理示例儲存庫中找到 Android 應用程式的完整原始碼。

構建具有內建預處理和後處理功能的 ONNX 模型

此步驟是可選的,因為模型在上面的應用程式資料夾中的示例儲存庫中可用。如果您有興趣,以下步驟將向您展示如何自行構建模型。

建立一個 Python 環境並安裝以下包。

pip install --upgrade onnx onnxruntime onnxruntime-extensions pillow

下載以下指令碼以構建模型。

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

執行指令碼。

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

指令碼執行後,您將看到一個 PyTorch 模型和兩個 ONNX 模型

  • yolov8n.pt: 原始 YOLOv8 PyTorch 模型
  • yolov8n.onnx: 匯出的 YOLOv8 ONNX 模型
  • yolov8n.with_pre_post_processing.onnx: 包含預處理和後處理的 ONNX 模型
  • <test image>.out.jpg: 您的測試影像,帶有提供的邊界框。

例如,擴充套件儲存庫中的狼測試影像

Image of three white wolves with red bounding boxes

構建 Android 應用程式

將 Android 應用程式載入到 Android Developer Studio 中。

您可以在 ObjectDetector.kt 中看到主要的推理程式碼。這就像將影像載入到位元組陣列中,然後透過 ONNX Runtime 執行模型以獲取帶有邊界框的原始影像一樣簡單。

    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

使用 YOLOv8 進行姿態估計

構建姿態估計模型

注意:本教程的這部分使用 Python。Android 和 iOS 示例即將推出!

建立一個 Python 環境並安裝以下包。

pip install --upgrade onnx onnxruntime onnxruntime-extensions pillow

下載以下指令碼以構建模型。

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

執行指令碼。

python yolov8_pose_e2e.py 

指令碼執行後,您將看到一個 PyTorch 模型和兩個 ONNX 模型

  • yolov8n-pose.pt: 原始 YOLOv8 PyTorch 模型
  • yolov8n-pose.onnx: 匯出的 YOLOv8 ONNX 模型
  • yolov8n-pose.with_pre_post_processing.onnx: 包含預處理和後處理的 ONNX 模型

執行姿態估計示例

您可以使用相同的指令碼執行模型,提供您自己的影像來檢測姿態。

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

並且輸出會繪製在原始影像上!

Person with pose drawn

開發您的移動應用程式

您可以使用 Python 推理程式碼作為開發移動應用程式的基礎。

其他資源

ONNX Runtime 示例儲存庫 ONNX Runtime 擴充套件儲存庫