第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

PPTX
Variational Template Machine for Data-to-Text Generation
PPTX
【DL輪読会】Semi-Parametric Neural Image Synthesis
PDF
三次元表現まとめ(深層学習を中心に)
PDF
画像認識の初歩、SIFT,SURF特徴量
PDF
全力解説!Transformer
PDF
プレゼン・ポスターで自分の研究を「伝える」 (How to do technical oral/poster presentation)
PDF
ディープラーニングの最新動向
PDF
SSII2019TS: プロジェクタ・カメラシステムが変わる! ~時間同期の制御で広がる応用~
Variational Template Machine for Data-to-Text Generation
【DL輪読会】Semi-Parametric Neural Image Synthesis
三次元表現まとめ(深層学習を中心に)
画像認識の初歩、SIFT,SURF特徴量
全力解説!Transformer
プレゼン・ポスターで自分の研究を「伝える」 (How to do technical oral/poster presentation)
ディープラーニングの最新動向
SSII2019TS: プロジェクタ・カメラシステムが変わる! ~時間同期の制御で広がる応用~

What's hot (20)

PPTX
【DL輪読会】ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
PDF
“機械学習の説明”の信頼性
PDF
ROS を用いた自律移動ロボットのシステム構築
PDF
[DL輪読会]画像を使ったSim2Realの現況
PDF
Cv勉強会cvpr2018読み会: Im2Flow: Motion Hallucination from Static Images for Action...
PPTX
畳み込みニューラルネットワークの高精度化と高速化
PPTX
MPC概説.pptx
PDF
画像の基盤モデルの変遷と研究動向
PPTX
畳み込みLstm
PPTX
【DL輪読会】High-Resolution Image Synthesis with Latent Diffusion Models
PPTX
Curriculum Learning (関東CV勉強会)
PDF
Non-autoregressive text generation
PDF
Visual SLAM: Why Bundle Adjust?の解説(第4回3D勉強会@関東)
PDF
大規模データ時代に求められる自然言語処理
PDF
Attentionの基礎からTransformerの入門まで
PPTX
画像キャプションの自動生成
PDF
【メタサーベイ】数式ドリブン教師あり学習
PPTX
【DL輪読会】DiffRF: Rendering-guided 3D Radiance Field Diffusion [N. Muller+ CVPR2...
PDF
[DL輪読会]Learning Transferable Visual Models From Natural Language Supervision
PDF
機械学習モデルの判断根拠の説明(Ver.2)
【DL輪読会】ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
“機械学習の説明”の信頼性
ROS を用いた自律移動ロボットのシステム構築
[DL輪読会]画像を使ったSim2Realの現況
Cv勉強会cvpr2018読み会: Im2Flow: Motion Hallucination from Static Images for Action...
畳み込みニューラルネットワークの高精度化と高速化
MPC概説.pptx
画像の基盤モデルの変遷と研究動向
畳み込みLstm
【DL輪読会】High-Resolution Image Synthesis with Latent Diffusion Models
Curriculum Learning (関東CV勉強会)
Non-autoregressive text generation
Visual SLAM: Why Bundle Adjust?の解説(第4回3D勉強会@関東)
大規模データ時代に求められる自然言語処理
Attentionの基礎からTransformerの入門まで
画像キャプションの自動生成
【メタサーベイ】数式ドリブン教師あり学習
【DL輪読会】DiffRF: Rendering-guided 3D Radiance Field Diffusion [N. Muller+ CVPR2...
[DL輪読会]Learning Transferable Visual Models From Natural Language Supervision
機械学習モデルの判断根拠の説明(Ver.2)
Ad

Similar to run Keras model on opencv (20)

PDF
自習形式で学ぶ「DIGITS による画像分類入門」
PPTX
CNTK deep dive
PDF
DIGITSによるディープラーニング画像分類
PDF
ハンズオン セッション 1: DIGITS によるディープラーニング入門
PDF
ハンズオン1: DIGITS によるディープラーニング入門
PDF
シリーズML-06 ニューラルネットワークによる線形回帰
PDF
Python初心者がKerasで画像判別をやってみた
PDF
ハンズオン セッション 2: DIGITS による物体検出入門
PPTX
コキュートスSwest19
PDF
Enjoy handwritten digits recognition AI !!
PPTX
「機械学習とは?」から始める Deep learning実践入門
PPTX
CNNチュートリアル
PPTX
いきなりAi tensor flow gpuによる画像分類と生成
DOCX
march report in japanese
PPTX
tfug-kagoshima
PDF
[CV勉強会]Active Object Localization with Deep Reinfocement Learning
PDF
[AI08] 深層学習フレームワーク Chainer × Microsoft で広がる応用
PDF
第3回機械学習勉強会「色々なNNフレームワークを動かしてみよう」-Keras編-
PDF
オトナのプログラミング勉強会 オトナのDeep Learning 2016-11
PPTX
AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」【旧版】※新版あります
自習形式で学ぶ「DIGITS による画像分類入門」
CNTK deep dive
DIGITSによるディープラーニング画像分類
ハンズオン セッション 1: DIGITS によるディープラーニング入門
ハンズオン1: DIGITS によるディープラーニング入門
シリーズML-06 ニューラルネットワークによる線形回帰
Python初心者がKerasで画像判別をやってみた
ハンズオン セッション 2: DIGITS による物体検出入門
コキュートスSwest19
Enjoy handwritten digits recognition AI !!
「機械学習とは?」から始める Deep learning実践入門
CNNチュートリアル
いきなりAi tensor flow gpuによる画像分類と生成
march report in japanese
tfug-kagoshima
[CV勉強会]Active Object Localization with Deep Reinfocement Learning
[AI08] 深層学習フレームワーク Chainer × Microsoft で広がる応用
第3回機械学習勉強会「色々なNNフレームワークを動かしてみよう」-Keras編-
オトナのプログラミング勉強会 オトナのDeep Learning 2016-11
AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」【旧版】※新版あります
Ad

More from Takuya Minagawa (20)

PDF
R-SCoRe: Revisiting Scene Coordinate Regression for Robust Large-Scale Visual...
PDF
「第63回コンピュータビジョン勉強会@関東」発表資料 CVの社会実装について考えていたらゲームを作っていた話
PDF
第61回CV勉強会「CVPR2024読み会」(前編)発表資料:State Space Models for Event Cameras
PDF
ろくに電子工作もしたことない人間がIoT用ミドルウェアを作った話(IoTLT vol112 発表資料)
PDF
Machine Learning Operations (MLOps): Overview, Definition, and Architecture
PDF
MobileNeRF
PDF
点群SegmentationのためのTransformerサーベイ
PDF
Learning to Solve Hard Minimal Problems
PDF
ConditionalPointDiffusion.pdf
PDF
楽しいコンピュータビジョンの受託仕事
PDF
20210711 deepI2P
PDF
20201010 personreid
PDF
20200910コンピュータビジョン今昔物語(JPTA講演資料)
PDF
2020/07/04 BSP-Net (CVPR2020)
PDF
20200704 bsp net
PDF
20190825 vins mono
PDF
20190706cvpr2019_3d_shape_representation
PDF
20190307 visualslam summary
PDF
Visual slam
PDF
20190131 lidar-camera fusion semantic segmentation survey
R-SCoRe: Revisiting Scene Coordinate Regression for Robust Large-Scale Visual...
「第63回コンピュータビジョン勉強会@関東」発表資料 CVの社会実装について考えていたらゲームを作っていた話
第61回CV勉強会「CVPR2024読み会」(前編)発表資料:State Space Models for Event Cameras
ろくに電子工作もしたことない人間がIoT用ミドルウェアを作った話(IoTLT vol112 発表資料)
Machine Learning Operations (MLOps): Overview, Definition, and Architecture
MobileNeRF
点群SegmentationのためのTransformerサーベイ
Learning to Solve Hard Minimal Problems
ConditionalPointDiffusion.pdf
楽しいコンピュータビジョンの受託仕事
20210711 deepI2P
20201010 personreid
20200910コンピュータビジョン今昔物語(JPTA講演資料)
2020/07/04 BSP-Net (CVPR2020)
20200704 bsp net
20190825 vins mono
20190706cvpr2019_3d_shape_representation
20190307 visualslam summary
Visual slam
20190131 lidar-camera fusion semantic segmentation survey

run Keras model on opencv