FPN网络详解

特征图金字塔网络FPN(Feature Pyramid Networks)是2017年提出的一种网络,FPN主要解决的是物体检测中的多尺度问题,通过简单的网络连接改变,在基本不增加原有模型计算量的情况下,大幅度提升了小物体检测的性能。

低层的特征语义信息比较少,但是目标位置准确;高层的特征语义信息比较丰富,但是目标位置比较粗略。另外虽然也有些算法采用多尺度特征融合的方式,但是一般是采用融合后的特征做预测,而本文FPN不一样的地方在于预测是在不同特征层独立进行的。

一、各种网络结构对比

1、通常的CNN网络结构如下图所示
在这里插入图片描述

上图网络是自底向上卷积,然后使用最后一层特征图进行预测,像SPP-Net,Fast R-CNN,Faster R-CNN就是采用这种方式,即仅采用网络最后一层的特征。

以VGG16为例子,假如feat_stride=16,表示若原图大小是1000600,经过网络后最深一层的特征图大小是6040,可理解为特征图上一像素点映射原图中一个1616的区域;那原图中有一个小于1616大小的小物体,是不是就会被忽略掉,检测不到了呢?

所以上图中的网络的缺点就是会造成检测小物体的性能急剧下降。

2、图片金字塔生成特征金字塔

鉴于上面的单层检测会丢失细节特征;就会想到利用图像的各个尺度进行训练和测试,比如下图所展示,将图像做成不同的scale,然后不同scale的图像生成对应的不同scale的特征
在这里插入图片描述

将图片缩放成多个比例,每个比例单独提取特征图进行预测,这样,可以得到比较理想的结果,但是比较耗时,不太适合运用到实际当中。有些算法仅会在测试时候采用图像金字塔。

3、多尺度特征融合的方式

在这里插入图片描述

像SSD(Single Shot Detector)就是采用这种多尺度特征融合的方式,没有上采样过程,即从网络不同层抽取不同尺度的特征做预测,这种方式不会增加额外的计算量。作者认为SSD算法中没有用到足够低层的特征(在SSD中,最低层的特征是VGG网络的conv4_3),而在作者看来足够低层的特征对于检测小物体是很有帮助的。

4、FPN(Feature Pyramid Networks)

在这里插入图片描述

这是本文要讲的网络,FPN主要解决的是物体检测中的多尺度问题,通过简单的网络连接改变,在基本不增加原有模型计算量的情况下,大幅度提升了小物体检测的性能。通过高层特征进行上采样和低层特征进行自顶向下的连接,而且每一层都会进行预测。后面再详细介绍,下面先来看看另外两种

5、top-down pyramid w/o lateral

在这里插入图片描述
上图该网络有自顶向下的过程,但是没有横向连接,即向下过程没有融合原来的特征。实验发现这样效果比图1的网络效果更差。

6、only finest nevel

在这里插入图片描述
上图带有skip connection的网络结构在预测的时候是在finest level(自顶向下的最后一层)进行的,简单讲就是经过多次上采样并融合特征到最后一步,拿最后一步生成的特征做预测,跟FPN的区别是它仅在最后一层预测。

二、FPN详解

作者的主网络采用了ResNet。

算法大致结构如下:一个自底向上的线路,一个自顶向下的线路,横向连接(lateral connection)。图中放大的区域就是横向连接,这里1*1的卷积核的主要作用是减少卷积核的个数,也就是减少了feature map的个数,并不改变feature map的尺寸大小。
在这里插入图片描述
自底向上

自底向上的过程就是神经网络普通的前向传播过程,特征图经过卷积核计算,通常会越变越小。

具体而言,对于ResNets,我们使用每个阶段的最后一个residual block输出的特征激活输出。 对于conv2,conv3,conv4和conv5输出,我们将这些最后residual block的输出表示为{C2,C3,C4,C5},并且它们相对于输入图像具有{4, 8, 16, 32} 的步长。 由于其庞大的内存占用,我们不会将conv1纳入金字塔中。

自上而下

