darknetを使用してみる
windowsでdarknet
を使用して機械学習(物体検出)に触れてみたいと思います。
いちいち設定ファイルを作成するのはめんどくさいので、なるべく簡単に設定ファイルを作成できるようにYoloToolkitを作りました。
使い方を説明しながら実際に自前データで学習を行っていきます。
1.darknetのセットアップ
フレームワークにdarknet
を使用します。
YOLOの原論文を書いた人が作ったフレームワークです。(YOLOv4からは違う人が受け継いでます)
darknet
のセットアップは今回はできている前提で進めます。
できていない人は下記を参考にセットアップしてみてください。
・Windows で Darknet を使って 機械学習する
・YOLOv4環境構築①
・YOLOv4環境構築②
2.YoloToolkitをcloneする
このリポジトリをcloneします。(cloneして名前が変更されている場合はYoloToolkit
に変更してください)
簡単に学習できるようなプログラムやフォルダが集まっています。
C:.
├─backup # weightのバックアップ
├─cfg # Yolov4の設定ファイル
├─images # アノテーションに使用する画像
├─net # ネットワーク
├─toolkit # toolkit(*.py)
├─VoTT # VoTTの出力先
└─YoloDataset # 学習用のデータセット
3.データセットの作成
データセットを作成していきます。
今回はドライブレコーダーで撮影した映像からナンバープレートと車を検出するものを作成します。
3.1.画像収集
今回はドライブレコーダーで撮影された映像から学習に必要なデータを収集します。
データの収集方法は何でもいいです。
収集した画像はimagesディレクトリ
内にコピーしてください。
各種コードは.jpg
の画像を想定しているため拡張子は.jpgにしてください。(ほかの拡張子でも動作するようにそのうち変更します)
3.2.画像の整形
アノテーションを行う前に画像サイズを固定する必要があります。
アノテーション後にサイズを変更すると出力されるxmlファイルに書かれた座標がずれてしまい、アノテーションを再度する必要が発生する可能性があります。
YOLOv4は学習データの画像を32の倍数にする必要があります。
今回は416×416を使用します。
※自分のPCスペックを考えてサイズを決めてください。大きすぎるとメモリが足りなくなります。
今回はリサイズではなく、トリミングを使用して1920×1080の画像をトリミングします。
追記 2022/5/21
動作未確認ですが、コメントよりDarknetはcfgファイルのサイズに自動でリサイズされるようです。
今回は事前にトリミングを行なってからアノテーションを行います。
トリミング(trimming.py)
-
trimming.py
を実行して、拡張子、x座標、y座標、幅、高さを入力してください。
x座標、y座標はトリミングする領域の左上の座標を指定します。 - バリデーションが実行されて問題がない場合、サンプルとして領域が書き込まれたサンプル画像が表示されます。
- サンプル画像に表示された領域でトリミングを行う場合、
y
を入力すると全ての画像に対してトリミングが実行されます。
リサイズ(resize.py)
-
resize.py
を実行して、拡張子、幅、高さを入力してください。 - アスペクト比を保持したままリサイズされ、足りない場所は白で埋められます。
3.3.アノテーション(VoTT)
学習画像をリサイズやトリミングで固定サイズに整形できたらアノテーションを行います。
今回はアノテーションにVoTTを使用します。
YoloToolkitを使用する際のVoTTの使用方法は下記スライドを参考にしてください。
VoTTをインストールできていない人は下記を参考にインストールしてください。
・物体検出のアノテーションツール VOTT の使い方
・VoTTの使い方
3.4.makedataset.pyを実行する
toolkitディレクトリ
内にあるmakedataset.py
を実行します。
makedataset.py
を実行すると下記がまとめて実行されます。
①アノテーションの形式変更(xml->txt)
convert.pyを実行すると以下が実行される。
・xmlファイル
をパースしてYOLOv4形式のtxtファイル
を作成しYoloDatasetディレクトリ
に保存する
・xmlファイル
に対応する画像ファイル
もtxtファイル
と同時にYoloDatasetディレクトリ
にコピーする
②データの分割(train,val,test)
アノテーションされたファイルをtrain
,valid
,test
に分割します。
デフォルトでは、train=70%,valid=20%,test=10%に分割します。
※変更したい場合は、makedataset.py
のdata_split関数
のtrain_rate,valid_rateを変更してください。
各種振り分けられた結果はcfgディレクトリ
内にtrain.txt
,valid.txt
,test.txt
が作成され書き込まれます。
③設定ファイルの作成
YOLOv4を実行するのに必要な設定ファイルを作成します。
ファイル名 | 用途 |
---|---|
.name | アノテーションされたラベル対応する |
.data | class数、各種pathを記入する |
それぞれclasses.name
,test.data
で作成され設定が書き込まれます。
4.cfgファイルを作成
ネットワークの設定を行います。
書き方はdarknetのREADMEに書いてあります。
最初は最低限の変更だけでいいと思います。
netディレクトリ
内にyolov4-custom.cfgを入れてあるので各自変更してください。(他ネットワークも入ってる)
変更部分
[net]
それぞれ一か所ずつ
・batch=64
・subdivisions=64
それぞれスペックによって設定([7],[9]))
・width=(アノテーションを行った画像のサイズ)
# 今回は416
・height=(アノテーションを行った画像のサイズ)
# 今回は416
・max_batches=(クラス数*2000)もしくは6000の大きい方
# 今回は6000
・steps=(max_batchesの80%,90%)
# 今回は4800,5400
[convolutional]
[yolo]の前の層の[convolutional]3ヶ所→(1)、(2)、(3)
・filters=(クラス数+4+1)×3
# 今回は21
[yolo]
[yolo]3ヶ所→(1)、(2)、(3)
・classes=(クラス数)
# 今回は2
5.weightを用意する
学習済みのweights(yolov4.conv.137)をダウンロードしてcfgディレクトリ
内に配置してください。
6.学習を実行
cd [path to darknet]/darknet/build/darknet/x64
でdarknet.exeがある場所まで移動して下記コマンドを実行してください。
darknet detector train [path to YoloToolkit]/cfg/test.data [path to YoloToolkit]/net/yolov4-custom.cfg [path to YoloToolkit]/cfg/yolov4.conv.137 -map
※[path to YoloToolkit]
はYoloToolkit
をcloneした場所までのpathです。
※ pathが通ってない場合はdarknet.exeのpathを通してください
ネットワークが表示された後に学習が開始されたら学習が開始されます。
7.結果
学習がある程度進んだのでepochを1000で止めました。
cfgディレクトリ内のtest.txtに書いてあるtest画像でtestを行ってみます。
comand prompt
darknet detector test [path to YoloToolkit]/cfg/test.data [path to YoloToolkit]/cfg/yolov4.cfg [path to YoloToolkit]/backup/yolov4-custom_best.weights < [path to YoloToolkit]/cfg/test.txt
powershell
cat [path to YoloToolkit]/cfg/test.txt | darknet detector test [path to YoloToolkit]/cfg/test.data [path to YoloToolkit]/cfg/yolov4-custom.cfg [path to YoloToolkit]/backup/yolov4-custom_best.weights
今回はiterationが1000で止めたのでweightsにyolov4_1000.weightsを使用しました。
1枚目は結構うまくいってます。
2枚目はナンバープレートを二重で検出してしまっています。
3枚目はうまくいっていますが通行人も車として検出してしまっています。
もう少し学習を進めるとうまくいくかもしれないです。
動作確認環境
PC: Leginon 7 15IMH05
OS: Windows 10 Home
CPU: Intel(R) Core(TM) i7-10750H CPU @ 2.60GHz 2.59 GHz
GPU: NVIDIA GeForce RTX2080 Super with Max-Q Design
RAM: 32GB
参考
[1]Yolov4を使ったオリジナルデータの学習(with Ubuntu20.04)
[2]AlexeyAB/darknet
[3]YOLOv4(Darknet)で異常検知モデル作成挑戦(GoogleColab)
[4]Darknet YOLOv4 を Google Open Images Datasetのデータを使って学習させる with Elixir
[5]アノテーションファイル変換(xmlからYOLOへ)
[6]Windows で Darknet を使って 機械学習する
[7]Error: cuDNN isn't found FWD algo for convolution
[8]Error: l.outputs == params.inputs filters= in the [convolutional]-layer doesn't correspond to classes= or mask= in [yolo]-layer #2263
[9]what's the meaning of 'subdivisions' and how to set it's value? #224
[10]【Darknet】実行コマンドまとめ
[11]YOLOv4環境構築①
[12]YOLOv4環境構築②
[13]物体検出のアノテーションツール VOTT の使い方
[14]VoTTの使い方