今回は小さくて数の多いモノの物体検出に挑戦します。人の目で見分けるのが難しいモノは基本的に物体検出も難しくなります。今回は↓のような稲の画像から米一粒一粒を物体検出するモデルをつくるため、かなり難しいモデルになると予想されます。
今回は物体検出アルゴリズムとしてYOLOv5をつかっていきます。教師データは自前画像です。
学習をより良く進めるためハイパーパラメータ最適化を実施していきます。ハイパーパラメータとは「推論や予測の枠組みの中で決定されないパラメータ」とウィキペディアには記述されていますが、AIをつくる過程で人が決定する値のことです。
なんとYOLOv5にはHyperparameter Evolutionという遺伝的アルゴリズムを利用したパラメータ最適化機能が備わっています。これを使って最適パラメータで学習を進めモデルをつくっていきます。
↓過去にもYOLOv5による物体検出の記事を掲載しております。よかったら併せてご覧ください。
米粒のアノテーション
米一粒一粒のアノテーション処理を実施しました。アノテーションソフトは「labelimg」を利用しています。詳しくはここに使い方を記載していますのでご参照ください。↓の感じでアノテーションしていきます。
・・・地獄の作業でした。手前にあるコメを物体検出できるように、一粒一粒が大きく写っている部分についてアノテーションしています。今回30枚ほどアノテーション画像を用意しました。(ここが限界・・・)ディープラーニングとしてはデータ数が少なすぎですが、ハイパーパラメータチューニングでどこまで物体検出できるようになるか挑戦していこうかと思います。
YOLOv5学習準備
YOLOv5学習の前準備をしていきます。過去の記事にこの辺りの詳細を記載していますので、必要あれば参照していただくと良いかと思います。
学習環境
- Windows 10
- CPU : AMD Ryzen 7 5800
- GPU : RTX3070 8GB
事前準備としてCUDA、cudnnのインストールします。この辺りはここに詳しく掲載されているので、その通りにインストールしています。インストールしたバージョンは下記です。
- NVIDIA CUDA Toolkit 11.4
- NVIDIA cuDNN v8.2.0
ソースコード・ライブラリをインストール
YOLOv5をgithubからクローンし、必要なライブラリをインストールしてください。↓のコードを実行する
git clone https://github.com/ultralytics/yolov5
cd yolov5
pip install -r requirements.txt
データの配置
アノテーションした画像とtxtデータを下記dataディレクトリ下へ保存してください。
data.yamlファイル作成
txtファイルを作成し、下記を記入してください。
train: data/train/images
val: data/valid/images
nc: 1
names: [‘A’]
記入しましたら、ファイル名をdata.yaml(拡張子をyaml)にしてYOLOv5ディレクトリ下へ保存してください。
以上で準備完了です。
ハイパーパラメータチューニング
冒頭でも述べましたが、YOLOv5には遺伝的アルゴリズムを利用したハイパーパラメータチューニングの機能があるので実行していこうと思います。
そもそもYOLOv5のデフォルトのハイパーパラメータは”data/hyps/hyp.scratch.yaml”です。中身をみていただくと、学習率(lr)であったり、warmup関連や、DataAugmentation関連のパラメータが設定されています。これらの値を今回学習するモデルに合わせ最適な数値にしていこう!というモノになります。
YOLOv5ではハイパーパラメータを遺伝的アルゴリズムで更新していきます。これをYOLOv5ではハイパーパラメータ進化と言っています。遺伝的アルゴリズムの詳細は割愛しますが、クロスオーバー(遺伝子のシャッフル)と突然変異を利用し300世代のパラメータ進化をする仕組みとなっています。
っと説明はややこしいですが、↓のコードを実行すれば進化は始まります。
python train.py --data data.yaml --weights yolov5l.pt --epochs 10 --cache --evolve
そこそこ時間かかるのでお待ちください。進化が終了すると、/runs/train/evolve/hyp_evolved.yamlに進化完了したハイパーパラメータが格納されています。開いてみるとデフォルトと数値が変化しているのが確認できると思います。
YOLOv5学習
進化させたハイパーパラメータをつかって学習していきます。↓のコードを実行ればOKです。引数「–hyp」でハイパーパラメータを指定してください。
python train.py --data data.yaml --cfg yolov5l.yaml --weights yolov5l.pt --batch-size 2 --epochs 1000 --hyp ./runs/train/evolve/hyp_evolved.yaml
runs/train/exp/weightsにlast.pt、best.ptが入ってると思います。ここではbest.ptを重みファイルとしてつかいます。best.ptをyolov5ディレクトリ直下へコピーしてください。
結果を見てみる
↓のコードを実行すると推論を実行することができます。
#images
python detect.py --source ./data/valid_ine/images/ --weights best.pt --conf 0.1
#movies
python detect.py --source ./data/movies_ine/ --weights best.pt --conf 0.1 #--sourceに保存ディレクトリを指定してください
検証用データ(学習に用いていないデータ)での推論結果を↓に示します。
結果、いい感じに物体検出しているように見えます。拡大すると、
2粒同じバインディングボックスになったり、重複したりしているのが分かります。精度を求めるとしたらもっと画像枚数が必要そうです。とは言え、ハイパーパラメータ進化を使うことで良く学習できたかなと思います。
動画はこんな感じです。手前の稲にだけ物体検出が反応する感じが分かると思います。
以上になります。米粒は色んな意味で難しかったですが、うまく学習できれば、発育状況を把握したり、病気の米粒を見つけたりできる可能性があると思います。じっくり見て確認しないと分からないことがAIでできるようになると素晴らしいですね👍
コメント