YOLOv7でオリジナルデータを物体検出する

AI実装

この前(2022年6月)YOLOv6が出たと思ったら、2022年の7月にYOLOv7が公開されました。今回はYOLOv7を使ってオリジナルデータの学習と推論に挑戦してみます。また、YOLOv5lモデルとも比較してみます👍

YOLOv7はYOLOv5と非常に似ているので、YOLOv5で学習した経験があれば簡単に実装することができると思います。FarmLブログではYOLOv5の学習・推論について詳しく説明していますので、それをベースに実装していきます👍

YOLOv5の学習については↓の記事で詳しく説明しています。

YOLOv6はこちら↓。こちらも活用していくので併せてご覧ください。

YOLOv7とYOLOv5の比較

まずはYOLOv7とYOLOv5の比較をしてみます。

YOLOv7とYOLOv5lのモデルで比較しています。

YOLOv7はYOLOv5と学習の難易度は同じくらい簡単かつ、高精度に物体検出できることが分かります。よく見ると、YOLOv5で未検出のスナップエンドウを検出しており、感度は良さそうです。一方で、誤検出も目立つかな?と思います。

すみませんが、検出速度に関しては今回は未検証です😅

COCOデータセットの重みデータでの比較もやってみました。

YOLOv7の方が遠くの人を検出できており、感度良いですね👍

以下に、YOLOv7をローカルPCで動かした方法を記載します。

YOLOv7について

YOLOv7のアーキテクチャについては論文が公開されているので参考にしてみてください↓

YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors
YOLOv7 surpasses all known object detectors in both speed and accuracy in the range from 5 FPS to 160 FPS and has the highest accuracy 56.8% AP among all known ...

↓日本語で論文解説もされています。

YOLOv7を完全に理解した(YOLOv7の論文を読んでみた) | DevelopersIO

YOLOv7は速度/精度面において、既知の物体検出モデルを上回る結果となっています。YOLOv5と比較するとFPSで120%ほど速くなっているとのことでした↓

https://github.com/WongKinYiu/yolov7

FarmLブログで取り扱う農作物データでも同様か?ということで試してみます👍

YOLOv7の学習準備

学習環境

GPU搭載したローカルPCの環境で実装していきます。GPU環境のない方はGoogle Colabなどの利用をお勧めします。CPU環境ではしんどいです😂

  • OS : Windows 11
  • CPU : AMD Ryzen7 5800
  • メモリ : 16GB
  • GPU : GeForce RTX3070 8GB

CUDAやライブラリ関連は過去の記事と同じ環境で実施していきます。ここを参照してください。

インストール

ソースコードは↓を使っていきます。

GitHub - WongKinYiu/yolov7: Implementation of paper - YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors
Implementation of paper - YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors - WongKinYiu/yolov7

AnacondaPromptなどで↓のコードを実行してください。過去の記事でYOLOv5は手動でZIPファイルをダウンロードしていますが、同じことですのでやりやすい方を選択してください。

git clone https://github.com/WongKinYiu/yolov7
cd YOLOv7
pip install -r requirements.txt

PyTorchは1.8.1+cu111で動作確認しました。

学習データの準備

学習データの準備についてはYOLOv6と同様でやっていきます👍↓に詳細がありますので併せてご覧ください。

データセットの準備

物体検出用のデータセットを準備します。データセットは検出する物体に対しアノテーションという処理を実施し学習する必要があります。

独自のデータを準備しアノテーションを実施してください。アノテーションに“labelimg”を使う場合はYOLO形式(.txt)で保存してください。

今回(も)↓のようなスナップエンドウの画像を使っていきます。

  1. 画像データを保存してあるフォルダを指定する
  2. アノテーションしたデータを保存するフォルダを指定する
  3. YOLOフォーマットを指定する
  4. 物体検出したいモノをアノテーションして、保存する

データの配置

作業フォルダ直下にcustom_datasetフォルダを作成します。アノテーションしたデータセットを↓のように配置してください。

custom_dataset
├── images
│   ├── train
│   │   ├── train0.jpg
│   │   └── train1.jpg
│   └── val
│       ├── val0.jpg
│       └── val1.jpg
└── labels
    ├── train
    │   ├── train0.txt
    │   └── train1.txt
    └── val
        ├── val0.txt
        └── val1.txt

YAMLファイルをつくる

dataset.yamlファイルを作成していきます。dataフォルダ内にdataset.yamlファイルが格納されていると思います。この中身を↓のように修正してください。

