Chapters
📘 Chapter #0 YOLOとは
📘 Chapter #1 環境設定
📘 Chapter #2 アノテーション
📘 Chapter #3
📗 Chapter #3-1 YOLOv3 Keras版実装
📗 Chapter #3-2 YOLOv3 Darknet版
📘 Chapter #A
📗 Chapter #A-1 YOLOの各バージョンについてまとめ
📗 Chapter #A-2 YOLOv3 Keras版実装に関して関連記事のまとめ
📗 Chapter #A-3 ONNX変換・確認ライブラリ、アプリケーションまとめ
TL;DR
-
YOLOv3 Darknet版でのオリジナルデータ(独自データ)学習手順について、記載します。
- 重みファイル、cfgファイルはYOLOv3-tinyについての記述となっていますので、必要に応じて公式ドキュメントを参考に読み替える必要があります。
- 学習データのアノテーション作業は終わっている前提。アノテーションについての記事はこちら:YOLOのオリジナルデータ学習手順 #2 アノテーション
最終調査日
2020年10月6日
環境
- Windows 10 Pro 1909 x64
- GeForce GTX 1080 Ti
1. ソースをクローン
cd C:\Users\username\repos
mkdir github
cd .\github
mkdir AlexeyAB
cd .\AlexeyAB
git clone https://github.com/AlexeyAB/darknet
2. Darknet.exeのビルド
2.1. 手順
以下の手順を参考にビルドまで行いました。
2.2. 使用した資材
ソフト | インストーラーファイル名 |
---|---|
Visual Studio 2017 Professional1 | vs_professional__1216243409.1564557702.exe |
NVidiaドライバ | 456.38-desktop-win10-64bit-international-dch-whql.exe |
CUDA Toolkit 10.0 | cuda_10.0.130_411.31_win10.exe |
cuDNN (for CUDA 10.0) | cudnn-10.0-windows10-x64-v7.6.5.32.zip |
OpenCV | opencv-4.4.0-vc14_vc15.exe |
CMake | cmake-3.18.3-win64-x64.msi |
2.3. 動作検証
cd C:\Users\username\repos\github\AlexeyAB\darknet\build\darknet\x64
darknet.exe detector test cfg/coco.data cfg/yolov3-tiny.cfg yolov3-tiny.weights -thresh 0.25
エラーなく実行できること、画像ファイルパスを指定して推論できることを確認します。
3. トレーニング用資材の用意
YOLOのオリジナルデータ学習手順 (アノテーション編)の手順でVottでエクスポートしたPascal VOC形式から、YOLO形式に変換する必要があります。
3.1. Vott 2にてPascal VOC形式でエクスポートしたフォルダの構成
PascalVOC-export
├─Annotations
├─ImageSets
│ └─Main
└─JPEGImages
3.2. Pascal VOC形式→YOLO形式への変換
Vott 2は出力形式としてYOLO形式が選択できないため別途変換が必要です。
-
変換にはMartin Hwangさんのソースを利用しますので、ソースをクローンします。
cd C:\Users\username\repos\github mkdir ssaru cd .\ssaru git clone https://github.com/ssaru/convert2Yolo
-
クローンしたフォルダに移動します。
cd convert2Yolo
-
上記のフォルダに、Vottでエクスポートした「PascalVOC-export」フォルダをコピーします
-
YOLO形式の出力先フォルダを作成します。
mkdir YOLO
-
変換を実施します。
python example.py --datasets VOC --img_path ./PascalVOC-export/JPEGImages/ --label ./PascalVOC-export/Annotations/ --convert_output_path ./YOLO/ --img_type ".jpg" --manifest_path ./ --cls_list_file ./PascalVOC-export/voc.names
-
出力結果は以下の構成となります。
└─YOLO/~.txt manifest.txt
3.3. フォルダ構成、ファイルの作成
公式のドキュメント、harmegiddoさんの記事を参考に、フォルダ構成、必要なファイルを作成します。
以下は手作業で作成する手順を記載しています(自動化を行ったら更新予定です)。
3.3.1. 最終的な構成
先に最終的な構成を示します。
💡 対象画像がPNG形式の場合の例
github\AlexeyAB\darknet\build\darknet\x64\cfg
└─task
├─backup
└─datasets
<対象画像ファイル名>.txt
<対象画像ファイル名>.png
~
class.txt
datasets.data
train.txt
test.txt
yolov3-tiny_obj_custom.cfg
3.3.2 backupフォルダの作成
backup
フォルダを作成します。
3.3.3 datasetsフォルダの作成
datasets
フォルダを作成します。
3.3.4 画像ファイルのコピー
datasets
フォルダに3.1.のPascalVOC-export\JPEGImages
フォルダ内の画像ファイルをコピーします。
3.3.5 YOLO形式のアノテーションデータのコピー
datasets
フォルダに3.2.のYOLO/~.txt
をコピーします。
3.3.6. クラス名ファイル(class.txt)
クラス名を記載します。
3.3.7. トレーニングファイル一覧(train.txt)、検証ファイル一覧(test.txt)
トレーニングに使用するファイルの一覧(train.txt
)、トレーニングに使用するファイルの一覧(test.txt
)を用意します。
ファイル名(フルパス)を改行区切りで記載します。
(パスが同じであれば、前項で出力したmanifest.txt
の内容を使用できます。)
💡 トレーニングファイルと検証ファイルの切り分け
- トレーニングと検証の比率は特に記載がないため9:1としましたが、8:2が良いとの記事が多いようです。
- データの偏りを防ぐため、本来はランダムに検証ファイルを抜粋したほうが望ましい結果となります。
3.3.8. データセット設定ファイル(datasets.data)
各ファイルのパスを記載します。
classes= 1
train = <train.txt のフルパス>
valid = <test.txt のフルパス>
names = <class.txt のフルパス>
backup = <backup フォルダのフルパス>
3.3.9. cfgのカスタマイズ
公式ドキュメントを参考に作成します。
参考までに、以下のデータの場合に必要となった変更を記載します。
(2020年10月6日時点のドキュメントを参照)
項目 | 値 |
---|---|
クラス数 | 1 |
トレーニング画像数 | 720 |
💡 学習に使用するデータ数
- サンプルを見ると80クラスで500200枚で1クラス当たり6252.5枚となっています。学習データは水増しした上で1クラスあたり6200枚程度は用意したほうが良いのかもしれません。
- 学習に使用するデータ数についての目安はこちら
手順
-
yolov3-tiny_obj.cfg
をgithub\AlexeyAB\darknet\build\darknet\x64\cfg\yolov3-tiny_obj_custom.cfg
にコピーします。 -
機器のスペックに応じた
batch
の変更、およびデータ量に応じたmax_batch
とsteps
の変更を行います。- batchを
64
→8
に変更(メモリエラー対策) - max_batchを変更(クラス数、画像数に合わせて適切な数値を設定)
- classes2000 , but not less than number of training images and not less than 6000(日本語訳:クラス2000 、ただし、学習画像の数を下回らず、かつ 6000 を下回らない。)
- クラス数 1*2000 、ただし、学習画像の数(720)を下回らず、かつ 6000 を下回らない。よって、
6000
。
- stepsを変更(max_batch数の80% and 90% の数値を設定)。max_batch数
6000
から4800,5400
。
- batchを
-
クラス数に応じて、classesとfilterを変更します。
- classesを変更(判定クラス数が1)
- activation=linear前のフィルターをクラス数に合わせて変更
4. 重みファイルの準備
4.1. トレーニング方式に応じたファイルをダウンロード
YOLOv3-tinyであれば以下をダウンロードします。
for (6 MB): yolov3-tiny.conv.11yolov3-tiny-prn.cfg , yolov3-tiny.cfg
https://drive.google.com/file/d/18v36esoXCh-PsOKwyP2GWrpYDptDY8Zf/view?usp=sharing
4.2. 以下に配置
github\AlexeyAB\darknet\build\darknet\x64\yolov3-tiny.conv.11
5. トレーニング
-
ビルドしたDarknet.exeのフォルダに移動(
github\AlexeyAB\darknet\build\darknet\x64
) -
トレーニング
darknet.exe detector train ./cfg/task/datasets.data cfg/task/yolov3-tiny_obj_custom.cfg yolov3-tiny.conv.11
6. 結果
6.1. チャート例
今回使用した例では、15分程度で終了しました。
6.2. 推論に使用するYOLO Darknet形式の重みファイル
github\AlexeyAB\darknet\build\darknet\x64\cfg
└─task
└─backup
└─yolov3-tiny_obj_custom_final.weights
7. 推論
darknet.exe detector test cfg/task/datasets.data cfg/task/yolov3-tiny_obj_custom.cfg cfg/task/backup/yolov3-tiny_obj_custom_final.weights <推論対象画像ファイルパス> -thresh 0.25
💡 枠表示を行う信頼度の閾値は-thresh 0.25
の部分で指定します。
8. (おまけ)JetsonNanoで使用する場合
細かい記載は省略しますが、以下のリポジトリを参考にJetson NanoのTensorRTで動作するファイルへの変換(コンパイル)を実施し動作確認しています。
TensorRTは動作環境(GPU)に特化したファイルを作成するため、実際に使用する機器上(Jetson Nano)で変換(コンパイル)を行う必要があります。
-
YOLO Darknet形式の重みファイル → ONNX形式
https://github.com/jkjung-avt/tensorrt_demos/blob/master/yolo/yolo_to_onnx.py -
ONNX形式 → TensorRT形式
https://github.com/jkjung-avt/tensorrt_demos/blob/master/yolo/onnx_to_tensorrt.py
参考文献
- AlexeyAB/darknet: YOLOv4 - Neural Networks for Object Detection (Windows and Linux version of Darknet )
- ssaru/convert2Yolo: This project purpose is convert voc annotation xml file to yolo-darknet training file format
- Windows10環境でdarknet使って学習、ビルド編 - Qiita
- jkjung-avt/tensorrt_demos: TensorRT YOLOv4, YOLOv3, SSD, MTCNN, and GoogLeNet