【物体検出2022】YOLO最新版のYOLOv7を試してみる　〜デモから学習まで〜

# はじめに

物体検出でお馴染みのYOLOシリーズの最新版「YOLOv7」について、動かしながら試していきます。YOLOv7は2022年7月に公開された最新バージョンであり、速度と精度の面で限界を押し広げています。Google colabで簡単に最新の物体検出モデルを実装することができますので、ぜひ最後までご覧ください。

# YOLOv7とは
YOLOv7は2022年7月に公開された最新バージョンであり、5FPSから160FPSの範囲で速度と精度の両方ですべての既知のオブジェクト検出器を上回り、速度と精度の面で限界を押し広げています。
これまでのYOLOR、YOLOX、Scaled-YOLOv4、YOLOv5、 DETR、Deformable DETR、DINO-5scale-R50、ViT-Adapter-Bなどと比較しても速度と精度における他の多くのオブジェクト検出器を上回る結果を出しています。
特にYOLOv7-E6オブジェクト検出器（56 FPS V100、55.9％AP）は、トランスフォーマーベースの検出器SWIN-LカスケードマスクR-CNN（9.2 FPS A100、53.9％AP）よりも速度が509％、精度が2％が上回っており、畳み込みベースの検出器ConvNeXt-XLカスケードマスクR-CNN（8.6 FPS A100、55.2％AP）に対しても、速度が551％、精度が0.7％上回る性能を誇ります。
リアルタイム物体検出器に対して、パラメータを効果的に利用できる「拡張」及び「複合スケーリング」手法により、リアルタイム物体検出器のパラメータを約40%、計算量を約50%削減することができるとしています。

![yolov7_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1559455/9ae526d8-f2cd-83d3-0235-d548d9da8f36.png)
（引用：https://arxiv.org/pdf/2207.02696.pdf）

YOLOv7のベンチマーク結果は以下となっています。
![yolov7_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1559455/4b736cdd-b941-8c28-bc0a-8ea76e63865b.png)

詳細は以下のリンクよりご覧ください。

URL：https://arxiv.org/abs/2207.02696
コード：https://github.com/WongKinYiu/yolov7

なお、ライセンスは「GNU General Public License v3.0」となっています。

# 環境構築

早速YOLOv7を使って動かしていきましょう。
ここからはGoogle colabを使用して実装していきます。
まずは「ランタイムのタイプを変更」→「ハードウェアアクセラレータ」をGPUに変更して、GPUが使えるようにしましょう。
GPUの設定が終わったら、Googleドライブをマウントします。
```ruby:python
from google.colab import drive
drive.mount('/content/drive')
%cd ./drive/MyDrive
```
公式よりcloneしてきます。

```ruby:python
!git clone https://github.com/WongKinYiu/yolov7
```

次に必要なライブラリをインポートします。

```ruby:python
%cd yolov7
!pip install -r requirements.txt
```

以上で準備完了です。
YOLOv7を使えるようになりました。

# 学習済みモデルを使った推論デモ
ここからはサンプル画像で推論デモを試してみましょう。
まずは学習済みモデルを取得します。
冒頭紹介した通り、いくつかの学習済みモデルがあります。
ここでは最も精度が高い「yolov7-e6e.pt」を使うことにします。
下記の通り実行してモデルをダウンロードしましょう。

```ruby:python
!wget https://github.com/WongKinYiu/yolov7/releases/download/v0.1/yolov7-e6e.pt
```

次に推論を実施します。
サンプル画像として「yolov7/inference/images/horses.jpg」が用意されています。
このサンプル画像を指定しましょう。
```ruby:python
!python detect.py --source inference/images/horses.jpg --weights yolov7-e6e.pt --conf 0.25 --img-size 1280 --device 0
```
実行すると「yolov7/runs/detect/exp」のフォルダ内に結果が保存されます。
中身を確認してみると、馬が高精度で検出できていることがわかります。

![yolov7_main.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1559455/1b5835fd-bcbc-4a41-08d3-ee9bb58538ec.jpeg)

簡単に物体検出を実装することができました。

# 任意の画像で試してみる

次に推論デモを任意の画像でも試してみましょう。
画像を用意したら先ほどの「horses.jpg」がある「yolov7/inference/images/」に画像を保存しましょう。
今回はYOLOシリーズではおなじみの画像を使用してみます。
保存したら先ほど同様に推論デモを実行します。
「--source」の引数をアップロードした画像「inference/images/dog.jpg」に変えましょう。

```ruby:python
!python detect.py --source inference/images/dog.jpg --weights yolov7-e6e.pt --conf 0.25 --img-size 1280 --device 0
```

実行すると、「yolov7/runs/detect/exp2」に結果が保存されます。

![dog (3).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1559455/805f177d-7f4e-6cef-f834-e900a105bf53.jpeg)

# 任意の動画で試してみる

動画でも試してみましょう。

「yolov7/inference/images/」に動画を保存して、同様に推論デモを実行します。

```ruby:python
!python detect.py --source inference/images/road.mp4 --weights yolov7-e6e.pt --conf 0.25 --img-size 1280 --device 0
```
処理が終わると結果が動画として出力されます。
YouTubeにまとめましたので、ぜひご覧ください。

https://youtu.be/AFGcMdZnGJg

https://youtu.be/VWphDSSwXfA

任意の動画で推論デモを簡単に実行することができました。

# 学習

データセットを用意すれば、学習も簡単に実行できます。
今回はオープンデータであるマスク着用判定のセットを活用して、モデルを作成してみます。


```ruby:python
!python train.py --workers 8 --batch-size 16 --data mask_wearing.yaml --cfg cfg/training/yolov7x.yaml --weights 'yolov7x.pt' --name yolov7x --hyp data/hyp.scratch.p5.yaml --epochs 300 --device 0
```
学習後には各指標も出力できます。

![results.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1559455/336e9b90-4e4d-7932-daf7-26392dae9ca9.png)

作成したモデルを使ってテストをしてみます。

![mask (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1559455/fc356971-f770-358b-84eb-d96e778b63e4.jpeg)
 
精度良く判定することができました。
こちらも動画にしました。


https://youtu.be/QdbTvd5Kx18


# まとめ

最後までご覧いただきありがとうございました。
2022年7月に公開されたYOLOシリーズの最新バージョンである「YOLOv7」について、動かしながら試してみました。
精度・推論速度ともに向上しており、非常に使いやすいものになっています。
物体検出の活用の幅がさらに広がりそうですね。

ブログではYOLOv7による学習及び推論の方法をまとめていますので、ぜひ合わせてご覧ください。


https://tt-tsukumochi.com/object_detection