Location via proxy:
[ UP ]
[Report a bug]
[Manage cookies]
No cookies
No scripts
No ads
No referrer
Show this form
Submit Search
Submit Search
Upload
run Keras model on opencv
•
5 likes
•
13,429 views
Takuya Minagawa
Follow
第50回コンピュータビジョン勉強会@関東「CVで使えるツールLT大会2」発表資料です。
Read less
Read more
Report
Share
Report
Share
1 of 18
Download now
Download to read offline
More Related Content
run Keras model on opencv
1.
第50回CV勉強会「CVツールLT大会2」 Kerasで学習したモデルをOpenCVで使う 2018/12/14 takmin
2.
自己紹介 2 株式会社ビジョン&ITラボ 代表取締役 皆川 卓也(みながわ
たくや) 「コンピュータビジョン勉強会@関東」主催 博士(工学) http://visitlab.jp 略歴: 1999-2003年 日本HP(後にアジレント・テクノロジーへ分社)にて、ITエンジニアとしてシステム構築、プリ セールス、プロジェクトマネジメント、サポート等の業務に従事 2004-2009年 コンピュータビジョンを用いたシステム/アプリ/サービス開発等に従事 2007-2010年 慶應義塾大学大学院 後期博士課程にて、コンピュータビジョンを専攻 単位取得退学後、博士号取得(2014年) 2009年-現在 フリーランスとして、コンピュータビジョンのコンサル/研究/開発等に従事(2018年法人化)
3.
OpenCVでDeep Learning 3 OpenCVがバージョン3.3でDNNモジュー ルをリリース なんででぃーぷらーにんぐにわざわざ OpenCV使う必要あるの?専用ライブラリ でいいじゃん。
4.
DNNモジュールを使うモチベーション 4 OpenCVで開発した画像処理プログ ラムの一部分にCNNを使いたい ライブラリをいくつもインストールしたく ない
簡単に使いたい C++で動かしたい
5.
OpenCV DNNモジュール 5 推論専用
学習は他のDeep Learningライブラリを使用 ドキュメントは少ない チュートリアル: https://docs.opencv.org/4.0.0/d2/d58/tutorial_table _of_content_dnn.html APIリファレンス: https://docs.opencv.org/4.0.0/d6/d0f/group__dnn.ht ml 使っている人もそれほど多くなさそう
6.
学習にKerasを使った理由 6 諸般の事情でKerasを使う必要があった 3.4.4までは以下のライブラリのモデルをサ ポートしており、この中で一番CNNの開発が 易しそうなのがKeras
+ Tensorflowと判断 Caffe Tensorflow Torch なお、4.0からはONNXもサポートしてるので、 ChainerやPyTorchからもいけるはず
7.
Kerasで学習してOpenCVで推論 7 試した環境 Tensorflow 1.5
(Python) OpenCV 4.0 (C++) LeNETでMNISTを学習 CPUで学習/推論 コードはこちら https://github.com/takmin/Keras2OpenCV
8.
Kerasで学習してOpenCVで推論 8 手順: 1. Kerasで学習モデルを構築/学習 2. Kerasで推論モデルを構築し、学習結 果を読み込み 3.
Kerasの推論モデルからTensorflowの モデルを取得し、保存 4. OpenCVでモデルファイルを読み込み、 推論を実行
9.
1. Kerasで学習モデルを構築/学習 9 モデル:
LeNet5 学習データ: MNIST
10.
1. Kerasで学習モデルを構築/学習 10 Tmodel =
Sequential() Tmodel.add(Conv2D(32,kernel_size=(5,5),input_shape=input_shape)) Tmodel.add(MaxPooling2D(pool_size=(2,2))) Tmodel.add(Conv2D(64,kernel_size=(5,5),input_shape=input_shape)) Tmodel.add(MaxPooling2D(pool_size=(2,2))) Tmodel.add(Flatten()) Tmodel.add(Dense(1024, activation=tf.nn.relu)) Tmodel.add(Dropout(0.2)) Tmodel.add(Dense(10,activation=tf.nn.softmax)) Tmodel.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) 学習モデル構築 KerasのSequential Model Conv x2 Max Pooling x2 Full Connected Layer Drop Out 学習方法を指定してコンパイル
11.
1. Kerasで学習モデルを構築/学習 11 from tensorflow.python.keras.datasets
import mnist (x_train, y_train), (x_test, y_test) = mnist.load_data() x_train = x_train.reshape(x_train.shape[0], 28, 28, 1) x_test= x_test.reshape(x_test.shape[0], 28, 28, 1) x_train = x_train.astype('float32') x_test = x_test.astype('float32') x_train /= 255 x_test /= 255 Tmodel.fit(x=x_train,y=y_train,epochs=10,batch_size=128,validation_ data=(x_test,y_test)) Tmodel.save("trained_model.h5") MNISTで学習する例 MNISTの読み込 みとデータ整形 学習 学習結果 を保存
12.
2. Kerasで推論モデルを構築し、学習結果を読 み込み 12 OpenCVは推論のみサポートしているため、例えば Dropoutのような学習用のレイヤーを読み込むことがで きない
Tensorflowには”optimize_for_inference”という学習用の モデルから推論に必要な部分のみを抜き出すツール/ラ イブラリが用意されているが、Dropoutは除去してくれな い 現在pull requestが上がっているが現時点ではマージされてい ない 推論用のモデルを構築し、学習したパラメータを読み込 むことで解決
13.
2. Kerasで推論モデルを構築し、学習結果を読 み込み 13 Imodel =
Sequential() Imodel.add(Conv2D(32,kernel_size=(5,5),input_shape=input_sha pe)) Imodel.add(MaxPooling2D(pool_size=(2,2))) Imodel.add(Conv2D(64,kernel_size=(5,5),input_shape=input_sha pe)) Imodel.add(MaxPooling2D(pool_size=(2,2))) Imodel.add(Flatten()) Imodel.add(Dense(1024, activation=tf.nn.relu)) #Imodel.add(Dropout(0.2)) Imodel.add(Dense(10,activation=tf.nn.softmax)) 推論モデル構築 学習モデルから Dropoutを除いただけ
14.
2. Kerasで推論モデルを構築し、学習結果を読 み込み 14 Imodel.load_weights("trained_model.h5") Imodel.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy’]) Imodel.save("inference_model.h5") 学習結果読み込み 学習モデルからパラ メータを推論モデルへ 読み込み コンパイル 推定モデルを保存
15.
3. Kerasの推論モデルからTensorflowのモデル を取得し、保存 15 1. KerasからバックエンドのTensorflowへ アクセスし、モデルを取得 2.
Tensorflowのモデルでは、ネットワーク 構造と重みは別々に扱われているため、 それらを統合(freeze) ネットワーク内の変数を定数(学習した重 み)に置き換え 3. Freezeしたモデルをファイルへ保存
16.
3. Kerasの推論モデルからTensorflowのモデル を取得し、保存 16 from tensorflow.python.keras.models
import load_model import tensorflow as tf from tensorflow.python.keras import backend as K model = load_model('inference_model.h5') sess = K.get_session() outname = "output_node0" tf.identity(model.outputs[0], name=outname) constant_graph = graph_util.convert_variables_to_constants(sess, sess.graph.as_graph_def(),[outname]) tf.train.write_graph(constant_graph, "./", "lenet.pb", as_text=False) 推論モデル構築 Keras推論モデル 読み込み Kerasのバックエンド(Tensorflow) のセッション取得 Freeze プロトコルバッファをバイ ナリで保存(./lenet.pb)
17.
4. OpenCVでモデルファイルを読み込み、推論 を実行 17 dnn::Net net
= dnn::readNet("./lenet.pb"); Mat img = imread(“mnist0.png", 0); Mat blob = dnn::blobFromImage(img, 1.0 / 255); net.setInput(blob); Mat prob = net.forward(); Point classIdPoint; double confidence; minMaxLoc(prob.reshape(1, 1), 0, &confidence, 0, &classIdPoint); int classId = classIdPoint.x; C++ Tensorflow推論 モデル読み込み 予測
18.
まとめ 18 Kerasで学習してOpenCVで推論 学習モデルの他に推論モデルを用意
KerasからバックエンドのTensorflowを呼び出し、Freezeして保 存 実行時間はKerasで約2.8ms、OpenCVで1.2ms (Celeron 1.8G) 今後試したいこと Functional APIを使って、どこまで複雑なモデルに対応できる か確認 Custom Layer ONNXからの読み込み
Download now