1、环境:win10+cuda11.4+onnxruntime-gpu1.10+opencv3.4.4+vs2019
c++
GPU:本人使用的NVIDIA GeForce GTX 1650 4GB显存。
2、模型的训练参考:
https://blog.51cto.com/u_8681773/6163656
3、C++调用测试:
接口形式:
#pragma once
#ifndef _IMAGECLASSIFY_ONNX_INTERFACE_H_
#define _IMAGECLASSIFY_ONNX_INTERFACE_H_
#ifndef IMAGECLASSIFY_ONNX_EXPORTS
#define IMAGECLASSIFY_ONNX_API __declspec(dllimport)
#else
#define IMAGECLASSIFY_ONNX_API __declspec(dllexport)
#endif
#include <iostream>
#include "opencv2/core.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include <vector>
#include <stdio.h>
#include <map>
#include <algorithm>
#include<string>
using namespace std;
#ifdef __cplusplus
extern "C" {
#endif
//初始化图像分类模型
IMAGECLASSIFY_ONNX_API int Init_ImageClassify(void*& modelHandles, std::string modelpath, const int gpu_id);
//图像分类
IMAGECLASSIFY_ONNX_API int ImageClassify(void*& modelHandles, cv::Mat img, int& ClassifyResult, float& score);
//图像分类,batch,需要模型支持batch识别
IMAGECLASSIFY_ONNX_API int ImageClassify_Batch(void*& modelHandles, const std::vector<cv::Mat>& imgs, std::vector<int>& ClassifyResult, std::vector<float>& scores);
//模型释放
IMAGECLASSIFY_ONNX_API int ImageClassify_Free(void*& modelHandles);
#ifdef __cplusplus
#endif
#endif //_IMAGECLASSIFY_ONNX_INTERFACE_H_
测试结果:(lenet网络效果不太好)
#include "image_classify_interface.h"
#include <Windows.h>
#include <iostream>
#include <ctime>
#define batch_test 0
double getCurrentTime() {
return (static_cast<double>(cv::getTickCount())) / cv::getTickFrequency() * 1000;//单位毫秒
int main(int argc, char** argv)
string gpu_id_str = argv[3];
int gpu_id = atoi(gpu_id_str.c_str());
void* modelHandles=NULL;
std::string modelpath = argv[1];
//初始化CRNN模型
int initflag = Init_ImageClassify(modelHandles, modelpath, gpu_id);
std::string image_dir = argv[2];
cv::String pattern = image_dir + "/*.jpg";
vector<cv::String> image_list;
cv::glob(pattern, image_list, false);
if (image_list.empty())
cout << "images list is null,please check your image dir !!!" << endl;
return -1;
#if batch_test
for (int i = 0; i < image_list.size()-32; i++)
std::vector<cv::Mat> inputImage;
for (int j = 0; j < 32; j++)
std::cout << "[" << i + j << "/" << image_list.size() << "]" << image_list[i + j] << endl;
cv::Mat inputImage1 = cv::imread(image_list[i + j]);
inputImage.push_back(inputImage1);
std::vector<int> recResult;
std::vector<float> scores;
double startCrnnTime = getCurrentTime();
//识别文本
initflag = ImageClassify_Batch(modelHandles, inputImage, recResult, scores);
double endCrnnTime = getCurrentTime();
cout << "recog time=" << endCrnnTime - startCrnnTime << "ms" << endl;
for (auto& rlt: recResult)
cout << rlt << endl;
//Sleep(100);
#else
for (int i = 0; i < image_list.size(); i++)
std::cout << "[" << i + 1 << "/" << image_list.size() << "]" << image_list[i] << endl;
cv::Mat inputImage = cv::imread(image_list[i]);
int recResult;
float score;
double startCrnnTime = getCurrentTime();
//识别文本
initflag = ImageClassify(modelHandles, inputImage, recResult, score);
double endCrnnTime = getCurrentTime();
cout << "recog time = " << endCrnnTime - startCrnnTime << "ms,recResult = " << recResult<<",score = "<< score << endl;
//Sleep(100);
#endif
//模型释放
initflag = ImageClassify_Free(modelHandles);
return 0;
}
图像分类 C++ onnx使用示例工程分享:
链接:
https://pan.baidu.com/s/1kjsRhruiEhUpl1CmuMr4zg
提取码:g5kr
自己要学习Onnx的C++推导,可学习以下课程:
https://edu.51cto.com/course/30388.html