FPN(特征图金字塔)

《Feature Pyramid Networks for Object Detectin》CVPR2017

通常,利用网络对物体进行检测时,浅层网络分辨率高,学到的是图片的细节特征,深层网络,分辨率低,学到的更多的是语义特征

1)、通常的CNN使用如下图中显示的网络,使用最后一层特征图进行预测

在这里插入图片描述
例如VGG16,feat_stride=16,表示若原图大小是1000x600,经过网络后最深一层的特征图大小是60x40,可理解为特征图上一像素点映射原图中一个16x16的区域;那这个是不是就表示,如果原图中有一个小于16x16大小的小物体,是不是就会被忽略掉,检测不到呢!

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

2)、如果上面的单层检测会丢失细节特征;就会想到,利用图像的各个尺度进行训练和测试,比如下图所展示(图片金字塔生成特征金字塔)
在这里插入图片描述

将图片缩放成多个比例,每个比例单独提取特征图进行预测,这样,可以得到比较理想的结果,但是比较耗时,不太适合运用到实际当中。

3)、为了节约时间,直接使用卷积网络中产生的各层特征图分别进行预测
在这里插入图片描述

SSD网络也采用了类似的思想,这种方法的问题在于,让不同深度的特征图去学习同样的语义信息,同样会忽略掉底层网络中的细节特征

4)FPN网络,网络结构原理如下图所示

FPN特征金字塔是计算机视觉领域的重要技术,在目标检测和分割等任务中表现出色。它是特征金字塔网络(FPN)的核心部分,能同时利用深度卷积网络中不同级的特征,提升多尺度目标检测的性能[^1][^2]。 ### FPN特征金字塔的原理 FPN特征金字塔的核心在于自底向上路径、自顶向下路径和横向连接的协同工作。传统卷积网络只能在某个固定特征级进行预测,限制了多尺度目标的检测能力。FPN通过引入自顶向下的路径和横向连接,融合了高的语义信息(丰富的类别信息但空间分辨率较低)与底的空间细节信息(高分辨率但语义信息较少),兼顾了高分辨率和强语义信息,在不同尺度上实现高效且准确的目标定位[^1][^2]。 ### FPN特征金字塔的应用 FPN的通用性和高效性使其成为许多现代检测框架的标配模块,在目标检测和分割任务中,通过高效的多尺度特征融合,显著提升了性能。建立在图像金字塔上的特征金字塔(简称特征图金字塔)是标准解决方案的基础,其每是尺度不变的,物体的尺度变化通过改变级实现,该模型可以通过扫描模型位置和所处金字塔级来检测大范围对象[^1][^3]。 ### FPN特征金字塔代码示例 以下是一个简化的FPN特征金字塔代码示例,使用Python和PyTorch实现: ```python import torch import torch.nn as nn class FPN(nn.Module): def __init__(self, in_channels_list, out_channels): super(FPN, self).__init__() self.inner_blocks = nn.ModuleList() self.layer_blocks = nn.ModuleList() for in_channels in in_channels_list: inner_block = nn.Conv2d(in_channels, out_channels, 1) layer_block = nn.Conv2d(out_channels, out_channels, 3, padding=1) self.inner_blocks.append(inner_block) self.layer_blocks.append(layer_block) def forward(self, x): last_inner = self.inner_blocks[-1](x[-1]) results = [] results.append(self.layer_blocks[-1](last_inner)) for i in range(len(x) - 2, -1, -1): inner_lateral = self.inner_blocks[i](x[i]) feat_shape = inner_lateral.shape[-2:] last_inner = nn.functional.interpolate(last_inner, size=feat_shape, mode="nearest") last_inner = last_inner + inner_lateral results.insert(0, self.layer_blocks[i](last_inner)) return results # 示例使用 in_channels_list = [256, 512, 1024, 2048] out_channels = 256 fpn = FPN(in_channels_list, out_channels) x = [torch.randn(1, c, 64 // (2**i), 64 // (2**i)) for i, c in enumerate(in_channels_list)] output = fpn(x) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值