小目标检测很难, 为什么难. 想象一下, 两幅图片, 尺寸一样, 都是拍的红绿灯, 但是一副图是离得很近的拍的, 一幅图是离得很远的拍的, 红绿灯在图片里只占了很小的一个角落, 即便是对人眼而言, 后者图片中的红绿灯也更难识别.
说回到 cnn, 不断地卷积以后, feature map 的尺寸变小. 这时候 feature map 所代表的语义信息已经很丰富了, 如果绘图绘制出来, 可能会看见代表的是某种形状, 颜色, 或更高级的更抽象的概念了. 但是由于 feature map 尺寸减小, 所以检测小目标困难.
我们可以用同一图片, 不同尺寸内容相同的同一幅图分别训练多个 feature map, 但是这么搞会及其耗时, 并且需要大量内存. 在实时性要求高的场景下是不能这么搞的. 这就引入了 FPN 的概念
Feature Pyramid Networks (FPN)
特征金字塔网络 (FPN) 是根据特征金字塔概念设计的特征提取器, 目的是提高精度和速度. 它替代了类如 Faster R-CNN 中的特征提取器, 并且生成更高质量的特征图金字塔.
经过一系列的卷积以后得到了 feature map, 我们通过上采样, 再一步步还原回去, 在保证高级语义信息没丢的情况下, 还把 feature map 的 size 搞大了. 然后用大 size 的 feature map 去检测小目标. 从而解决小目标难以检测的问题.
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 的位置已经不准确了.
所以我们在重新构建出来的层和相应的 feature map 之间构建横向连接, 以使得检测器可以更好地预测 location.
下面是自下而上和自上而下的路径图. P2,P3,P4,P5 是 object detection 所需的金字塔 feature map.
FPN with RPN
FPN 本身并不是 object detetcor. 它只是一个 feature detetor. 下图显示 FPN 在一个 object detector 中的位置和作用. 每一个 feature map(P2 到 P5)被独立地送到后续的流程完成 object detection.
FPN with Fast R-CNN or Faster R-CNN
通过 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
来源: https://www.cnblogs.com/sdu20112013/p/11050746.html