ONNX変換・確認ライブラリ、アプリケーションまとめ

**Chapters**

📘 **Chapter #0**　[YOLOとは](https://qiita.com/tfukumori/items/65056a4d51b531cdd45c)
📘 **Chapter #1**　[環境設定](https://qiita.com/tfukumori/items/6f33af8f9dc2ac974f43)
📘 **Chapter #2**　[アノテーション](https://qiita.com/tfukumori/items/0911c8fe1f5319530d4b)
📘 **Chapter #3**
　📗 **Chapter #3-1**　[YOLOv3 Keras版実装](https://qiita.com/tfukumori/items/d1f79078803d8a7fe103)
　📗 **Chapter #3-2**　[YOLOv3 Darknet版](https://qiita.com/tfukumori/items/15edd532e0a04c0a4672)
📘 **Chapter #A**
　📗 **Chapter #A-1**　[YOLOの各バージョンについてまとめ](https://qiita.com/tfukumori/items/519d84bf3feb8d246924)
　📗 **Chapter #A-2**　[YOLOv3 Keras版実装に関して関連記事のまとめ](https://qiita.com/tfukumori/items/9e62c4a7acd7ea6ddd3b)
　📗 **Chapter #A-3**　[ONNX変換・確認ライブラリ、アプリケーションまとめ](https://qiita.com/tfukumori/items/3f438294e722bc29fe16)

---

#TL;DR

- ONNXに変換を行う、またはONNXの内容を確認するライブラリ、アプリケーションまとめ（随時更新予定）


# 目次

