Yolov7のつかいかた（推論、学習）

# Yolo最新モデルを使ってみよう

![img.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/1a77ae21-0777-b232-58d1-b5c418b39dec.jpeg)

https://github.com/WongKinYiu/yolov7

物体検出モデルYolov7（２０２２リリース）は、従来のYoloモデルに比べて高速かつ高精度と謳われています。

<img src=https://github.com/WongKinYiu/yolov7/raw/main/figure/performance.png width=600>

Yolov7による、推論、学習、検証のやり方です。

# １、セットアップ

```shell
git clone https://github.com/WongKinYiu/yolov7.git # リポジトリをクローン
cd yolov7 # ディレクトリ内へ移動
pip install -r requirements.txt # 必要なpythonライブラリをインストール
wget https://github.com/WongKinYiu/yolov7/releases/download/v0.1/yolov7.pt # 事前トレーニング済みの重みをダウンロード
```

# ２、推論

入力のパスを指定して実行します。

```shell
python detect.py --weights yolov7.pt --source inference/images/horses.jpg
# --sourceに自前の画像や画像ディレクトリ、動画ファイルのパスを指定する
```

runs/detect/exp/
に推論結果画像が保存されます。


# ３、学習

トレーニング用の重みをダウンロードする

```shell
wget https://github.com/WongKinYiu/yolov7/releases/download/v0.1/yolov7-e6e_training.pt
```

### データを用意する

データは

**・画像
・画像に対応するアノテーション・テキスト・ファイル**

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

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

```
class x_center y_center width height
```

ボックス座標は、正規化されたxywh形式（0〜1）である必要があります。
ボックスがピクセル単位の場合は、画像の幅と画像の高さで割ります。
クラス番号は0から始まります。

以下のようなアノテーション・サービスを使って画像のボックスとラベルをテキストにします。

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

アノテーションが終わったら、以下のようなディレクトリ構成にまとめます。

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

```
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
            |__...
```


### Configファイルの記述

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

```custom.yaml
# train and val data as 1) directory: path/images/, 2) file: path/images.txt, or 3) list: [path1/images/, path2/images/]
train: my_dataset/images/train/
val: my_dataset/images/val/

# number of classes
nc: 3

# class names
names: [ 'my_class_0', 'my_class_1', 'my_class_2']
```

モデルの大きさによって、二種類のトレーニングスクリプトから選んで実行します。

--cfg はcfgフォルダからモデルの種類に合わせて指定します。
--weight は、自分が使いたいモデルのweightをリポジトリからダウンロードします。
--data　は上の手順で作った独自データセットのyamlファイルを指定します。
--projectと--nameで指定したフォルダに結果の重みと数値表が保存されます。

**トレーニング中にメモリ不足でエラーになった場合はbatch-sizeを小さくして実行すると、学習できます（２のn乗の値にする）**

p5モデル（入力サイズ640のモデル）

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

p6モデル（入力サイズ1280のモデル）

```shell
python train_aux.py --workers 8 --device 0 --batch-size 16 --data data/custom.yaml --img 1280 1280 --cfg cfg/training/yolov7-e6e.yaml --weights 'yolov7-e6e_training.pt' --name yolov7-e6e --hyp data/hyp.scratch.custom.yaml --project "runs/"
```

# 検証

--weight にトレーニングで保存されたweightを指定します。
--data に検証用のデータセットパスを記載したyamlファイルを指定します。

```shell
python test.py --device 0 --batch-size 2 --data data/val_custom.yaml --img-size 640  --weights "runs/yolov7/exp/weights/last.pt"
```

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

機械学習、ARアプリ（Web/iOS）を作っています。
機械学習／AR関連の情報を発信しています。

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