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を指定すると何もかも検出してしまいます。
閾値の選定には塩梅を見てやる必要があります。

f:id:electric-city:20200326000130j:plain:w200:h200
きちんと検出できてます

f:id:electric-city:20200326000204j:plain:w175:h200
対燕、鷹でも大丈夫

きちんと検出できています。

テスト画像複数枚を一気に検出させたい場合

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(適宜変更)/