DeepLearning
YOLO
YOLOv2

YOLOv2を独自データセットで訓練する

More than 1 year has passed since last update.


YOLOv2を自分で用意したデータで訓練する

YOLOv2はまだ論文も発表されていないが ソースコードがホームページで公開されているので自分のデータで訓練し試してみた

YOLO9000: Better, Faster, Strongerというタイトルで論文が発表されている


データセットの用意

画像と対応するアノテーションデータは用意済と仮定する

YOLOでは画像の座標ではなく割合で表現するのでデータを変換する必要がある

いままでのYOLO(Old YOLO)と同じデータフォーマットなのでこういったサイトを参考に用意する


cfgファイルの変更

出力クラス数に合わせて設定ファイルを変更する

今回はTiny YOLOを用いることとする


  • ラベルの設定ファイル

data/voc.namesを参考に作成

ペンと消しゴムの2クラスの場合は以下のようになる


my-dataset.names

pen

eraser


  • 使用するデータを指定するファイル

cfg/voc.dataを参考に作成

例を下に示す


my-dataset.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_rate0.0001くらいがおすすめ

経験と勘で丁度良く設定

max_batchesも自由に設定(初期値でも問題なし)

filters = num * (classes + coords + 1)

例を以下に示す


my-dataset.cfg

[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