Yolov7をトレーニング

https://github.com/WongKinYiu/yolov7.git

# 手順

### データセットを用意

以下の形式で用意します。

```
my_dataset
  |
  |__images
  |    |__train
  |    |    |__image1.jpg
  |    |    |__image2.jpg
  |    |    |__...
  |    |
  |    |_val
  |         |__val_image1.jpg
  |         |__val_image2.jpg
  |         |__...
  |
  |    
  |__labels
       |
       |__train
       |    |__image1.txt
       |    |__image2.txt
       |    |__...      
       |
       |__val
            |__val_image1.txt
            |__val_image2.txt
            |__...
```

**画像とアノテーション・テキスト・ファイルを同じ名前で用意します。**
例えば、
**image1.jpg**
**image1.txt**
という風に対応するセットで用意します。

アノテーション・テキスト・ファイルには、以下を記述します（オブジェクトごとに１行ずつ）。

```
class x_center y_center width height
```

ボックス座標は、0〜1に正規化されたxywh形式です。
クラス番号は0から始まります。

以下のようなアノテーション・サービスを使ってYolo用のアノテーション・ファイルを生成できます。

https://roboflow.com/annotate?ref=ultralytics

トレーニングに使うデータ（train）
モデルの検証に使うデータ（val）
を、８:２程度で振り分けるのが一般的だと思います。

##### 備考：
以前にyolov5などをトレーニングしたデータセットである場合、labelsディレクトリに.cacheファイルが残っていて以下のエラーが出ることがあるので、その場合は.cacheファイルを削除します。

```python
_pickle.UnpicklingError: STACK_GLOBAL requires str
```

### Configファイルの記述

トレーニングの構成を指示するファイルを作ります。.yaml ファイルに以下を記述します。

**・画像パス
・クラス数
・クラス名の配列**

を記述します。

```
train: ./datasets/my_dataset/images/train  # トレーニング画像ディレクトリ
val: ./datasets/my_dataset/images/val # 検証画像ディレクトリ
test:  # テスト画像ディレクトリ（オプション）

# Classes
nc: 80  # number of classes
names: [ 'person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 'train', 'truck', 'boat', 'traffic light',
         'fire hydrant', 'stop sign', 'parking meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep', 'cow',
         'elephant', 'bear', 'zebra', 'giraffe', 'backpack', 'umbrella', 'handbag', 'tie', 'suitcase', 'frisbee',
         'skis', 'snowboard', 'sports ball', 'kite', 'baseball bat', 'baseball glove', 'skateboard', 'surfboard',
         'tennis racket', 'bottle', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl', 'banana', 'apple',
         'sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza', 'donut', 'cake', 'chair', 'couch',
         'potted plant', 'bed', 'dining table', 'toilet', 'tv', 'laptop', 'mouse', 'remote', 'keyboard', 'cell phone',
         'microwave', 'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock', 'vase', 'scissors', 'teddy bear',
         'hair drier', 'toothbrush' ]  # class names
```


### Yolov7のセットアップ

```shell
git clone https://github.com/WongKinYiu/yolov7.git  # clone
cd yolov7
pip install -r requirements.txt # install modules
wget https://github.com/WongKinYiu/yolov7/releases/download/v0.1/yolov7.pt # download pretrained weight
```

モデルの事前トレーニング済みウェイトは公式リポジトリからダウンロードできます。

##### 備考：
Colabなど、使用環境によってはGPUメモリが不足することがあります。その場合は、バッチサイズを小さくすると学習できます。

### トレーニング

```shell
python train.py --workers 8 --device 0 --batch-size 32 --data data/coco.yaml --img 640 640 --cfg cfg/training/yolov7.yaml --weights 'yolov7.pt' --name yolov7 --hyp data/hyp.scratch.p5.yaml
```

モデルには、サイズと精度に応じて幾つか種類があり、モデルごとにconfigファイルがリポジトリに用意されているので、
事前トレーニング済みモデルとconfigファイルの種類を合わせて実行します。

学習が終わると、run/expに結果の重みとログが保存されます。

🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLやARKitを使ったアプリを作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)