Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
第50回CV勉強会「CVツールLT大会2」
Kerasで学習したモデルをOpenCVで使う
2018/12/14 takmin
自己紹介
2
株式会社ビジョン&ITラボ 代表取締役
皆川 卓也(みながわ たくや)
「コンピュータビジョン勉強会@関東」主催
博士(工学)
http://visitlab.jp
略歴:
1999-2003年
日本HP(後にアジレント・テクノロジーへ分社)にて、ITエンジニアとしてシステム構築、プリ
セールス、プロジェクトマネジメント、サポート等の業務に従事
2004-2009年
コンピュータビジョンを用いたシステム/アプリ/サービス開発等に従事
2007-2010年
慶應義塾大学大学院 後期博士課程にて、コンピュータビジョンを専攻
単位取得退学後、博士号取得(2014年)
2009年-現在
フリーランスとして、コンピュータビジョンのコンサル/研究/開発等に従事(2018年法人化)
OpenCVでDeep Learning
3
OpenCVがバージョン3.3でDNNモジュー
ルをリリース
なんででぃーぷらーにんぐにわざわざ
OpenCV使う必要あるの?専用ライブラリ
でいいじゃん。
DNNモジュールを使うモチベーション
4
 OpenCVで開発した画像処理プログ
ラムの一部分にCNNを使いたい
 ライブラリをいくつもインストールしたく
ない
 簡単に使いたい
 C++で動かしたい
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
 使っている人もそれほど多くなさそう
学習にKerasを使った理由
6
 諸般の事情でKerasを使う必要があった
 3.4.4までは以下のライブラリのモデルをサ
ポートしており、この中で一番CNNの開発が
易しそうなのがKeras + Tensorflowと判断
 Caffe
 Tensorflow
 Torch
 なお、4.0からはONNXもサポートしてるので、
ChainerやPyTorchからもいけるはず
Kerasで学習してOpenCVで推論
7
試した環境
 Tensorflow 1.5 (Python)
 OpenCV 4.0 (C++)
 LeNETでMNISTを学習
 CPUで学習/推論
 コードはこちら
 https://github.com/takmin/Keras2OpenCV
Kerasで学習してOpenCVで推論
8
手順:
1. Kerasで学習モデルを構築/学習
2. Kerasで推論モデルを構築し、学習結
果を読み込み
3. Kerasの推論モデルからTensorflowの
モデルを取得し、保存
4. OpenCVでモデルファイルを読み込み、
推論を実行
1. Kerasで学習モデルを構築/学習
9
 モデル: LeNet5
 学習データ: MNIST
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
学習方法を指定してコンパイル
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の読み込
みとデータ整形
学習
学習結果
を保存
2. Kerasで推論モデルを構築し、学習結果を読
み込み
12
 OpenCVは推論のみサポートしているため、例えば
Dropoutのような学習用のレイヤーを読み込むことがで
きない
 Tensorflowには”optimize_for_inference”という学習用の
モデルから推論に必要な部分のみを抜き出すツール/ラ
イブラリが用意されているが、Dropoutは除去してくれな
い
 現在pull requestが上がっているが現時点ではマージされてい
ない
 推論用のモデルを構築し、学習したパラメータを読み込
むことで解決
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を除いただけ
2. Kerasで推論モデルを構築し、学習結果を読
み込み
14
Imodel.load_weights("trained_model.h5")
Imodel.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy’])
Imodel.save("inference_model.h5")
学習結果読み込み
学習モデルからパラ
メータを推論モデルへ
読み込み
コンパイル
推定モデルを保存
3. Kerasの推論モデルからTensorflowのモデル
を取得し、保存
15
1. KerasからバックエンドのTensorflowへ
アクセスし、モデルを取得
2. Tensorflowのモデルでは、ネットワーク
構造と重みは別々に扱われているため、
それらを統合(freeze)
 ネットワーク内の変数を定数(学習した重
み)に置き換え
3. Freezeしたモデルをファイルへ保存
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)
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
 Kerasで学習してOpenCVで推論
 学習モデルの他に推論モデルを用意
 KerasからバックエンドのTensorflowを呼び出し、Freezeして保
存
 実行時間はKerasで約2.8ms、OpenCVで1.2ms (Celeron 1.8G)
 今後試したいこと
 Functional APIを使って、どこまで複雑なモデルに対応できる
か確認
 Custom Layer
 ONNXからの読み込み

More Related Content

run Keras model on opencv