Faster rcnn概述
参考:
https://www.jianshu.com/p/9da1f0756813
https://www.cnblogs.com/wangyong/p/8523814.html
https://www.cnblogs.com/wangyong/p/8513563.html
网络结构图是理解神经网络的核心,理解了这张图,就能通过它理解那些零散的知识点。而且,这张网络图也能便于记忆,一片论文放出来,很多知识点,你看似都理解了,但是,并不能将这些知识点都联系到一起。我们通过网络结构图就能快速的记忆理解这些东西。
言归正传,上面的这张图,我们先看左边的部分,VOCDataset,COCODataset这部分,很明显是否数据集部分,为了生成真实的groundtruth,也就是label,送到网络末端进行训练。
从dataset解析出来了的有两个部分,一个是用于网络末端的label,另一个就是网络的输入img,这里首先经过了一个特征提取网络,当然特征提取网络分为好多种,有resnet,vgg,mobienet等,虽然他们的参数大小等都很不相同,但是他们实现的功能是一致的。
接下来就会通过ROIPooling对网络进行训练。我们知道RPN网络生成2万个候选狂,然后这些候选框的图片被送到ROIPooling中进行学习。
RPN网络就是生成候选框的网络,这里就不做介绍了,大家可以看下其他文章。
代码地址:https://github.com/jwyang/faster-rcnn.pytorch
我们来分析一下:
原始图像没有固定大小,我们假设为1000×1000,最后的输出为60*40(1000/16≈60,600/16≈40),因为有4个pooling,相当于缩小了16倍。完毕。
RPN网络参数参数ratios=[0.5, 1, 2]scales=[8, 16, 32]。生成2万个achoc,60*40*9=21600个Anchor box
过滤的规则:
这一层主要是为特征图60*40上的每个像素生成9个Anchor box,并且对生成的Anchor box进行过滤和标记,参照源码,过滤和标记规则如下:
① 去除掉超过1000*600这原图的边界的anchor box
② 如果anchor box与ground truth的IoU值最大,标记为正样本,label=1
③ 如果anchor box与ground truth的IoU>0.7,标记为正样本,label=1
④ 如果anchor box与ground truth的IoU<0.3,标记为负样本,label=0
除了对anchor box进行标记外,另一件事情就是计算anchor box与ground truth之间的偏移量,预测X,Y偏移
令:ground truth:标定的框也对应一个中心点位置坐标x*,y*和宽高w*,h*
anchor box: 中心点位置坐标x_a,y_a和宽高w_a,h_a
所以,偏移量:
△x=(x*-x_a)/w_a △y=(y*-y_a)/h_a
△w=log(w*/w_a) △h=log(h*/h_a)
通过ground truth box与预测的anchor box之间的差异来进行学习,从而是RPN网络中的权重能够学习到预测box的能力
源码中,会重新生成60*40*9个anchor box,然后累加上训练好的△x, △y, △w, △h,从而得到了相较于之前更加准确的预测框region proposal,进一步对预测框进行越界剔除和使用nms非最大值抑制,剔除掉重叠的框;比如,设定IoU为0.7的阈值,即仅保留覆盖率不超过0.7的局部最大分数的box(粗筛)。最后留下大约2000个anchor,然后再取前N个box(比如300个);这样,进入到下一层ROI Pooling时region proposal大约只有300个。