OpenCV调用Faster-RCNN对象检测网络
星标或者置顶【OpenCV学堂】
干货文章与技术教程第一时间送达
Faster-RCNN模型
对象检测网络Faster-RCNN,模型结构如下:
其中
VGG部分是CNN网络,也是前置网络或者特征网络,主要作用是实现对象特征提取,在前置特征CNN网络的最后一层,使用区域推荐网络替代原来的SS方法,得到区域推荐框,RPN网络的结构如下:
其中k表示推荐的boxes数目,上述表示有三种比率的窗口,每种比率有三个尺度,总数为9个boxex,所以每个点得到4x9+2x9=54个向量。然后对得到每个boxes进行ROI Pooling操作得到固定长度的特征向量输出,实现BB回归位置精炼与分类预测,从而实现对象检测。
下载预训练模型
Tensorflow的Object Detection API框架中提供了一系列不同前置网络的Faster-RCNN预训练网络模型,大多数都是基于COCO数据集训练的,可以直接下载使用。下载地址如下:
http://download.tensorflow.org/models/object_detection/faster_rcnn_resnet50_coco_2018_01_28.tar.gz
解压缩之后就会看到可以导入到OpenCV DNN模块的模型pb文件
-frozen_inference_graph.pb
-graph.pbtxt
如果还不了解如何生成pb文件与pbtxt文件,请看公众号历史文章
tensorflow模型导出与OpenCV DNN中使用
使用模型
1.加载图像与label_map的代码如下
Mat src = imread("D:/images/person.jpg");
int width = src.cols;
int height = src.rows;
if (src.empty()) {
printf("could not load image...\n");
return 0;
}
namedWindow("input", WINDOW_AUTOSIZE);
imshow("input", src);
map<int, string> names = readLabelMaps();
2.通过tensorflow网络支持接口加载Faster-RCNN模型
// 加载Faster-RCNN
Net net = readNetFromTensorflow(model, config);
Mat blob = blobFromImage(src, 1.0, Size(300, 300), Scalar(), true, false);
net.setInput(blob);
3.读入图像实现预测返回
// 预测
Mat detection = net.forward();
Mat detectionMat(detection.size[2], detection.size[3], CV_32F, detection.ptr<float>());
float threshold = 0.5;
4.根据返回数据绘制预测框与预测结果
// 处理输出数据,绘制预测框与文本
for (int row = 0; row < detectionMat.rows; row++) {
float confidence = detectionMat.at<float>(row, 2);
if (confidence > threshold) {
// base zero
int object_class = detectionMat.at<float>(row, 1) + 1;
// predict box
int left = detectionMat.at<float>(row, 3) * width;
int top = detectionMat.at<float>(row, 4) * height;
int right = detectionMat.at<float>(row, 5) * width;
int bottom = detectionMat.at<float>(row, 6) * height;
Rect rect;
rect.x = left;
rect.y = top;
rect.width = (right - left);
rect.height = (bottom - top);
// render bounding box and label name
rectangle(src, rect, Scalar(255, 0, 255), 4, 8, 0);
map<int, string>::iterator it = names.find(object_class);
printf("id : %d, display name : %s \n", object_class, (it->second).c_str());
putText(src, (it->second).c_str(), Point(left, top - 5), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(255, 0, 0), 1);
}
}
imshow("faster-rcnn-demo", src);
运行结果如下:
博观而约取
厚积而薄发
推荐阅读
HOG特征详解与行人检测
教程|OpenCV场景文字检测
Selective Search算法与演示
听说点【好看】会有好运来