C++-OpenCV(10)-DNN-图像分类

图像分类:给一张图像,和配置文件,这张图像的类型在配置文件中定义,根据这些条件,给出这张图像的分类。
可以用DNN实现。不过DNN不支持训练只支持推理(推理:前向反馈;训练,反向传播。训练用Caffe Tensorflow Torch Darknet)。
DNN的使用非常简单,就4步,如下图所示:


代码如下:
 

void main()
{
    //读取模型、配置、图像、分类文件
	//googlenet 基于ImageNet数据集训练,支持1000个类别的数据分类
	string protoFile = "../models/bvlc_googlenet.prototxt";
	string weightFile = "../models/bvlc_googlenet.caffemodel";

	string filepath = "";
	Mat frame = imread("../images/panda.jpg");
	string classFile = "../models/classification_classes_ILSVRC2012.txt";
	ifstream ifs(classFile.c_str());
	string line;
	while (getline(ifs, line))
	{
		classes.push_back(line);
	}

	float scale = 1.0;
	int inHeight = 224;
	int inWidth = 224;
	bool swapRB = false;
	Scalar mean = Scalar(104, 117, 123);

	//1.网络加载
	Net net = readNetFromCaffe(protoFile, weightFile);

	//2.把图像的MAT转换成blob对象
	Mat blob;
	blobFromImage(frame, blob, scale, Size(inWidth, inHeight), mean, swapRB, false);

	net.setInput(blob);

	//3.推理  prob就是输出结果
	Mat prob = net.forward();


	//4.解析输出结果
	//minMaxLoc 找出最大得分值对应的索引标签,根据标签索引号可以确定分类了。
	Point classIdPoint;
	double confidence;
	minMaxLoc(prob.reshape(1, 1), 0, &confidence, 0, &classIdPoint);
	int classId = classIdPoint.x;
	string label = format("Predicted Class : %s, confidence : %.3f", (classes[classId].c_str()), confidence);
	putText(frame, label, Point(10, 30), FONT_HERSHEY_SIMPLEX, 0.6, Scalar(0, 0, 255), 2, LINE_AA);

	imshow("Classification Output", frame);
	waitKey(0);
	destroyAllWindows();
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值