Unlit Sphere

Let’s discover a new world with Unity

【YOLOv3】オリジナルの学習済みモデルを作成する

OverView

画像から手の位置を認識をさせたかったんじゃぁ.

お.いい高速な画像認識アルゴリズムがある.つかってみるか...

f:id:nagatsukimxi:20190228105652p:plain

ということで,YOLOv3で自分で作成したデータを学習させる方法

つまりオリジナルの学習済みモデルの作り方を書き残します.

YOLOはYou Only Look Onceの略,物体検出アルゴリズム

darknetはC/CUDAで開発されたOSSニューラルネットフレームワーク

Environment

macOS Mojave version.10.14.3

Python 3.7.2

Method

1. darknetをmake & Install

https://github.com/pjreddie/darknet からdarknetをcloneする

git clone https://github.com/pjreddie/darknet
cd darknet
make

makeをする前にMakefileを編集することでdarknetでGPUを使うか否かなどの設定ができる.

# Compiling with CUDA
GPU=1

# Compiling with OpenCV
OPENCV=1

2. 学習用データセットを作る

この記事を執筆しているとき,自分は人の手を認識させたかったので,データセットの中の名前がhandなんとかになったりしていますが,適宜ファイル名を分かりやすいものに変えても問題はない.

f:id:nagatsukimxi:20190228104757p:plain

backupフォルダ

学習済みモデルが完成したときに格納されるディレクト

datasets

学習用画像と学習用画像のどこに何が写っているかを記述したtxtファイルが入っている.

画像とtxtの名前は揃っていないといけない.

hand-obj.names

hand

今回は手しか認識させないので1行目にhandとだけ記述.

複数のものを学習させたいときには2行目3行目と認識させたいものの名前を記述していく.

hand-test.txt

datasets/img_0-0.jpg
datasets/img_0-1.jpg
datasets/img_0-2.jpg

学習用画像のある場所を列挙する.こちらはテスト用の画像リスト.

hand-train.txt

datasets/img_0-0.jpg
datasets/img_0-1.jpg
datasets/img_0-2.jpg

こちらも学習用画像のある場所を列挙する.こちらは訓練用の画像リスト.

hand.data

classes= 1
train  = hand-train.txt
valid  = hand-test.txt
names = hand-obj.names
backup = ~/Documents/GitHub/darknet/cfg/task/backup

hand.dataにはここまでに作成したtxtファイルなどの場所などを記述.

最後の行のbackupは学習済みモデルを保存するディレクトリ指定だが,権限的にちゃんと保存できる場所にしておかないと,時間かけて学習したデータが保存されない.何時間も時間を掛けて学習させエラーが最後の最後に起きたら悲しぃ(経験済み)

yolov3-hand.cfg

darknet/cfg/yolov3-voc.cfgをコピーして名前を変更した.

このファイルには学習時のハイパーパラメータが記述されている.

細かいことをしないのであれば,とりあえず以下の行数の「filters」と「classes」の値だけ変更すればいい.

605: filters=18
611: classes=1
689: filters=18
695: classes=1
773: filters=18
779: classes=1

この値にはルールがあり,classesは認識させたいオブジェクトの数.今回は手(hand)だけなので1.

filtersは「(classes + 5) * 3」の値となる.今回は(1+5) * 3 = 18とした.

ex. 学習用データセットを自作するのに今回使ったツール「labelImg」

https://github.com/tzutalin/labelImg

とりあえず,labelImgを使わせてもらった.

Install方法は以下のReadme

https://github.com/tzutalin/labelImg/blob/master/README.rst

直感的に動かすことができるが,画像の範囲を選択したあとにxmlで出力するのではなく,txtで出力するように設定を変更する.たしかYOLO用に書き出し.みたいな設定があった.

3. YOLOv3用の学習モデル初期値ファイルをDL

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

からDLできる.適当なディレクトリに保存しておく.155MB.

今回は darknet/models/に保存した.

4. 学習開始

コマンドを叩いて学習スタート.

./darknet detector train hand.data yolov3-hand.cfg models/darknet53.conv.74

5. 学習したモデルを使ってみる

Ref.

https://timebutt.github.io/static/how-to-train-yolov2-to-detect-custom-objects/

https://www.slideshare.net/BusHato/ss-100355414

https://orizuru.io/blog/machine-learning/yolov3/

https://pjreddie.com/darknet/yolo/

https://wakuphas.hatenablog.com/entry/2018/09/19/025941