【OpenCV+OPENVINO使用】opencv+openvino 使用自己的模型推理实战(基于C++)
前期准备openvino安装, 可以参考我的文章【OpenCV+OPENVINO使用】openvino安装教程IR模型,这个需要openvino的模型转换,获得model.bin文件和model.xml文件,可以利用openvino 的GitHub中model-optimizer文件夹内提供的模型转换工具,如mo_tf.py、mo_onnx.py等,可以参考我的文章【OpenCV+OPENVINO
·
前期准备
- openvino安装, 可以参考我的文章【OpenCV+OPENVINO使用】openvino安装教程
- IR模型,这个需要openvino的模型转换,获得model.bin文件和model.xml文件,可以利用openvino 的GitHub中model-optimizer文件夹内提供的模型转换工具,如mo_tf.py、mo_onnx.py等,可以参考我的文章【OpenCV+OPENVINO使用】模型转换
实验代码
- 首先通过readNetFromModelOptimizer读取IR模型,opencv也同时支持readNetFromONNX、readNetFromCaffe,不过大部分自己写的模型都很难被加载成功。。。因此,选择转换成IR模型成了比较好的选择。
- setPreferableBackend设置使用的后端,可以是OPENCV或INFERENCE_ENGINE,一般来说,INFERENCE_ENGINE的速度快于OPENCV,此外OPENCV有可能无法正常推理模型。
- setPreferableTarget设置使用的device,可选的有CPU、CUDA和MYRIAD(神经计算棒),安装方式也在文章【OpenCV+OPENVINO使用】openvino安装教程中
- blobFromImage函数用于处理图像,注意是先删除mean中的值在进行scalefactor缩放,可参考我的示例而定,swapRB就是交换RB通道,相信搞深度学习的都明白。具体是否进行图像预处理根据自己的网络要求来定。
- setInput函数中的“input”即为输入层的名字,可以使用多个该函数来对应多输入。
- setOutput函数中的“output”同理为输出层的名字,同样可以使用多个。
- 注意,输出的模型推理时间可能与该代码的实际运行时间不同,这是正常情况,第一次加载会比较慢,之后的图像推理时间就稳定在该值。
#include <opencv2/dnn.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
int main(int argc, char** argv){
std::string model_xml = "models/MobileNetVLAD/MobileNetVLAD.xml";
std::string model_bin = "models/MobileNetVLAD/MobileNetVLAD.bin";
cv::dnn::Net net = cv::dnn::readNetFromModelOptimizer(model_xml,model_bin);
net.setPreferableBackend(cv::dnn::DNN_BACKEND_INFERENCE_ENGINE);
net.setPreferableTarget(cv::dnn::DNN_TARGET_CPU);//DNN_TARGET_MYRIAD
cv::Mat img = cv::imread(argv[1], 1);
/*
CV_EXPORTS_W Mat blobFromImage(InputArray image, double scalefactor=1.0, const Size& size = Size(),
const Scalar& mean = Scalar(), bool swapRB=true, bool crop=true);
*/
cv::Mat inputBlob = cv::dnn::blobFromImage(img, 0.01712475f, cv::Size(640,480), cv::Scalar(123.675, 116.28, 103.53), true,false);
net.setInput(inputBlob,"input");//set the network input, "data" is the name of the input layer
cv::Mat pred = net.forward("output");
double freq = cv::getTickFrequency() / 1000;
std::vector<double> layersTimes;
double t = net.getPerfProfile(layersTimes) / freq;
std::cout << "[INFO] network process took " << t << " ms" << std::endl;
return 0;
}
项目地址

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)