はじめに
アノテーションツール『labelImg』を使って、モデルの作成からi-PRO用AIモデルへの変換までを行ってみました。
i-PRO用AIモデルに関しては先にこちらの概要をお読みください。
labelImgは一例であり、i-PROの推奨ツールではありません。
チュートリアルでの実行環境
Windows 10 Pro 64bit
labelImgの環境構築
Python3をインストールする
アノテーションツール『labelImg』のインストールに必要なPython3をインストールします。
以下サイトからインストーラーをダウンロードします。
インストール時、labelImgのサポート対象バージョンが3.6~3.9でしたので、3.9.11をダウンロードしました。
ダウンロードしたexeファイルを実行し、[Install Now] をクリックしてインストールを行います。
この時、[Add Python 3.9 to PATH] にチェックを入れてください。
[Disalbe path length limit] が表示されたら、クリックして長いパスが設定できるようにします。
実行環境によって表示されないことがあります。
[Close] をクリックしてインストーラーを終了します。
アノテーションツール『labelImg』をインストールする
コマンドプロンプトを開いて、インストールを実行します。
$ pip install labelImg
アプリのインストール先を確認します。
$ pip show labelImg Name: labelImg Version: 1.8.6 Summary: LabelImg is a graphical image annotation tool and label object bounding boxes in images Home-page: https://github.com/tzutalin/labelImg Author: TzuTa Lin Author-email: tzu.ta.lin@gmail.com License: MIT license Location: c:\users\[ユーザー名]\appdata\local\programs\python\python39\lib\site-packages Requires: lxml, pyqt5 Required-by:
アノテーションを行う
まず、アノテーションする画像を準備します。
今回はテスト用にi-PROカメラの画像を準備しました。
コマンドプロンプトからツールを起動します。
$ labelImg
左側のメニューから、出力形式をYOLOに変更します。
デフォルトで [PascalVOC] となっているボタンをクリックすると切り替わります。
入力・出力フォルダを指定します。
[Open Dir] でテスト用画像フォルダを指定し、
[Change Save Dir] でアノテーション情報の出力先を指定します。
以下は便利設定です。必要に応じて設定してください。
上の [View] メニューから設定できます。
[Auto Save mode] を有効にする
今回は ”ipro” のタグだけつけるので、 [Single Class Mode] を有効にする
[Edit] - [Create RectBox]を選択すると、枠の作成を開始できます。
カメラを囲むとダイアログが表示されるため、”ipro” とタグを入力します。
これを繰り返します。
最後の画像まで完了したら、[Save] で保存します。
ショートカットキー
枠の作成を開始する:w
次の画像へ(Next Image):d
前の画像へ(Prev Image):a
機械学習環境構築
学習データを作成する前に、学習環境を構築します。
Googleの提供する無料のPython実行環境『Google Colab』を利用します。
Google Colabをセットアップする
Google Colabにアクセスし、Googleアカウントでログインします。
ノートブックを新規作成します。
ノートブックの名前を変更します。
[Runtime] - [Change runtime type] をクリックし、[Hardware accelerator] を [GPU] に変更して保存します。
この設定は最初の1回だけです。
動作確認のためにPythonコードを入力して [実行ボタン] を押下し、結果が表示されればOKです。
print("Hello Python")
最初のコード実行時に環境が割り当てられるので、少し時間がかかります。
Googleドライブをマウントします。
この作業は環境がリセットされる度実行してください。
YOLOv5をインストールする
Google Colab上でインストールコマンドを実行します。
この作業は環境がリセットされる度実行してください。
!git clone https://github.com/ultralytics/yolov5 %cd /content/yolov5/ !pip install -qr requirements.txt
学習データを作成する
学習用データを配置する
Google Driveにアクセスします。
マイドライブ直下にフォルダを作成し、各フォルダにjpgファイルとそのファイルに対応するtxtファイルを入れます。
val : 評価データ
trains : 検証データ
test : テストデータ
今回は、評価データ46組、検証データ7組、テストデータとしてすべてのデータを格納しました。
また、YOLOv5の学習時に使用するyamlファイルも作成して画像フォルダと同じ場所に配置します。
ipro.yaml:
train: /content/drive/MyDrive/ai/data/yolov5/ipro/trains/ val: /content/drive/MyDrive/ai/data/yolov5/ipro/val/ test: /content/drive/MyDrive/ai/data/yolov5/ipro/test/ # number of classes nc: 1 # class names names: ['ipro']
yamlファイルに使用するパスは、Google Colabのフォルダツリー上で右クリックして、[パスをコピー] すると実際のパス名が分かります。
例:/content/drive/MyDrive/ai/data/yolov5/ipro/test
Google Driveに学習結果出力先フォルダも作成しておきます。
機械学習実行
学習を開始する
Google Colab上で学習用コマンドを実行します。
[+Code] ボタンで次のコードの入力ダイアログを表示できます。
!python train.py --img 416 --batch 16 --epochs 500 --data \ /content/drive/MyDrive/ai/data/yolov5/ipro/ipro.yaml --weights yolov5s.pt --project \ /content/drive/MyDrive/ai/data/yolov5/ipro/output
実行はyolov5フォルダで行います。
学習済みモデルは、指定したフォルダ配下に作成されます。
/content/drive/MyDrive/ai/data/yolov5/ipro/output/exp/weights/best.pt
学習を複数実行すると、exp, exp2…と名前が変わっていきます。
学習が完了したら、学習結果をグラフで確認します。
%load_ext tensorboard %tensorboard --logdir /content/drive/MyDrive/ai/data/yolov5/ipro/output
precision : 予測結果のうちの正解した割合(誤検出しない確率)
recall : 正解した予測結果が実際の正解のうちの割合(見逃さない確率)
モデルを検証する
作成した学習モデルを使用して、テストデータからiproが検知できるか確認してみます。
!python detect.py --source /content/drive/MyDrive/ai/data/yolov5/ipro/test --weights \ /content/drive/MyDrive/ai/data/yolov5/ipro/output/exp/weights/best.pt --img 416 --conf 0.6 --name \ trained_exp --exist-ok --save-conf
結果は以下のパスに出力されます。
/content/yolov5/runs/detect/trained_exp
モデルをONNX形式に変換する
学習モデルをonnx形式に変換します。
!python export.py --img 416 --weights \ /content/drive/MyDrive/ai/data/yolov5/ipro/output/exp/weights/best.pt --include onnx --opset 11 --batch 1
変換結果は、best.pt と同じフォルダに拡張子 .onnx で出力されます。
i-PRO用モデルへの変換
ONNXモデルの構造確認
AIモデル変換時のパラメータ設定のため、ONNXモデルの構造を確認します。
onnxモデルの名前は学習内容がわかるように名前を変更しておきます。
今回は 「best.onnx」 から 「iprocamera.onnx」に変更します。
機械学習モデルのビジュアライズツール『netron』でモデル図を確認します。
[open model] からファイルを指定して開きます。
左上のハンバーガーメニューから [Find] を選択します。
“transpose” と検索すると、その上に3つのConvノードが確認できます。
それぞれのConvノードのプロパティを確認し、 [OUTPUTS] の値をメモしておきます。
/model.24/m.0/Conv_output_0
/model.24/m.1/Conv_output_0
/model.24/m.2/Conv_output_0
AIモデル変換ツールを実行する
AIモデル変換ツールの環境構築および使い方はこちらをご参照ください。
学習に使用したjpegファイルをdockerの以下フォルダに配置します。
/home/cvtool/conversion/ipro_jpg
onnxファイルをdockerのyolov5用のフォルダに配置します。
/home/cvtool/conversion/onnx/yolov5/sample/yolov5/models/iprocamera.onnx
変換用設定ファイル「setting.conf」の記述を変更します。
/home/cvtool/conversion/onnx/yolov5/setting.conf
・下記説明の通り、CAVALRY_VER
はambaCV2Xでは"2.1.7"
ですが、ambaCV5Xでは"2.2.8.2"
を設定ください。
編集 - CV5Xモデル作成方法 - Technology Partner - Confluence (atlassian.net)
OUT_LAYERには、netronで確認したレイヤー名を列挙します。(空白なしカンマ区切り)
今回の変更点はこちらです。
NET_NAME=iprocamera DRA_IMAGE_DIR=../../ipro_jpg OUT_LAYER=/model.24/m.0/Conv_output_0,/model.24/m.1/Conv_output_0,/model.24/m.2/Conv_output_0
IN_DATA_WIDTH, IN_DATA_HEIGHTについては、
今回INPUTデータを416でモデル生成したのでデフォルト値のままで使用しています。
変換コマンドを実行します。
./onnx_conversion.sh setting.conf
変換が終了すると、以下ファイルが作成されます。
最適化されたonnxファイル :
/home/cvtool/conversion/onnx/yolov5/sample/yolov5/models/iprocamera_surgery.onnx
カメラ実行用ファイル :
/home/cvtool/conversion/onnx/yolov5/out/iprocamera/MIX/iprocamera_surgery.onnx/iprocamera_cavalry.bin
アプリへ組み込み
カメラ実行用AIモデルファイル「iprocamera_cavalry.bin」を、C版サンプルアプリ「yuv_yolov5_app」に組み込み、カメラ上で実行させます。
サンプルアプリのビルド
AIモデルファイルを以下にコピーします。
${SDK_DIR}/src/adamapp/yuv_yolov5_app/data/cnn/iprocamera_cavalry/bin
main.cをモデルに合わせて編集します。
今回の変更点はこちらです。
#define NETNAME "iprocamera_cavalry.bin" #define LAYERNAMEOUT_CONV1037 "/model.24/m.2/Conv_output_0" #define LAYERNAMEOUT_CONV1017 "/model.24/m.1/Conv_output_0" #define LAYERNAMEOUT_CONV997 "/model.24/m.0/Conv_output_0" #define TOTAL_CLS (1) char const *names[] = {"ipro"};
configuration.txtをモデルに合わせて編集します。
APPLICATION yuv_yolov5_ipro_app APPNAME0 YUV&YOLOv5 i-PRO Application
Makefileを編集します。
実行ファイル名を変更したので、Makefileも合わせて変更します。
PROG_NAME= yuv_yolov5_ipro_app
アプリをビルドします。
make
アプリを実行する
ビルドして作成されたアプリ yuv_yolov5_ipro_app_V1_0_ambaCV2X.extをカメラにインストールします。
アプリ画面にアクセスします。
カメラで画像を映してみると、枠が出てiproと表示されました。