前期准备

  1. openvino安装, 可以参考我的文章【OpenCV+OPENVINO使用】openvino安装教程
  2. IR模型,这个需要openvino的模型转换,获得model.bin文件和model.xml文件,可以利用openvino 的GitHub中model-optimizer文件夹内提供的模型转换工具,如mo_tf.py、mo_onnx.py等,可以参考我的文章【OpenCV+OPENVINO使用】模型转换

实验代码

  1. 首先通过readNetFromModelOptimizer读取IR模型,opencv也同时支持readNetFromONNX、readNetFromCaffe,不过大部分自己写的模型都很难被加载成功。。。因此,选择转换成IR模型成了比较好的选择。
  2. setPreferableBackend设置使用的后端,可以是OPENCV或INFERENCE_ENGINE,一般来说,INFERENCE_ENGINE的速度快于OPENCV,此外OPENCV有可能无法正常推理模型。
  3. setPreferableTarget设置使用的device,可选的有CPU、CUDA和MYRIAD(神经计算棒),安装方式也在文章【OpenCV+OPENVINO使用】openvino安装教程
  4. blobFromImage函数用于处理图像,注意是先删除mean中的值在进行scalefactor缩放,可参考我的示例而定,swapRB就是交换RB通道,相信搞深度学习的都明白。具体是否进行图像预处理根据自己的网络要求来定。
  5. setInput函数中的“input”即为输入层的名字,可以使用多个该函数来对应多输入。
  6. setOutput函数中的“output”同理为输出层的名字,同样可以使用多个。
  7. 注意,输出的模型推理时间可能与该代码的实际运行时间不同,这是正常情况,第一次加载会比较慢,之后的图像推理时间就稳定在该值。
#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

Logo

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

更多推荐