こんにちは。
コンピュータビジョン(『ロボットの眼』開発)が専門の”はやぶさ”@Cpp_Learningです。
『深層学習による物体検出』が好きで色んな記事を書いてます↓



ChainerやPyTorchを使う機会が多いのですが、今回はMicrosoft社製OSSのONNX Runtimeを使って物体検出を実践します。
Contents
ONNXとは
ONNXとはOpen Neural Network Exchangeの略称で、深層学習フレームワークなどで生成された学習済みモデルのためのフォーマットです。
各深層学習フレームワークが独自フォーマットの学習済みモデルではなく、ONNX形式を採用することで、学習済みモデルの交換を簡単に実現することができます。

例えば、Chainerでは「HDF5形式」と「NPZ形式」の2種類のフォーマットで学習済みモデルを保存できますが、onnx-chainerを使うことで、ONNX形式のモデルを出力することもできます。
一方、MXNetはONNX-MXNet APIがあり、ONNX形式のモデルの入出力ができます。
つまり、ONNXを使うことで、Chainerで学習したモデルをMXNetで使う!といったツール間の移動(モデルの交換)を簡単に実現することができます。
ONNXをサポートしているフレームワークについては、公式サイトなどで確認できます。
ONNX Runtimeとは
ONNX RuntimeとはONNXモデルに特化した推論エンジンです。推論専用という意味で、ChainerのMenohやNVIDIAのTensorRTの仲間です。
2019/07/08時点、ONNX Runtimeがサポートしている言語(API)は以下の通りです。
環境構築
ONNX Runtime(Python API)を使うための環境構築について説明します。
今回はAnaconda for Windowsを採用しました。Anacondaのインストール方法や基本的な使い方については、下記記事をご参照ください。

最初に、以下のコマンドで仮想環境を生成後、アクティブにします。
conda create -n onnxruntime pip python
activate onnxruntime
続いて、以下のコマンドでONNX Runtimeをインストールします。
pip install onnxruntime
その他のモジュールもインストールします。
pip install numpy
pip install Pillow
pip install matplotlib
以降で説明するソースコードは以下のバージョンで動作確認しました。
- Python==3.7
- onnxruntime==0.4.0
- numpy==1.16.4
- Pillow==6.0.0
- matplotlib==3.1.0
2019/07/08時点、onnxruntimeはPython3.5~Python3.7をサポートしています。
実践!ONNX RuntimeとYoloV3で物体検出
以降からONNX Runtimeの使い方を説明します。ONNX Model Zoo の中からChainerCVで実践したYoloV3モデルを見つけたので…
今回は『ONNX RuntimeとYoloV3でリアルタイム物体検出』を実践します。

ONNXRuntime_YoloV3.py開発
ONNX Model ZooからダウンロードしたYoloV3モデルの説明がONNX_YoloV3にあります。これを参照しながら作成したソースコード”ONNXRuntime_YoloV3.py”が以下です。
以下のコマンドで動作確認できます。
python ONNXRuntime_YoloV3.py
出力画像はChainerCVを意識した表示にしました。

フクロウのくるるちゃん@kururu_owl をちゃんと検出できてますね…可愛い!!
ソースコードのパス設定を任意に変更してください
- 43行目:画像パス
- 61行目:ONNXモデルパス
ONNXRuntime_YoloV3.pyの解説
”ONNXRuntime_YoloV3.py”を作成する前にJupyter Notebookで各種検討を実施した『技術ノート』があるので公開します。
資料としてはもちろん、チュートリアルとしても活用できると思うので、自由に使って下さい。
まとめ
本記事は以下の文章構成で説明しました。
- 【前半】ONNXおよびONNX Runtimeの概要説明
- 【後半】ONNX RuntimeとYoloV3による物体検出
深層学習や画像処理などを勉強している人が…
- ONNXについて知りたい
- 推論エンジンを使ったリアルタイム処理に興味がある
- ONNX Runtimeで物体検出などを実践したい
などを想いながら本記事にたどり着き、”ONNXRuntime_YoloV3.py”や『技術ノート(Jupyter Notebook)』を参考にしてくれた最高に嬉しいです!
