Yolo v3のさまざまな実装  - オリジナルからFPGA実装まで -

お使いの環境での最適な実装は、お使いの環境によって違ってきます。
ぜひ、調査してみることをおすすめします。

各実装でのモデルデータは、以下の流儀が混在しています。

- 他のフレームワークで学習させたモデルを、モデルの変換器で変換したもの
- そのフレームワークの中で学習したもの

kerasの使われ方も、どのkerasを使っているのか、tensorflowのバージョンなど、いくつもの組み合わせの中で、
後少しのはずの状況ですんなりいかないことがあります。



|フレームワーク|ソースコードのURL|モデルデータ | ドキュメントのURL|解説記事|
|----|----|------|------|-----|
| darknet | https://github.com/AlexeyAB/darknet|https://pjreddie.com/darknet/|
| darknet | https://github.com/pjreddie/darknet | | ------|
| Keras | https://github.com/qqwweee/keras-yolo3|モデル名.h5| https://qiita.com/yoyoyo_/items/10d550b03b4b9c175d9c | [最新の物体検出YOLO v3 (Keras2.2.0+TensorFlow 1.8.0)を独自データで学習できるようにしてみた](https://arkouji.cocolog-nifty.com/blog/2018/07/yolo-v3-keras22.html) |
| Keras 量子化付き | https://github.com/tkwataru/keras-yolo3 |------| tensorflowLTで量子化済みの重みデータを出力する。 |
| Chainer | https://github.com/chainer/chainercv/tree/master/examples/yolo|------|　| Chainer自体が開発が終了している | 
| pytorch | https://github.com/ayooshkathuria/pytorch-yolo-v3| モデル名.pt (pytorch の形式)| | [PyTorch + YOLO v3導入](https://qiita.com/MasanoriOGIHARA/items/745252df0873dad63a80) |
| pytorch | https://github.com/ultralytics/yolov3| | | https://qiita.com/harayama_dev68/items/fc660bec06ee05ed32c3 学習のiteration に対する各種指標のプロットを作成できる。|
| Tensorflow | https://github.com/wizyoung/YOLOv3_TensorFlow |------|
| Tensorflow | https://github.com/YunYang1994/tensorflow-yolov3 |------|
| Tensorflow2.x | https://github.com/YunYang1994/TensorFlow2.0-Examples/tree/master/4-Object_Detection/YOLOV3 | | |
| Tensotflow2.x | https://github.com/zzh8829/yolov3-tf2 | | |
| Neural Network Console　（YOLO v2) | https://github.com/sony/nnabla-examples/tree/master/object-detection/yolov2 | | | https://www.slideshare.net/Sony_Neural_Network_Console_Libraries/20190316lets-try-low-powerconsumption-ai-with-sonys-spresense-handson|
| Onnx | https://github.com/onnx/models/tree/master/vision/object_detection_segmentation/yolov3 | https://github.com/onnx/models/tree/master/vision/object_detection_segmentation/yolov3 | | DeepLearningモデルを様々なフレームワーク間で交換するためのフォーマット. Onnx での検出の例 https://github.com/onnx/tutorials/blob/master/tutorials/OnnxRuntimeServerSSDModel.ipynb|

## 推論に特化したフレームワーク

|フレームワーク|ソースコードのURL|モデルデータ | ドキュメントのURL|解説記事|
|----|----|------|------|-----|
| OpenCV | https://github.com/opencv/opencv/blob/master/samples/dnn/object_detection.py |  | https://docs.opencv.org/master/da/d9d/tutorial_dnn_yolo.html | https://docs.opencv.org/master/da/d9d/tutorial_dnn_yolo.html OpenCVでのYoLoの利用は、学習済みモデルを推論する部分が含まれている。学習自体は、darknet で行う。 | 
| OpenVino |https://github.com/PINTO0309/OpenVINO-YoloV3 | | https://github.com/intel-iot-devkit/smart-video-workshop/tree/master/presentations| OpenVinoも推論だけの枠組み|
| Tensorflow lite| https://github.com/peace195/tensorflow-lite-YOLOv3 |モデル名.tflite | |Android端末などの組み込み用途 |
| Xilinx® DNNDK | https://github.com/Xilinx/Edge-AI-Platform-Tutorials/tree/master/docs/Darknet-Caffe-Conversion |  |  | [DNNDK + Ultra96でYOLOv3物体認識onFPGA （その1・FPGA向けデプロイまで）](http://lp6m.hatenablog.com/entry/2019/08/17/013229) - [Ultra96ボードでYOLOを高速化 ](https://www.slideshare.net/HiroyukiOkuhata/ultra96yolo) |
| NNgen | https://github.com/NNgen/nngen/tree/develop/examples/darknet_yolov3_tiny | | | NNgenは、ディープニューラルネットワーク用のモデル固有のハードウェアアクセラレーターを合成するオープンソースのコンパイラーです。 NNgenは、入力モデル定義から、DNNアクセラレータのVerilog HDLソースコードとIPコアパッケージ（IP-XACT）を生成します。|
|TensorRT | https://github.com/lewes6369/TensorRT-Yolov3| | |TensorRT は 推論処理を実行する NVIDIA の GPU に対して convolution の演算などを最適化することにより推論を高速化するライブラリです。 https://qiita.com/dcm_yamaya/items/dcb149684fb210b39e8c |
|TensorRT |https://github.com/jkjung-avt/tensorrt_demos |  | | |
| blueoil | https://docs.blue-oil.org/autoapi/blueoil/networks/object_detection/yolo_v2/index.html | | | LeapMind の提供しているプラットフォーム https://leapmind.io/news/content/3886/ |




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

