Python 3.7 x OpenCV 4.0 で ONNX のモデルを実行する
2018/12/24
Table of Contents
4.0-alpha (2018/9/20) の抜粋&意訳 (*1)
- OpenCV の DNN モジュールに ONNX パーサーを追加したよ
— AlexNet, Inception v2, Resnet, VGG etc. The tiny YOLO v2 などが部分的にサポートされているよ。 - Mask RCNN をサポートし、example を追加したよ
- OpenVINOを利用することによってより早い物体検出ができるようになったよ。
- QR コードがより早く読めるようになったよ (Core i5, 640x480px の画像で 80FPS ぐらい)
らしいです。
4.0-beta(2018/10/16) の抜粋&意訳(*2)
- ONNX パーサーでもっと多くのトポロジーを認識できるようにしたよ
- 物体検出のコードを改良して使いやすくしたよ
- 超効率的な画像処理パイプラインエンジンがopencv_gapiモジュールとして統合されたよ
- QUirc (https://github.com/dlbeer/quirc) ライブラリを活用して、QRコードを読み取って解析できるようになったよ
あと、 OpenVINO toolkit の話も出ていました。
OpenVINO toolkit は、Intel 製のDeep Learning モデル推論時に使うライブラリらしく、Intel 製のチップを用いた推論速度が早くなるそうです。
4.0-rc (2018/11/12) の抜粋&意訳(*3)
- Vulkan をバックエンドとしたDNN のモジュールが追加されたよ
- より正確にカメラのキャリブレーションを行えるメソッドが追加されたよ
- Graph API がより良くなったよ
- QuickTime, QTKit, Unicap, Video for Windows, libv4l, DC1394_V1, Carbon などの時代遅れのビデオバックエンドを削除したよ
- 3.4 のブランチに最近入ったコード(脆弱性対策など)をマスターにマージしたよ
changelog の抜粋&意訳
割愛。
読んだ感想
QR コードと DNN を超推してるなという印象です。
中国では数年前からQR コード決済がずっと流行っていますし、
日本でも、PayPay によるQR コード決済が大きな話題を呼びました。
確実に需要が高まってきているのでしょう。
QR コードの読み取りと解析がすばやくできるのは大きな価値になるのだろうなと感じます。
DNNは相変わらず画像の分野で猛威を奮っています。
OpenCVも画像を扱うライブラリである以上、無視できなくなった形でしょうか。
ちなみに、開発自体はかなり前から行われていたそうです(*4)。
ただ、新たにONNXに対応するなど、幅を広げている印象です。
今回、G-API (Graph-API) というものが追加されており、興味深いのですが、
まだPython 版はリリースされていない(*5)ようなので、もう少し待ってから使ってみようと思います。
環境構築
Python から OpenCV を操作できる環境を構築していきましょう。
Python を使っている人はお世話になっている方が多いと思いますが、
OpenCV 3.4.x 系は、 pip install opencv-python
でインストールできます(*6)。
ところが、こちらの issue にあるとおり、
まだ2018/12/16 の段階では OpenCV の 4系には対応していません。
困った。。。
ということで、いろいろと探しました。そして、見つけました。
こんな素晴らしいレポジトリを!
https://github.com/janza/docker-python3-opencv
ということで、使ってみました。
が、残念ながら python -c "import cv2; print(cv2. __version__ )"
を実行してもうまくいきませんでした。
なので、改良版を作成しました。
こちらのコマンドで docker pull していただけます(1.3GB)。
docker pull gorogoroyasu/docker-python3-opencv
入手後、 docker run -it --rm gorogoroyasu/docker-python3-opencv python -c "import cv2; print(cv2. __version__ )"
としていただけると、無事 4.0.0 という結果が帰ってくるのではないかと思います。
変更点を見たらわかることなのですが、本家との違いは、シンボリックリンクの設定を追加したことです。
// 2018/12/24 編集
一応本家にもPRを出してますが、マージされるかどうかはわかりませんし、あまり自信もありません。
もしマージされたら、本家の方を使ってください。
マージされましたので、 https://github.com/janza/docker-python3-opencv をお使いください。
// 2018/12/24 編集 ここまで
なお、以下のONNX を使ってみるサンプルコードは、全てこの環境で動かしています。
ONNXを動かしてみる。
- Python を実行する。
docker run -it --rm gorogoroyasu/docker-python3-opencv python
- Mnist のモデルを準備する
https://github.com/onnx/models/tree/master/mnist より、データをダウンロードする。
そして、解凍する。
wget https://onnxzoo.blob.core.windows.net/models/opset_8/mnist/mnist.tar.gz
tar -zxvf mnist.tar.gz
- 推論する
最初に、
pip install matplotlib sklearn
を実行する必要があります。
その後、
import numpy as np
import matplotlib.pyplot as plt
import cv2
import sklearn
from sklearn import datasets, model_selection, svm, metrics
mnist = datasets.fetch_mldata('MNIST original', data_home='data/src/download/')
lendata = np.arange(len(mnist['data']))
choosen = np.random.choice(lendata, 5, replace=False);
for c in choosen:
img = mnist['data'].reshape((28, 28))
img = img / 255.
img = img.reshape((-1, 1, 28, 28))
net=cv2.dnn.readNetFromONNX('./mnist/model.onnx')
net.setInput(img)
detections = net.forward()
print('prediction: ', np.argmax(detections), 'answer: ', int(mnist['target']))
を実行すると、
prediction: 3
answer: 3
のように、NN によって予想された結果と、正解が出力されます。
ということで、無事推論できました。
今回は OpenCV 4.0 を使って ONNX が実行できることを確認したかったので、
適当に学習済みのモデルを取ってきて推論を回しましたが、
実際はちゃんと train/validation データに分類する必要があります。
参考文献等
文中で引用
- https://opencv.org/opencv-4-0-0-alpha.html
- https://opencv.org/opencv-4-0-0-beta.html
- https://opencv.org/opencv-4-0-0-rc.html
- https://rest-term.com/archives/3269/
- https://docs.opencv.org/4.0.0/df/d7e/tutorial_table_of_content_gapi.html
- https://github.com/skvark/opencv-python
その他
- https://rest-term.com/archives/3491/
- https://stackoverflow.com/questions/53224685/trouble-using-opencv-to-load-a-net-from-onnx-python-pytorch
- https://docs.opencv.org/4.0.0/d0/d1e/gapi.html
- http://asukiaaa.blogspot.com/2018/03/opencvdnnpythonmobilenet.html
- https://www.pyimagesearch.com/2017/11/06/deep-learning-opencvs-blobfromimage-works/\ など。
明日の担当は、@kawano-fusic です。楽しみですね!
Yasuaki Hamano
I'm a software engineer in Fukuoka, Japan. Recently, I am developing machine learning models using TensorFlow, and also developing Web services by using PHP.