みらいテックラボ

音声・画像認識や機械学習など, 週末プログラマである管理人が興味のある技術の紹介や実際にトライしてみた様子などメモしていく.

YOLOv3を試してみる(2)

オリジナルデータで物体検出を試してみたくなり, 久々にYOLOを触ってみることに...
YOLOは, 昨年少し触っていたYOLOv2からYOLOv3にバージョンアップしており, 今回はYOLOv3のモデル学習について公開データをもとに手順等の確認を行った.


関連記事:
YOLOv2を試してみる(1)
・YOLOv3を試してみる(2)
YOLOv3を試してみる(3)


YOLOv3のインストールもモデル学習も基本的には公式ページにある手順で問題なく行えるが, オリジナルデータで学習する際にはモデル構造の定義などを変更する必要があるので, 少しまとめておく.


1. 学習手順[1][2]
1.1 学習データの準備
公式サイトを参考に学習データをダウンロードし, 解凍する.

wget https://pjreddie.com/media/files/VOCtrainval_11-May-2012.tar
wget https://pjreddie.com/media/files/VOCtrainval_06-Nov-2007.tar
wget https://pjreddie.com/media/files/VOCtest_06-Nov-2007.tar
tar xf VOCtrainval_11-May-2012.tar
tar xf VOCtrainval_06-Nov-2007.tar
tar xf VOCtest_06-Nov-2007.tar


1.2 ラベルファイルの作成
YOLOの学習データのラベルは, 以下のフォーマットで各画像ファイル毎に作成する.

<ラベル> <矩形の中心座標x/画像幅> <矩形の中心座標y/画像高さ> <矩形の幅/画像幅> <矩形の高さ/画像高さ>

今回は, ダウンロードした学習データのラベルを上記の形式に変換する.
変換ツールが準備されているので, これをダウロードし, 実行する.

wget https://pjreddie.com/media/files/voc_label.py
python voc_label.py

ls
2007_test.txt   VOCdevkit
2007_train.txt  voc_label.py
2007_val.txt    VOCtest_06-Nov-2007.tar
2012_train.txt  VOCtrainval_06-Nov-2007.tar
2012_val.txt    VOCtrainval_11-May-2012.tar

ちなみに, 変換後のラベルを覗いてみると, 以下のような感じ.
例:./VOCdevkit/VOC2007/JPEGImages/000001.jpg
f:id:moonlight-aska:20181224131630j:plain:w250

cd ./VOCdevkit/VOC2007/labels
cat 000001.txt
11 0.34419263456090654 0.611 0.4164305949008499 0.262
14 0.509915014164306 0.51 0.9745042492917847 0.972


1.3 学習パラメータ等の設定
darknetインストールディレクトリ下のcfg/voc.dataをコピーし, train, validに上記画像データのリストファイルを設定する.
例:cfg/mytrain.data

classes= 20   # クラス数
train  = data/darknet/train.txt   # 学習用画像データリスト
valid  = data/darkent/2007_test.txt   # 評価用画像データリスト
names = data/voc.names   # クラスのリスト
backup = backup    # 重みの保存ディレクトリ

また, オリジナルデータで学習する場合, モデル構造を定義するcfg/yolov3-voc.cfgをコピーし, 以下の箇所を修正するらしい.
修正箇所
・[net]のbatch, subdivisionsをTrainingモードの値に設定する.
・[yolo]内のclassesにクラス数を設定する. 3か所.
・[yolo]の直前の[convolutional]のfiltersに, (classes + 5) * 3の値を設定する. 3か所
例:cfg/yolov3-mytrain.cfg

[net]
# Testing
# batch=1
# subdivisions=1
# Training
batch=64   # 学習時のバッチサイズ
subdivisions=8   # バッチサイズを何分割するか. GPU性能に応じて変更するとか...
width=416
height=416
channels=3
momentum=0.9
decay=0.0005
angle=0
saturation = 1.5
exposure = 1.5
hue=.1

learning_rate=0.001
burn_in=1000
max_batches = 50200   # バッチ学習を何回繰り返すか
policy=steps
steps=40000,45000
scales=.1,.1
  :
[convolutional]
size=1
stride=1
pad=1
filters=75   # = (classes + 5) * 3
activation=linear

[yolo]
mask = 6,7,8
anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  3\
73,326
classes=20   # クラス数
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=1
  :


1.4 学習
ベースモデルをダウンロードし, 学習を行う.

wget https://pjreddie.com/media/files/darknet53.conv.74

./darknet detector train cfg/mytrain.data cfg/yolov3-mytrain.cfg darknet53.conv.74 -gpus 0

なんと, 学習に1日半以上もかかった!


1.5 テスト
学習したモデルを試してみる.

./darknet detector test cfg/mytrain.data cfg/yolov3-mytrain.cfg backup/yolov3-mytrain_final.weights data/dog.jpg
layer     filters    size              input                output
    0 conv     32  3 x 3 / 1   416 x 416 x   3   ->   416 x 416 x  32  0.299 BFLOPs
      :
  104 conv    256  3 x 3 / 1    52 x  52 x 128   ->    52 x  52 x 256  1.595 BFLOPs
  105 conv     75  1 x 1 / 1    52 x  52 x 256   ->    52 x  52 x  75  0.104 BFLOPs
  106 yolo
Loading weights from backup/yolov3-test_final.weights...Done!
data/dog.jpg: Predicted in 0.252517 seconds.
dog: 94%
car: 100%
bicycle: 100%

[結果]
f:id:moonlight-aska:20181226215012j:plain:w400

YOLOv3のモデル学習手順を確認できたので, 今度はオリジナルデータで学習をやってみようと思う.

----
参照URL:
[1] YOLO: Real-Time Object Detection
[2] YOLOv3の使い方 | orizuru






つくりながら学ぶ! 深層強化学習 ~PyTorchによる実践プログラミング~

つくりながら学ぶ! 深層強化学習 ~PyTorchによる実践プログラミング~