这是一个阅读笔记,主要用于记录在阅读经典的目标检测模型论文过程中,得出的总结和思考。并不详细介绍每个模型,主要总结每个模型的优缺点。其中可能存在错误的理解,仅供参考哈。
11. FPN(2016-12)
11.1 FPN是一个高级的特征提取网络
还记得前面介绍的PVANet吗?PVANet本身指的是目标检测器中的特征提取网络,或者说是基础网络(Base Network),PVANet专注于在保证特征提取性能的同时最大化地降低计算成本。和Faster R-CNN风格的RPN,以及检测网络组合在一起,才构成的PVANet目标检测器。
类似的,这篇论文中提出的FPN(Feature Pyramid Network, 特征金字塔网络)也是一个特征提取网络/基础网络。而FPN专注于如何更好地捕获多层级的特征表征,从而更好地解决目标的多尺度问题。
我们根据时间关系,来聊聊目标检测器中的基础网络在解决多尺度目标方面尝试过的办法:
- 图像金字塔
如下图所示:
即将原始输入图像在送入网络前缩放到不同的尺度,对应得到不同层级的特征图,这些特征图都包含了很强的语义信息(特征图中边框的粗细程度反映了特征图包含语义信息的强弱,边框越粗,表示特征图包含的语义信息越强)。使用同一个检测网络依次完成每一个尺度图像的检测,最后将检测结果进行融合。
这种方案在提升多尺度目标检测性能方面没的说,肯定是相当有效的。大尺度的特征图能更好地检测小目标;小尺度特征图能更好地检测大目标。这种方案在基于手工特征(hand-engineered feature)的检测时代用的最多。
但是,图像金字塔方案的缺点是会显著地增大检测网络的计算量以及内存占用。这很好理解,图像金字塔相当于同时要检测多张图像。
主流的目标检测器出于实时性方面的需求,很少采用这种古老的方案。
- 在一张特征图上进行多尺度预测
如下图所示:
这是原始Faster R-CNN风格的的解决方案,即针对单张输入图像,得到最高层级的特征图,然后在上面布置多尺度的anchor。前面在Faster R-CNN的部分已经讨论过,这种方案主要问题在于两点:
(1)由于仅使用了比较粗糙的深层特征图,丢失图像中的细节信息,在检测小目标方面表现不好。
(2)特征图的感受野是固定的,使用固定感受野的特征图要预测不同尺度的目标,有点牵强(个人观点)。
- 使用多个层级的特征图同时进行预测
如下图所示:
这是原始SSD风格的解决方案。基于浅层特征图感受野较小,且较好地保留了图像的细节信息,可用于检测小目标;深层特征图感受野较大,适合用于检测大目标。因此同时使用不同层级的特征图进行预测,不就可以完成多尺度的目标检测了吗!
得到的特征图构成的金字塔看上去是不是有点像古老的图像金字塔?
这种方案仍然存在两个缺陷:
(1)虽然这种多层级的预测考虑到了Faster R-CNN的缺点,使得不同感受野的特征图负责处理对应尺度的目标,但是SSD忽略了一个问题:高分辨率的浅层特征图虽然保留了图像更多的细节信息,但是语义信息弱啊!
所以说,SSD得到的特征金字塔仅仅是有点像图像金字塔方案。前面说了,特征图中边框的粗细程度反映了特征图包含语义信息的强弱,边框越粗,表示特征图包含的语义信息越强。
看上图中,SSD得到的特征金字塔中,层数越浅,边框越细,意思是语义信息越弱。
再看第一张图像金字塔得到的特征金字塔,每个层级的特征图的边框都很粗,意味着每个层级的特征图语义信息都很强。
所以说,天下没有免费的午餐,SSD想要免费得到每个层级都包含丰富语义信息的特征金字塔,不是这么容易的。
SSD中浅层特征图的语义信息弱,得不到好的特征表征,导致识别环节表现不好。
(2)其实SSD作者也不是没有考虑到浅层特征图语义信息弱的问题,相反,作者考虑到了,要不为啥SSD中最浅层的特征图都使用的VGG-16中的conv4_3呢?这已经是8倍的步长了。作者认为这一层特征图的语义信息已经还可以了。所以缺陷(1)好像对SSD有点不公平。。。
但是另一个问题又来了,导致SSD虽然打着多尺度预测完美解决多尺度目标的旗号,但是实际上SSD对于小目标的检测仍然不好。因为,可能,8倍的步长得到的特征图conv4_3已经算是很粗糙了。
或许我们需要更浅的特征图来解决小目标预测问题。但特征图的细节信息和语义信息是一对矛盾兄弟啊!两者不可兼得?答案是使用多层级特征融合!
- 进行多层级特征融合,使用融合后的一张特征图进行预测
如下图所示(偷个懒,直接在原论文中截图的,表示形式和上面的有点区别,不过不影响):
这是HyperNet风格的解决方案。前面对HyperNet简单介绍过,HyperNet将不同层级的特征图进行融合,使得融合后的特征图既具有深层特征图高级的语义信息,同时又保留了浅层特征图的图像细节信息。
HyperNet使用了conv3(步长为4)的图像分辨率进行预测,同时融合了conv1(步长为1)和conv5(步长为16)的特征图信息,融合之后的特征图称为Hyper Feature Maps。
从效果来看,这种融合方式在PASCAL VOC20017测试集上得到的porposal的召回率还不错:
但是最终的mAP就不怎么样了。说明这种融合方式不够合理?注意到,特征图融合时,conv5直接经过4倍的上采样,conv1直接经过4倍的下采样。不知是否这种融合方式过于简单粗暴?或许基础网络(VGG-16)不够好?没看源代码,没具体去做ablation实验,说不清道不明。重点是这种多层级特征融合的思想挺好,融合高层级的特征之后,使得高分辨率的特征图也拥有了高层级特征图的语义信息。
- 基础网络设计中的新思想——FPN
FPN的示意图如下:
看上去是不是有点像SSD,还有点像HyperNet?
FPN采用了和SSD相似的预测方案,即同时使用多个层级的特征图进行预测,出发点也类似:浅层特征图包含较多的图像细节,用于预测小目标;深层特征图用于预测大目标。
但前面讲SSD这种预测方案有缺陷:浅层高分辨率的特征图语义信息弱的问题如何解决?
FPN又借用了HyperNet的多层级特征融合的思想:将深层的,语义信息较强的特征图逐渐进行上采样,使用在channel维度上进行concate,或者使用element-wise的方式相加等方式,与浅层的特征图进行融合,达到加强浅层特征图语义信息的效果。
(也不能说FPN就是参考了HyperNet的多层级特征融合思想,因为多层级特征融合思想在2014年底出来的,语义分割领域的经典论文《Fully Convolutional Networks for Semantic Segmentation》中就已经获得成功了,之后的很多语义分割模型貌似都用了这种思想,具体论文还没看。。。FPN着重提了这一篇论文:《Learn-
ing to refine object segments》)
经过多层级特征融合之后可以看到(特征图边框粗细程度),每一个层级的特征图都拥有了丰富的语义信息了。
可以说,FPN通过融合多层级特征,对SSD的基础网络进行了升级,得到了在所有层级都拥有高级语义信息的特征金字塔。
原来天下真的有免费的午餐。就这样,FPN通过近乎免费的方式达到了图像金字塔的效果。
11.2 FPN的具体网络结构
前面介绍了FPN的整体思路,现在介绍FPN具体的网络结构,看看它具体是怎样进行融合的?
FPN由一个bottom-up highway和top-down highway&lateral connection组成。
11.2.1 bottom-up highway
bottom-up highway就是针对一张任意尺寸的输入图像,采用一个基础网络提取特征图的前向过程。这里的基础网络随便选,VGG-16、PVANet、Darknet-19、ResNet等都行。
文中作者采用了ResNet作为基础网络(论文中尝试了ResNet-50,ResNet-101),其网络层配置参考来自相关论文的表格:
论文中,将输入图像的短边统一缩放到800,作为FPN的输入。
首先经过一个7x7,s=2的大卷积层,以及一个3x3,s=2的池化层。
然后ResNet经过了4个阶段的卷积过程,即表格中的conv2_x,conv3_x,conv4_x,conv5_x。
其中每一个阶段内,特征图大小是不变的,且conv2_x,conv3_x,conv4_x,conv5_x每个阶段对应的特征图大小分别是原始输入图像的1/4,1/8,1/16,1/32。
FPN将以上4个阶段中,每个阶段的最后一个卷积层的输出特征图取出来,得到{C2,C3,C4,C5}。
即,{C2,C3,C4,C5}每张特征图大小分别是输入图像的{1/4,1/8,1/16,1/32}。
假设输入图像的尺寸是[H,W],那{C2,C3,C4,C5}特征图的尺寸分别是:
- C2.shape=[H/4, W/4, 256]
- C3.shape=[H/8, W/8, 512]
- C4.shape=[H/16, W/16, 1024]
- C5.shape=[H/32, W/32, 2048]
11.2.2 top-down highway&lateral connection
top-down highway&lateral connection指的是特征自顶向下进行融合的过程。
现在要利用{C2,C3,C4,C5},获取融合之后的特征金字塔:{P2,P3,P4,P5,P6}。
其中,{P2,P3,P4,P5}的长和宽与{C2,C3,C4,C5}一一对应相等,P6是在P5基础上经过一个最大池化层所得,目的是获得更大感受野的特征图。
下面描述如何计算{P2,P3,P4,P5,P6},总的计算过程如下图所示:
上图中,Upsample/2可以直接是一个resize操作,采用最近邻插值方式。"+"表示一个element-wise的加法。
于是,{P2,P3,P4,P5,P6}就构成了FPN的输出,每个层级的shape如下:
- P2.shape=[H/4, W/4, 256]
- P3.shape=[H/8, W/8, 256]
- P4.shape=[H/16, W/16, 256]
- P5.shape=[H/32, W/32, 256]
- P6.shape=[H/64, W/64, 256]
11.3 FPN + RPN
原始的Faster R-CNN仅使用了最高层级的单张特征图进行预测,现在将基础网络换成FPN之后,要同时使用5张不同层级的特征图,即{P2,P3,P4,P5,P6}进行预测。那RPN如何与FPN进行结合呢?
- anchor的设计
经典的Faster R-CNN是在一张特征图上使用了3个尺度和3个横纵比的anchor,即共有9种不同的anzhor。
基础网络采用FPN之后,每个层级的特征图就负责1个尺度就行了,每层特征图与其负责的anchor尺度的对应关系如下:
(P2, 32), (P3, 64), (P4, 128), (P5, 256), (P6, 512)
而横纵比的选择不变,每个尺度都对应3个横纵比,即(1/2,1,2)。因此,由于采用FPN的多层级特征进行预测之后,总的anchor类别数由9增加到15种,主要增加了32和64两个小尺度anchor,希望能改善对小目标的检测效果。
- 所有层级的特征图共享一个RPN
虽然使用了6个特征图进行预测,但是不同特征图之间采用共享RPN参数的方式。这是由于每层特征图都包含了很强的语义信息,所以仅采用一个统一的RPN网络进行预测是可行的。而且这样做大大减小了RPN部分的网络参数数量。
RPN部分的训练方式不变,训练时,正负anchor的选择标准与经典Faster R-CNN中的RPN一致。
11.4 FPN + RPN + Fast R-CNN
- ROI池化的处理方式
通过RPN得到了N多个proposals的坐标信息,比如box1是一个由RPN产生的proposal,其高和宽分别为h,w。
那么在进行ROI池化时,需要将box1的坐标信息映射回{P2,P3,P4,P5,P6}中哪一个层级的特征图,从而得到proposal feature map呢?显然,面积小的proposal应该映射回分辨率较大的特征图,面积大的proposal应该映射回分辨率较小的特征图。具体,论文中是这么做的:
其中,k值决定了proposal(高=h,宽=w)应该映射回{P2,P3,P4,P5,P6}中的哪一个特征图。k0取为4。
比如,当w=h=224时,此时“+”后面的部分为0,那么k=4,该proposal应该映射回P4。
比如,当w=h=112时,此时“+”后面的部分为-1,那么k=3,该proposal应该映射回P3。
如果k是小数,则做一下四舍五入取整。以此类推,达到了越小的proposal应该使用越浅的特征图的效果。
但是,论文中提到,ROI池化时P6不使用:
那么,如果上面的公式计算得到的k=6,也将该proposal映射回P5。
解决了proposal应该映射回哪一张特征图之后,最后采用7x7的ROI池化层,即得到了每个proposal的feature vector。
- 分类回归层
这里的分类回归层采用2个1000-d的fc层,然后是分别接分类输出和回归输出,形式与原始的Faster R-CNN保持一致。在Faster R-CNN(ResNet-101),作者使用C4特征图送入RPN,使用C5卷积层来做预测网络,但是,FPN中已经将C4、C5都用来提取图像特征了,因此这里就是用了MLP来做分类回归层。
好了,FPN以及基于FPN的Faster R-CNN的重点应该就是上面这些内容了。至于训练的细节,暂时不关注,需要用到时再细看。
11.5 FPN+Faster R-CNN架构在COCO上的表现
加入了FPN后的Faster R-CNN在COCO数据集上大杀四方,就单模型的表现来看,胜过了COCO2016的冠军G-RMI。如下表所示:
另外,FPN的主要目标是改善目标的多尺度检测,尤其是对小目标的检测(这是之前几乎所有目标检测器的痛点),实验结果非常明显:
和仅使用单层特征图的RPN相比,使用了FPN多层级特征图的RPN在COCO上的平均召回率AR提升明显。其中,在小目标上的AP从32.0升到了44.9,整整提升了12.9个百分点!
论文中还做了很多的Ablation实验,用于探究FPN中的几个关键idea,即
- top-down highway,即Upsample/2;
- lateral connection,即将每个层级的Ci使用卷积1x1x256,然后与上一层级的特征图相加;
- 多层级特征图同时预测
- RPN在每个特征图上是否共享卷积等
各自对模型性能的影响,感兴趣就仔细读一下论文吧。
11.6 总结
这篇论文主要有以下贡献:
- 为目标检测网络提出了新的基础网络结构,即FPN。通过bottom-up highway、top-down highway以及lateral connection,巧妙地得到了特征金字塔结构,每个层级的特征图都拥有高级的语义信息。
- 通过将FPN与Faster R-CNN进行结合,就单模型性能来看,超越了先前所有的检测模型,同时速度还能达到约6FPS。
- 通过将高层级特征图的语义信息融合到浅层特征图中,Faster R-CNN(FPN)对小目标的检测效果提升明显。
11.7 参考资料
12. TDM(2016-12)
12.1 TDM也是一种用于多尺度特征融合的基础网络结构
TDM结构来自于谷歌的这篇论文:
和FPN高度相似,都是致力于设计更好的特征提取网络,然后与Faster R-CNN架构进行结合用于目标检测。
TDM和FPN都采用了多层级特征融合的思路,先是一个bottom-up的前向传播,得到不同层级的特征图,然后从最高层级的特征图开始,通过top-down将深层特征图往下传,然后通过lateral connection与当前层的特征图进行融合。然后继续往下传播。。。最后每个层级的特征图都拥有了丰富的语义信息。
FPN和TDM的整体网络结构如下图所示:
如果已经熟悉了FPN的网络结构,TDM的网络结构一看就懂。总体来看,TDM仅仅使用了FPN中分辨率最高的特征图进行预测而已。
但是,FPN和TDM在相邻两层特征图如何进行融合方面有区别,如下图所示:
图中P4表示一个top-down 特征图,C3表示bottom-up特征图,P3表示融合之后的特征图。两者区别如下:
- 卷积方式有区别,比如卷积核大小和位置,见上图。
- FPN的top-down 特征图,以及bottom-up特征图经过lateral connection的卷积之后,特征图通道数固定在256。但是TDM的特征图通道数是可以设置的,如上图中的C1/C2/C3。
- 特征图的融合方式不同,FPN采用的是element-wise addition,而TDM采用的是通道维度上的concate。
预测层上面,FPN使用了6个特征图同时进行预测,而TDM仅仅使用了融合后,分辨率最大的特征图进行预测。
从以上对比可以看出,TDM和FPN的思想高度重合,但是两份工作应该是独立完成的。
从将论文首次提交到到arxiv.org网站的时间来看,FPN的提交时间是2016-12-9:
本小节要讨论的TDM论文提交的时间是2016-12-20:
时间相当接近。
12.2 FPN被TDM打脸了?
怎么说?FPN使用了6个特征图同时进行预测,而且在FPN的论文中,作者做了ablation实验,其中一个对比实验就是仅使用融合之后,分辨率最高的特征图进行预测(这不就是TDM干的事吗???)。就是下面这段文字:
但是这样做得到的实验结果并不太好:
上图中,(c)是使用6个特征图进行预测得到的平均召回率,(f)就是仅使用融合之后,分辨率最高的特征图进行预测的结果,从结果来看,单纯使用一个特征图进行预测的效果确实不如特征金字塔好。
而且,仅仅使用分辨率最高的特征图进行预测还有一个缺点,会造成ahchor的数量超级多,因为特征图的分辨率比较大。会额外增加计算成本和内存占用。
但是,仅从mAP的角度看,虽然仅仅使用分辨率最高的特征图进行预测,但是TDM+Faster R-CNN在COCO test-dev上面的AP值最高刷到了37.3%:
而FPN+Faster R-CNN在同样的数据集上的AP值是36.2%:
因此,仅仅从准确率角度来看,FPN通过ablation实验说明仅使用分辨率最高的特征图进行预测不好,这一观点是被TDM打脸了。
但是,这样对比又有一些不公平:
- FPN和TDM训练时使用的数据集大小不一样,FPN的训练集更大,具体看论文。
- TDM刷到37.3%的AP时,使用的基础网络是InceptionResNetv2。当使用和FPN相同的ResNet-101时,TDM得到的AP值是35.2,并没有FPN高。
- 另外,两个模型训练时使用的深度学习框架不一样,TDM使用的Tensorflow,而FPN应该使用的caffe吧。比如TDM论文中使用Tensorflow重现了Faster R-CNN,结果准确率优于原版Faster R-CNN(caffe实现)。所以,在准确率相差不大(约1%)的情况下,很难得出TDM和FPN到底哪一种作为目标检测的基础网络更好。
- 还有一点是速度问题,虽然TDM论文中没有提到模型速度问题,TDM+Faster R-CNN的检测速度应该要比FPN+Faster R-CNN要慢一些。
总的来说,TDM和FPN这两篇论文写得都很详细,都做了完整的ablation实验。作为吃瓜群众,目前我觉得两种结构都可以考虑。
13. DSSD(2017-1)
13.1 DSSD相对于SSD的改进措施
和YOLO_v2与YOLO关系类似,DSSD是在SSD的基础上进行优化,DSSD和SSD的作者都是Liu Wei等人。
DSSD在SSD的基础上做了以下改进:
- 基础网络的选择上,使用ResNet-101替换掉VGG-16。
更换前后,用于预测的特征图对比如下图所示:
- 尝试了不同的预测模块。
原始的SSD使用图(a)中的预测模块,即直接一个3x3卷积(可看做1个fc层)得到分类和回归结果。本文中作者尝试将预测模块加深,并且尝试了3种加深方案。ablation实验结果如下图所示:
PM表示Prediction Module,即预测模块。
从结果来看,上图(c)的效果最好,因此DSSD采用了图(c)的预测模块。
- 引入了和FPN非常相似的top-down通道,进一步加强浅层特征图的语义信息。
论文中DSSD的网络结构称为hourglass/沙漏造型,但是除去预测模块,实质上和FPN是一个套路。只是相邻两个层级的融合方式有一点点区别,DSSD中相邻层融合方式如下:
深层特征图经过一个转置卷积层达到2倍上采样的目的,而FPN直接使用双线性插值的resize操作。
通过top-down通道加强浅层特征图的语义信息之后,DSSD在小目标的检测上比原始的SSD效果好了很多。
- 在anchor的横纵比选择上,采用了和YOLO_v2相同的思路,使用了K-means聚类的方式,根据具体数据集的的目标框特点来得到anchor的横纵比。
经过以上几点改进之后,DSSD在COCO2015测试集上的表现如下图所示:
AP最好达到了33.2。作为对比FPN+Faster R-CNN在COCO测试集上达到了35.8:
13.2 DSSD的缺点
相比于SSD,虽然DSSD的准确率提上去了,但是作为one-stage模型引以为傲的速度优势没了。如下图所示:
和SSD类似,DSSD也是使用了两种输入图像分辨率:321和513。性能最好的DSSD513的检测速度已经,慢到5-6FPS了,这和FPN的检测速度差不多。完全失去了one-stage模型的速度优势。
13.3 参考资料
14. Mask R-CNN(2017-3)
...