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。