一、 ONNXRUNTIME加速效果
https://github.com/onnx/keras-onnx
1,创建虚拟环境
conda create -n keras-onnx python=3.6
2,激活环境
conda activate keras-onnx
3,安装需要的依赖包
pip install tensorflow-gpu
pip install keras
pip install onnxmltools
安装onnxruntime需要注意cpu和版本
cpu版本:
pip install onnxruntime
gpu版本:
pip install onnxruntime-gpu
这个版本是1.0,要求cuda是10.0,cudnn是7.6
4, 进行测试
a,首先将h5文件转换为onnx文件
b, 获取ONNX的输入和输出
c,使用onnx和onnxruntime进行前向加速运算
import onnxmltools
from keras.models import load_model
import cv2
import numpy as np
import onnxruntime
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--keras_model", type=str, default='./Inception_v3_classification_dataset08_c_c_201982845.h5')
parser.add_argument("--onnx_model", type=str, default='onnx_classification.model')
args = parser.parse_args()
input_model = args.keras_model
output_model = args.onnx_model
# 得到网络模型结构和参数
keras_net = load_model(input_model)
# 将keras模型转换为onnx模型
onnx_net = onnxmltools.convert_keras(keras_net)
# 将onnx模型文件保存下来
onnxmltools.utils.save_model(onnx_net, output_model)
content = onnx_net.SerializeToString()
# 创建session
sess = onnxruntime.InferenceSession(content)
# 获得模型的输入或输出名
for i in sess.get_inputs():
print(i.name)
print(i.shape)
for i in sess.get_outputs():
print(i.name)
print(i.shape)
# 构造输入图像
img = np.zeros((1,139,139,3),dtype=np.float32)
# 使用模型默认输出作为输出结果,input_6是通过打印sess.get_inputs()的name得到
pred_onnx = sess.run(None,{'input_6':img})
print(pred_onnx)
得到的打印内容如下:
input_6
['N', 139, 139, 3]
dense_3/Softmax:0
['N', 2]
[array([[0.9215646 , 0.07843538]], dtype=float32)]