Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Table of Contents
minLevel1
maxLevel7

はじめに

...

アノテーションツール『labelImg』を使って、モデルの作成からi-

...

PRO用AIモデルへの変換までを行ってみました。

i-PRO用AIモデルに関しては先にこちらの概要をお読みください。

labelImgは一例であり、i-PROの推奨ツールではありません。

チュートリアルでの実行環境
  • Windows 10 Pro 64bit

labelImgの環境構築

...

Python3をインストールする

...

アノテーションツール『labelImg』のインストールに必要なPython3をインストールします。

以下サイトからインストーラーをダウンロードします。

...

Download Python | Python.org

インストール時、labelImgのサポート対象バージョンが3.6~3.9でしたので、3.

...

https://www.python.org/downloads/

インストールを実行します。

...

9.11をダウンロードしました。

Python Release Python 3.9.11 | Python.org

...

ダウンロードしたexeファイルを実行し、[Install Now] をクリックしてインストールを行います。

この時、[Add Python 3.9 to

...

PATH] にチェックを入れてください。

...

[Disalbe path length

...

アノテーションツール(labelImg)をインストールする

...

limit] が表示されたら、クリックして長いパスが設定できるようにします。

Info

実行環境によって表示されないことがあります。

...

[Close] をクリックしてインストーラーを終了します。

...

アノテーションツール『labelImg』をインストールする

コマンドプロンプトを開いて、インストールを実行します。

Code Block
$ pip install labelImg

アプリのインストール先を確認します。

Code Block
$ pip show

...

Info

インストール先フォルダにデフォルトで表示されるラベル名を定義しておくと便利です。

 インストール先フォルダ/data/predefined_classes.txt

...

アノテーションを行う

labelImgでアノテーションを行います。

アノテーションする画像を準備します。

今回はテスト用にi-PROカメラの画像を準備しました。(チュートリアルとしてお使いいただけます?)

DOSプロンプトからツールを起動します。

Code Block
labelImg

メニューで、出力形式をYOLOに変更します。

...

入力・出力フォルダを指定します。

  Open Dirでjpegのあるフォルダを指定

  Change Save Dirでアノテーション情報(txt)の出力先を指定

...

Info

以下を設定すると便利です。

  • Auto Save modeを有効にする

  • 今回はiproのタグだけつけるので、Single Class Modeを有効にする

...

タグをつけます。

Create Rect Box(ショートカットキー w)で枠を設定して、タグに「ipro」を入力します。

  1. Image Removed

これを繰り返します。

学習データを作成する

アノテーションしたデータを使って学習データを作成します。

参考: https://laid-back-scientist.com/yolo-v5#toc4

アノテーションしたデータを以下のフォルダ構成で配置します。

 val : 評価データ 

 trains : 検証データ

 test : テストデータ

各フォルダに.jpgとそのファイルに対応する.txtを配置します。

...

機械学習環境構築

学習環境を構築します。

...

 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カメラの画像を準備しました。

View file
nameipro_jpg.zip

コマンドプロンプトからツールを起動します。

Code Block
$ labelImg

...

左側のメニューから、出力形式をYOLOに変更します。

デフォルトで [PascalVOC] となっているボタンをクリックすると切り替わります。

...

入力・出力フォルダを指定します。

[Open Dir] でテスト用画像フォルダを指定し、

[Change Save Dir] でアノテーション情報の出力先を指定します。

...

Info

以下は便利設定です。必要に応じて設定してください。

上の [View] メニューから設定できます。

  • [Auto Save mode] を有効にする

  • 今回は ”ipro” のタグだけつけるので、 [Single Class Mode] を有効にする

[Edit] - [Create RectBox]を選択すると、枠の作成を開始できます。

...

カメラを囲むとダイアログが表示されるため、”ipro” とタグを入力します。

...

これを繰り返します。

最後の画像まで完了したら、[Save] で保存します。

Info

ショートカットキー

 枠の作成を開始する:w

 次の画像へ(Next Image):d

 前の画像へ(Prev Image):a

機械学習環境構築

...

学習データを作成する前に、学習環境を構築します。

Googleの提供する無料のPython実行環境『Google Colab』を利用します。

Google Colabをセットアップする

Google Colabにアクセスし、Googleアカウントでログインします。

Colaboratory へようこそ - Colaboratory (google.com)

ノートブックを新規作成します。

...

...

ノートブックの名前を変更します。

...

動作確認のためにPythonコードを入力して実行ボタンを押下し、結果が表示されればOKです。

最初のコード実行時に環境が割り当てられるので、時間がかかります。

...

 GPUの使用を設定します。

ランタイム - ランタイムのタイプを変更 - GPU と設定します。

