[论文学习]《Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks 》

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liangdong2014/article/details/79507032
  • faster R-CNN的主要贡献
    • 提出了 region proposal network(RPN),通过该网络我们可以将提取region proposal的过程也纳入到深度学习的过程之中。这样做既增加了Accuracy,由降低了耗时。之所以说增加Accuracy是因为,RPN是可以通过反向传播训练的,所以他提取的proposal也会更准确一些。
  • The Flowchart of the Faster RCNN
    image
  • faster R-CNN 的几个主要概念(按照网络的结构顺序来)

    • RPN block,如下图所示。他的输入就是feature map,输出是K个anchor,以及对应的score和coordinates。其中score代表的是这个bbox是前景(foreground, fg)还是背景(background, bg),coordinates代表是bounding box 的坐标。
      image
      • RPN中首先将每一个slide Windows变成一个256/512(ZF/VGG respectively)维的向量,代表的是提取特征。因为我们要对每个slide window做这一步操作,所以这步操作也可以通过卷积来完成,卷积kernel的size就是slide window的大小。假设,我们Feature map 的大小为w*h, 我们每个anchor的size和长宽比都有三种,所以针对每个pixel,我们可以得到的anchor的个数为9个。(注意,一开始anchor是针对每个pixel都提取的,只不过后来通过一些算法剔除了一些)。
      • proposal score:在第一步,我们得到了中间层,抽象来讲就是每个pixel的特征向量,要知道这里的pixel对应到原图中就是16倍的(vgg16为例)。然后我们再通过一个卷积层来预测每个pixel的每个anchor的得分。所以这里的输出就是w*h*18。
      • proposal bbox location:同上一步,这里的输入也是第一步的输出。在上一步中,我们已经得到了bounding box的坐标,这一步的作用是对上面的坐标进行微调(平移和缩放)。也需要4个参数。所以这里的输出就是w*h*36。
    • 到目前为止,我们就已经可以训练RPN了。下面是训练RPN中的知识点:
      • Loss function 是由两部分组成,第一部分是对proposal score计算交叉熵,第二部分是对proposal bbox计算Smooth L1 loss。
      • 对proposal score计算交叉熵:首先是通过Softmax得到概率。既然计算交叉熵,那么我们的label是什么呢?我们知道我们已经得到了许多anchor,每个anchor都可以映射到原图上去,而原图也是有ground truth的。所以我们的label主要是通过anchor与ground truth(bounding box)的IoU的值来决定的。原文将anchor的label分为三种类型:1,0,和-1。它们分别代表fg,bg和don’t care。其中fg有两个条件:1、IoU的值大于0.7。2、ground truth对应IoU最大的anchor。两者只要满足其一就认为是fg。bg的话就是IoU不满足条件。don’t care一般是指anchor不合法,比如说越界等情况。为了减少计算量,文中提出了一种优化方法,也就是限制fg和bg的个数。文中限制的总数不超过256个,fg的个数不超过128个。然后计算交叉熵的时候,我们只关注fg和bg。
      • 对于proposal bbox location计算Smooth L1 loss。其中Smooth L1 loss的定义如下所示:
        x i = w i n ( t i v i ) i { x , y , w , h } L 1 ( x i ) = { 0.5 x i 2 σ 2 | x i σ | < 1 | x i | 0.5 σ 2 o t h e r w i s e S m o o t h L 1 = w o u t i x , y , w , h L 1 ( x i )

        -其中 w i n 是选择那些fg的anchor,其余的都为0。 w o u t 是为了正则化。总的来说,就是我们只对fg计算Smooth L1 loss。
    • 到目前为止,我们已经可以提取proposal了(bounding box),为了消除提取proposal的冗余性,我们使用non-maximum suppression(nms,非最大抑制)。
      • 算法流程:
        • 按照得分从高到低将N个矩阵排序,假设排序好的最高得分的是R1,并且得分依次递减,Rn的得分最低。
        • 从前往后找到第一个未被确定的矩阵x
        • 从该位置往后遍历,计算每一个矩阵y与矩阵x的IoU值,如果该值大于阈值,则删除矩阵y,否则继续该步骤。直到遍历完成整个矩阵集合。
        • 重复步骤2,直到集合中的所有元素都已经确定。
      • 注意,算法里面的score就是我们之前预测的每个anchor的score。
    • 到目前位置我们已经找到了将要输入R-CNN的proposal,接下来就是给所有的proposal赋予相应的label,这是依据他对某个ground truth的IoU值来确定的。
    • 到目前为止,我们得到了proposal和label。但是在输入到R-CNN前还有一问题,那就是我们的proposal的大小是不一致的,但是我们在输入到fully connected layer之前必须将他们的维度变成一致的。在这里,作者采用了RoI pooling的方法。RoI Pooling最直观的介绍如下图所示。通过RoI Pooling, 我们将所有的proposal的都变成了7*7的大小。
      RoI Pooling
    • 最后再将ROI Pooling的结果展开输入到fully connected layer中去,实现object classification。
  • 实现代码:upcoder/MyFasterRCNN

  • 参考文献:

猜你喜欢

转载自blog.csdn.net/liangdong2014/article/details/79507032