Faster R-CNN中的anchors和YOLO中的grid的理解

来源:互联网 发布:免费看书软件哪个好 编辑:程序博客网 时间:2024/05/01 04:37
转自http://blog.csdn.net/u014540717/article/details/53522083

一直不知道7×7的网格到底是干什么的,不就是结果预测7×7×2个框吗,这跟把原图分成7×7有什么关系?不分成7×7就不能预测7×7×2个框吗?

之前跟一个朋友讨论,他说7×7的网格是作为回归框的初始位置,我后来的很长一段时间一直这么认为,后来想想不对啊,bbox的初始位置不是根据各层的权重得到的吗?各层权重是随机初始化的,7×7的grid怎么能作为bbox的初始位置?我脑子被驴踢了么,竟然一直这么认为。

看了源码之后又看了faster-rcnn的论文中关于rpn的介绍,又看了rpn的代码,然后豁然开朗,我们来分析一下

一、YOLO

首先你应该看完YOLO源码详解(三)- 前向传播(forward),之后问题就简单了,只有一句话:grid和anchor的唯一作用就是为了计算IOU,从而来确定正负样本。在YOLO中,计算完IOU后确定loss function中的1obji,1objij,λcoord,λnocoord的值。

二、RPN的anchors

YOLO中的理解了,我们再来看一下PRN中的anchors,如下图所示:

这里写图片描述

假设原始图像尺寸是1000×600,最左边的一层就是VGG的第5层卷积层,下一层是rpn_conv/3*3层,千万不要被他迷惑了,说是rpn_conv/3×3其实还是普通的卷积层,也就是说这里跟普通的卷积层没有任何区别,这里的输出是64×39×512,在这里,每个feature map一共有64×39个点,这里每个点对应到原始图像上是16×16的区域(注意这里并不是感受野),16×16怎么算出来的呢?ceil(1000/64)×ceil(600/39),为什么向上取整呢?因为有padding啊~

假设每个点要搞到9个anchors,也就是原始图像上每隔16×16的区域就搞9个网格,因为这9个网格大小不一样,就取名叫anchors,这里是不是跟YOLO一样了?只不过YOLO整副图就搞了7×7个网格。到这里是不是豁然开朗了,两种算法有异曲同工之妙。

继续往下走,rpn_cls_score层,这里输出39×64×18,每个位置有9个anchors,预测每个anchor是否是物体,所以是2×9=18,继续到了rpn-data层(就是AnchorTargetLayer层,层的结构如下prototxt),这一层就是要算IOU的,也就是体现了:grid和anchor的唯一作用就是为了计算IOU,从而来确定正负样本。你理解了吗?

layer {  name: 'rpn-data'  type: 'Python'  bottom: 'rpn_cls_score'  bottom: 'gt_boxes'  bottom: 'im_info'  bottom: 'data'  top: 'rpn_labels'  top: 'rpn_bbox_targets'  top: 'rpn_bbox_inside_weights'  top: 'rpn_bbox_outside_weights'  python_param {    module: 'rpn.anchor_target_layer'    layer: 'AnchorTargetLayer'    param_str: "'feat_stride': 16"  }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

(END)

----------------------------------------------分割------------------------------------------------------

个人理解:Faster R-CNN里的RPN,是对RCNN和Fast R-CNN的region proposals获取的改进,把这个步骤并入网络,所以anchors某种意义上也算是一种region proposals。在Faster RCNN中anchors确实是在确定正负样本时会用到,因为要计算IOU的值,但是在训练时也要用anchors的坐标值来计算其与Ground Truth的偏移量,在测试时也是需要anchors的坐标值和偏移量来计算预测框的位置。

             而YOLO中的grid,按7*7来分,其实就是得到98个bounding boxes,对这个98个boxes进行回归和分类预测,某种意义上也算是一种anchor,作用也基本相同。

阅读全文
0 0
原创粉丝点击