オリジナルデータで物体検出を試してみたくなり, 久々に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
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%
[結果]
YOLOv3のモデル学習手順を確認できたので, 今度はオリジナルデータで学習をやってみようと思う.
----
参照URL:
[1] YOLO: Real-Time Object Detection
[2] YOLOv3の使い方 | orizuru
DeepLearningによる画像認識!: クラウドコンピューティングとオープンソースソフトウェアによるDeep Learningの実践
|
Pythonで動かして学ぶ! あたらしい深層学習の教科書 機械学習の基本から深層学習まで (AI & TECHNOLOGY)
|
つくりながら学ぶ! 深層強化学習 ~PyTorchによる実践プログラミング~
|
|