---
title: "アノテーションツール『labelImg』を使ったAIモデル作成"
canonical: "https://dev-partner.i-pro.com/space/TPFAQ/1007060562/%E3%82%A2%E3%83%8E%E3%83%86%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%84%E3%83%BC%E3%83%AB%E3%80%8ElabelImg%E3%80%8F%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9FAI%E3%83%A2%E3%83%87%E3%83%AB%E4%BD%9C%E6%88%90"
format: markdown
---
> Macro (toc)

# はじめに

アノテーションツール『labelImg』を使って、モデルの作成からi-PRO用AIモデルへの変換までを行ってみました。

i-PRO用AIモデルに関しては先に[こちら](https://dev-partner.i-pro.com/space/TPFAQ/961545224/AI%E3%83%A2%E3%83%87%E3%83%AB%E5%A4%89%E6%8F%9B%E3%83%84%E3%83%BC%E3%83%AB)の概要をお読みください。

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

##### チュートリアルでの実行環境

- Windows 10 Pro 64bit

# labelImgの環境構築

---

## Python3をインストールする

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

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

> [Download Python | Python.org](https://www.python.org/downloads/)

インストール時、labelImgのサポート対象バージョンが3.6~3.9でしたので、3.9.11をダウンロードしました。

> [Python Release Python 3.9.11 | Python.org](https://www.python.org/downloads/release/python-3911/)

![image](media://2cd4d6ee-8c5f-485b-ab6b-cbfe39571926)

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

この時、[Add Python 3.9 to PATH] にチェックを入れてください。

![image](media://2d86c4e6-fad3-48a6-920a-395cfc242094)

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

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

![image](media://60e2d895-254b-4306-be13-1237369185e5)

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

![image](media://0bcee282-b7ee-45c5-ac32-b5f5833b814b)

## アノテーションツール『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
```

![image](media://18b1d970-b44c-4900-94e4-0c64573538cc)

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

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

![image](media://f841e1c1-a2d1-4fdc-ba27-5dbf4d5e3ce8)

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

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

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

![image](media://6e5fcca4-1474-44ba-9536-3619f777c275)

> ℹ️ 以下は便利設定です。必要に応じて設定してください。
> ℹ️ 
> ℹ️ 上の [View] メニューから設定できます。
> ℹ️ 
> ℹ️ - [Auto Save mode] を有効にする
> ℹ️ - 今回は ”ipro” のタグだけつけるので、 [Single Class Mode] を有効にする

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

![image](media://73c61981-ee68-47e4-a183-1ebc8ec8f684)

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

![image](media://c4ec1922-01c9-47cc-b9dc-37e95b1b824d)

これを繰り返します。

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

> ℹ️ ショートカットキー
> ℹ️ 
> ℹ️ 　枠の作成を開始する：w
> ℹ️ 
> ℹ️ 　次の画像へ（Next Image）：d
> ℹ️ 
> ℹ️ 　前の画像へ（Prev Image）：a

# 機械学習環境構築

---

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

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

## Google Colabをセットアップする

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

> [Colaboratory へようこそ - Colaboratory (google.com)](https://colab.research.google.com/)

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

![image](media://690d114d-8ed5-468b-8861-756983b60980)

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

![image](media://f49e896b-b7f1-4859-a699-1ff1fa31e660)

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

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

![image](media://75ad1aa6-4c4c-47a9-b43a-1a1633e6be11)

![image](media://abd69f6c-9a5c-4636-b78c-418dfab316be)

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

```
print("Hello Python")
```

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

![image](media://aedb1d80-ebc5-4fda-a031-e6fd8ec85cbc)

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

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

![image](media://ee9a5767-c923-4b02-bbe0-4d8499df69bc)

## YOLOv5をインストールする

> ℹ️ yolov5はCVTool ver1.21以前のみ利用できます。必要な場合はお問合せください。

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

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

```
!git clone https://github.com/ultralytics/yolov5
%cd /content/yolov5/
!pip install -qr requirements.txt
```

![image](media://e363aa77-3896-48eb-861c-21c119a1c96b)

# 学習データを作成する

---

## 学習用データを配置する

Google Driveにアクセスします。

> [マイドライブ - Google ドライブ](https://drive.google.com/drive/my-drive)

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

> 参考： [https://laid-back-scientist.com/yolo-v5#toc4](https://laid-back-scientist.com/yolo-v5#toc4)

　val : 評価データ　

　trains : 検証データ

　test : テストデータ

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

![image](media://1d41ea38-0e26-4edf-9f6a-f23e2b0c052f)

また、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

![image](media://9142e20b-93d1-424d-92d4-a019964e2b11)

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

![image](media://8eb1e04e-a0e9-4522-9181-585c4fc03b18)

# 機械学習実行

---

## 学習を開始する

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

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

![image](media://245476da-d6ef-46d7-874e-545326b605b5)

```
!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
```

![image](media://f0caf34d-13a5-485f-a58f-3e2072f38e54)

> ℹ️ 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

![image](media://2c78e7b7-4eef-4d35-b500-624e087a92fb)

## モデルを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 で出力されます。

![image](media://d36a8e19-9c70-4560-b05c-71fe7e7745ad)

# i-PRO用モデルへの変換

---

## ONNXモデルの構造確認

AIモデル変換時のパラメータ設定のため、ONNXモデルの構造を確認します。

onnxモデルの名前は学習内容がわかるように名前を変更しておきます。

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


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

> [https://netron.app/](https://netron.app/)

[open model] からファイルを指定して開きます。

![image](media://fae445db-cd58-445e-8098-dff9abe6a269)

 左上のハンバーガーメニューから [Find] を選択します。

![image](media://f5a5240d-633d-4e02-aba6-9d43cbd0b9a7)

 “transpose” と検索すると、その上に3つのConvノードが確認できます。

![image](media://a90e9e79-fe9c-4f70-9dc6-7890606caf24)

それぞれのConvノードのプロパティを確認し、 [OUTPUTS] の値をメモしておきます。

![image](media://3c74e478-e5d0-4614-8681-70b0712499fa)

![image](media://4cb4fa8c-dc8e-4bbf-ac58-fd1e3cfc8586)

![image](media://baadd968-cced-4411-a1f6-cf75320260bb)

> /model.24/m.0/Conv_output_0
> 
> /model.24/m.1/Conv_output_0
> 
> /model.24/m.2/Conv_output_0

## AIモデル変換ツールを実行する

AIモデル変換ツールの環境構築および使い方は[こちら](https://dev-partner.i-pro.com/space/TPFAQ/961545224/AI%E3%83%A2%E3%83%87%E3%83%AB%E5%A4%89%E6%8F%9B%E3%83%84%E3%83%BC%E3%83%AB)をご参照ください。

学習に使用した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で確認したレイヤー名を列挙します。（空白なしカンマ区切り）

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

```
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と表示されました。

![image](media://661f2e61-2c30-48dd-adbb-ed7bb9b7cb93)