OpenCV 4.0のONNXサポートについて

前回の記事に引き続きOpenCV4.0の新機能を紹介します。今回は待望のONNXフォーマット対応を試してみます。

また、OpenCVのDeep Learning関連機能については昔の記事に書いてあります。基本的な使い方はこの頃からあんまり変わってないので参考までに。

ONNXとは

ONNX is a open format to represent deep learning models. With ONNX, AI developers can more easily move models between state-of-the-art tools and choose the combination that is best for them. ONNX is developed and supported by a community of partners.

ONNX(Open Neural Network Exchange)はニューラルネットワークのモデルを定義するためのオープンフォーマットの一つで、様々なDNNフレームワークで作成したモデルをONNXフォーマットで出力することで相互利用することができます。OpenCVでは既にCaffeやTensorFlow等のモデルを読み込みできましたが、OpenCV4.0ではONNXフォーマットもサポートされました。

環境

* CentOS 7.5 (x86_64/Xeon 8core CPU/16GB RAM)
* Python 3.6.5 (Anaconda custom)

使い方

これまでのOpenCV関連記事では基本的にC++から使っていましたけど、たまにはPythonだけでさくっと試してみます。まずは適当なONNXモデルをModel Zooから探します。

ここでは動作確認しやすい画像分類用モデル(ImageNet ILSVRC2012)であるResNet-50のCNNモデルで試してみます。必要なファイルは上記のリポジトリからダウンロードできます。

* 入力画像 (beer.jpg みなとみらいのオクトーバーフェストの時の写真)

* ONNXファイル

* 実装 (read_onnx.py)

* 出力結果

出力結果を見る限り特に問題は無さそうです。前処理としての入力画像の正規化や、カテゴリ定義ファイルの読み込み処理等を省いて見てみると、ONNXモデルの入力と推論処理は簡潔に書けることがわかります。ONNXファイルの読み込みはcv2.dnn.readNetFromONNXメソッドを使うだけです。以前のようにImporterオブジェクトを作る必要も無いので楽ですね。また、前処理部分のコードはModel Zooで紹介されているものをOpenCVのデータ形式と合うように微修正したものを利用しています。一応、cv2.dnn.blobFromImageメソッドでもスケーリング処理等の前処理用オプションが提供されていますが、ここでは手動でスケーリング/正規化処理をしています。

ついでにResNet-50だけではなくShuffleNetも試してみます。こちらもModel Zooからダウンロードできます。

ShuffleNetはエッジデバイスでの効率的な推論処理を実現できる軽量なモデルアーキテクチャの一つです。ONNXファイル比でResNet-50の約18分の1のサイズで収まっています。

ソースコードの変更は読み込むONNXファイル名を変えるだけです。

* 出力結果

分類精度はResNet-50と比べても遜色ないレベルですね。軽量で推論処理も高速なので、久しぶりにRaspberry Pi等のデバイスで動かしてみようかなという気になってきます。

おわりに

近年のOpenCVは機械学習関連の機能を充実させていますが、ONNXフォーマットに対応したことで様々なDNNフレームワークとの併用がより推進されそうです。以前の記事でも書きましたが、個人的にOpenCV3.xを使う機会に恵まれなかった分、OpenCV4.0はどんどん使い倒したいと思います。

前述のサンプルコードはGitHubにも上げてあります。今回は珍しくPython版のみでしたけどC++版も後ほど作って上げておこうと思います。

あと、あけましておめでとうございます。今年もほどほどにがんばろう。

あわせて読む:

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です