5.6 画像のクラス別セグメンテーション
サンプルの概要
セグメンテーションサンプルは /app/pydev_demo/06_segment_sample/ にある Python インターフェース の開発コードサンプル群で、hbm_runtime モジュールを使用してセグメンテーションタスクを行う方法を示します。このサンプルは MobileNet-UNet モデルを使用して、人、車両、路面、道路標識などのクラスのセグメンテーションを実現しています。
含まれるモデルサンプル:
root@ubuntu:/app/pydev_demo/06_segment_sample$ tree -L 1
.
└── 01_mobilenet_unet
実行結果の例
サンプルは画像に対してピクセル単位の分類を行い、異なる色でクラス(人、車両、路面、道路標識など)を識別し、セグメンテーション結果を元画像に重ねて表示します。

ハードウェアの準備
ハードウェアの接続
このサンプルは RDK 開発ボード本体のみで動作し、追加の周辺機器の接続は不要です。開発ボードに正常に給電され、システムが起動していることを確認してください。

クイックスタート
コードとボード上の場所
/app/pydev_demo/06_segment_sample/ に移動すると、セマンティックセグメンテーションのサンプルフォルダが含まれていることが確認できます:
root@ubuntu:/app/pydev_demo/06_segment_sample# tree
.
└── 01_mobilenet_unet
├── mobilenet_unet.py
├── segmentation.png
└── segmentation_result.png
コンパイルと実行
Python サンプルはコンパイル不要で、そのまま実行できます。
cd /app/pydev_demo/06_segment_sample/01_mobilenet_unet
python mobilenet_unet.py
実行結果
root@ubuntu:/app/pydev_demo/06_segment_sample/01_mobilenet_unet# python mobilenet_unet.py
[BPU_PLAT]BPU Platform Version(1.3.6)!
[HBRT] set log level as 0. version = 3.15.55.0
[DNN] Runtime version = 1.24.5_(3.15.55 HBRT)
[A][DNN][packed_model.cpp:247][Model](2000-01-01,11:51:43.693.476) [HorizonRT] The model builder version = 1.23.8
[W][DNN]bpu_model_info.cpp:491][Version](2000-01-01,11:51:43.813.309) Model: unet_mobilenet_1024x2048_nv12. Inconsistency between the hbrt library version 3.15.55.0 and the model build version 3.15.54.0 detected, in order to ensure correct model results, it is recommended to use compilation tools and the BPU SDK from the same OpenExplorer package.
...
=== Output Tensor Stride ===
unet_mobilenet_1024x2048_nv12:
seg_head_seg_pred_4/FusedBatchNorm:0 -> stride: [9961472, 38912, 76, 4]
=== Scheduling Parameters ===
unet_mobilenet_1024x2048_nv12:
priority : 0
customId : 0
bpu_cores : [0]
deviceId : 0
root@ubuntu:/app/pydev_demo/06_segment_sample/01_mobilenet_unet#
可視化結果は、同じディレクトリにある segmentation_result.png という名前の画像です。
詳細説明
サンプルプログラムのパラメータオプションの説明
セマンティックセグメンテーションサンプルはコマンドライン引数による設定に対応しています。パラメータを指定しない場合、プログラムはデフォルト値を使用して同じディレクトリ内のテスト画像を自動的に読み込み、推論を行います。
| パラメータ | 説明 | 型 | デフォルト値 |
|---|---|---|---|
--model-path |
BPU 量子化モデルのパス(.bin) |
str | /app/model/basic/mobilenet_unet_1024x2048_nv12.bin |
--test-img |
入力テスト画像のパス | str | segmentation.png |
--save-path |
セグメンテーション結果画像の保存パス | str | segmentation_result.png |
--priority |
推論の優先度(0~255、255 が最高) | int | 0 |
--bpu-cores |
BPU コアのインデックスリスト(例: 0 1) |
int list | [0] |
ソフトウェアアーキテクチャの説明
ここでは、セマンティックセグメンテーションサンプルのソフトウェアアーキテクチャと処理の流れを紹介し、モデルの読み込みから結果出力までの一連の実行過程を説明して、コードの全体構造とデータの流れを理解できるようにします。

- モデルの読み込み -
hbm_runtimeモジュールを使用してモデルファイルを読み込む - 画像の読み込み - 入力テスト画像を読み込む
- 画像の前処理 - 入力画像をモデルの入力サイズにスケーリングし、BGR を NV12 形式に変換
- モデル推論 - BPU 上でモデルの順伝播計算を実行
- 結果の後処理 - モデル出力に argmax を適用し、各ピクセルのクラス予測を取得
- 結果の出力 - セグメンテーション結果を元画像上に描画し、異なる色でクラスを識別して結果画像を保存
API フローの説明
ここでは、サンプルプログラムで使用している主な API インターフェースを列挙し、各インターフェースの機能、入力パラメータ、戻り値を説明して、開発者がコードの実装詳細とインターフェースの呼び出し方法をすばやく理解できるようにします。np. で始まるものは Numpy ライブラリの汎用インターフェースで、それ以外は独自定義のインターフェースです。

hbm_runtime.HB_HBMRuntime(model_path)
プリコンパイル済みモデルを読み込みます。入力:モデルファイルのパス
load_image(image_path)
テスト画像を読み込みます。入力:画像ファイルのパス
resized_image(img, input_W, input_H, resize_type)
画像をスケーリングします。入力:画像、目標の幅、目標の高さ、スケーリングの種類、戻り値:スケーリング後の画像
bgr_to_nv12_planes(image)
BGR を NV12 形式に変換します。入力:BGR 画像、戻り値:y プレーン、uv プレーン
model.run(input_data)
モデル推論を実行します。入力:前処理済みの画像データ、戻り値:モデル出力
np.argmax(outputs, axis)
最大値のインデックスを取得します。入力:モデル出力、指定の次元、戻り値:各ピクセルのクラスインデックス
draw_seg_result(image, pred_result, save_path)
セグメンテーション結果を描画します。入力:元画像、予測結果、保存パス
ドキュメント