c++使用opencv调用caffe训练的深度学习模型

c++使用opencv调用caffe框架训练的caffemodel模型,并对数据集图像批量测试,统计分类结果

#include <opencv2/dnn.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/core/utils/trace.hpp>
#include <fstream>
#include <iostream>
#include <cstdlib>
#include <vector>

using namespace cv;
using namespace cv::dnn;
using namespace std;

//寻找出概率最高的一类
static void getMaxClass(const Mat &probBlob, int *classId, double *classProb)
{
	Mat probMat = probBlob.reshape(1, 1);
	Point classNumber;
	minMaxLoc(probMat, NULL, classProb, NULL, &classNumber);
	*classId = classNumber.x;
}

//从标签文件读取分类 空格为标志
static std::vector<String> readClassNames(const char *filename = "D:\\Program Files\\caffe\\caffe-master\\caffe-master\\examples\\transfer-water\\data\\mydata\\labels.txt")
{
	std::vector<String> classNames;
	std::ifstream fp(filename);
	if (!fp.is_open())
	{
		std::cerr << "File with classes labels not found: " << filename << std::endl;
		exit(-1);
	}

	std::string name;
	while (!fp.eof())
	{
		std::getline(fp, name);
		if (name.length())
			classNames.push_back(name.substr(name.find(' ') + 1));
	}
	fp.close();
	return classNames;
}

//主程序
int main(int argc, char **argv)
{
	//初始化
	CV_TRACE_FUNCTION();
	//读取模型参数和模型结构文件

	String modelTxt = "D://predict//water//deploy_transform.prototxt";
	//String modelBin = "D://predict//water//models//caffenet_train_transform_iter_1000.caffemodel";
	String modelBin = "D:\\Program Files\\caffe\\caffe-master\\caffe-master\\examples\\transfer-water\\data\\mydata\\caffenet_train_transform_iter_500.caffemodel";



	//读取图片
	String imageFile = "D://predict//water//mirror//*.jpg";
	//String imageFile = "D://predict//water//InspectData//water//*.jpg";

	//合成网络
	Net net = dnn::readNetFromCaffe(modelTxt, modelBin);
	//判断网络是否生成成功
	if (net.empty())
	{
		std::cerr << "Can't load network by using the following files: " << std::endl;
		exit(-1);
	}
	cerr << "net read successfully" << endl;

	vector<cv::String> image_files;
	glob(imageFile, image_files);
	if (image_files.size() == 0) {
		std::cout << "No image files[jpg]" << std::endl;
		return 0;
	}


	int a = 0, b = 0;
	for (unsigned int frame = 0; frame < image_files.size(); ++frame)
	{                                                                    //image_file.size()代表文件中总共的图片个数

		//读取图片

		Mat img = cv::imread(image_files[frame]);
		cout << image_files[frame] << endl;
		//imshow("image", img);
		if (img.empty())
		{
			std::cerr << "Can't read image from the file: " << imageFile << std::endl;
			exit(-1);
		}
		cerr << "image read sucessfully" << endl;


		//构造blob,为传入网络做准备,图片不能直接进入网络
		Mat inputBlob = blobFromImage(img, 1, Size(227, 227), Scalar(103.788, 104.337, 100.518), false);
		Mat prob;
		cv::TickMeter t;

		CV_TRACE_REGION("forward");
		//将构建的blob传入网络data层
		net.setInput(inputBlob, "data");
		prob = net.forward("prob");
	
		int classId;
		double classProb;
		//找出最高的概率ID存储在classId,对应的标签在classProb中
		getMaxClass(prob, &classId, &classProb);

		
		//打印出结果
		std::vector<String> classNames = readClassNames();
		std::cout << "Best class: " << classId << " '" << classNames.at(classId) << "'" << std::endl;
		std::cout << "Probability: " << classProb * 100 << "%" << std::endl;

		//打印出花费时间
		//std::cout << "Time: " << (double)t.getTimeMilli() / t.getCounter() << " ms (average from " << t.getCounter() << " iterations)" << std::endl;

		if (classId == 0)
		{
			a  = a + 1;
		   imshow("", img);
		
		}
			
		else
		{ 
			b = b + 1;
			//imshow("img", img);
			
		}
		waitKey(0);

		
	}
	cout << "无水图片:" << a << endl;
	cout << "有水图片:" << b << endl;
	 
	system("Pause");
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一颗小萌新

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值