Faster RCNN源码解读(Tensorflow 版)

Faster RCNN源码解读(Tensorflow 版)

  • (一)基本原理的介绍与总结
    • 检测和分类:
    • 目标的分类好说,但定位如何做?

(一)基本原理的介绍与总结

写在开头:虽然这篇基于anchor的two-stage的object detection是16年提出,但是作为踏入基于深度学习的目标检测领域而言,一定是必读的经典论文。其原理其实也挺简单,弄懂他也不是难事。后续将贴出YOLO等的源码阅读经验总结,今天也要加油呀↖(ω)↗~

首先贴出fork的项目地址:https://github.com/dBeker/Faster-RCNN-TensorFlow-Python3.5

Faster RCNN 论文地址:https://arxiv.org/abs/1506.01497v3

看了源码后,我个人认为,比较符合Faster RCNN架构的图如下:
Faster RCNN源码解读(Tensorflow 版)_第1张图片
Faster RCNN的流程可以简述为
Feature extraction(产生feature map)+Region Proposal Network(rpn_proposal classification + rpn_bounding box regression)+ROI Pooling(产生固定大小(7x7)的RoI feature map)+(Proposal classification + bounding box regression)

检测和分类:

目标检测与单纯的图像分类任务的不同在于,图像分类的目的往往是对整幅图进行分类、打标签操作,比如经典的MNIST数据集识别,就是给每一张手写字体打上0~9的标签,对于这样的图像分类任务,5层的全连接网络就可以达到98.4%的识别率,而卷积神经网络LeNet-5可以达到99.4%,这里也可以看出,对于图像的分类,卷积的作用比全连接有很大的优势:准确率提升,再者,训练参数比卷积层少很多。这也是使用Convolutional Neural Network进行特征提取的主要原因。目标检测与图像分类的不同在于,不仅要识别出图像中的目标属于哪个类别(这实质上是分类),而且,还要知道目标在图像中的相对位置(这就是位置回归),所以目标检测的难度一般是要大于单纯的分类任务的。

目标的分类好说,但定位如何做?

1.使用类似于Selective Search的办法:
RCNN和Fast RCNN中,都是使用了Selective Search(即启发式搜索)产生几十k个候选框(proposals),为了适应分类任务中,全连接层节点数目固定的特性,RCNN选择将这些proposals放缩至固定大小后再输入到卷积神经网络以得到固定长度的特征向量,再输入到softmax层进行分类,以得到这些proposals的类别,而位置的精修则是通过统计的方法——岭回归(ridge regression)得到从proposals的坐标映射到gt_box坐标的四个最佳偏移参数(tx,ty,tw,th),然后得到回归器的最佳统计l量:W*参数,具体细节可参考RCNN的文章
2.基于anchors:
Fast RCNN提出后,几乎可以实现网络的end-to-end的训练了(引入多任务损失,同时训练分类器和回归器),但是有一个遏制检测速度的瓶颈——proposal的产生仍是依靠Selective Search,速度很慢(约2s per img on CPU),
这对于检测速度要求高的trick是致命的,于是rgb大神想到了一个办法:为何不使用network来产生proposals呢,然后直接将产生的proposals(RoI pooling后)进行回归和分类,速度是不是就提高了呢?通过巧妙的设计,速度确实提高了——在测试时,通过共享卷积层,对每张图片产生固定数量的proposals的时间缩短至10ms!
是的,然后就有了经典的RPN。
我觉得想要了解Faster RCNN,就必须要了解RPN的工作原理,所以我们剖析下RPN的具体细节:

  1. 构建的位置 :在Convs之上,以VGG16为例,RPN搭建于最后一个卷积层的上面(之前,图像经过了13个卷积层,4个2x2的max pooling层),我们记这时的网络为net,此时net.shape:(batch_size, height/16,width/16,512),height、width表示输入图像的高、宽。
  2. 实际内容:rpn是对net采用3 x 3的滑窗得到结果,之所以用3x3,个人认为:此处想必是类似于对固定大小的区域进行特征的提取和融合,毕竟后续操作是对每个得到的点进行预测,预测其内部是否包含物体。
  3. anchors的产生:scales=(8,16,32)——anchor宽、高的放缩系数;ratios=(0.5,1,2)——anchor的宽、高比;base_size = 16——基本的宽、高;对于rpn上的每一个点,都会产生3*3=9个anchors,先放一下结果图~:
    Faster RCNN源码解读(Tensorflow 版)_第2张图片
    于是,对于一幅图像,我们大约可以产生(height/16) * (width/16) *9个anchors,这些anchors的坐标以及尺寸如何计算的,我们下一篇具体讨论~

你可能感兴趣的:(深度学习,深度学习,目标检测)