小目标检测很难,为何难.想象一下,两幅图片,尺寸同样,都是拍的红绿灯,可是一副图是离得很近的拍的,一幅图是离得很远的拍的,红绿灯在图片里只占了很小的一个角落,即使是对人眼而言,后者图片中的红绿灯也更难识别.网络
说回到cnn,不断地卷积之后,feature map的尺寸变小.这时候feature map所表明的语义信息已经很丰富了,若是绘图绘制出来,可能会看见表明的是某种形状,颜色,或更高级的更抽象的概念了.可是因为feature map尺寸减少,因此检测小目标困难.ui
咱们能够用同一图片,不一样尺寸内容相同的同一幅图分别训练多个feature map,可是这么搞会及其耗时,而且须要大量内存.在实时性要求高的场景下是不能这么搞的.这就引入了FPN的概念
设计
特征金字塔网络(FPN)是根据特征金字塔概念设计的特征提取器,目的是提升精度和速度.它替代了类如Faster R-CNN中的特征提取器,而且生成更高质量的特征图金字塔.
通过一系列的卷积之后获得了feature map,咱们经过上采样,再一步步还原回去,在保证高级语义信息没丢的状况下,还把feature map的size搞大了.而后用大size的feature map去检测小目标.从而解决小目标难以检测的问题.blog
FPN由自下而上和自上而下两部分构成.自下而上的就是传统的卷积网络作特征提取,随着卷积的深刻,空间分辨率减小,空间信息丢失.可是高级语义信息被更多地检测到.
图片
ssd从依据多个feature map来作预测,可是底层的layer并无选中作object detetion.底层的具备high resolution,可是不具有高级语义high semantic.ssd为了提升速度,在predict的时候不用比较底层的feature map.这一点也致使了它对小目标的检测效果很差.
内存
FPN提供了一种自上而下的路径,去构建higher resolution layer from a semantic rich layer.
这样构建出来的层具备high resolution的同时又有丰富的语义rich semantic.可是因为通过了不断地上采样下采样,object的位置已经不许确了.it
因此咱们在从新构建出来的层和相应的feature map之间构建横向链接,以使得检测器能够更好地预测location.
io
下面是自下而上和自上而下的路径图.P2,P3,P4,P5是object detection所需的金字塔feature map.
ast
FPN自己并非object detetcor.它只是一个feature detetor.下图显示FPN在一个object detector中的位置和做用. 每个feature map(P2到P5)被独立地送到后续的流程完成object detection.
object
经过FPN,生成了feature map的金字塔(也就是一堆不一样尺寸的特征图,都具备高级语义).而后用RPN生成ROI.而后对不一样尺寸的目标,选用不一样尺寸的特征图去作识别.小目标要用大尺寸的feature map. 大目标用小尺寸的feature map.很好理解,目标很小,你再用小尺寸(低分辨率)的feature map,确定更难看清目标了.
参考:https://medium.com/@jonathan_hui/what-do-we-learn-from-single-shot-object-detectors-ssd-yolo-fpn-focal-loss-3888677c5f4d