YOLOv2を自分で用意したデータで訓練する
YOLOv2はまだ論文も発表されていないが ソースコードがホームページで公開されているので自分のデータで訓練し試してみた
YOLO9000: Better, Faster, Strongerというタイトルで論文が発表されている
データセットの用意
画像と対応するアノテーションデータは用意済と仮定する
YOLOでは画像の座標ではなく割合で表現するのでデータを変換する必要がある
いままでのYOLO(Old YOLO)と同じデータフォーマットなのでこういったサイトを参考に用意する
cfgファイルの変更
出力クラス数に合わせて設定ファイルを変更する
今回はTiny YOLOを用いることとする
- ラベルの設定ファイル
data/voc.names
を参考に作成
ペンと消しゴムの2クラスの場合は以下のようになる
pen
eraser
- 使用するデータを指定するファイル
cfg/voc.data
を参考に作成
例を下に示す
classes = 2
train = data/my-dataset/train.txt
valid = data/my-dataset/test.txt
names = data/my-dataset.names
backup = ./backup
- ネットワーク定義のファイル
cfg/tiny-yolo-voc.cfg
を参考に作成
classes
をデータセットに合わせて変更
その上のconvolutional
レイヤーのfilters
を以下の式から算出して変更
lerning_rate
は0.0001
くらいがおすすめ
経験と勘で丁度良く設定
max_batches
も自由に設定(初期値でも問題なし)
filters = num * (classes + coords + 1)
例を以下に示す
[convolutional]
size=1
stride=1
pad=1
filters=35
activation=linear
[region]
anchors = 1.08,1.19, 3.42,4.41, 6.63,11.38, 9.42,5.11, 16.62,10.52
bias_match=1
classes=2
coords=4
num=5
softmax=1
jitter=.2
rescore=1
object_scale=5
noobject_scale=1
class_scale=1
coord_scale=1
absolute=1
thresh = .6
random=1
訓練する
darknetにtrainを引数で与えて訓練する
重みの初期値をdarknet.conv.weights
とするなら以下のように指定する
指定のbatch数ごとの重みのスナップショットがbackupに指定したディレクトリ以下に作成される
darknet detector train cfg/my-dataset.data cfg/my-dataset.cfg darknet.conv.weights
ウェブカメラを用いてリアルタイム検出する
YOLOのサイトにあるように以下のコマンドで実行
darknet detector demo cfg/my-dataset.data cfg/my-dataset.cfg my-dataset.weights