# Please insure that your custom_dataset are put in same parent dir with YOLOv7_DIR
train: ./custom_dataset/images/train # train images
val: ./custom_dataset/images/val # val images
# test: ./custom_dataset/images/test # test images (optional)

# Classes
nc: 1  # number of classes
names: ['snap_pea']  # class names

dataset.yamlファイルを作成したら、dataフォルダへ保存してください。学習データの準備は以上でOKです。

YOLOv7で学習してみる

事前学習済み重みデータを準備する

GitHub中段の”Transfer learning”に重みデータ(****.pt)があるのでダウンロードしてください。今回は”yolov7_training.pt”を使います。ダウンロードしたら、作業フォルダ直下にweightsフォルダを作成し、そこへ保存してください。

学習

下のコードをAnacondaPromptなどで実行して学習します。

python train.py --workers 8
         --device 0 
         --batch-size 8
          --data data/dataset.yaml
          --img 640 640
          --cfg cfg/training/yolov7.yaml
          --weights './weights/yolov7_training.pt'
          --name yolov7_snap_pea
          --hyp data/hyp.scratch.p5.yaml

引数の詳細はtrain.pyの中身に記載されているのでご確認ください。

学習結果は”runs/train/yolov7_snap_pea”フォルダの中に格納されます。

ハイパーパラメータ進化

YOLOv5でハイパーパラメータ進化ができましたが、YOLOv7でもできます。

  • 上で学習した重みデータ(best.pt)をweightsフォルダへ移動
  • –evolveを追加
python train.py --workers 8
                --device 0
                --batch-size 8
                --data data/dataset.yaml
                --img 640 640
                --cfg cfg/training/yolov7.yaml
                --weights './weights/snap_yolov7_best.pt'
                --name yolov7_evolve
                --hyp data/hyp.scratch.p5.yaml
                --evolve

出力(yolov7_evolve)フォルダにhyp_evolved.yamlが格納されていると思います。これが進化後のパラメータなので、これを使って再度学習させればOKです👍(–hyp の後のパスを書き換えればOKです)

YOLOv7学習結果

学習結果の出力フォルダ(”runs/train/yolov7_snap_pea”)の中に結果が格納されているので確認していきます。

YOLOv7学習結果

Results.pngを見ていきます。

YOLOv7学習結果(Results.png)

Box、Objectnessのロスが下がっており学習が進行しているのが分かります👍

最終的に精度はmAP@0.5:0.83となりました。特別難しい調整などなく、高精度なモデルが得られたと思います👍

YOLOv5学習結果との比較

YOLOv5の結果を↓に示します。mAP@0.5は0.85とYOLOv7と比較し若干良い結果となっています。

YOLOv5学習結果(Results.png)

Precision/RecallをYOLOv7と比較は↓

ModelPrecisionRecall
YOLOv70.830.79
YOLOv50.950.75

RecallはYOLOv7が優れており、PrecisionはYOLOv5の方が優れていることが分かります。

YOLOv7は感度高いですが、一方で間違えたモノでも多く検出していたのはRecallが高く見逃しが少ないモデルとなっているためと考えられます。

どちらのモデルが優れているか?は使い方次第なので言えませんが、私はYOLOv5の方が好きですかね🚀🚀🚀

YOLOv7で学習した重みを使って推論する

↓のコードを実行すると推論してくれます。画像や学習済み重みのパスはご自身の環境に合わせ指定してください。

python detect.py --source ./data/inference/ #推論したい画像のパスを指定
                 --weights ./runs/train/exp/weights/last.pt #学習した重みを指定
                 --conf 0.3 
                 --line-thickness 6 #バウンディングボックスの線の太さ。入力画像に応じお好みで変えてください

推論結果は./runs/detect下に保存されます。

いい感じの物体検出ができました👍

YOLOv5の様々な使い方について

FarmLブログではYOLOv5の様々な使い方を紹介しています。お時間あれば併せてご覧ください。

  • 独自データをつかったYOLOv5の学習方法
  • 事前学習済みデータを転移学習したYOLOv5の学習方法
  • 遺伝的アルゴリズムを利用したYOLOv5のパラメータ最適化手法
  • YOLOv5で物体検出した画像を切り出して学習データにする方法
  • YOLOv5で物体検出した作物の数を数える【Object Counter】
  • Ultralystics社よりインタビューを受けた内容がブログになりました👍
YOLOvME: Making Snap Pea Detection Easy by Ultralytics Team
Discover how Takayuki Nukui applies YOLOv5 AI for efficient snap pea harvesting—blending machine learning with traditional farming.

コメント

  1. のーす より:

    学習環境のGPUの部分、RTX3700になってます!

タイトルとURLをコピーしました