YOLOv7で自作データセットを学習してみた

# はじめに
はじめまして。今回が初投稿になります。
データサイエンスに興味があり、勉強も兼ねてこれから投稿していこうと思います。
よろしくお願いします。

今回は **①自作データセットを準備** し、 **②YOLOv7で学習+物体検出** に挑戦してみました。

# 環境
Google Colaboratoryの無料枠を使用しました。
Googleアカウントがあれば手軽に始められるので便利ですよね。

https://colab.research.google.com/

# ①自作データセットを準備
今回はYOLOv7で自宅で飼っている犬を判別していこうと思います。
まずは、↓こんな感じにiPhoneを使って飼い犬の画像を準備します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111444/7c816ee6-8272-9867-c151-e7c946b97c47.png)

画像サイズが大きいと学習に時間がかかるため、320x320にリサイズしています。
画像形式はjpeg形式にしています。

### アノテーションの設定
VoTTを使用して、バウンディングボックスで犬にタグ付けを行っていきます[[1](https://sleepless-se.net/2019/06/21/how-to-use-vott/)]。タグ付けが完了したら結果をVoTT JSON形式でエクスポートします。

https://github.com/Microsoft/VoTT/releases

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111444/59d6939b-05fe-85e3-b9b3-780223ba8033.png)

次にroboflowを使って、先ほどのVoTTのエクスポート結果をYOLOv7用に変換します[[2](https://konchangakita.hatenablog.com/entry/2020/08/24/220000),[3](https://roboflow.com/convert/vott-json-to-yolov7-pytorch-txt)]。
変換時にデータセットをトレーニングデータとバリデーションデータに分割できます。
今回は合計39枚の画像をトレーニングデータ：30枚、バリデーションデータ：9枚になるように分けました。

https://roboflow.com/

roboflowによる変換後のデータはzipでダウンロードします。
その際に、データフォーマットが選べるので「YOLO v7 PyTorch」を選択します。

![スクリーンショット 2023-01-15 10.42.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111444/cdcd3792-6a1e-a8e2-95fd-fb58a37307e1.png)

zip解凍後のディレクトリ構造は以下のようになっていました。

```
myDog.v1i.yolov7pytorch/
├─ data.yaml
├─ README.dataset.txt
├─ README.roboflow.txt
├─ train/
│  ├─ images/
│  │  ├─ XXX.jpg
│  │  └─ ...
│  └─ labels/
│     ├─ XXX.txt
│     └─ ...
└─  valid/
   ├─ images/
   │  ├─ XXX.jpg
   │  └─ ...
   └─ labels/
      ├─ XXX.txt
      └─ ...
```

ここまででデータセットの作成が完了です。


# ②YOLOv7で学習+物体検出

以下であげていただいているソースを使用して、学習と物体検出を行っていきます。
コマンドについては[[4](https://dev.classmethod.jp/articles/yolov7-train-with-customize-dataset/
),[5](https://qiita.com/hkwsdgea_ttt2/items/ba352f6e5ef6032b5dc9)]を参考にしました。

https://github.com/WongKinYiu/yolov7


### 実行環境の準備

作業ディレクトリに移動し、cloneします。

```
cd /content/drive/MyDrive
!git clone https://github.com/WongKinYiu/yolov7
```

cloneしたフォルダに移動し、実行に必要なパッケージをダウンロードします。
その後、学習済みの重みをダウンロードします。

```
cd yolov7
pip install -r requirements.txt
!wget https://github.com/WongKinYiu/yolov7/releases/download/v0.1/yolov7-e6e.pt
```

次に先ほど作成したデータセットを配置していきます。
まずはデータセットを配置するためのフォルダ(dataset)を作成します。

```
mkdir dataset
```

datasetの下に自作データセットのtrainとvalidを配置します。
またdataの下にも同じく先ほど作成されたdata.yamlを配置します。

```
drive/
└─ MyDrive/
   └─ yolov7/
      ├─ dataset/
      │  ├─  train/
      │  │   ├─ images/
      │  │   │  ├─ XXX.jpg
      │  │   │  └─ ...
      │  │   └─ labels/
      │  │      ├─ XXX.txt
      │  │      └─ ...
      │  └─  valid/
      │      ├─ images/
      │      │  ├─ XXX.jpg
      │      │  └─ ...
      │      └─ labels/
      │         ├─ XXX.txt
      │         └─ ...
      ├─ data
      │  ├─  data.yaml
      │  └─ ...
      └─ ...
```

トレーニングデータとバリデーションデータを取得するため、data.yamlに記載されているパスの変更が必要です。

```
(変更前)
train: ../train/images
val: ../valid/images

(変更後)
train: /content/drive/MyDrive/yolov7/dataset/train/images
val: /content/drive/MyDrive/yolov7/dataset/valid/images
```

## 自作データセットで学習

先ほど配置したtrain内のデータを用いて学習します。

```python
!python train_aux.py --workers 8 --batch-size 16 --data data/data.yaml --cfg cfg/training/yolov7-e6.yaml --weights 'checkpoints/yolov7-e6.pt' --name yolov7-e6-myDog --hyp data/hyp.scratch.p6.yaml --epochs 200 --device 0
```

## 学習済みモデルで推論

valid内のデータを用いて推論します。
結果の保存先は「yolov7/runs/detect/(任意のフォルダ名)」になります。

```python
!python detect.py --weights runs/train/yolov7-e6-myDog/weights/best.pt --conf 0.25 --img-size 640 --source dataset/valid/images --name exp-yolov7-e6-myDog-valid
```

以下のような推論結果になりました。
myDogというタグがついたバウンディングボックスで、飼い犬を検出することができました。
![](https://storage.googleapis.com/zenn-user-upload/64e84de687cc-20230108.png)

# おわりに

最後までご覧いただきありがとうございました。
今回は **①自作データセットを準備** し、 **②YOLOv7で学習+物体検出** に挑戦してみました。
次回も同じく手を動かしてみた内容を投稿できればと思います。
(この記事を書いている間に最新verの「YOLOv8」が出たようなのでこちらも動かしてみたいですね)

# 参考文献

[1]【物体検出】アノテーションツールVoTTの使い方
https://sleepless-se.net/2019/06/21/how-to-use-vott/
[2]アノテーションツール VoTT を使って YOLOv5 の学習データセットを作る
https://konchangakita.hatenablog.com/entry/2020/08/24/220000
[3]How To Convert VoTT JSON to YOLOv7 PyTorch TXT
https://roboflow.com/convert/vott-json-to-yolov7-pytorch-txt
[4]YOLOv7を使って自作データセットで物体検出してみた
https://dev.classmethod.jp/articles/yolov7-train-with-customize-dataset/
[5]【物体検出2022】YOLO最新版のYOLOv7を試してみる　〜デモから学習まで〜
https://qiita.com/hkwsdgea_ttt2/items/ba352f6e5ef6032b5dc9)