opencv dnn部署onnx模型

#include 
#include 
#include 
using namespace cv;
using namespace cv::dnn;

#include "img_tools.h"   // 这个只是显示图像和文件查找的工具,自行实现

#include 
#include 
#include 
#include 
using namespace std;


void main()
{
    //    cv::dnn::initModule();  //Required if OpenCV is built as static libs
    ocl::setUseOpenCL(false);//关闭OpenCL,就不会出错了

    String modelBin = "E:\\data\\5PA\\fpc\\loc_len\\train-3-rect_loc_256_0722\\model_300.onnx";

    //! [Read and initialize network]
    Net net = dnn::readNetFromONNX(modelBin);

    net.setPreferableBackend(0);	//设置模型的实现方式,分OpenCV和Intel加速
    net.setPreferableTarget(0);	//推断设备选择

    //! [Check that network was read successfully]
    if (net.empty())
    {
        std::cerr << "Can't load network by using the following files: " << std::endl;
        std::cerr << "caffemodel: " << modelBin << std::endl;
        std::cerr << "bvlc_googlenet.caffemodel can be downloaded here:" << std::endl;
        std::cerr << "http://dl.caffe.berkeleyvision.org/bvlc_googlenet.caffemodel" << std::endl;
        exit(-1);
    }

    std::string dir_path = "E:\\data\\5PA\\0713\\FPC";
    std::vector Filename = ImageHelper::findfile(dir_path, "mask.jpg", ".jpg");
    for (int i = 0; i < Filename.size(); i++)
    {
        std::string img_path = Filename[i];
        std::cout << img_path << std::endl;
        std::string file_name = ImageHelper::file_base_name(img_path);

        //! [Prepare blob]
        Mat img = imread(img_path);	//加载图片
        if (img.empty())
        {
            std::cerr << "Can't read image from the file: " << img_path << std::endl;
            exit(-1);
        }
        clock_t start = clock();      //获取当前系统时间
        
        resize(img, img, Size(256, 256));                   //MyNet accepts only 512x512 RGB-images
        //ImageHelper::show_img("img", img, 0);
        Mat blob;
        dnn::blobFromImage(img, blob, 1.0, Size(256, 256), Scalar(0, 0, 0), false, false);	//把图像转成4通道的tensor数据(float),每个通道的数据都-127
        blob /= 255.0; 	//把数据归一化到(-1,1)
        net.setInput(blob);	//设置输入

        clock_t tm = clock();
        Mat output = net.forward();	//进行推断
        tm = clock() - tm;
        std::cout << "infer time: " << tm << std::endl;
        // process output

        std::vector ress;  // 有些网络会有多个输出
        imagesFromBlob(output, ress); //转成多通道,从Tensor转回ImageMat,这步很重要,要不然不好用cv处理
        std::cout << ress[0].rows << " " << ress[0].cols << " " << ress[0].channels() << std::endl;
        // show res
        Mat res = ress[0];
        ImageHelper::show_img("maskImg", res, 0);
        std::cout << "seg time: " << ((double)clock() - start) / CLOCKS_PER_SEC << std::endl;
    }


    return;
}

你可能感兴趣的:(onnxruntime,opencv,dnn)