图像分类:给一张图像,和配置文件,这张图像的类型在配置文件中定义,根据这些条件,给出这张图像的分类。
可以用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();
}