YOLOのオリジナルデータ学習手順 #2 アノテーション

**Chapters**

📘 **Chapter #0**　[YOLOとは](https://qiita.com/tfukumori/items/65056a4d51b531cdd45c)
📘 **Chapter #1**　[環境設定](https://qiita.com/tfukumori/items/6f33af8f9dc2ac974f43)
📘 **Chapter #2**　[アノテーション](https://qiita.com/tfukumori/items/0911c8fe1f5319530d4b)
📘 **Chapter #3**
　📗 **Chapter #3-1**　[YOLOv3 Keras版実装](https://qiita.com/tfukumori/items/d1f79078803d8a7fe103)
　📗 **Chapter #3-2**　[YOLOv3 Darknet版](https://qiita.com/tfukumori/items/15edd532e0a04c0a4672)
📘 **Chapter #A**
　📗 **Chapter #A-1**　[YOLOの各バージョンについてまとめ](https://qiita.com/tfukumori/items/519d84bf3feb8d246924)
　📗 **Chapter #A-2**　[YOLOv3 Keras版実装に関して関連記事のまとめ](https://qiita.com/tfukumori/items/9e62c4a7acd7ea6ddd3b)
　📗 **Chapter #A-3**　[ONNX変換・確認ライブラリ、アプリケーションまとめ](https://qiita.com/tfukumori/items/3f438294e722bc29fe16)

---

# TL:DR

