【OpenCV+OPENVINO使用】opencv+openvino 使用自己的模型推理实战(基于C++)

前期准备

  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 
#include 
#include 
#include 

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

你可能感兴趣的:(opencv,openvino,神经计算棒,GitHub)