PythonMania

普段はロボットとAIを組み合わせて色々作ってます。Python関係以外も色々投稿していくと思います。

【Python】YOLOv3でオリジナルデータを学習させてみる

f:id:mizuhiki0111:20190501173702p:plain




今回自前のデータを用意しYOLOv3で学習を行ってみたいと思います。


YOLOの環境設定、アノテーションデータの作成は以前の記事をご覧ください。




YOLOの環境設定

www.pythonmania.work



アノテーションデータの作成

www.pythonmania.work



作成したアノテーションデータは画像ファイルと同じディレクトリに入っているものとします。

(僕の場合は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