YOLOを使ってドアラ検出〜後編〜
目次
前回の続き
melheaven.hatenadiary.jp
設定ファイルの編集
ここで編集する設定ファイルは最低3つです。
yolov2.cfg
あなたが用いるYOLOアルゴリズムの種類によって編集するファイルは変わってきます。
今回ではYOLOv2を用いるので、Darknet/cfg/yolov2.cfgを開きます。
yolov2.cfgでは主にハイパーパラメータの設定を行います。
Darknet/cfg/yolov2.cfg
batch=64 subdivisions=2 width=416 height=416 channels=3 momentum=0.9 decay=0.005 angle=0 saturation=1.5 exposure=1.5 hue=-1 learning_rate=0.001 burn_in=1000 max_batches=50000 policy=steps steps=40000,45000 scales=.1,.1 [convolutional] 以下続く...
重要な要素を説明していきます。
- batch・・・1エポックあたり抽出するサンプル数。
- subdivisions ・・・batchをsubdivisions分、分割させミニバッチサイズを特定できる。
- height/width ・・・入力層の画像サイズ
- learning_rate ・・・学習率
- max_batches ・・・最大エポック数
ファイル下部の[convolutional]にも変更点
- Classes ・・・クラス数
- Filters ・・・(Classes+5)*5
Classes=1ならばFilters=(1+5)*5=30となります。
以下のリンクはYOLOv3についてですが非常に参考になるサイトです。
www.miki-ie.com
cfg/obj.names
オリジナルクラス名を英語で入力します。
yolov2.cfgで指定したClasses(クラス数)と一致する分だけ入力してください。
教師データ作成時に活用したLabelImg/data/predefined_class.txtと書き方はほぼ同じです。
例えば・・・
Darknet/cfg/obj.names
doara
こんな感じ。
cfg/obj.data
- classesは①yolov2.cfgで指定したClasses(クラス数)、②LabelImg/data/predefined_class.txtで書き込まれたクラス数、③cfg/obj.namesで書き込まれたクラス数と一致していると、すんなり学習できると思います。
- trainとtestはdata/doaraに存在するファイル名に設定してください。
- backupは重みファイルが保存されるフォルダです。
Darknet/cfg/obj.data
classes=1 #適宜変更してください train=data/doara(フォルダ名)/train2020.txt(PATHファイル) test=data/doara(フォルダ名)/test2020.txt(PATHファイル) names=obj.names backup=backup/
darknet19_448.conv.23を取得
darknet19_448.conv.23は重みの初期値として適切なデータセットです。
darknet19_448.conv.23はYOLOv2での学習においては問題ありませんが、YOLOv3ではスムーズに学習できません。
Terminal wget https://pjreddie.com/media/files/darknet19_448.conv.23
darknet19_448.conv.23の場所はDarknet/darknet19_448.conv.23です。
これで学習の準備が整いました。
学習
ターミナル上で以下のコマンドを入力します。
#current -> ~/Darknet make clean make ./darknet detector train cfg/obj.data cfg/yolov2.cfg darknet19_448.conv.23
IoUが高いほど精度は向上しています。
IoUとは実際にドアラである or モデルがドアラと予測した領域から、モデルが正確にドアラであると予測した領域の割合を示しています。
mAPやIoUの詳細は以下のリンクへ。勉強になるサイトです。
qiita.com
テスト
テスト画像1枚だけ検出させたい場合
検出したい画像(test.jpg)を[Darknet]/dataに格納します。
$ ./darknet detector test cfg/obj.data cfg/yolov2.cfg backup/yolov2.backup data/test.jpg(検出したい画像) -thresh 0.5
threshは閾値です。0~1を後ろから指定します。
1を指定すると全く検出されませんし、0を指定すると何もかも検出してしまいます。
閾値の選定には塩梅を見てやる必要があります。
きちんと検出できています。
テスト画像複数枚を一気に検出させたい場合
Darknet/dataに検出したい画像群を格納するtest_doara(適宜変更)フォルダを作成します。
Darknet/data/test_doara(適宜変更)に検出したい画像を格納。
今回はシェルスクリプトを活用して、test_doara(適宜変更)フォルダ内の画像を自動で検出させます。
Darknet/test_yolov2.sh
#!/bin/bash #echo "---- Debug Message----" echo "param1 = $1" #echo "---- Debug Message----" #$1は引数ーコマンドで指定 for filename in "$1"*.jpg do dname=$(dirname $filename) fname=$(basename $filename .jpg) ./darknet detector test cfg/obj.data cfg/yolov2.cfg backup/yolov2.backup "$filename" -thresh 0.5 convert predictions.png predictions.jpg mv predictions.jpg "$filename".res mv predictions.txt "$dname"/"$fname".txt done
以上のシェルスクリプトを動作させます。
#current -> ~/Darknet $ bash test_yolov2.sh data/test_doara(適宜変更)/