6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

自前データをYOLOv4で学習させるためのToolkit

Last updated at Posted at 2022-01-03

darknetを使用してみる

windowsでdarknetを使用して機械学習(物体検出)に触れてみたいと思います。
いちいち設定ファイルを作成するのはめんどくさいので、なるべく簡単に設定ファイルを作成できるようにYoloToolkitを作りました。

使い方を説明しながら実際に自前データで学習を行っていきます。

1.darknetのセットアップ

フレームワークにdarknetを使用します。
YOLOの原論文を書いた人が作ったフレームワークです。(YOLOv4からは違う人が受け継いでます)

darknetのセットアップは今回はできている前提で進めます。
できていない人は下記を参考にセットアップしてみてください。
Windows で Darknet を使って 機械学習する
YOLOv4環境構築①
YOLOv4環境構築②

2.YoloToolkitをcloneする

このリポジトリをcloneします。(cloneして名前が変更されている場合はYoloToolkitに変更してください)
簡単に学習できるようなプログラムやフォルダが集まっています。

C:.
├─backup       # weightのバックアップ
├─cfg          # Yolov4の設定ファイル
├─images       # アノテーションに使用する画像
├─net          # ネットワーク 
├─toolkit      # toolkit(*.py) 
├─VoTT         # VoTTの出力先
└─YoloDataset  # 学習用のデータセット

3.データセットの作成

データセットを作成していきます。
今回はドライブレコーダーで撮影した映像からナンバープレートと車を検出するものを作成します。

3.1.画像収集

今回はドライブレコーダーで撮影された映像から学習に必要なデータを収集します。
データの収集方法は何でもいいです。

収集した画像はimagesディレクトリ内にコピーしてください。
各種コードは.jpgの画像を想定しているため拡張子は.jpgにしてください。(ほかの拡張子でも動作するようにそのうち変更します)

3.2.画像の整形

アノテーションを行う前に画像サイズを固定する必要があります。
アノテーション後にサイズを変更すると出力されるxmlファイルに書かれた座標がずれてしまい、アノテーションを再度する必要が発生する可能性があります。

YOLOv4は学習データの画像を32の倍数にする必要があります。
今回は416×416を使用します。
※自分のPCスペックを考えてサイズを決めてください。大きすぎるとメモリが足りなくなります。
今回はリサイズではなく、トリミングを使用して1920×1080の画像をトリミングします。

追記 2022/5/21
動作未確認ですが、コメントよりDarknetはcfgファイルのサイズに自動でリサイズされるようです。
今回は事前にトリミングを行なってからアノテーションを行います。

トリミング(trimming.py)

  1. trimming.pyを実行して、拡張子、x座標、y座標、幅、高さを入力してください。
    x座標、y座標はトリミングする領域の左上の座標を指定します。
  2. バリデーションが実行されて問題がない場合、サンプルとして領域が書き込まれたサンプル画像が表示されます。
  3. サンプル画像に表示された領域でトリミングを行う場合、yを入力すると全ての画像に対してトリミングが実行されます。

リサイズ(resize.py)

  1. resize.pyを実行して、拡張子、幅、高さを入力してください。
  2. アスペクト比を保持したままリサイズされ、足りない場所は白で埋められます。

3.3.アノテーション(VoTT)

学習画像をリサイズやトリミングで固定サイズに整形できたらアノテーションを行います。
今回はアノテーションにVoTTを使用します。

YoloToolkitを使用する際のVoTTの使用方法は下記スライドを参考にしてください。

VoTTをインストールできていない人は下記を参考にインストールしてください。
物体検出のアノテーションツール VOTT の使い方
VoTTの使い方

3.4.makedataset.pyを実行する

toolkitディレクトリ内にあるmakedataset.pyを実行します。
makedataset.pyを実行すると下記がまとめて実行されます。

①アノテーションの形式変更(xml->txt)
convert.pyを実行すると以下が実行される。
xmlファイルをパースしてYOLOv4形式のtxtファイルを作成しYoloDatasetディレクトリに保存する
xmlファイルに対応する画像ファイルtxtファイルと同時にYoloDatasetディレクトリにコピーする

②データの分割(train,val,test)
アノテーションされたファイルをtrain,valid,testに分割します。
デフォルトでは、train=70%,valid=20%,test=10%に分割します。
※変更したい場合は、makedataset.pydata_split関数train_rate,valid_rateを変更してください。

