標準搭載のAI検知プログラム

Contents

1

はじめに

AIBOX OSには、人を検知するように設定されたAI物体検出プログラムが標準搭載されています。
このページでは、このプログラムの説明と、人以外の物体(動物や車など)を検出するための変更方法などを説明します。

AIBOX OSにログインして、ファイル等を確認・編集できる状態にしておいてください。

2

構成ファイル一覧

AIBOXには、下記の場所に検知プログラムを配置する場所が作成されています。

配置場所
/home/cap/aicap/extmod
ヒント

/home配下の場所は、RAMディスク化されていませんので、変更前にRAMディスクを解除する必要はありません。

ここに、YOLO11を使用した物体検知プログラムが、標準で配置されています。

YOLO11についてはこちらを参照

配置されているファイルは以下になります。

GitHub GitHubで公開中
ファイル名説明
start.shAIBOXのメインプログラム起動時にコールされるシェルスクリプト
stop.shAIBOXのメインプログラム終了時にコールされるシェルスクリプト
extmod.py物体検出を行うPythonのプログラム
yolo11m_ncnn_model YOLO11のモデル(yolo11m.pt)をNCNNフォーマットでエクスポートしたモデル

YOLO11でのNCNN Exportについてはこちらを参照

docker-compose.ymlDockerコンテナの構成・設定をまとめたファイル

start.sh/stop.shは、検知プログラムの自動実行/終了に必要な処理を記述しますが、このプログラムでは、docker composeでコンテナを起動/終了する処理が記述されています。

物体検出はPythonでYOLO11を使用して行いますが、通常のモデルではなく軽量で高速なNCNNフォーマットに変換して使用しています。

3

Dockerについて

AIBOX OSには、標準でYOLO11をNCNNで実行できるDocker Imageが登録されています。

docker images
REPOSITORY TAG SIZE aicap/arm64/ultralytics 1.0.250923 3.43GB

このイメージは、Ultralyticsが公開しているYOLO11用のイメージをベースに、ncnn変換・実行に必要なモジュールのインストールや、aicapコマンドを実行するための環境構築処理が行われていますので、 AIBOX OS上で稼働させるYOLO11を使用した基本的な検知プログラムは、このイメージから起動したコンテナ上で動作させることが可能になっています。

GitHub Dockerfileはこちら

標準搭載AI検知プログラムでは、コンテナの起動にdocker composeを使用しますので、docker-compose.ymlを配置していますが、 この中で指定しているvolumes / enviroment / network_modeについて説明します。

GitHub docker-compose.ymlはこちら

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

ホストとコンテナのディレクトリをマッピングするvolumesですが、ここでは以下の3つを指定しています。
最初の2つは、aicapコマンドや、Pythonのプログラムを実行するに必要な設定ですので、独自の検知プログラムを作成する場合も同様に設定してください。
3つ目のNginX用のHTTP公開ディレクトリは、検知結果画像をブラウザから確認する場合に必要です。

マッピング元&先説明
/usr/local/aicapaicapコマンドの実行ディレクトリ
/home/cap/aicap検知プログラムファイルや各種設定ファイル等の配置場所
/var/www NginXのHTTP公開ディレクトリ
検出結果の画像を保存することで、ブラウザで検知結果画像を確認するために使用します
注意事項

NginXのHTTP公開ディレクトリの公開は、デフォルトではOFFになっています。

enviroment

環境変数は、Pythonプログラム(extmod.py)実行に必要な下記の2つの値を設定しています。

環境変数名説明
MODEL_FILE_NAME使用するYOLOモデルの名前
yolo11m_ncnn_model
PREVIEW_IMAGE_PATH検知結果画像の保存先
/var/www/result.jpg

network_mode: host

aicapコマンドは、カメラのフレーム画像を取得する為にキャプチャープログラム(cvc)にアクセスしますが、cvc側ではlocalhostからの要求しか受け付けない設定になっています。 そのため、network_modeをhostに設定し、ホストとコンテナのネットワークを一緒にする必要があります。

4

検知プログラムの解説

GitHub プログラムの全ソースコード(extmod.py)はこちら

関数一覧

物体検出のプログラム(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通知送信] → [プレビュー用イメージの保存]

Pushする画像について

aicap pushコマンドは、引数に送信する画像を指定できます。

このプログラムでは、カメラフレーム画像に、物体検出結果の赤枠を書き込んだ画像を引数に渡して送信しています。

5

検知する物体の変更や精度の修正

GitHub プログラムの全ソースコード(extmod.py)はこちら

検知する物体を人ではなく別の物体に変更したり、検出精度を修正する場合は、プログラムのグローバル変数の値を変更します。

検知する物体の変更

検知する物体を変更する場合は、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通知で一緒に送られる検出結果情報を確認しながら、不要な検出がなるなるように調整してください。