【YOLOv5 Tutorial】アノテーションから物体検出の学習，推論，精度評価（mAP）まで

# はじめに
1年ほど前，とある理由からYOLOv5を使って物体検出をすることになったのですが，自分でアノテーションを行なってYOLO形式のデータセットを作り，学習をして物体検出し，また精度をmAPとして出すという一連の流れが綺麗にまとまった記事というのがなく（大抵はCOCOデータセットを使って物体検出をしてみた止まりの記事ばかり），また当時はパソコンをまともに触ったことがないようなレベルだったので物体検出をするのにとても苦労したのを覚えています．

当時は特に記事にするとかは考えていなかったのですが，後輩に教えることになったことがきっかけでふと同じように苦労している人がいるのではないかと思って記事にすることにしました．大した内容ではないですが，少しでも誰かの参考になれば幸いです．

# YOLOv5を使った物体検出

## YOLOv5とは
以下の記事が物体検出アルゴリズムの全体像を知るにはいいと思います．

https://qiita.com/mshinoda88/items/9770ee671ea27f2c81a9

## 全体の流れ
全体的な流れとしては，以下のように行います．

1. 画像を用意する
1. VoTTを利用してアノテーションを行い，PascalVOC形式でアノテーションファイルを出力
1. PascalVOC形式からYOLO形式のアノテーションファイルに変換
1. データセットを作成する
1. YOLOv5を使って学習，検出，精度評価

## 画像を用意する
全体の画像枚数としてはできれば1000枚以上は欲しいですが，100枚ぐらいでもまあ大丈夫かなと思います．

## VoTTを利用してアノテーションを行い，PascalVOC形式でアノテーションファイルを出力
画像を分け終わったら，アノテーションを行なっていきます．

### アノテーションとは
物体検出の学習をするときには，物体検出アルゴリズム（今回の場合はYolov5）に画像のどこに検出して欲しい物体があるのかということを教えてあげる必要があります．物体がどこにあるのか画像に印をつける作業を「アノテーション」と言います．annotate「注釈をつける」

アノテーションのつけ方にはいくつか種類があります．ざっと主なものだけ説明します．

#### セグメンテーション
以下の画像のように検出対象を塗りつぶすアノテーションの仕方をセグメンテーションと言います．検出対象とそうでないものとの境界線が重要なときなどに使われます．自動運転等に使われています．
![images.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1639185/61850ee4-b76c-e0bf-a148-88ed2d895c5f.jpeg)
*画像引用元：[MultiNet: Real-time Joint Semantic Reasoning for Autonomous Driving](https://arxiv.org/pdf/1612.07695.pdf])*

#### バウンディングボックス
この画像のように長方形で囲む方法もあります．この長方形をバウンディングボックスと言います．主に対象の物体があるかないかを知りたいときに使います．今回使うのがこれです．
![127574988-6a558aa1-d268-44b9-bf6b-62d4c605cc72.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1639185/b3596edd-e87f-8a28-6644-291716c18018.jpeg)
*画像引用元：[YOLOv5 Tutorial](https://colab.research.google.com/github/ultralytics/yolov5/blob/master/tutorial.ipynb)*

#### キーポイント
他にもこの画像のように関節をアノテーションするものなどもあります．スポーツ選手の動きの分析などによく使われます．
![1_q8Bq1q0tb0BSCaVmcHygFw.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1639185/c9b984ba-1160-6190-37c8-e645e008dcc9.png)
*画像引用元：[Deep High-Resolution Representation Learning for Human Pose Estimation](https://arxiv.org/pdf/1902.09212.pdf)*

### VoTTの使い方
有名なアノテーションツールとしては他にもLabelImageだったり，coco-annotarorだったりがありますが，なぜか自分のM1macで動くのがVoTTだけだったのと，インストールや使い方が簡単だったので，VoTTを使うことにしました．

VoTTの使い方はここでは詳しく説明しませんが，以下の記事がわかりやすいと思います．

https://sleepless-se.net/2019/06/21/how-to-use-vott/

テスト画像にもアノテーションをしましょう．精度評価の際に必要です．

上記の記事にも書いてある通り，VoTTを使って訓練画像とテスト画像を分けることができます．分ける比率としてはデフォルトの8:2か7:3ぐらいがいいんじゃないかと思います．PascalVOC形式でアノテーションファイルを出力してください．

## PascalVOC形式からYOLO形式のアノテーションファイルに変換
以下の記事にて私が書いたコードを公開しています．ぜひご参照ください．

https://qiita.com/Rihib/items/e163d90c009f4fe12782

## データセットを作成する
ディレクトリ構成を整えてデータセットを作成します．作成したデータセットは全てご自身のGoogleドライブにアップロードしてください．Google Colaboratoryで使うためです．

### ディレクトリ構成
Yolov5の特徴としてimagesディレクトリから画像を検出したら，同じ階層にあるlabelsという名前のアノテーションファイルが入っているディレクトリを探す挙動をするので，それぞれがimagesとlabelsというディレクトリ名であることとその二つが同じ階層にあることはYOLOv5を動かす上で必須です．（正確にはimagesディレクトリに関しては必ずしもimagesという名前でなくても動きます）

```plaintext:ディレクトリ構成
dataset　データセット
   └── train
        └── images　画像が入っているディレクトリ
        └── labels　画像のアノテーションファイルが入っているディレクトリ
   └── test
        └── images　画像が入っているディレクトリ
        └── labels　画像のアノテーションファイルが入っているディレクトリ
```

## YOLOv5を使って学習，検出，精度評価
YOLOv5を使って訓練画像の学習とテスト画像の検出，作成したモデルの精度評価を行うことができます．

以下の私のGitHubレポジトリにYOLOv5の学習，検出，精度評価のコードとやり方について詳細に書かれたファイルがありますので使ってください．

https://github.com/rihito-bannai/yolov5_rihib

## 補足

### Google Colaboratoryの90分&12時間ルール
蛇足かもしれませんが，一定時間画面を動かさないと停止してしまうので気をつけてください．

https://qiita.com/enmaru/items/2770df602dd7778d4ce6

# おわりに
以上で終わりです．何か質問やご指摘等ありましたら下のコメントから教えていただけますと幸いです．