- ここでは、YOLOv3でオリジナルデータを学習させる際のアノテーションの手順について記載します。
- [一足早い初夏のML怪談😱〜深層学習を使った画像の異常検知編](https://qiita.com/daisukelab/items/55d2a2a04b86c0577954)も踏まえて、劣化を少しでも抑えるためにアノテーション用にリサイズする際はPNGフォーマットとしています（どの程度効果があるかは未検証です）。
- 環境設定は終わっている前提。環境設定についての記事はこちら：[YOLOのオリジナルデータ学習手順 （環境設定編）](https://qiita.com/tfukumori/items/6f33af8f9dc2ac974f43)

# 環境

- Windows 10 Pro 1909
- IrfanView 4.5.1
- Vott 2.2.0

# YOLOの学習に必要な画像数について

> 最低：1カテゴリに対して100枚
> 基準：1カテゴリ1000枚
> 推奨：1カテゴリ5000、10000枚（高い精度と検出率、差異が少ない対象を扱っている場合、汎化性能を求める場合）
> 1カテゴリ当たり100枚で「試しにやってみる」
> ⇒ PoC（Proof of Concept：仮説検証）
> 角度、大きさ、色相、明度の異なる複数のバリエーションを偏りなく集め、1カテゴリ1000枚を達成します。
> ⇒ 精度を向上します。
> 誤検知のデータを修正、データの水増しをしながらブラッシュアップを繰り返していくと、結果的に5000枚、10000枚になります。

引用：https://www.nakasha.co.jp/future/ai/yolov3train.html

# 1. スクリプトの準備

```
git clone https://github.com/tfukumori/keras-yolo3
```

# 2. 実施手順（画像の整理とリサイズ）

※手戻りがないように、各工程作業毎にファイルを保持しておくことをお勧めします。

## 2.1. 画像の収集

- 後の作業で削除等しますので、**「コピー」し原本は残しておきます**。

## 2.2. 選別

IrfanViewで確認しながら、良質な画像を選択し不要な画像を除きます。

- NGファイル（目的のものが写っておらず or ピンボケ）：Deleteキー
- OKファイル（目的のものが写っていて、ピントがあっている）：→キー

**良質な画像とは**

- 対象とする物体が、大きく、くっきりと写っていること。学習段階で大きい物体を使用してもYOLOv3は仕組み上小さい物体も検知できます。

**途中で中断するときは**

途中で中断するときはIrfanViewの左下の数字を覚えておきます。

💡 参考：[より良い機械学習のためのアノテーションの機械学習](https://tech-blog.abeja.asia/entry/ml-annotation)
　　・アノテーションはAIの開発・運用にとってクリティカル
　　・精度の良い、大量のアノテーションデータを作ることが重要
　　・機械学習によりアノテーションプロセスを解析・改善が可能

## 2.3. 残ったものについてテスト用の画像を適当に選別

必要に応じて1割程度をテスト用に取っておきます。

※目的は、Train、Validateで使用した画像はテスト用として妥当ではないためです。
※リサイズ前の画像をテストとして選別しておいて構いませんが、実際の使用目的によりリサイズ後の画像をテストとして使用することを検討します。

## 2.4. リサイズの準備

トレーニング対象の画像を以下のフォルダの直下にコピーします（ない場合には新規作成します）。

```
keras-yolo3\images
```

- 不要なファイルがあった場合は除いておきます。
- データ量が少ない場合には、リサイズと同時に[データの水増し（Data Augmentation）](https://japan-medical-ai.github.io/medical-ai-course-materials/notebooks/06_Blood_Cell_Detection.html#Data-augmentation%E3%81%AE%E5%AE%9F%E8%A3%85)を行うことも検討します。

## 2.5. リサイズ

以下を実行しリサイズします。
この処理で`images`フォルダの画像ファイルがリサイズされ、`resize_image`フォルダに生成されます。（正方形でない場合は空白が白で埋められます）

```posh:画像のリサイズ
python resize_images.py
```

今回はYOLOv3の既定値に合わせて変更しています。

この`416 x 416`は学習のサイズ、推論のサイズどちらにも影響するので、実際に推論に使用するサイズと合わせておく必要があります。
推論時は必ずこの画像サイズにリサイズしてから推論させることになります。

# 3. 実施手順（アノテーション）

作業を分担する場合は、Azureクラウドを使用して作業するか、作業担当者ローカルでファイルを分担して作業してから後で手作業でまとめます（train.txtはエディタ等で結合します）。

## 3.1. アノテーション

Vottを使用してアノテーションを行います。

[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/ed362d75-66dc-8ca2-8b11-383de606903d.png)](https://www.youtube.com/embed/BzlAbHjFr5M)
※クリックで開く。引用元：https://sleepless-se.net/2019/06/21/how-to-use-vott/

ここではローカルでの作業を記載しますが、Azureクラウドを使用した作業も可能です。
参考：https://dev.classmethod.jp/articles/annotation-vott-azure-blob/

また、Vottアプリケーションは2重起動すると正常に動作しないようです。

1. 新規プロジェクトの作成
2. `Add Connection`から、ローカルファイルシステムのコネクションを作成する
    
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/a8976c9c-0b44-1994-64d7-37ce217d5703.png)
    
    このローカルファイルシステムには、`resize_image`フォルダのパスを指定します。
    
3. ソース接続とターゲット接続に作成した`Connection`を指定しプロジェクトを作成する

4. ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/a950bd99-c731-46ac-e677-a1c286adb25d.png)からエクスポート設定を行う

    |設定名|設定値|
    |---|---|
    |プロバイダー|Pasca VOC|
    |アセットの状態|タグ付きアセットのみ|
    |テスト/トレーニング分割|100（既定値 80）|
    |未割り当てをエクスポート|OFF|
    
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/bc297389-a7a9-1965-86eb-fc2392ea7ab5.png)


5. タグがない場合はタグを作成する

6. キーボードショートカットを使用しながらアノテーション（囲み作業とタグ付け）を行う

    |操作|ショートカットキー|
    |---|---|
    |前の画像|`w`キー|
    |次の画像|`s`キー|
    |タグ付け|数字キー　※マウスで領域を囲んで数字キー|
    
    ※アノテーションするときは、大きい物体がくっきり写ってる良質な写真を選ぶ必要があります（小さい物体は学習させないほうが良い）。YOLOv3はネットワークの構造上、大きい物体を学習しておけば、推論時には小さい物体も検知できます。
    ※大量のデータセットで学習する必要があります。

7. ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/fb47fdd2-d7d6-5850-68c8-c5cba239df1f.png)から保存する

8. ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/9bccd832-fc41-9c37-d333-726e0e0dcff1.png)でエクスポートする

    次のフォルダにエクスポートされます。

    ```
    <項2で指定した`resize_image`フォルダ>\<Vottのプロジェクト名>-PascalVOC-export
    ```

# 参考文献

- [【物体検出】vol.3 ：YOLOv3の独自モデル学習の勘所|機械学習・AI|Nakasha for the Future|ナカシャクリエイテブ株式会社](https://www.nakasha.co.jp/future/ai/yolov3train.html)