お使いの環境での最適な実装は、お使いの環境によって違ってきます。
ぜひ、調査してみることをおすすめします。
各実装でのモデルデータは、以下の流儀が混在しています。
- 他のフレームワークで学習させたモデルを、モデルの変換器で変換したもの
- そのフレームワークの中で学習したもの
kerasの使われ方も、どのkerasを使っているのか、tensorflowのバージョンなど、いくつもの組み合わせの中で、
後少しのはずの状況ですんなりいかないことがあります。
推論に特化したフレームワーク
Intel のOpenVinoの資料によれば、オリジナルのcaffeモデルから数倍の高速化ができるとのことである。
Yoloもcaffeモデルがあり、同様に高速化が期待できそうだ。
https://github.com/intel-iot-devkit/smart-video-workshop/blob/master/presentations/01-Introduction-to-Intel-Smart-Video-Tools.pdf
TinierYolo
推論時に利用するライブラリを減らしたいなら
既にOpenCVのライブラリを使っているなら、cv2.dnn.readNetFromDarknet()などを使って、OpenCVで推論するのが選択肢の一つ。
OpenCVのcv2.dnn.readNet() 関数の使い方を確認したい場合には、既に動作が検証されているモデルデータを使うこと。変換に成功した気になっていても、実際に動作させてみなければ、変換に失敗していることに気づかない。
[What is indeed surprising is that OpenCV’s CPU implementation of DNN is 9x faster than Darknet with OpenML. 実際に驚くべきことは、OpenCVのDNNのCPU実装が、OpenMLのDarknetより9倍高速であることです。] (https://www.learnopencv.com/deep-learning-based-object-detection-using-yolov3-with-opencv-python-c/)
学習時の学習データの与え方を楽にしたいなら
Kerasのライブラリ内部で、学習用画像の加工があるのを使いたい。
オリジナルの実装では、解析できない内容を解析させながら学習させたいなら
PyTorchなどでのyoloの実装を見てみよう。
https://github.com/ultralytics/yolov3 から図を引用。
from keras.optimizers import Adam
などのようにkeras自体の中に有用な最適化のライブラリがある。
実装されているアルゴリズムを理解するには、pythonで実装されているので、本家の実装のyoloのコードを理解するよりは楽そうだ。
Intelのデバイスでの計算の実行速度を向上させたいのなら
OpenVino
あなたがしたい作業によって、現状では使いやすい実装が違ってくる。
ARM 用の実装
https://github.com/digitalbrain79/darknet-nnpack
SlideShare Ultra96ボードでYOLOを高速化
付記
https://github.com/microsoft/onnxruntime
https://pypi.org/project/onnxruntime/
ONNX RuntimeとYoloV3でリアルタイム物体検出
Microsoft の ONNX Runtime を速攻レビュー
YoloV3の独自学習結果をONNX Runtime を使って推論する事例
https://github.com/axinc-ai/yolov3-face
Preferred Networks、深層学習の研究開発基盤をPyTorchに移行
OpenVino のModelOptimizer で変換後のモデルデータを入手するには
注意点
wget を使ってyolov3.cfg などを入手するとき、htmlファイルを入手しないこと。
ページのリンクでは、該当のcfgファイルを表示するためのhtmlファイルになっていることがある。
htmlファイルではなく、確実にcfgファイルのテキストファイルをダウンロードすること。
注意点
このコードは、TF1系のtf.keras、TF2.0のtf.keras、生kerasの3つで挙動が異なります
引用元 https://qiita.com/n_kats_/items/df7ac37f31eeaf4cb557
Data Augmentation for Object Detection(YOLO)
Training YOLOv3 on your custom dataset
Yoloのモデルのpruning
-
Pytorch
-
darknet
PaddleSlim モデルのpruning、量子化を行うツール
https://github.com/PaddlePaddle/PaddleSlim
https://paddlepaddle.github.io/PaddleSlim/index_en.html
https://paddlepaddle.github.io/PaddleSlim/model_zoo_en.html
PaddleSlimは、モデル圧縮用のツールキットです。これには、pruning(剪定)、固定小数点量子化、知識抽出、ハイパーパラメーター検索、ニューラルアーキテクチャ検索などの圧縮戦略のコレクションが含まれています。
Baidu が開発しているようです。
neural network distiller
https://github.com/NervanaSystems/distiller
https://nervanasystems.github.io/distiller/install.html
DistillerでDeepLearningのモデルを軽量化: Gradual Pruning編
PyTorchのモデルを軽量化してONNX出力
PyTorch Pruning Tutorial
quantization
どうやたいがいのターゲットデバイス上で、重みファイルのbit幅を削減するツールはそろってきているようです。
float32 が float16 になることだけでも高速化することは多いようです。
学習済み重みファイルをint8 に変換するツールはあったりするようですが、int8にまで量子化を進めたものは、検出性能が低下するのは避けられないようです。
【物体検出】vol.9 :YOLOv3をNVIDIA Jetson AGX Xavierで動かす
Jetson Xavier: Tensorコア対応Yolo V3 インストールメモ
Jetson Xavier を動かしてみた。
Jetson Xavier
- darknet
- opencv
- tensorflow
- onnx