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のKeras版実装でのオリジナルデータ(独自データ)学習手順について、記載します。
- tensorflowはV2になって大きく変わっています。YOLOv3のKeras版実装はtensorflowのV1でテストされているため、使用ライブラリなどの注意点があります。
- 環境設定は終わっている前提。環境設定についての記事はこちら:YOLOのオリジナルデータ学習手順 #1 環境設定
- 学習データのアノテーション作業は終わっている前提。アノテーションについての記事はこちら:YOLOのオリジナルデータ学習手順 #2 アノテーション
最終調査日
2020年10月4日時点
環境
ソフト
- Windows 10 Pro 1909 x64
- GeForce GTX 1080 Ti
- Anaconda
- Git
- Visual Studio Code
Pythonモジュール
公式
- Python 3.5.2
- Keras 2.1.5
- tensorflow 1.6.0
- OpenCV
この記事
- Python 3.6
- Keras 2.2.4
- tensorflow 1.14.0
- OpenCV
- pillow
- numpy
- matplotlib
1. スクリプトの準備
git clone https://github.com/tfukumori/keras-yolo3
2. 仮想環境の作成
2.1. Anacondaで仮想環境を作成
conda create -n keras-yolo3 python=3.6
- CPU版のtensorflowを使用する場合は"keras-yolo3"
- GPU版のtensorflowを使用する場合は"keras-yolo3-gpu"
※名称に意味はない。わかりやすさのため
2.2. 仮想環境に必要なモジュールをインストール
以下は、仮想環境の名称がkeras-yolo3
という前提で記載します。
call activate.bat keras-yolo3
conda install pillow -y
conda install numpy -y
conda install tensorflow==1.14.0 -y
conda install keras==2.2.4 -y
conda install matplotlib -y
conda install -c conda-forge opencv -y
※YOLOv3のKeras版実装は、最新版のtensorflowとの互換性がないため、tensorflowとkerasはバージョン指定してインストールします。
conda install tensorflow-gpu==1.14.0 -y
⚠minicondaでconda-forgeを使用する場合は、tensorflow-gpu
は存在しない
⚠未検証だがtensorflowは1.15からgpu版が統合されたので、pipでtensorflowを使用することについても検討が必要
3. 実施手順(エクスポート結果の配置)
YOLOのオリジナルデータ学習手順 (アノテーション編)でエクスポートファイルを使用する。
※効率化の観点からこの処理も自動化(Pythonプログラム作成)することが望ましいです。
3.1. 最終的なフォルダ構成
先に最終的な構成を示します。
💡 対象画像がPNG形式の場合の例
keras-yolo3
└─model_data
voc_classes.txt
└─VOCdevkit
└─VOC2007
└─Annotations
│ <対象画像ファイル名>.xml
│ ~
├─ImageSets
│ └─Main
│ train.txt
│ val.txt
│ test.txt
└─JPEGImages
<対象画像ファイル名>.png
~
3.2. エクスポートしたフォルダを既定の位置に配置
エクスポートしたフォルダを既定の位置にコピーします(再作業する場合には、既存のフォルダは削除しておきます)。
コピー元:keras-yolo3\resize_image\<Vottのプロジェクト名>-PascalVOC-export
コピー先:keras-yolo3\VOCdevkit\<Vottのプロジェクト名>-PascalVOC-export
リネームします(再作業する場合には、既存のフォルダは削除しておきます)。
リネーム前:keras-yolo3\VOCdevkit\<Vottのプロジェクト名>-PascalVOC-export
リネーム後:keras-yolo3\VOCdevkit\VOC2007
3.3. train.pyで読み込むアノテーションを学習させるtxtファイルを作成
-
以下のファイルをリネームする
リネーム前:
keras-yolo3\VOCdevkit\VOC2007\ImageSets\Main\<タグ名>.txt
リネーム後:keras-yolo3\VOCdevkit\VOC2007\ImageSets\Main\train.txt
※Vottで「テスト/トレーニング分割:100」と設定すると、「<タグ名>.txt」のみが作成されます(100以外なら<タグ名>_train.txtと<タグ名>_val.txt)。
※複数のタグを指定した場合はすべて結合してtrain.txt
を作成する。 -
空ファイルを作成する
keras-yolo3\VOCdevkit\VOC2007\ImageSets\Main\val.txt
keras-yolo3\VOCdevkit\VOC2007\ImageSets\Main\test.txt
-
以下のファイルをエディタで開き、
.jpg 1
を除く。keras-yolo3\VOCdevkit\VOC2007\ImageSets\Main\train.txt keras-yolo3\VOCdevkit\VOC2007\ImageSets\Main\val.txt keras-yolo3\VOCdevkit\VOC2007\ImageSets\Main\test.txt
変更前<ファイル名>.jpg 1 ~
変更後<ファイル名> ~
-
voc_annotation.py
の一部を作成したタグに合わせて変更する```python:
voc_annotation.py
の一部
classes = [<作成したタグ文字列をカンマ区切りで記載>]classes = ["aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat", "chair", "cow", "diningtable", "dog", "horse", "motorbike", "person", "pottedplant", "sheep", "sofa", "train", "tvmonitor"]
-
以下を実行し、アノテーションを学習させるtxtファイルを作成
アノテーションを学習させるtxtファイルを作成python voc_annotation.py
以下のファイルが作成されます。
keras-yolo3\2007_test.txt keras-yolo3\2007_train.txt keras-yolo3\2007_val.txt
ℹ️ Annotationsフォルダ内のxmlファイル内のクラス名と座標の情報から作成されます
3.4. 認識するクラス名の指定
model_data\voc_classes.txt
を別名でバックアップしておき、model_data\voc_classes.txt
にVottで設定したクラス(タグ)を記載します。
ℹ️ "voc_annotation.pyの一部を作成したタグに合わせて変更"とこの「3.4. 認識するクラス名の指定」で記載するクラス名の順番は同じにしておく必要があります。理由は、2007_test.txt、2007_train.txt、2007_val.txtではクラスを「<クラス名>ごとに振られた0から始まる番号」で区別しているため、順番が異なると違うクラスと判断されてしまうためです
4. 実施手順(ウエイトファイルの変換)
変換元ウエイトファイルが同じ場合は初回のみでOKです。
4.1. ウエイトファイルの配置
Darknetからウエイトファイルをダウンロードして、以下に配置します。
keras-yolo3\yolov3.weights
4.2. ウエイトファイルのコンバート
ダウンロードした「yolov3.weights」はそのままではkerasで使えないので、kerasモデルにコンバートします。
python convert.py -w yolov3.cfg yolov3.weights model_data/yolo_weights.h5
5. 実施手順(トレーニング)
「5.1. トレーニング方法1(プルリクエスト改善版)」の方が時間はかかりますが精度が良く、トレーニング途中でも学習状況を確認できるためお勧めです。
機械学習は精度を保証することはできないため、学習状況・結果を分析しながら改善を行っていくことがどの程度の精度になっているかを確認してくことが重要です。
5.1. トレーニング方法1(プルリクエスト改善版) ★おすすめ
-
TensorBoardの準備(初回のみ)
仮想環境名は学習を行う環境と別で構いません。
ここでは別に仮想環境を「tensorboard」として作成します。TensorBoardのインストールconda activate tensorboard conda install tensorflow==1.14.0 -y conda install tensorboard -y
-
トレーニングのログファイルを使用したTensorBoardの起動。
初回起動時は、yolo_logsフォルダは作成されていないので「4. トレーニングの実行」後に実行してください。
--host 0.0.0.0
を指定することで外部からアクセス可能となります。run_tensorboard.batCALL activate "C:\Users\<ログインユーザー名>\Anaconda3\envs\<仮想環境名>" tensorboard --logdir=<yolo_logs>のフルパス --host 0.0.0.0
-
TensorBoardを開く
ブラウザで
http://localhost:6006/
orhttp://<マシンのIPアドレス>:6006/
にアクセスすると、TensorBoardで解析結果を確認できます。
トレーニング状況をリアルタイムで確認できますので、学習状況を確認できます。例 -
トレーニングの実行
--yolo_val_file nano
を指定することで2007_train.txt
の内容が自動的に分割されます。
先にフォルダの整理が必要です。作業フォルダ(tmp_~)が中断等で残っていた場合は削除、結果フォルダ(yolo_logs)が残っていた場合には退避など。トレーニングconda activate keras-yolo3 python train_v2.py --yolo_train_file 2007_train.txt --anchors_file model_data/yolo_anchors.txt --yolo_val_file nano
5.2. トレーニング方法2(標準の方法)
YOLOv3のKeras版実装に記載されている方法です。
-
シンプルにトレーニングのみを行う方法です。
トレーニングpython train.py
-
処理が完了すると以下のファイルが作成されます。
keras-yolo3\logs\000\trained_weights_final.h5
※
train.py
でGPU使用時にエラーが出る場合は、後述の困ったときにはを参照
6. 実施手順(テスト)
6.1. テスト
python yolo_video.py --image --model_path <作成したモデル拡張子が`h5`のファイルパス(`yolo_video.py`からの相対パス)> --classes_path <クラスを記載した`voc_classes.txt`のパス(`yolo_video.py`からの相対パス)>
- Python上のパスの区切り文字列は
\
ではなく/
となるので留意ください。 - 3.2. yolo_video.pyの修正に伴い、引数名が変更となっています。
例1(トレーニング方法1の出力ファイル名)
python yolo_video.py --image --model_path yolo_logs\models\Step2_yolo_weight_mAP_best.h5 --classes_path model_data/voc_classes.txt
例2(トレーニング方法2の出力ファイル名)
python yolo_video.py --image --model_path logs/000/trained_weights_final.h5 --classes_path model_data/voc_classes.txt
YOLOv3-tinyを使用する場合
以下のように変更します。
4.1. ウエイトファイルの配置
YOLOv3-tinyのWeightsファイルをダウンロードして配置します。
keras-yolo3\yolov3-tiny.weights
4.2. ウエイトファイルのコンバート
python convert.py -w yolov3-tiny.cfg yolov3-tiny.weights model_data/tiny_yolov3_weights.h5
※5.2. の方法を使用する場合は、ファイル名を同一として、すでにYOLOv3-416のh5ファイルがある場合は退避しておくこと
5.1. トレーニング方法1(プルリクエスト改善版)
4.のアンカーファイルの指定を変更する
変更前
python train_v2.py --yolo_train_file 2007_train.txt --anchors_file model_data/yolo_anchors.txt --yolo_val_file nano
変更後
python train_v2.py --yolo_train_file 2007_train.txt --anchors_file model_data/tiny_yolo_anchors.txt --yolo_val_file nano
それ以外は手順通り実行する
(yolov3-tinyを考慮した変更が反映されている最新のソースであること)
5.2. トレーニング方法2(標準の方法)
以下のファイルのアンカーファイルを書き換える
変更前
anchors_path = 'model_data/yolo_anchors.txt'
変更後
anchors_path = 'model_data/tiny_yolo_anchors.txt'
python train.py
困ったときには
control_flow_ops
でエラーが表示される
- Keras 2.2.5以降には対応していない。Keras 2.2.4を使用する。
No such file or directory: 'yolov3.weights'
のエラーが表示される
- 本手順の4.1. ウエイトファイルの配置と4.2. ウエイトファイルのコンバートが行われていない。
Visual Studio CodeからPythonを実行した場合にCommandNotFoundError: Your shell has not been properly configured to use 'conda activate'.
エラーが表示される
- 本手順に記載の
conda init
を実行する。(2.2.2. conda用にpowershellを設定)
train.py
実行時に、tensorflow.python.framework.errors_impl.ResourceExhaustedError: 2 root error(s) found.
エラーが表示され、trained_weights_stage_1.h5
作成まで行われない。
- GPUのメモリが足りない。GPU(tensorflow-gpu)でなく、CPU(tensorflow)を使用するか、
train.py
の以下の部分を変更してエラーが出なくなるまで調整(小さく)する。
batch_size = 32 # note that more GPU memory is required after unfreezing the body
参考:https://teratail.com/questions/246310
GPU で演算を行なう場合、バッチサイズが大きいほうが、GPU とのデータ転送の回数がすくなくなるので、学習速度が早くなります。(GPU は一度に大量のデータを計算するのが得意)
では、単純にバッチサイズを大きくすればいいのかというとそうではなく、以下の点を考慮して適当な値にします。
- バッチサイズが大きいほど、GPU の消費メモリが増えるので、大きくしすぎると、メモリ不足でエラーになります。
- バッチサイズが大きすぎると、局所解に陥りやすくなり、学習結果が悪くなるかもしれません。
引数を指定しても無視される(渡したモデルパスが無視され、既定のモデルパスを読み出そうとしたエラーが表示される。OSError: Unable to open file (unable to open file: name = 'model_data/yolo.h5', errno = 2, error message = 'No such file or directory', flags = 0, o_flags = 0)
)
-
yolo_video.py
の引数名とyolo.py
の引数名が不一致であることが原因。yolo_video.py
を修正する。
参考
mAP関係のプルリクエスト関連記事
- Training (add tensorboard debug, and mAP Calculation) by KUASWoodyLIN · Pull Request #206 · qqwweee/keras-yolo3
- 【物体検出】mAP ( mean Average Precision ) の算出方法 - Qiita
py
ランチャー、venv
利用時の環境作成
tensorflow-gpu
py -3.6 -m venv .venv
&.venv\Scripts\activate.ps1
pip install pillow numpy h5py==2.10.0 tensorflow-gpu==1.14.0 keras==2.2.4 matplotlib opencv-python
参考:https://qiita.com/Hiroki-Fujimoto/items/b078bfb680fb710c38c1
tensorboard
py -3.6 -m venv .venv
&.venv\Scripts\activate.ps1
pip install tensorboard tensorflow