この設定は最初の1度だけでよいです。

...

 

...

[Runtime] - [Change runtime type] をクリックし、[Hardware accelerator] を [GPU] に変更して保存します。

この設定は最初の1回だけです。

...

動作確認のためにPythonコードを入力して [実行ボタン] を押下し、結果が表示されればOKです。

Code Block
print("Hello Python")
Info

最初のコード実行時に環境が割り当てられるので、少し時間がかかります。

...

Googleドライブをマウントします。

この作業は環境がリセットされる度実行してください。

...

...

YOLOv5をインストールする

Google

...

Colab上でインストールコマンドを実行します。

この作業は環境がリセットされる度実行してください。

...

Code Block
!git clone https://github.com/ultralytics/yolov5

...


%cd /content/yolov5/
!pip install -qr requirements.txt

...

学習データを作成する

...

学習用データを配置する

Google

...

マイドライブ直下にコピーしてください。

...

Google Colab側からマウントしたドライブを見ると、このようになります。

...

Google Colabのフォルダツリー上で右クリックして、「パスをコピー」すると実際のパス名が分かります。

Driveにアクセスします。

マイドライブ - Google ドライブ

マイドライブ直下にフォルダを作成し、各フォルダにjpgファイルとそのファイルに対応するtxtファイルを入れます。

参考: https://laid-back-scientist.com/yolo-v5#toc4

 val : 評価データ 

 trains : 検証データ

 test : テストデータ

今回は、評価データ46組、検証データ7組、テストデータとしてすべてのデータを格納しました。

...

また、YOLOv5の学習時に使用するyamlファイルも作成して画像フォルダと同じ場所に配置します。

ipro.yaml:

Code Block
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

...

 Google Driveに学習結果出力先フォルダを作成しておきます。

...

学習を開始する

...

/data/yolov5/ipro/test

...

 Google Driveに学習結果出力先フォルダも作成しておきます。

...

機械学習実行

...

学習を開始する

Google Colab上で学習用コマンドを実行します。

[+Code] ボタンで次のコードの入力ダイアログを表示できます。

...

Code Block
!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フォルダで行います。

実行はyolov5フォルダでおこないます。

...

学習済みモデルは、指定したフォルダ配下に作成されます。

/content/drive/MyDrive/ai/data/yolov5/ipro/output/exp/weights

...

/best.pt

学習を複数実行すると、exp,

...

exp2…と名前が変わっていきます。

...

学習が完了したら、学習結果をグラフで確認します。

Code Block
%load_ext tensorboard

...


%tensorboard --logdir /content/drive/MyDrive/ai/data/yolov5/ipro/output

...

Info

precision : 予測結果のうちの正解した割合(誤検出しない確率)

recall : 正解した予測結果が実際の正解のうちの割合(見逃さない確率)

モデルを検証する

作成した学習モデルを使用して、テストデータからiproが検知できるか確認してみます。

Code Block
!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形式に変換します。

Code Block
!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

...

今回は 「best.onnx」 から 「iprocamera.onnx」に変更します。

機械学習モデルのビジュアライズツール『netron』でモデル図を確認します。

https://netron.app/

[open

...

 左上のハンバーガーメニューからFindを選択(Ctrl+F)します。

...

 transposeで検索し、その上にあるConvのノードをクリックすると、このような3つのノードが確認できます。

...

OUTPUTSのところに表示されるname:をメモしておきます。

これはsetting.confのOUT_LAYERとして記載します。

...

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

...

OUT_

...

LAYERには、netronで確認したレイヤー名を列挙します。(空白なしカンマ区切り)

今回の変更点はこちらです。

Code Block
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
Info

IN_DATA_WIDTH, IN_DATA_HEIGHTについては、

...

今回INPUTデータを416でモデル生成したのでデフォルト値のままで使用しています。

異なるデータサイズであれば変更してください。

変換コマンドを実行します。

Code Block
./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をモデルに合わせて編集します。

今回の変更点はこちらです。

Code Block
#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をモデルに合わせて編集します。

Code Block
APPLICATION yuv_yolov5_ipro_app
APPNAME0 YUV&YOLOv5 i-PRO Application

Makefileを編集します。

...

実行ファイル名を変更したので、Makefileも合わせて変更します。

Code Block
PROG_NAME= yuv_yolov5_ipro_app

アプリをビルドします。

Code Block
make

アプリを実行する

ビルドして作成されたアプリ yuv_yolov5_ipro_app_V1_0_ambaCV2X.extをカメラにインストールします。

アプリ画面にアクセスします。

カメラで画像を映してみると、枠が出てiproと表示されました。

...