自上而下的过程是把更抽象、语义更强的高层特征图进行上采样(upsampling),而横向连接则是将上采样的结果和自底向上生成的相同大小的feature map进行融合(merge)。横向连接的两层特征在空间尺寸相同,这样做可以利用底层定位细节信息。将低分辨率的特征图做2倍上采样(为了简单起见,使用最近邻上采样)。然后通过按元素相加,将上采样映射与相应的自底而上映射合并。这个过程是迭代的,直到生成最终的分辨率图。

为了开始迭代,我们只需在C5上附加一个1×1卷积层来生成低分辨率图P5。最后,我们在每个合并的图上附加一个3×3卷积来生成最终的特征映射,这是为了减少上采样的混叠效应。这个最终的特征映射集称为{P2,P3,P4,P5},分别对应于{C2,C3,C4,C5},它们具有相同的尺寸。

由于金字塔的所有层次都像传统的特征化图像金字塔一样使用共享分类器/回归器,因此我们在所有特征图中固定特征维度(通道数,记为d)。我们在本文中设置d = 256,因此所有额外的卷积层都有256个通道的输出。

横向连接

采用1×1的卷积核进行连接(减少特征图数量)。

三、FPN加入到各种网络的实验效果表

作者一方面将FPN放在RPN网络中用于生成proposal,原来的RPN网络是以主网络的某个卷积层输出的feature map作为输入,简单讲就是只用这一个尺度的feature map。但是现在要将FPN嵌在RPN网络中,生成不同尺度特征并融合作为RPN网络的输入。在每一个scale层,都定义了不同大小的anchor,对于P2,P3,P4,P5,P6这些层,定义anchor的大小为322,642,1282,2562,512^2,另外每个scale层都有3个长宽对比度:1:2,1:1,2:1。所以整个特征金字塔有15种anchor。

正负样本的界定和Faster RCNN差不多:如果某个anchor和一个给定的ground truth有最高的IOU或者和任意一个Ground truth的IOU都大于0.7,则是正样本。如果一个anchor和任意一个ground truth的IOU都小于0.3,则为负样本。

加入FPN的RPN网络的有效性如下表Table1。网络这些结果都是基于ResNet-50的。评价标准采用ARAverage Recall),AR右上角的100或1K表示每张图像有100或1000个anchor,AR的右下角s,m,l表示COCO数据集中object的大小分别是小,中,大。feature列的大括号{}表示每层独立预测。

在这里插入图片描述
从(a)(b)(c)的对比可以看出FRN的作用确实很明显。另外(a)和(b)的对比可以看出高层特征并非比低一层的特征有效。
(d)表示只有横向连接,而没有自顶向下的过程,也就是仅仅对自底向上的每一层结果做一个11的横向连接和33的卷积得到最终的结果,从feature列可以看出预测还是分层独立的,如上面图3的结构。作者推测(d)的结果并不好的原因在于在自底向上的不同层之间的semantic gaps比较大。
(e)表示有自顶向下的过程,但是没有横向连接,即向下过程没有融合原来的特征,如上面图5的结构。这样效果也不好的原因在于目标的location特征在经过多次降采样和上采样过程后变得更加不准确。
(f)采用finest level层做预测(如上图6的结构),即经过多次特征上采样和融合到最后一步生成的特征用于预测,主要是证明金字塔分层独立预测的表达能力。显然finest level的效果不如FPN好,原因在于PRN网络是一个窗口大小固定的滑动窗口检测器,因此在金字塔的不同层滑动可以增加其对尺度变化的鲁棒性。另外(f)有更多的anchor,说明增加anchor的数量并不能有效提高准确率

另一方面将FPN用于Fast R-CNN的检测部分。除了(a)以外,分类层和卷积层之前添加了2个1024维的全连接层。
实验结果如下表Table2,这里是测试Fast R-CNN的检测效果,所以proposal是固定的(采用Table1(c)的做法)。与Table1的比较类似,(a)(b)(c)的对比证明在基于区域的目标卷积问题中,特征金字塔比单尺度特征更有效。(c)(f)的差距很小,作者认为原因是ROI pooling对于region的尺度并不敏感。因此并不能一概认为(f)这种特征融合的方式不好,博主个人认为要针对具体问题来看待,像上面在RPN网络中,可能(f)这种方式不大好,但是在Fast RCNN中就没那么明显。
在这里插入图片描述

