超解像コンペの側、物体検出も勉強してみようということで、有名なYOLOモデルの最新版を動かしてみて、自作データの作成、学習までの方法を紹介します。
環境
Mac OS Monterey ver12
python: 3.8.12
PyTorch: 1.9.0
学習済みモデルの準備
普段ならJupyterやColabでモデルを構築して学習させてとやるところですが、YOLOに関してはGithub上からリポジトリを引っ張ってきて学習させます。
# 作業フォルダ作成
mkdir YOLOv5
cd YOLOv5
# リポジトリをコピー,移動
git clone https://github.com/ultralytics/yolov5
cd yolov5
以降このリポジトリ内のフォルダやファイルを編集していきます。
自作データの作成
物体検出タスクでの自作データセットを作るには
- 画像データ
- 画像データに対するアノテーションデータ
の2つが必要になります。
アノテーションデータとは、画像のどこに物体があるかを示すデータのことで
1.物体のラベル
2.物体を囲む矩形の左上のx座標
3.物体を囲む矩形の左上のy座標
4.矩形の高さ
5.矩形の幅
の5つの情報で構成されています。
ではこの2つを作成していきます。
画像データ
今回は顔検出をしたいので、顔が写っている画像ならなんでもいいと思います。
コチラでスクレイピングして集めた櫻坂メンバーの画像フォルダから30枚ほど使います。
ただ理想は300枚ほど欲しいです。ただその分アノテーションデータの作成が苦行になります。
アノテーションデータ
アノテーションデータ作成には、アノテーションツールを使います。
今回はVoTT
というツールを使います。ダウンロードはコチラ。
macならdmgファイルを、windowsならexeファイルをダウンロードしてインストールしてください。
インストールして起動すると以下の画面が開かれるはずです。
新規プロジェクトをクリック。
表示名、説明
は自由
プロバイダー
はローカルファイルシステム
を選択してフォルダーパス
のフォルダーを選択
をクリックしたら、アノテーション付けする画像が格納されたフォルダを選択します。
最後に接続を保存
をクリック。
そうしたらソース接続
がさっき設定したフォルダになっているはずです。
今回はフォルダ分けするのがめんどくさいのでターゲット接続
も同じフォルダにします。
このターゲット接続
に設定したフォルダにアノテーションデータ等必要なものが保存されるので自分の好きなとこでいいと思います。
問題なければ一番下のプロジェクトを保存
をクリック。
そうすると以下のように編集画面が開くはずです。
使い方は
右のTAGS
の+
を押して矩形領域につけるラベル名を作成、画像の領域をドラッグして囲って、ラベルを適用する
という流れになります。
上記のように顔の部分を囲って、右のface
タグをクリックするだけで囲った矩形領域にfaceというラベルをつけることができます。
操作自体はシンプルで簡単なので、問題ないと思いますがこれを何百枚もやるというのは大変ですね、、、
また複数ラベルだったりすると、1枚アノテーション付けするのに時間がかかっちゃうので、、、(想像もしたくない)
今回は30枚で妥協させてください。
全部アノテーション付けが終わったら、中央のアイコン群のプロジェクトをエクスポート
をクリックします。
こうしたフォルダが作成されているはずです。この中に画像データとそれに対するアノテーションデータがひとまとめになって入っています。
さてこれで完了!学習と行きたいところですが、このままでは学習には使えません。
作成したデータをYOLOv5でも使える形式に変換する必要があります。
アノテーションデータを変換
VoTTで作成したアノテーションデータをYOLOv5でも使えるようにroboflowというツールを使って変換します。
アカウントを作成してログインすると以下のような画面になるはず(個人情報部分黒くしてます)
初めてログインするとプロジェクトの種類を選ばされるはずなので、Public Projects
でいいと思います。
Create New Project
をクリック。
Project Name
, License
は自由
Project Type
は物体検知なのでObject Detection(Bounding Box)
を選択
Annotation Group
は何でもいいですが、アノテーション付けするグループ名(動物、乗り物、人とか)をつけとくといいのではと思います。
僕は以下のようにしました。
これでCreate Public Project
を押すと以下の画面に。
ここに先ほどのvott-json-export
フォルダを丸ごとアップロードします。
All Images
とAnnotated
の数が一緒なら画像とアノテーションデータが一致して正しく読み込まれています。
大丈夫そうなら右上のFinish Uploading
をクリック。
そうするとTrain, Valid, Testに分割する割合を選択できるので好きなように選択。
別に後で変更もできるので適当で大丈夫です。
Continue
をクリック。
そうしたら、ここまでで右のSource Images
, Train/Test Split
までの工程が完了しています。Preprocessing
はデフォルトでAuto-Orient
とResize
が設定されています。
前処理のオプションを選択できるので、もし追加したい場合はここから好きなものを追加しましょう。
今回はデフォルトで行きます。Continue
をクリックすると次はAugmentation
の設定に移ります。
こんな感じでたくさん選択できます。今回はさすがに30枚は少なすぎるので
上記のような水増しで行きます。Continue
を押して
Maximux Version Size
を選択して、Generate
をクリックします。無料枠だと3倍までしか選択できません。
こんな画面になるはずです。
もし新しい水増しを適用させたい場合は左のNew Version
をクリックすれば大丈夫です。
Export
をクリックして
Formatは今回はYOLOv5を使うのでYOLO v5 PyTorch
をダウンロード方法は好きな方を選択してContinue
。
今回はzipでダウンロードしたので解凍すると
こんな中身になってるはず。
そしたらまずは、train,valid,testフォルダを丸ごと、先ほどコピーしたリポジトリ内のdata
ディレクトリに移動させます。Jupyter Labで見るとこんな感じ。
次にdata.yamlファイルをyolov5ディレクトリ直下にあるdata.yamlファイルと置き換えます。
このままだとディレクトリを読み込んでくれないのでdata.yamlを以下のように編集します。
train: ./data/train/images
val: ./data/valid/images
test: ./data/test/images
nc: 1
names: ['face']
別にtestの記載はなくてもいいです。
これで学習の準備は整いました。
いざ学習
以下のコマンドをターミナルで実行します。
python train.py --img 416 --data data.yaml --weights yolov5s.pt --batch-size 16
引数の詳細
--img
で画像の入力サイズ
--data
で学習用データの詳細を読み込むファイルを指定
--weights
で使用する学習済みモデルの重みを選択
今回は一番小さいyolov5s
を使います。
うまくいくとruns/train/exp
ディレクトリに学習の詳細情報が保存されていきます。
result.csv
なんかは各種lossの値などがcsv形式で確認できて便利です。
推論
正直データ枚数も少ないので精度は微妙です。
評価データの結果は、学習が終わった時に保存されるval_batch0_pred.jpg
に表示されていて、今回はこんな感じになりました。
testデータの画像を推論したい場合は以下のコマンドを実行します。
python detect.py --source data/test/images --weights runs/train/exp/weights/best.pt --conf 0.1
引数の説明
--source
は推論したい画像の格納先を指定
--weights
は推論時のモデルの重みを選択
--conf
はある物体が存在する確率がここに設定した確率値以上のものだけを矩形で囲む
学習した重みはruns/train/exp/weights
ディレクトリの中にbest.pt
とlast.pt
の2つが保存されているのでbest.pt
で推論します。
実行するとruns/detect/exp
ディレクトリ内に結果画像が保存されています。
まぁ精度はダメダメですね、、、
30枚は少なすぎるので、データ枚数もっと増やす必要がありますね。もしくはエポック数増やすか、モデルを大きいものにするか。
まとめ
YOLOv5を使って物体検知をやる流れを説明しました。
物体検知タスクへのハードルが下がれば幸いです。
知見が深まったら、物体検知の精度アップへの記事も書こうと思います。