今回自前のデータを用意しYOLOv3で学習を行ってみたいと思います。
YOLOの環境設定、アノテーションデータの作成は以前の記事をご覧ください。
YOLOの環境設定
アノテーションデータの作成
作成したアノテーションデータは画像ファイルと同じディレクトリに入っているものとします。
(僕の場合はbuild/darknet/x64/data/imgディレクトリを作成し、保存しました)
①train.txt test.txtの作成
トレーニング・バリデーションデータを分けるために、それぞれに使用する画像データ全てのパスを記載した.txtファイルを作成します
それぞれに記載するパスは/build/darknet/x64/以降の相対パスを記載します。
トレーニング
data/img/train1.jpg
data/img/train2.jpg
data/img/train3.jpg
テスト
data/img/test1.jpg
data/img/test2.jpg
data/img/test3.jpg
それぞれの.txtファイルは画像・アノテーションデータが入っているディレクトリに保存しておきます。
②class.txtの作成
class.txtを作成し、検出するクラス名を記載して保存しておきます。
例えば検出したい物体が「car」のみの場合にはcarとだけ記入しておきます。
これも画像・アノテーションが入っているフォルダに入れておきます。
③.nameファイルの作成
x64/dataに入っているopenimages.namesを編集し、②同様に検出するクラス名だけを記入して保存しておきます
(念のため「test.names」にファイル名を変更して保存しておきました)
④.dataファイルの作成
x64/dataにあるvoc.dataファイルを編集し、以下の内容を入力します。
classes = 1
train = data/img/train.txt
valid = data/img/test.txt
names = data/test.names
backup = backup/
クラス数やそれぞれのパスは環境に合わせて変更してください。
backup= は学習時の重みファイルの保存先になります。
編集後、別名で同ディレクトリに保存しておきます
今回の場合はtest.dataで保存しました
⑤.cfgファイルの作成
x64/に保存されている、yolov3.cfgを編集していきます。
まずctl + Fでclassesを検索し、検出するクラス数を変更します。
今回は1クラスの検出なので1に変更しておきます。
こちらは全部で3か所変更する必要があります。
次にfiltersを変更します
fileters=255となっている個所が3か所あるので、こちらを全て
(検出するクラス数 + 5) ×3 に変更します 今回の場合、18に変更します。
また学習を行う際に、「out of memory」エラーが発生する場合があります。
その場合はファイル冒頭のsubdivisions=の部分を増やしていくとうまく動くと思います。
※cuda out of memoryのエラーが消えない場合にはタスクマネージャー等で正しくGPUが動いているかチェックしてみてください。
以前の記事で記載した、「makefileの編集」→「darknetのビルド」の手順ができていないと、
GPUを認識できていない可能性が高いです。
僕の場合最終的に以下のような設定でうまく動きました。
batch=64
subdivisions=64
width=416
height=416
channels=3
momentum=0.9
decay=0.0005
angle=0
saturation = 1.5
exposure = 1.5
hue=.1
⑦学習の実行
まず重みの初期値として、以下からdarknet53.conv.74をダウンロードしてきて、
build/darknet/x64に保存しておく
https://pjreddie.com/media/files/darknet53.conv.74
上記まで出来たら、AnacondaPromptで以下のコマンドで学習が実行されます。
darknet.exe detector train data/test.data test.cfg darknet53.conv.74
学習が進むにつれてbackup/にweightファイルが吐き出されます。
⑧テスト
以下のコマンドで画像ファイルに対して検出を行うことができます。
darknet.exe detector test data/test.data test.cfg backup/test_last.weights data/img/test.jpg -thresh 0.01
それぞれのファイル名、パスは適宜変更してください。
動画
darknet.exe detector demo data/test.data test.cfg backup/test_last.weights data/img/test.mp4
webcamを使用するような場合は以下のコマンドになります
darknet.exe detector demo data/testdata test.cfg backup/test_last.weights -c 1