https://github.com/Xilinx/QNN-MO-PYNQ/tree/master/qnn

https://ru-clip.net/video/D1RxIp76rpc/object-detection-on-the-pynq-z1-and-movidius-neural-compute-stick.html


## 推論時に利用するライブラリを減らしたいなら
　既に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://user-images.githubusercontent.com/26833433/78175826-599d4800-7410-11ea-87d4-f629071838f6.png)
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://www.slideshare.net/HiroyukiOkuhata/ultra96yolo)


[TVMでyolo v3を速くしてみる](https://medium.com/nttlabs/tvm-yolo-v3-1554499de30e)

---
## 付記
https://github.com/microsoft/onnxruntime
https://pypi.org/project/onnxruntime/
[ONNX RuntimeとYoloV3でリアルタイム物体検出](https://cpp-learning.com/onnx-runtime_yolo/)
[Microsoft の ONNX Runtime を速攻レビュー](https://tech-blog.optim.co.jp/entry/2018/12/05/160831)
YoloV3の独自学習結果をONNX Runtime　を使って推論する事例
https://github.com/axinc-ai/yolov3-face

---
[Preferred Networks、深層学習の研究開発基盤をPyTorchに移行](https://preferred.jp/ja/news/pr20191205/)


### OpenVino のModelOptimizer で変換後のモデルデータを入手するには

https://github.com/PINTO0309/OpenVINO-YoloV3/blob/master/lrmodels/tiny-YoloV3/FP32/download_tiny-yolov3lrFP32.sh

## 注意点
wget　を使ってyolov3.cfg などを入手するとき、htmlファイルを入手しないこと。
ページのリンクでは、該当のcfgファイルを表示するためのhtmlファイルになっていることがある。
htmlファイルではなく、確実にcfgファイルのテキストファイルをダウンロードすること。

## 注意点
> このコードは、TF1系のtf.keras、TF2.0のtf.keras、生kerasの3つで挙動が異なります
引用元　https://qiita.com/n_kats_/items/df7ac37f31eeaf4cb557


https://qiita.com/n_kats_/items/df7ac37f31eeaf4cb557

----
[YOLO V3: Darknetのデータ拡張](https://demura.net/robot/athome/15558.html)

[Data Augmentation for Object Detection(YOLO)](https://github.com/srp-31/Data-Augmentation-for-Object-Detection-YOLO-)
[Training YOLOv3 on your custom dataset](https://medium.com/@anirudh.s.chakravarthy/training-yolov3-on-your-custom-dataset-19a1abbdaf09)

[Data Augmentation in YOLOv4](https://towardsdatascience.com/data-augmentation-in-yolov4-c16bd22b2617)

----
## Yoloのモデルのpruning

- Pytorch
    - https://github.com/Lam1360/YOLOv3-model-pruning
    - https://github.com/coldlarry/YOLOv3-complete-pruning
    - https://github.com/PengyiZhang/SlimYOLOv3
    - https://github.com/violet17/yolov3-channel-pruning

- darknet
    - https://github.com/manishravula/yolov3_tiny_pruned


## PaddleSlim モデルのpruning、量子化を行うツール
https://pypi.org/project/paddleslim/

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編](http://tkat0.hateblo.jp/entry/2018/05/22/082911)
> PyTorchのモデルを軽量化してONNX出力


## PyTorch Pruning Tutorial
https://pytorch.org/tutorials/intermediate/pruning_tutorial.html


---
## quantization

https://github.com/Ironteen/YOLOv3-quantization-model-v1.0

---
どうやたいがいのターゲットデバイス上で、重みファイルのbit幅を削減するツールはそろってきているようです。
float32 が float16 になることだけでも高速化することは多いようです。
学習済み重みファイルをint8 に変換するツールはあったりするようですが、int8にまで量子化を進めたものは、検出性能が低下するのは避けられないようです。


----
[【物体検出】vol.9 ：YOLOv3をNVIDIA Jetson AGX Xavierで動かす ](https://www.nakasha.co.jp/future/ai/vol9_yolov3nvidia_jetson_agx_xavier.html)

[Jetson Xavier: Tensorコア対応Yolo V3 インストールメモ](https://demura.net/robot/athome/15506.html)
[Jetson Xavier を動かしてみた。](http://takesan.hatenablog.com/entry/2018/09/13/233334)

## Jetson Xavier
- darknet
- opencv
- tensorflow
- onnx


---
[YOLO（darknet）のコンフィグ(CFG)パラメーターおよびオプション一覧](https://qiita.com/K_ichijima/items/98c41409449d24b445ce)