Pytorch: 目标检测-特征金字塔-FPN
Copyright: Jingmin Wei, Pattern Recognition and Intelligent System, School of Artificial and Intelligence, Huazhong University of Science and Technology
本教程不商用,仅供学习和参考交流使用,如需转载,请联系本人。
Reference
《深度学习之 Pytorch 物体检测实战》
import torch.nn as nn
import torch.nn.functional as F
import torch
FPN 网络结构
为了增强语义性,传统的物体检测模型通常只在深度卷积网络的最后一个特征图上进行后续操作,而这一层对应的下采样率(图像缩小的倍数)通常又比较大,如 16 , 32 16,32 16,32 ,造成小物体在特征图上的有效信息较少,小物体的检测性能会急剧下降,这个问题也被称为多尺度问题。
解决多尺度问题的关键在于如何提取多尺度的特征。传统的方法有图像金字塔(Image Pyramid),主要思路是将输入图片做成多个尺度,不同尺度的图像生成不同尺度的特征,这种方法简单而有效,大量使用在了 COCO 等竞赛上,但缺点是非常耗时,计算量也很大。
从 torch.nn 那一章可以知道,卷积神经网络不同层的大小与语义信息不同,本身就类似一个金字塔结构。 2017 2017 2017 年的 FPN (Feature Pyramid Network)方法融合了不同层的特征,较好地改善了多尺度检测问题。
FPN 的总体架构如图所示,主要包含自下而上网络、自上而下网络、横向连与卷积融合 4 4 4 个部分。
-
自下而上:最左侧为普通的卷积网络,默认使用 ResNet 结构,用作提取语义信息。 C 1 C_1 C1 代表了 ResNet 的前几个卷积与池化层,而 C 2 − C 5 C_2-C_5 C2−C5 分别为不同的 ResNet 卷积组,这些卷积组包含了多个 Bottleneck 结构,组内的特征图大小相同,组间大小递减。
-
自上而下:首先对 C 5 C_5 C5 进行 1 × 1 1\times1 1×1 卷积降低通道数得到 M 5 M_5 M5 ,然后依次进行上采样得到 M 4 , M 3 , M 2 M_4,M_3,M_2 M4,M3,M2 ,目的是得到与 C 4 , C 3 , C 2 C_4,C_3,C_2 C4,C3,C2 长宽相同的特征,以方便下一步进行逐元素相加。这里采用 2 2 2 倍最邻近上采样,即直接对临近元素进行复制,而非线性插值。
-
横向连接(Lateral Connection):目的是为了将上采样后的高语义特征与浅层的定位细节特征进行融合。高语义特征经过上采样后,其长宽与对应的浅层特征相同,而通道数固定为 256 256 256 ,因此需要对底层特征 C 2 − C 4 C_2-C_4 C