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