LoginSignup
21
24

More than 3 years have passed since last update.

YOLOのオリジナルデータ学習手順 #3-2 YOLOv3 Darknet版

Last updated at Posted at 2020-10-06

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

最終調査日

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. 手順

以下の手順を参考にビルドまで行いました。

Windows10環境でdarknet使って学習、ビルド編

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形式が選択できないため別途変換が必要です。

  1. 変換にはMartin Hwangさんのソースを利用しますので、ソースをクローンします。

    cd C:\Users\username\repos\github
    mkdir ssaru
    cd .\ssaru
    git clone https://github.com/ssaru/convert2Yolo
    
  2. クローンしたフォルダに移動します。

    cd convert2Yolo
    
  3. 上記のフォルダに、Vottでエクスポートした「PascalVOC-export」フォルダをコピーします

  4. YOLO形式の出力先フォルダを作成します。

    mkdir YOLO
    
  5. 変換を実施します。

    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
    
  6. 出力結果は以下の構成となります。

   └─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

💡 学習に使用するデータ数

手順

  1. yolov3-tiny_obj.cfggithub\AlexeyAB\darknet\build\darknet\x64\cfg\yolov3-tiny_obj_custom.cfgにコピーします。

  2. 機器のスペックに応じたbatchの変更、およびデータ量に応じたmax_batchstepsの変更を行います。

    • batchを648に変更(メモリエラー対策)
    • max_batchを変更(クラス数、画像数に合わせて適切な数値を設定)
      • classes*2000 , 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

    image.png

  3. クラス数に応じて、classesとfilterを変更します。

    • classesを変更(判定クラス数が1)
    • activation=linear前のフィルターをクラス数に合わせて変更

    image.png
    image.png

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. トレーニング

  1. ビルドしたDarknet.exeのフォルダに移動(github\AlexeyAB\darknet\build\darknet\x64

  2. トレーニング

    darknet.exe detector train ./cfg/task/datasets.data cfg/task/yolov3-tiny_obj_custom.cfg yolov3-tiny.conv.11
    

6. 結果

6.1. チャート例

今回使用した例では、15分程度で終了しました。

image.png

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)で変換(コンパイル)を行う必要があります。

  1. YOLO Darknet形式の重みファイル → ONNX形式
    https://github.com/jkjung-avt/tensorrt_demos/blob/master/yolo/yolo_to_onnx.py

  2. ONNX形式 → TensorRT形式
    https://github.com/jkjung-avt/tensorrt_demos/blob/master/yolo/onnx_to_tensorrt.py

参考文献


  1. 参考にした手順ではVisual Studio 2017 Community Editionをインストールしています。 

21
24
0

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
21
24