- [1. ONNXのVersionとOpset](#1-onnxのversionとopset)
    - [1.1. Version](#11-version)
    - [1.2. Opset](#12-opset)
    - [1.3. TensorRTとONNXの対応バージョン](#13-tensorrtとonnxの対応バージョン)
    - [1.4. 参考](#14-参考)
- [2. 機械学習フレームワーク間の変換](#2-機械学習フレームワーク間の変換)
    - [2.1. MMdnn](#21-mmdnn)
    - [2.2. ONNXMLTools](#22-onnxmltools)
    - [2.3. keras2onnx](#23-keras2onnx)
    - [2.4. WinMLTools](#34-winmltools)
    - [2.5. PyToachからONNXに変換する](#25-pytoachからonnxに変換する)
- [3. ONNXバージョン変換](#3-onnxバージョン変換)
    - [3.1. ONNX Version Converter](#31-onnx-version-converter)
- [4. 確認](#4-確認)
    - [4.1. Netron](#41-netron)


# 前提

- 基本的には仮想環境を作成してから作業することをお勧めします。

```posh:Anacondaでの例
conda create -n mmdnn python=3.6
```

# 1. ONNXのVersionとOpset

## 1.1. Version

（調査中...）

## 1.2. Opset

（調査中...）

## 1.3. TensorRTとONNXの対応バージョン

|TensorRT|ONNX|URL|
|---|---|---|
|7.x|1.6.0|https://docs.nvidia.com/deeplearning/tensorrt/release-notes/tensorrt-7.html|
|6.x|1.5.0|https://docs.nvidia.com/deeplearning/tensorrt/release-notes/tensorrt-6.html|
|5.x|1.4.1|https://docs.nvidia.com/deeplearning/tensorrt/release-notes/tensorrt-5.html|
|4.x|1.0|https://docs.nvidia.com/deeplearning/tensorrt/release-notes/tensorrt-4.html|

## 1.4. 参考

ONNX versioning
https://github.com/onnx/onnx/blob/master/docs/Versioning.md
ONNX Version Converter
https://github.com/onnx/onnx/blob/master/docs/VersionConverter.md
ONNX Runtimeのバージョン互換に関するドキュメント
https://github.com/microsoft/onnxruntime/blob/master/docs/Versioning.md
ONNX バージョンと Windows ビルド
https://docs.microsoft.com/ja-jp/windows/ai/windows-ml/onnx-versions
いまさらONNXを調べた(v1.4.1)
https://tkat0.github.io/posts/learn-onnx/

# 2. 機械学習フレームワーク間の変換

## 2.1. MMdnn

### 2.1.1. 公式サイト

https://github.com/Microsoft/MMdnn

### 2.1.2. 概要

> MMdnnは、ディープラーニング（DL）モデルの変換、可視化、診断を行うための包括的でクロスフレームワークのツールです。「MM」はモデル管理の略で、「dnn」はディープニューラルネットワークの頭文字をとったものです。

参考：https://github.com/Microsoft/MMdnn

### 2.1.3. 対応機械学習フレームワーク

- Keras
- TensorFlow (試験的) (まずは TensorFlow のReadmeを確認することを勧めます)
- CoreML (訳注：Apple CoreML)
- Caffe
- MXNet
- PyTorch
- Microsoft Cognitive Toolkit (CNTK)
- DarkNet (ソースのみ、 試験的))
- ONNX (ターゲットのみ)

転載元（2020年7月7日時点）：https://github.com/Microsoft/MMdnn

### 2.1.4. インストール

```posh
pip install mmdnn
```

- その他変換する形式に応じたモジュールが必要。kerasの形式（*.karas, *.h5）を変換するならば、keras, tensorflowなど

### 2.1.5. 使い方

```posh
mmconvert -sf keras -iw <kerasのHDF5ファイル(*.h5)> -df onnx -om <出力ONNXファイル(*.onnx)>
```

参考：https://arakan-pgm-ai.hatenablog.com/entry/2019/03/01/090000

### 2.1.6. Tips

- **load_model_from_hdf5メソッドで`raise ValueError('No model found in config file.')`が表示された場合**

    保存しているkeras形式が重み付けだけの場合に表示される模様。

    対処法は、保存時に`model.save_weights()`の代わりに`model.save()`を使用することで改善した、との情報あり。

    参考：
    - [AssertionError · Issue #324 · microsoft/MMdnn](https://github.com/microsoft/MMdnn/issues/324)
    - [Kerasにおける重み／モデルの保存、読み込みについて](https://intellectual-curiosity.tokyo/2019/07/04/keras%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E9%87%8D%E3%81%BF%EF%BC%8F%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E4%BF%9D%E5%AD%98%E3%80%81%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF%E3%81%AB%E3%81%A4%E3%81%84/)

## 2.2. ONNXMLTools

### 2.2.1. 公式サイト

https://github.com/onnx/onnxmltools
https://pypi.org/project/onnxmltools/

### 2.2.2. 概要

> ONNXMLToolsを使用すると、さまざまな機械学習ツールキットのモデルをONNXに変換することができます。

引用元：https://github.com/onnx/onnxmltools

### 2.2.3. 対応機械学習フレームワーク

- Keras ([keras2onnx converter](https://github.com/onnx/keras-onnx/)のラッパー)
- Tensorflow ([tf2onnx converter](https://github.com/onnx/tensorflow-onnx/)のラッパー)
- scikit-learn ([skl2onnx converter](https://github.com/onnx/sklearn-onnx/)のラッパー)
- Apple Core ML
- Spark ML (試験的)
- LightGBM
- LibSVM
- XGBoost

※Pytorchには内蔵のONNXエクスポート機能があります。

転載元（2020年7月7日時点）：https://github.com/onnx/onnxmltools

## 2.3. keras2onnx

### 2.3.1. 公式サイト

https://github.com/onnx/keras-onnx

### 2.3.2. 概要

> keras2onnxモデルコンバータを使用すると、KerasモデルをONNXモデルフォーマットに変換することができます。当初、Kerasコンバータはonnxmltoolsプロジェクトで開発されていましたが、Keras2onnxコンバータの開発は独立したリポジトリに移され、より多くの種類のKerasモデルをサポートし、複数のコンバータを混在させる複雑さを軽減しました。

引用元：https://github.com/onnx/keras-onnx

また、[WinMLTool](#12-winmltools)は、keras2onnx の呼び出しをラップしています。

## 2.4. WinMLTools

様々な機械学習モデルをONNXに変換し、[Windows ML（Windows用の高速な推論環境）](https://docs.microsoft.com/ja-jp/windows/ai/windows-ml/)で使用できるようにするためのツール。

### 2.4.1. 公式サイト

https://docs.microsoft.com/ja-jp/windows/ai/windows-ml/convert-model-winmltools

### 2.4.2. 概要

> WinMLTools を使用すると、さまざまなトレーニング フレームワークで作成された機械学習モデルを ONNX に変換できます。 これは、モデルを ONNX に変換して Windows ML で使用できるようにするための ONNXMLTools および TF2ONNX の拡張機能です。

引用元：https://docs.microsoft.com/ja-jp/windows/ai/windows-ml/convert-model-winmltools

### 2.4.3. 対応機械学習フレームワーク

- Keras
- TensorFlow (試験的)
- scikit-learn
- Apple Core ML
- LightGBM
- LibSVM
- XGBoost

転載元（2020年7月7日時点）：https://docs.microsoft.com/ja-jp/windows/ai/windows-ml/convert-model-winmltools

## 2.5. PyToachからONNXに変換する

https://torch.classcat.com/2020/01/21/pytorch-1-4-tutorials-super-resolution-with-onnxruntime/

# 3. ONNXバージョン変換

## 3.1. ONNX Version Converter

### 3.1.1. 公式サイト

https://github.com/onnx/onnx/blob/master/docs/VersionConverter.md

ONNX モデルを新しいターゲット opset にアップグレードおよびダウングレードする方法の例を示すチュートリアル
https://github.com/onnx/tutorials/blob/master/tutorials/ExportModelFromPyTorchForWinML.md

### 3.1.2. 概要

> ONNX API には、異なる opset バージョン間で ONNX モデルを変換するためのライブラリが用意されています。 これにより、開発者とデータ サイエンティストは、既存の ONNX モデルを新しいバージョンにアップグレードしたり、モデルを古いバージョンの ONNX 仕様にダウングレードしたりできます。
> バージョン コンバーターは、C++ または Python の API を使用して呼び出すことができます。 ONNX モデルを新しいターゲット opset にアップグレードおよびダウングレードする方法の例を示すチュートリアルも用意されています。

引用元：https://docs.microsoft.com/ja-jp/windows/ai/windows-ml/onnx-versions


# 4. 確認

## 4.1. Netron

### 4.1.1. 公式サイト

https://github.com/lutzroeder/netron

### 4.1.2. インストール

[Winget](https://github.com/microsoft/winget-cli/releases)にてインストールする

```posh
winget install -e --id LutzRoeder.Netron
```

### 4.1.3. 情報確認

左上のModel Propertiesボタンから、ONNXのバージョンを確認できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/dfbd366f-3674-2822-331b-d2c850484304.png)

**確認例1**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/cc8f668a-af9a-f098-aa32-b11712622c6d.png)

- ONNXのファイルフォーマットバージョンが v6
- INPUTSが2つ、OUTPUTSが3つ

**確認例2**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/1044416e-3b76-46f0-bbf7-84a2b491aebc.png)

- ONNXのファイルフォーマットバージョンが v7
- INPUTSが2つ、OUTPUTSが3つ（確認例1と違いなし）