前期准备
- 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;
}
项目地址
GitHub地址:https://github.com/tjj1998/test_openvino