目标检测:fasterRCNN和RFCN算法的理解

所有的two-stage detection 算法大致都由两部分组成:RPN生成proposal和对proposal的cls和reg。本科做毕设用了Faster RCNN,对此类算法稍稍有点了解,但是还是很多迷惑。最近本人认真研读了light head rcnn,对two stage算法进行了比较,也解答了之前的一些疑惑。列举: 

1. RPN网络中anchor和proposal的关系

以faster rcnn网络为例,假定输入到RPN网络的feature map的size为13*13,现定义了3个scales和3个aspect radio,即为13*13feature map上的每个点考虑k=9个框,anchor实际上就是一组由rpn/generate_anchors.py生成的矩形。RPN中的cls层会输出(2*9)13*13个分类信息,为了利用softmax对这么多框进行背景前景分类,要对(2*9)*13*13进行reshape成2(9*13)*13的size,cls完成后再reshape回来;与此同时,reg层也会输出(4*9)*13*13个位置偏移量,注意并不是直接输出位置信息喔,是通过论文中的公式计算得到位置信息的。接下来在proposal layer 中,主要有以下几步:利用[dx(A),dy(A),dw(A),dh(A)]对所有的框做bbox regression回归;提取前景pre_nms_topN(e.g. 1000)个框,即提取修正位置后的属于前景的1000个框;限定超出图像边界的框为图像边界(防止后续roi pooling时proposal超出图像边界);剔除非常小的框;再进行NMS,取出前300个框作为输出,这些输出的框就是proposal.这些过程可以理解为predict过程。在训练的时候,回传18*13*13个anchor box,肯定是没有必要的,具体怎么做的呢?train的时候随机选取256个postive anchors box+256个negative anchors box 进行训练,postive 和negative的界定方法如下:当anchor box与GT间IoU>0.7,认为是该anchor box是foreground;反之IoU<0.3时,认为是该anchor box是background,至于IoU在0.3和0.7之间的anchorbox 则不参与训练.(具体数字可能不准确,表达出意思即可。train的时候回传的proposal数目会高于predict过程,且计算IOU是只在train过程进行)。 

2. 为什么roi pooling需要proposal 和 feature map两个输入

因为在proposal layer第三步中将框映射回原图判断是否超出边界,所以这里输出的proposal是对应MxN输入图像尺度的,所以要想进行后续的cls和reg就必须要把proposal再缩放到feature map的像素极上,因此在feature上找到proposal对应的位置,进行pooling,所以需要两个输入,根本原因就是proposal是针对原图的。 

对faster rcnn解释的最清楚的一篇文章奉上:链接 。 

3. RFCN中提出了PSROIPooling的概念,引入了位置敏感的score map

说白了就是因为如果把roipooling层的输入直接接全连接层用于cls和reg,会让detection网络对位置不敏感,但是如果让单个proposal都通过一些卷积层又会导致计算量太大,时间过长。R-FCN可以说是做到了两全其美,首先对于backbone的最后一层feature map,又接了一层卷积层,干什么呢?就是用来处理位置敏感问题的。 

将每个ROI分为k*k个bin,那么这层卷积层的输出channel就是k*k*(c+1),怎么理解这个channel呢? 考虑人这一类,对于检测人来说top-center就是头部,bottom-center就是脚。现在就通过对每个bin进行检测来综合得到这个roi的检测结果。如果一个roi的top-center、bottom-center和其他bin都被检测为头、脚和人的其他特征,那么就都断定这个roi是人。好,现在以检测人头为目标生成一张feature map(这个feature map就是检测人的top-center),再以人脚为目标生成一张feature map,同理其他bin的特征也生成对应的feature map,那么对于人来说就生成k*k个feature map,总共c+1类就生成了k*k*(c+1)维feature map,即score map. 接下来用PSROIPooling的方法去得到每个roi的检测结果。试想如果roi的位置稍微偏移了一点就意味着每个bins都有移动,那么将每个bin的检测结果结合起来,差别就大了,位置敏感性就不言而喻了。 
4. 对于一个network,如果想把roipooling换成PSROIPooling,必须要生成一个score map吗?答案是否定的,如果使用PSROIPooling层,只需要注意输入的channel和psroipooling层的output_dim*group_size^2一致即可,至于class相不相同不是很重要了,因为后面可以接一个fc来改变维度。这也就是light head rcnn的一个创新点了,thinner feature map,链接。此处的output_dim为pool后的channel,group_size为pool后的size。
阅读更多
文章标签: ROIPooling
个人分类: 目标检测
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