IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> Pytorch学习系列之十二:OpenCV(C++)加载onnx模型进行推理 -> 正文阅读

[人工智能]Pytorch学习系列之十二:OpenCV(C++)加载onnx模型进行推理

1 前言

博客Pytorch学习系列之九:OpenCV加载onnx模型进行推理_thequitesunshine007的博客-CSDN博客_opencv 加载onnx记载了python版本opencv加载onnx模型进行推理的方法。这里记录的是C++版本OpenCV加载onnx模型进行推理。

2 代码

#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/dnn/dnn.hpp>
#include <opencv2/core/utils/logger.hpp>
#include<string>
#include<iostream>
#include<fstream>
#include<vector>
using namespace cv;
using namespace std;

class ONNXClassifier
{
public:
	ONNXClassifier(const std::string& model_path, const std::string& label_path, cv::Size _input_size);
	void Classify(const cv::Mat& input_image, std::string& out_name, double& confidence);
private:
	void preprocess_input(cv::Mat& image);
	bool read_labels(const std::string& label_paht);
private:
	cv::Size		input_size;
	cv::dnn::Net	net;
	cv::Scalar		default_mean;
	cv::Scalar		default_std;
	std::vector<std::string> labels;
};

ONNXClassifier::ONNXClassifier(const std::string& model_path, const std::string& label_path, cv::Size _input_size) 
	:default_mean(0.485, 0.456, 0.406),
	default_std(0.229, 0.224, 0.225), input_size(_input_size)
{
	if (!read_labels(label_path))
	{
		throw std::runtime_error("label read fail!");
	}
	net = cv::dnn::readNet(model_path);
	net.setPreferableBackend(cv::dnn::DNN_BACKEND_OPENCV);
	net.setPreferableTarget(cv::dnn::DNN_TARGET_CPU);
}

bool ONNXClassifier::read_labels(const std::string& label_path)
{
	std::ifstream ifs(label_path);
	assert(ifs.is_open());
	std::string line;
	while (std::getline(ifs, line))
	{
		std::size_t index = line.find_first_of(':');
		labels.push_back(line.substr(index + 1));
	}
	if (labels.size() > 0)
		return true;
	else
		return false;
}

//数据规范化Normalization
void ONNXClassifier::preprocess_input(cv::Mat& image)
{
	image.convertTo(image, CV_32F, 1.0 / 255.0);
	cv::subtract(image, default_mean, image);
	cv::divide(image, default_std, image);
}

void ONNXClassifier::Classify(const cv::Mat& input_image, std::string& out_name, double& confidence)
{
	out_name.clear();
	cv::Mat image = input_image.clone();
	preprocess_input(image);
	cv::Mat input_blob = cv::dnn::blobFromImage(image, 1.0, input_size, cv::Scalar(0, 0, 0), true);
	net.setInput(input_blob);
	const std::vector<cv::String>& out_names = net.getUnconnectedOutLayersNames();
	cv::Mat out_tensor = net.forward(out_names[0]);
	cv::Point maxLoc;
	double minV;
	cv::minMaxLoc(out_tensor, &minV, &confidence, (cv::Point*)0, &maxLoc);
	out_name = labels[maxLoc.x];
}


int main(int argc, char* argv[])
{
	cv::utils::logging::setLogLevel(cv::utils::logging::LogLevel::LOG_LEVEL_SILENT);
	
	//std::string model_path("../model/classifier.onnx");
	//std::string label_path("../model/labels.txt");
	//cv::Size input_size(224, 224);


	std::vector<std::string> imgVec;
	cv::glob("./defect_test/", imgVec);
	std::string model_path("../model/surface_defect_model.onnx");
	std::string label_path("../model/labels_defect.txt");
	cv::Size input_size(300, 300);

	for (size_t i = 0; i < imgVec.size(); i++)
	{
		cv::Mat test_image = cv::imread(imgVec[i], cv::IMREAD_COLOR);
		ONNXClassifier classifier(model_path, label_path, input_size);
		std::string result;
		double confidence = 0;
		classifier.Classify(test_image, result, confidence);
		std::cout << imgVec[i] <<",预测结果为:"<< result<<",confidence: " << confidence << std::endl;
	}

	
	return 0;
}

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-04-06 16:17:41  更:2022-04-06 16:18:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 11:54:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码