Yolov5による物体検出 記事一覧
- (1): 概要 ← イマココ
- (2): 環境構築と訓練済みモデルを使った動作確認
- (3): 少量のデータによる訓練と動作確認 ← 後で書く
最近ちょっと物体検出を試す機会があったので、少しまとめておきます。
物体検出の方法にはいくつかの方式がありますが、今回はYolov5というの使います。選んだ理由は単に以前に受講したCourseraのDeep Learning講座でYoloを習ったから、というだけなので深い意味はないです。v5はオリジナルのYolo作者とは別の人が作ったものだからYoloを名乗るのはおかしい、という指摘もあるみたいですが、まあ細かいことは気にしない。
作業は以下の手順で進めます。
- 環境構築
- Pythonとパッケージのインストール
- 訓練済みモデルを使った動作確認
- 少量のデータによる訓練と動作確認
- 訓練データフォーマットの調査
- 訓練データ生成スクリプトの作成
- 本番データでの訓練と結果確認
環境構築
まずは必要なパッケージをインストールして動作を確認します。Yolov5をはじめ、たいていのツールには訓練済みモデルが用意されているのでまずはこれを使います。いきなり自前のデータで訓練すると、うまく動かなかったときの原因究明が面倒だからです。必要なパッケージはたいていドキュメントに書いてあるので簡単、と思いきや以下のような理由で意外と苦労することが多いです。
- Python本体とフレームワーク(tensorflow, pytorchなど)のバージョンの相性
- CUDAが使えるかどうか
- LinuxかWindowsか
- パッケージをpipで入れるか、Anacondaか
訓練データフォーマットの調査
とりあえずの動作確認ができたら次にやるのは訓練データの構成とフォーマットの調査です。画像からの物体検出の学習には画像とラベルの情報が必要ですが、その構成やフォーマットはツールによってさまざまです。以下のようなことが明確になっていなければ訓練データを作ることができません。
- 画像・ラベルファイルを置くときのフォルダ構成
- ラベルファイルは全画像の情報を1つのファイルに入れるか、1画像に対して1ファイルか
- ラベルファイルのフォーマットの詳細(XML、JSON、CSVなど)
- バウンディングボックスはx, y, width, heightか、対頂点の座標(x1, y1, x2, y2)か
- バウンディングボックスの座標等の値はピクセルか、幅・高さを1としたときの相対値か
訓練データ生成スクリプトの作成
これらが明らかになったら、学習させたいデータセットからツールが期待する構成・フォーマットのデータセットを生成するスクリプトを書きます。このとき、使用するデータの数を指定できるようにしておき、最初は極少数(例えば10個程度)にし、epochも少なくします。もちろんこれではまともなパフォーマンスは望めませんが、まずは訓練スクリプトがエラーなく実行され、モデルが出力されることを確認します。また、このときかかる時間も計測しておきます。
訓練スクリプトが無事動いたらもう少し数を増やして(例えば1000個 x 30 epochs)試してみます。これくらいやればある程度は認識できていることが確認できるかと思います。これで全くデタラメな結果が出たら、多分何かが間違ってます。
本番データでの訓練と結果確認
ここまでできたらもっと多くのデータを使って訓練します。時間はかかるでしょうが待つだけです。
ということで次回「環境構築と訓練済みモデルを使った動作確認」に続く。