コンテンツにスキップ

YOLOv8を使用した物体検出とポーズ推定

YOLOv8を使用したモバイルでの物体検出とポーズ推定

Section titled “YOLOv8を使用したモバイルでの物体検出とポーズ推定”

組み込みの前処理と後処理を使用して、物体検出とポーズ推定のモバイルでONNXモデルを構築および実行する方法を学びます。

Androidアプリの完全なソースコードは、ONNX Runtime推論例リポジトリにあります。

組み込みの前処理と後処理でONNXモデルを構築する

Section titled “組み込みの前処理と後処理でONNXモデルを構築する”

このステップはオプションです。モデルは上記のアプリケーションフォルダーの例リポジトリで利用可能なためです。興味がある場合は、以下の手順でモデルを自分で構築する方法を示します。

Python環境を作成し、以下のパッケージをインストールします。

Terminal window
pip install --upgrade onnx onnxruntime onnxruntime-extensions pillow

モデルを構築するために、以下のスクリプトをダウンロードします。

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

スクリプトを実行します。

Terminal window
python yolo_e2e.py [--test_image <テストする画像>]

スクリプトが実行された後、1つのPyTorchモデルと2つのONNXモデルが表示されます:

  • yolov8n.pt: 元のYOLOv8 PyTorchモデル
  • yolov8n.onnx: エクスポートされたYOLOv8 ONNXモデル
  • yolov8n.with_pre_post_processing.onnx: 前処理と後処理がモデルに含まれるONNXモデル
  • <test image>.out.jpg: バウンディングボックスが提供されたテスト画像

たとえば、拡張リポジトリのオオカミのテスト画像:

赤いバウンディングボックス付きの3匹の白いオオカミの画像

Androidアプリケーションを構築する

Section titled “Androidアプリケーションを構築する”

AndroidアプリケーションをAndroid Developer Studioに読み込みます。

ObjectDetector.ktにメインの推論コードがあります。画像をバイト配列に読み込み、ONNX Runtimeでモデルを実行してボックス付きの元の画像を取得するのと同じくらい簡単です。

fun detect(inputStream: InputStream, ortEnv: OrtEnvironment, ortSession: OrtSession): Result {
// ステップ1: 画像をバイト配列(生画像バイト)に変換
val rawImageBytes = inputStream.readBytes()
// ステップ2: バイト配列の形状を取得し、ortテンソルを作成
val shape = longArrayOf(rawImageBytes.size.toLong())
val inputTensor = OnnxTensor.createTensor(
ortEnv,
ByteBuffer.wrap(rawImageBytes),
shape,
OnnxJavaType.UINT8
)
inputTensor.use {
// ステップ3: ort推論セッション実行を呼び出す
val output = ortSession.run(Collections.singletonMap("image", inputTensor),
setOf("image_out","scaled_box_out_next")
)
// ステップ4: 出力分析
output.use {
val rawOutput = (output?.get(0)?.value) as ByteArray
val boxOutput = (output?.get(1)?.value) as Array<FloatArray>
val outputImageBitmap = byteArrayToBitmap(rawOutput)
// ステップ5: 出力結果を設定
var result = Result(outputImageBitmap,boxOutput)
return result
}
}
}

自転車に乗った人物の画像

注:チュートリアルのこの部分はPythonを使用します。AndroidとiOSのサンプルはまもなく公開されます!

Python環境を作成し、以下のパッケージをインストールします。

Terminal window
pip install --upgrade onnx onnxruntime onnxruntime-extensions pillow

モデルを構築するために、以下のスクリプトをダウンロードします。

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

スクリプトを実行します。

Terminal window
python yolov8_pose_e2e.py

スクリプトが実行された後、1つのPyTorchモデルと2つのONNXモデルが表示されます:

  • yolov8n-pose.pt: 元のYOLOv8 PyTorchモデル
  • yolov8n-pose.onnx: エクスポートされたYOLOv8 ONNXモデル
  • yolov8n-pose.with_pre_post_processing.onnx: 前処理と後処理がモデルに含まれるONNXモデル

同じスクリプトを使用してモデルを実行し、独自の画像を提供してポーズを検出できます。

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

出力が元の画像に描画されます!

ポーズが描画された人物

モバイルアプリケーションを開発する

Section titled “モバイルアプリケーションを開発する”

Python推論コードを基礎として、モバイルアプリケーションを開発できます。

ONNX Runtime例リポジトリ ONNX Runtime拡張リポジトリ