各種振り分けられた結果はcfgディレクトリ内にtrain.txt,valid.txt,test.txtが作成され書き込まれます。

③設定ファイルの作成
YOLOv4を実行するのに必要な設定ファイルを作成します。

ファイル名  用途               
.name アノテーションされたラベル対応する
.data class数、各種pathを記入する   

それぞれclasses.name,test.dataで作成され設定が書き込まれます。

4.cfgファイルを作成

ネットワークの設定を行います。
書き方はdarknetのREADMEに書いてあります。
最初は最低限の変更だけでいいと思います。
netディレクトリ内にyolov4-custom.cfgを入れてあるので各自変更してください。(他ネットワークも入ってる)

変更部分

[net]
それぞれ一か所ずつ
batch=64
subdivisions=64
 それぞれスペックによって設定([7],[9]))
width=(アノテーションを行った画像のサイズ) # 今回は416
height=(アノテーションを行った画像のサイズ) # 今回は416
max_batches=(クラス数*2000)もしくは6000の大きい方 # 今回は6000
steps=(max_batchesの80%,90%) # 今回は4800,5400

[convolutional]
[yolo]の前の層の[convolutional]3ヶ所→(1)(2)(3)
filters=(クラス数+4+1)×3 # 今回は21

[yolo]
[yolo]3ヶ所→(1)(2)(3)
classes=(クラス数) # 今回は2

5.weightを用意する

学習済みのweights(yolov4.conv.137)をダウンロードしてcfgディレクトリ内に配置してください。

6.学習を実行

cd [path to darknet]/darknet/build/darknet/x64でdarknet.exeがある場所まで移動して下記コマンドを実行してください。

darknet detector train [path to YoloToolkit]/cfg/test.data [path to YoloToolkit]/net/yolov4-custom.cfg [path to YoloToolkit]/cfg/yolov4.conv.137 -map

[path to YoloToolkit]YoloToolkitをcloneした場所までのpathです。
※ pathが通ってない場合はdarknet.exeのpathを通してください

ネットワークが表示された後に学習が開始されたら学習が開始されます。

スクリーンショット 2022-01-03 035013.png

7.結果

学習がある程度進んだのでepochを1000で止めました。

代替テキスト

cfgディレクトリ内のtest.txtに書いてあるtest画像でtestを行ってみます。

comand prompt
darknet detector test [path to YoloToolkit]/cfg/test.data  [path to YoloToolkit]/cfg/yolov4.cfg  [path to YoloToolkit]/backup/yolov4-custom_best.weights < [path to YoloToolkit]/cfg/test.txt
powershell
 cat [path to YoloToolkit]/cfg/test.txt | darknet detector test [path to YoloToolkit]/cfg/test.data  [path to YoloToolkit]/cfg/yolov4-custom.cfg  [path to YoloToolkit]/backup/yolov4-custom_best.weights

今回はiterationが1000で止めたのでweightsにyolov4_1000.weightsを使用しました。
1枚目は結構うまくいってます。
2枚目はナンバープレートを二重で検出してしまっています。
3枚目はうまくいっていますが通行人も車として検出してしまっています。
もう少し学習を進めるとうまくいくかもしれないです。

動作確認環境

PC: Leginon 7 15IMH05
OS: Windows 10 Home
CPU: Intel(R) Core(TM) i7-10750H CPU @ 2.60GHz 2.59 GHz
GPU: NVIDIA GeForce RTX2080 Super with Max-Q Design
RAM: 32GB

参考

[1]Yolov4を使ったオリジナルデータの学習(with Ubuntu20.04)
[2]AlexeyAB/darknet
[3]YOLOv4(Darknet)で異常検知モデル作成挑戦(GoogleColab)
[4]Darknet YOLOv4 を Google Open Images Datasetのデータを使って学習させる with Elixir
[5]アノテーションファイル変換(xmlからYOLOへ)
[6]Windows で Darknet を使って 機械学習する
[7]Error: cuDNN isn't found FWD algo for convolution
[8]Error: l.outputs == params.inputs filters= in the [convolutional]-layer doesn't correspond to classes= or mask= in [yolo]-layer #2263
[9]what's the meaning of 'subdivisions' and how to set it's value? #224
[10]【Darknet】実行コマンドまとめ
[11]YOLOv4環境構築①
[12]YOLOv4環境構築②
[13]物体検出のアノテーションツール VOTT の使い方
[14]VoTTの使い方

6
5
11

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?