查看原文
其他

OpenCV调用Faster-RCNN对象检测网络

gloomyfish OpenCV学堂 2020-02-04

点击上方蓝字关注我们

星标或者置顶【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<intstring> names = readLabelMaps();

2.通过tensorflow网络支持接口加载Faster-RCNN模型

// 加载Faster-RCNN
Net net = readNetFromTensorflow(model, config);
Mat blob = blobFromImage(src, 1.0, Size(300300), Scalar(), truefalse);
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(2550255), 480);
        map<intstring>::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(25500), 1);
    }
}
imshow("faster-rcnn-demo", src);

运行结果如下:


博观而约取
厚积而薄发

推荐阅读

OpenCV学堂-原创精华文章

《tensorflow零基础入门视频教程》

基于OpenCV与tensorflow实现实时手势识别

图像分割网络FCN详解与代码实现

深度学习中的反向卷积

OpenCV SIFT特征算法详解与使用

HOG特征详解与行人检测
教程|OpenCV场景文字检测
Selective Search算法与演示


听说点【好看】会有好运来

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存