AIBOX OSには、人を検知するように設定されたAI物体検出プログラムが標準搭載されています。
このページでは、このプログラムの説明と、人以外の物体(動物や車など)を検出するための変更方法などを説明します。
AIBOX OSにログインして、ファイル等を確認・編集できる状態にしておいてください。
AIBOXには、下記の場所に検知プログラムを配置する場所が作成されています。
/home/cap/aicap/extmod
/home配下の場所は、RAMディスク化されていませんので、変更前にRAMディスクを解除する必要はありません。
ここに、YOLO11を使用した物体検知プログラムが、標準で配置されています。
YOLO11についてはこちらを参照
配置されているファイルは以下になります。
| ファイル名 | 説明 |
|---|---|
| start.sh | AIBOXのメインプログラム起動時にコールされるシェルスクリプト |
| stop.sh | AIBOXのメインプログラム終了時にコールされるシェルスクリプト |
| extmod.py | 物体検出を行うPythonのプログラム |
| yolo11m_ncnn_model |
YOLO11のモデル(yolo11m.pt)をNCNNフォーマットでエクスポートしたモデル YOLO11でのNCNN Exportについてはこちらを参照 |
| docker-compose.yml | Dockerコンテナの構成・設定をまとめたファイル |
start.sh/stop.shは、検知プログラムの自動実行/終了に必要な処理を記述しますが、このプログラムでは、docker composeでコンテナを起動/終了する処理が記述されています。
物体検出はPythonでYOLO11を使用して行いますが、通常のモデルではなく軽量で高速なNCNNフォーマットに変換して使用しています。
AIBOX OSには、標準でYOLO11をNCNNで実行できるDocker Imageが登録されています。
REPOSITORY TAG SIZE
aicap/arm64/ultralytics 1.0.250923 3.43GB
このイメージは、Ultralyticsが公開しているYOLO11用のイメージをベースに、ncnn変換・実行に必要なモジュールのインストールや、aicapコマンドを実行するための環境構築処理が行われていますので、 AIBOX OS上で稼働させるYOLO11を使用した基本的な検知プログラムは、このイメージから起動したコンテナ上で動作させることが可能になっています。
標準搭載AI検知プログラムでは、コンテナの起動にdocker composeを使用しますので、docker-compose.ymlを配置していますが、 この中で指定しているvolumes / enviroment / network_modeについて説明します。
volumes:
- /usr/local/aicap:/usr/local/aicap
- /home/cap/aicap:/home/cap/aicap
- /var/www:/var/www
environment:
MODEL_FILE_NAME: yolo11m_ncnn_model
PREVIEW_IMAGE_PATH: /var/www/html/result.jpg
network_mode: host
ホストとコンテナのディレクトリをマッピングするvolumesですが、ここでは以下の3つを指定しています。
最初の2つは、aicapコマンドや、Pythonのプログラムを実行するに必要な設定ですので、独自の検知プログラムを作成する場合も同様に設定してください。
3つ目のNginX用のHTTP公開ディレクトリは、検知結果画像をブラウザから確認する場合に必要です。
| マッピング元&先 | 説明 |
|---|---|
| /usr/local/aicap | aicapコマンドの実行ディレクトリ |
| /home/cap/aicap | 検知プログラムファイルや各種設定ファイル等の配置場所 |
| /var/www |
NginXのHTTP公開ディレクトリ 検出結果の画像を保存することで、ブラウザで検知結果画像を確認するために使用します |
NginXのHTTP公開ディレクトリの公開は、デフォルトではOFFになっています。
環境変数は、Pythonプログラム(extmod.py)実行に必要な下記の2つの値を設定しています。
| 環境変数名 | 説明 |
|---|---|
| MODEL_FILE_NAME | 使用するYOLOモデルの名前 yolo11m_ncnn_model |
| PREVIEW_IMAGE_PATH | 検知結果画像の保存先 /var/www/result.jpg |
aicapコマンドは、カメラのフレーム画像を取得する為にキャプチャープログラム(cvc)にアクセスしますが、cvc側ではlocalhostからの要求しか受け付けない設定になっています。 そのため、network_modeをhostに設定し、ホストとコンテナのネットワークを一緒にする必要があります。
物体検出のプログラム(extmod.py)は、下記の4つの関数と、それらを呼び出すメイン関数から構成されています。
このうち、get_frame関数と、push関数は、Pythonプログラムからaicapコマンドを実行する為のユーティリティ関数として使い回せると思います。
| 関数名 | 説明 |
|---|---|
| get_frame |
aicap get_frameコマンドを実行します。 フレーム画像は標準出力経由でメモリ上で取得します。 |
| push |
aicap pushコマンドを実行します。 送信する画像は、標準入力経由で引数に指定して、物体検出の赤枠を書き込んだ画像を送信します。 |
| create_result_jpeg | get_frameで取得したカメラのフレーム画像に、物体検出の赤枠を描画します。 |
| parse_results | YOLOのpredictの結果を使いやすく整形します。 |
メイン関数(main)を見てもらえれば解ると思いますが、非常に単純なプログラムになっています。
処理の流れとしては、以下の処理を繰り返し実行します。
[カメラのフレーム画像取得] → [YOLOで物体検知実行] → [結果を整形] → [検知していたら検出枠を描画] → [Push通知送信] → [プレビュー用イメージの保存]
aicap pushコマンドは、引数に送信する画像を指定できます。
このプログラムでは、カメラフレーム画像に、物体検出結果の赤枠を書き込んだ画像を引数に渡して送信しています。
検知する物体を人ではなく別の物体に変更したり、検出精度を修正する場合は、プログラムのグローバル変数の値を変更します。
検知する物体を変更する場合は、51行目に定義されているCLASSES変数の値を変更します。
#
# 検出する物体のラベルID
# 複数指定可能(配列で指定)
# Yoloで提供されているモデルを使用する場合は
# COCO(Common Objects in Context)のインデックスを指定する
# (抜粋)
# ID クラス名
# 0 person
# 1 bicycle
# 2 car
# 3 motorcycle
# 5 bus
# 16 dog
# 17 horse
# 18 sheep
# 19 cow
# 21 bear
# 例えば、車、バス、オートバイを検出するには CLASSES = [2, 3, 4]
#
CLASSES = [0]
コメントにも記載してある通り、この値を変更することで、検知する物体を変更できます。
例えば、熊を検出したい場合は、21を指定します。
# 21 bear
CLASSES = [21]
また、複数の物体を指定することも可能です。例えば、車と人を一緒に検出する場合は、[0, 2]と書きます。
# 0 person
# 2 car
CLASSES = [0, 2]
実際に運用していると、誤検知があったり、検知しなかったりという状況が発生します。
そのようなときには、物体検出のパラメータを調整してください。
調整するパラメータは、24行目に定義されているCONF変数と、30行目に定義されているIOU変数の2つです。
# confidence threshold
# 検出信頼度の閾値(0.0 ~ 1.0)
# これを下回る検出信頼度(confidence score)の検出は、結果に含めない1
CONF = 0.3
# Intersection over Union
# 検出BOXの重なり具合(0.0 ~ 1.0)
# YOLOは画像中で同じ物体を複数の候補BOXで検出することがあり、
# その中で、結果として残すBOXを決める閾値 = 重複検出を回避するための閾値
IOU = 0.5
主に調整するのは、CONFの方になると思います。簡単に言うと、検出のしきい値で、小さくすると、より多くの物体を検出しますが、誤検出も多くなり、大きくすると、誤検出が減りますが、検出ミスも増える、という感じです。
カメラの画像の鮮明さや設置場所によって最適な値が変わってきます。
Push通知で一緒に送られる検出結果情報を確認しながら、不要な検出がなるなるように調整してください。