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

本文指导读者如何安装OpenVINO,包括模型转换步骤,并详细介绍了使用OpenCV进行IR模型的加载、后端设置和图像推理的实验代码,适合深度学习开发者快速上手OpenVINO技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前期准备

  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

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值