四、总结

作者提出的FPN(Feature Pyramid Network)算法同时利用低层特征高分辨率和高层特征的高语义信息,通过融合这些不同层的特征达到预测的效果。并且预测是在每个融合后的特征层上单独进行的,效果甚佳。

<think> 我们被要求详细解释CSPDarknet53和FPN网络结构。根据引用内容,CSPDarknet53是YOLOv4中提出的骨干网络,而FPN(特征金字塔网络)在目标检测中常用于多尺度特征融合。引用[3]提到YOLOv4使用了CSPDarknet53作为主干网络,并集成了SPP和PANet(一种改进的FPN)作为颈部网络。引用[4]则提到YOLOX使用了PAFPN(Path Aggregation Feature Pyramid Network),它是FPN的一种改进。 首先,我们将分别解析CSPDarknet53和FPN(包括其改进形式PANet和PAFPN)的网络结构。 ### 1. CSPDarknet53网络结构 CSPDarknet53是基于Darknet53的改进,采用了CSP(Cross Stage Partial)结构。CSP结构的主要思想是将特征图分成两部分,一部分通过密集的卷积块,另一部分则直接进行连接(或通过较少的处理),然后将两部分合并。这样可以减少计算量,同时减轻梯度消失问题。 **CSP结构的基本原理**: - 输入特征图被分成两个部分,通常按通道数平均分割。 - 一部分通过多个卷积层(称为密集块)进行处理,另一部分则不经过这些层(或经过简单的卷积)直接传递。 - 然后两部分在通道维度上合并。 在CSPDarknet53中,每个CSP模块(也称为CSP块)通常由以下组成: - 一个基础卷积层(通常包含卷积、批归一化和激活函数)。 - 将特征图分成两部分。 - 一部分经过多个残差块(Residual Block),另一部分直接连接。 - 最后将两部分合并,再经过一个卷积层。 具体来说,CSPDarknet53由多个CSP块组成,每个CSP块包含多个残差块。整个网络包括5个阶段(stage),每个阶段的下采样通过步长为2的卷积实现。 **CSPDarknet53的总体结构**: 1. 初始卷积层:通常是一个3x3卷积,步长为2,用于快速下采样。 2. 阶段1(Stage1):包含一个或多个CSP模块(每个CSP模块中有多个残差块),并且输出特征图尺寸减半(通过步长为2的卷积)。 3. 阶段2(Stage2):类似,但特征图尺寸再次减半,通道数增加。 4. 阶段3(Stage3):同样操作,特征图尺寸减半,通道数增加。 5. 阶段4(Stage4):同上。 6. 阶段5(Stage5):最后一个阶段,输出高维特征。 每个阶段输出的特征图将用于后续的特征金字塔网络FPN)。 ### 2. FPN网络结构 FPN(Feature Pyramid Network)是一种用于多尺度目标检测的特征金字塔网络。它的基本思想是利用卷积神经网络中不同层次的特征图(具有不同的空间分辨率)来构建一个特征金字塔,从而在不同尺度上检测目标。 **传统FPN结构**: - 自顶向下(Top-down)路径:从高层特征(语义信息强但分辨率低)开始,通过上采样(如最近邻插值)来增加空间分辨率,并与来自自底向上路径中相同分辨率的特征图融合(通常通过逐元素相加)。 - 横向连接(Lateral connections):将自底向上路径中的特征图(来自骨干网络的不同阶段)通过1x1卷积调整通道数后,与上采样后的特征图进行融合。 具体步骤: 1. 从骨干网络(如ResNet)中提取多个阶段的特征图(例如C2, C3, C4, C5,其中C5的空间尺寸最小,但语义信息最强)。 2. 首先从最高层(C5)开始,应用1x1卷积得到P5(最顶层的特征图)。 3. 然后对P5进行上采样,并与C4经过1x1卷积后的特征图相加,得到P4。 4. 同样,对P4上采样并与C3融合得到P3,以此类推。 5. 最后,每个融合后的特征图(P3, P4, P5)再进行一个3x3卷积来消除上采样的混叠效应。 ### 3. PANet和PAFPN 传统的FPN仅仅使用了自顶向下的路径,而PANet(Path Aggregation Network)增加了自底向上的路径,形成双向金字塔结构。这样可以更好地传递低层的定位信息到高层。 **PANet结构**: - 在FPN的基础上,增加了一个自底向上的路径,该路径从低层特征(如P3)开始,通过步长为2的卷积进行下采样,并与上一层(如P4)融合,然后继续向上传递直到最高层。 - 这样,每个尺度的特征图都融合了来自底层和高层的信息,从而增强了特征表示能力。 **PAFPN**(Path Aggregation Feature Pyramid Network)是PANet的改进,被用于YOLOX等模型。它同样采用双向路径,但可能进行了一些优化,例如减少计算量或改进特征融合方式。 在引用[4]中,YOLOX使用了PAFPN作为特征融合模块,通过自顶向下和自底向上的路径聚合,将不同层次的特征进行融合。 **PAFPN的结构**: - 自顶向下路径:与FPN相同,从高层特征开始上采样并与底层特征融合。 - 自底向上路径:从底层特征开始,通过下采样(如步长为2的卷积)与高层特征融合。 - 每个节点(特征图)都接收两个方向的输入,然后进行融合(通常使用相加或拼接)。 ### 总结 - **CSPDarknet53**:作为骨干网络,采用CSP结构,通过分割特征图和部分处理减少计算量并缓解梯度消失,从而在保持精度的同时提高效率。 - **FPN**:构建特征金字塔,利用多尺度特征进行目标检测,通过自顶向下路径和横向连接融合不同层次的特征。 - **PANet/PAFPN**:在FPN基础上增加自底向上路径,形成双向特征金字塔,进一步优化特征融合能力。 这两个结构在目标检测模型(如YOLOv4和YOLOX)中扮演重要角色,分别负责特征提取和特征融合。 §§相关问题§§ 1. CSPDarknet53中的CSP结构具体是如何实现的?请描述一个CSP模块的内部结构。 2. 为什么FPN能够提升目标检测模型对小目标的检测能力? 3. PANet与FPN相比,有哪些改进?这些改进带来了什么优势? 4. 在YOLOv4中,除了CSPDarknet53和FPN,还使用了哪些关键组件? </think> ### CSPDarknet53网络结构详解 CSPDarknet53是YOLOv4提出的骨干网络,结合了Darknet53的残差结构和**CSP(Cross Stage Partial)设计**,显著减少计算量并缓解梯度消失问题[^3]。其核心结构如下: #### 1. **CSP模块设计** - **特征图分割**:输入特征图沿通道维度分为两部分(如50%:50%)。 - **部分处理分支**:一半特征图通过密集残差块(由多个残差单元组成),生成高阶特征。 - **直接连接分支**:另一半特征图直接跳过残差块(或仅经1×1卷积)。 - **特征融合**:两部分特征图在通道维度拼接(Concatenate),再通过1×1卷积整合信息[^1][^3]。 ```python # 伪代码示例:CSP模块(简化版) class CSPBlock(nn.Module): def __init__(self, in_channels): super().__init__() mid_channels = in_channels // 2 self.conv_branch = nn.Sequential( ConvBlock(mid_channels, mid_channels, kernel=3), # 残差块堆叠 ResidualBlock(mid_channels) # 重复多次 ) self.shortcut = ConvBlock(mid_channels, mid_channels, kernel=1) # 直接连接分支 def forward(self, x): x1, x2 = torch.chunk(x, 2, dim=1) # 通道分割 x1 = self.conv_branch(x1) # 残差处理 x2 = self.shortcut(x2) # 直接连接 return torch.cat([x1, x2], dim=1) # 通道合并 ``` #### 2. **整体网络架构** CSPDarknet53包含5个阶段(Stage),逐步下采样并提取多尺度特征: 1. **初始层**:3×3卷积(步长2) + 批归一化 + Mish激活。 2. **Stage1-4**:每个阶段由多个**CSP模块**组成,通过步长2卷积实现下采样(输出尺寸减半)。 3. **输出特征图**:生成3种尺度的特征图(如76×76、38×38、19×19)[^3]。 ```mermaid graph LR A[输入图像 416×416] --> B[初始卷积层] B --> C[Stage1: 208×208, CSP×1] C --> D[Stage2: 104×104, CSP×2] D --> E[Stage3: 52×52, CSP×8] E --> F[Stage4: 26×26, CSP×8] F --> G[Stage5: 13×13, CSP×4] G --> H[输出特征图 13/26/52尺度] ``` #### 3. **优势分析** - **计算效率**:CSP结构降低约20%计算量(FLOPs),减少重复梯度计算[^1][^2]。 - **信息保留**:直接连接分支保留浅层细节,提升小目标检测能力。 - **兼容性**:支持Mish激活函数(优于ReLU),增强非线性表达能力[^3]。 --- ### FPN(特征金字塔网络)结构详解 FPN是一种多尺度特征融合方法,通过**自顶向下路径**融合深层语义信息与浅层定位信息,解决目标检测中尺度变化问题[^2][^4]。 #### 1. **基础FPN结构** - **自底向上路径**:骨干网络(如CSPDarknet53)输出多尺度特征图(C3, C4, C5)。 - **自顶向下路径**: - 从深层特征(C5)开始,通过上采样(如双线性插值)扩大分辨率。 - 与前一层的特征图(如C4)逐元素相加(Add)或拼接(Concat)。 - 重复此过程直至融合所有层级特征。 - **输出层**:每个融合后的特征图再经3×3卷积消除混叠效应,生成{P3, P4, P5}。 #### 2. **改进版本:PANet与PAFPN** **PANet**:在FPN基础上增加**自底向上二次融合**路径,双向增强特征传递(用于YOLOv4)[^3]。 **PAFPN**(Path Aggregation FPN):YOLOX采用的结构,优化特征聚合方式: - **双重路径**:同时保留自顶向下(语义传递)和自底向上(细节传递)路径。 - **跨尺度连接**:通过跳跃连接直接融合不同层级特征,减少信息损失[^4]。 ```python # 伪代码示例:PAFPN模块 class PAFPN(nn.Module): def __init__(self, in_channels_list): # 输入通道列表 [C3, C4, C5] super().__init__() # 自顶向下路径(深层→浅层) self.top_down = nn.ModuleList([ ConvBlock(in_channels_list[2], 256), # 处理C5 Upsample(scale_factor=2), # 上采样 ConvBlock(256 + in_channels_list[1], 256) # 与C4融合 ]) # 自底向上路径(浅层→深层) self.bottom_up = nn.ModuleList([ ConvBlock(256, 256, stride=2), # 下采样 ConvBlock(256 + in_channels_list[2], 256) # 与C5融合 ]) def forward(self, inputs): c3, c4, c5 = inputs # 自顶向下 p5 = self.top_down[0](c5) p4 = self.top_down[2](torch.cat([self.top_down[1](p5), c4], dim=1)) # 自底向上 p3 = self.bottom_up[0](p4) p5_out = self.bottom_up[1](torch.cat([p3, c5], dim=1)) return [p3, p4, p5_out] # 输出多尺度特征 ``` #### 3. **FPN在目标检测中的作用** - **多尺度检测**:不同层级特征图分别检测不同尺寸目标(P3→小目标,P5→大目标)。 - **特征增强**:深层特征提供类别语义,浅层特征提供位置精度,融合后提升鲁棒性[^2][^4]。 --- ### 总结 - **CSPDarknet53**:通过CSP结构优化残差网络,平衡计算效率与特征表达能力。 - **FPN/PAFPN**:构建多尺度特征金字塔,解决目标尺度变化问题,PAFPN的双向路径进一步强化特征融合[^3][^4]。 二者结合形成YOLOv4/YOLOX等模型的骨干-颈部结构,显著提升检测精度与速度[^1][^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值