前言
级联分类器的效果并不是很好,准确度相对深度学习较低,本章使用opencv通过tensorflow深度学习,检测已有模型的分类。
Demo
可以猜测,1其实是人,18序号类是狗,因为笔者未找到对应的分类具体信息。
Tensorflow模型下载
OpenCV深度识别基本流程
opencv3.4.x支持了各种模型。
支持的模型
操作步骤:tensorflow
步骤一:加载模型和配置文件,建立神经网络。
根据不同的模型,使用cv::dnn::readNetFromXXX系列函数进行读取,opencv3.4.x系列支持的dnn模型(支持模型往上看)。
举例tensorflow模型如下:
std::string weights = "E:/qtProject/openCVDemo/dnnData/" \
"ssd_mobilenet_v1_coco_2017_11_17/frozen_inference_graph.pb";
std::string prototxt = "E:/qtProject/openCVDemo/dnnData/" \
"ssd_mobilenet_v1_coco_2017_11_17.pbtxt";
cv::dnn::Net net = cv::dnn::readNetFromTensorflow(weights, prototxt);
步骤二:将要预测的图片加入到神经网络中
加入之后,需要识别图片,那么需要把图片输入到神经网络当中去,如下:
cv::Mat mat;
cv::Mat blob;
mat = cv::imread("E:/testFile/14.jpg");
cv::dnn::blobFromImage(mat, blob);
步骤三:分类预测,获取识别的结果
输入之后,就进行识别,识别是向前预测(分类预测),并且拿到结果。
cv::Mat prob = net.forward();
对于预测的结果,存于cv::Mat类型的prob,然后需要统一对prob进行处理,使其成为我们可以使用的数据,代码如下:
cv::Mat detectionMat(prob.size[2], prob.size[3], CV_32F, prob.ptr());
对于从结果prob转换为detectionMat后,其结构如下:
cv::Mat为多行七列,每一行代表一个检测到的分类,具体列信息如下表:
(注意:具体的使用,请参照“步骤四”)
步骤四:对达到置信度的可以通过输出的mat进行分类和框选
cv::Mat detectionMat(prob.size[2], prob.size[3], CV_32F, prob.ptr());
// 置信度预制,大于执行度的将其使用rect框出来
float confidenceThreshold = 0.75;
for(int i = 0; i < detectionMat.rows; i++)
{
float confidence = detectionMat.at(i, 2);
if (confidence > confidenceThresho