目标检测Neck(1)——多尺度问题(FPN)

简介: 目标检测Neck(1)——多尺度问题(FPN)

pic14452190.jpg目标检测目前模型基本是Backbone+Neck+Head的一个结构,该文章介绍Neck模块。

1 ✨背景介绍

由于物体在图像中的大小和位置是不确定的,因此需要一种机制来处理不同尺度和大小的目标。

比如现在的很多网络都使用了利用单个高层特征(比如说Faster R-CNN利用下采样四倍的卷积层——Conv4,进行后续的物体的分类和bounding box的回归),但是这样做有一个明显的缺陷——即小物体本身具有的像素信息较少,在下采样的过程中极易被丢失。

1.1 🎃原因

出现上述问题的原因主要有两个:

  1. 1. 高层网络/高层特征层虽然能响应语义特征,但是由于Feature Map的尺寸太小,拥有的几何信息并不多,不利于目标的检测。浅层网络/低层特征层虽然包含比较多的几何信息,但是图像的语义特征并不多,不利于图像的分类。这个问题在小目标检测中更为突出。
  2. 2.高层特征层,包含更多的语义信息,但是分辨率会降低,很容易忽略小目标。

因此,我们需要合并深层和浅层网络(Neck模块)解决这个问题。

1.2 🎈Neck进化史

Neck网络主要分为Naive-Neck以及FPN系列:

  1. 1. Naive-Neck就是抽取网络在不同层级的输出,然后用不同层检测不同大小的目标。其典型代表是大家熟悉的SSD网络。
  2. 2. FPN系列主要是FPN及其相关变种如PAN、BiFPN、GFPN、NAS-FPN等。

目前在 Neck 上的研究主流大多都是基于 FPN 的改进,所以后续我们也会主要就 FPN 系列进行展开介绍。

✨2 Naive-Neck

SSD网络结构图

v2-6d74c01b4608a4aba65da8fe81a9bfad_r.png

可以明显看到其就是抽取网络在不同层级的输出进行目标的检测。

这样做在不同的层上面输出对应的目标,不需要经过所有的层才输出对应的目标(即对于有些目标来说,不用进行多余的前向操作),速度更快,又提高了算法的检测性能。但是由于很多的特征都是从较浅的层获得的,语义信息不足,对小物体的检测很差。

✨3 FPN

FPN借鉴了图像金字塔的思想,提出了四种方案。

🎈3.1 图像金字塔

642d0eed7c3c480985496647b5789f75.png

图像金字塔是由一幅图像的多个不同分辨率的子图构成的图像集合。其实就相当于输入一张图像(第0层),通过缩放图像(不是下采样,提取特征)逐渐降低图像分辨率,最终形成如上图所示的“金字塔”。

🎃3.2 FPN

b995b3d4527c47089aac7e4132b7f3cb.png

FPN提出了上述四种方案(最后一种称为FPN

🍕3.2.1 方案(a)

1554cd7e254742cf89ab7133a08ca990.png

上面这张图中,左侧部分可以称为一个图像金字塔,右侧称为特征金字塔。特征金字塔由图像金字塔生成。

上图中,对每一种尺度的图像进行特征提取,能够产生多尺度的特征表示,并且所有等级的特征图都具有较强的语义信息,甚至包括一些高分辨率的特征图。但是,缺点也很明显:

  1. 1.推理时间大幅度增加;
  2. 2. 由于内存占用巨大,用图像金字塔的形式训练一个端到端的深度神经网络变得不可行;
  3. 3. 如果只在测试阶段使用图像金字塔,那么,由于训练时,网络只是针对于某一个特点的分辨率进行训练,推理时运用图像金字塔,可能会在训练与推理时产生“矛盾”。

🎄3.2.2 方案(b)

4f17a5414c674829bdc25cd76a3175c3.png

不断利用卷积进行下采样。并采用了高层特征图进行分类和预测,没有和低层信息进行融合。

上图这样,速度快、内存少。但是,仅关注深层网络中最后一层的特征,却忽略了其它层的特征

🍔3.2.3 方案(C)

dacdc3655f1445aa8ce8f1fc47b2de43.png

SSD中使用的方案,具体见第二节

✨3.2.4 方案(d)

该方案才是真正被称为FPN的结构。

1a86bc4f8dc349afbac4fadd6aff432d.png

为了解决上述问题,假设每一步中像素变化为2倍活1/2倍,上述算法中图像像素的变化如下

48e6c879dc4944a09b4cb270876a1d0c.png

1步-3步进行三次特征提取,每次分辨率变成原来的1/2,3步-4步进行一次分辨率不变化的卷积操作,4步-5步是将2步的卷积操作至与5步的相同大小合并再进行卷积操作。5步-6步与4步-5步类似。

除此之外,FPN由许多的变种,下面总结一下

✨4 PAN

FPN是自上向下的一个特征金字塔,把高层的强语义特征传递下来,对整个金字塔进行增强。不过浅层获取的局部纹理、模式等信息却没有有效的传递到深层特征。

PAN针对这一点,在FPN的后面添加一个自下向上的金字塔,将低层的定位特征传递上去。这样形成的金字塔既结合了语义信息又拥有定位信息,“双杀”。

004d779bbc244c18a225113b5d571b82.png

除此之外,我了解到的还有NAS-FPN和BiFPN。同时以YOLOF为代表,响起了不同的声音。

✨5 YOLOF中的Neck

论文地址

YOLOF与YOLO简称很像,但实际上没有什么关系。YOLOF主要针对FPN进行了改进:

作者认为,FPN最成功之处在于将优化问题分治而不是多尺度特征融合。但FPN为检测器带来了计算以及内存的额外开销并且让检测器结构变得复杂。

为了解决这些问题,从优化角度,提出了一种只利用一级特征进行检测的方法来替代复杂的特征金字塔解决这个问题。

🍔5.1 分治

分治即,输出不同层级的特征图,在不同层级的特征图上检测不同尺度的目标。

951eb150d1df4325a74c61c6dd963e4f.png

FPN视作一个多进多出(Multiple-in-Multiple-out,MiMo)编码器,如上图(a)。

为了验证自己的猜想,作者对MiMo(多进多出)、单进多出(SiMo)、多进单出(MiSo)和单进单出(SiSo)编码器进行了对比实验,结果是MiMo 与 SiMo 的 mAP 相差无几,但 MiSo 和 SiSo 性能却降低了很多

🎄5.2 问题分析

上面提到,FPN相当于多进多出编译器,即MiMo。作者希望采用简洁的方式代替FPN,即只利用一级特征进行检测的方法,相当于上图SiSo,性能与MiMo有较大区别。

作者认为这种差异的主要原因有:

  1. 1. 与C5特征图感受野匹配的目标尺度范围是有限的,这阻碍了不同尺度目标的检测表现
  2. 2. 单级特征图上稀疏anchor生成策略造成的正样本不均衡问题

🎃5.3 匹配目标尺度问题

b821932faf944d948ab0cbf8f5de417a.png

SiSo结构只能输出固定感受野单级别的特征图,如图(a)。为了解决这个问题,作者做了两次改进。

作者首先通过堆叠标准卷积和膨胀卷积增大感受野。但是,增大感受野过程相当于将一个大于1的因子乘以原来覆盖的所有尺度,该方案可视化后如图(b),仍不能覆盖所有目标尺度的特征图。

之后,作者将原始特征图和扩大感受野的特征图加到一起,即借鉴残差的思想。形成了最终的解决方案——Dilated Encoder:

553a19df803e4a3697d86f48829ad284.png

🎆5.4 正样本不均衡问题

采用SiSo编码器时,由于特征图减少,anchor的数量比MiMo编码器中的anchor的数量减少了很多,从100k减少到5k,导致anchor非常稀疏。对稀疏的Anchor采用Max-IoU匹配,大的GT会比小的GT产生更多的Anchor,从而造成正样本不均衡的问题。

d0b02184b0644964b093c6c8911eb4ff.png

上述正样本不均衡的问题会导致,网络更多的关注大目标,从而忽略小目标。为此,作者设计Uniform Matching的方法:

  1. 1. 为了确保对大样本和小样本取得相同数量的Anchor,对每个GT,取距离其最近的k个anchor作为正 anchor
  2. 2. 然后再设置阈值来过滤大IoU的负样本和小IoU的正样本


相关文章
|
6月前
|
机器学习/深度学习 Go 计算机视觉
YOLOv8改进 | Neck篇 | 利用ASF-YOLO改进特征融合层(适用于分割和目标检测)
YOLOv8改进 | Neck篇 | 利用ASF-YOLO改进特征融合层(适用于分割和目标检测)
458 1
|
3月前
|
机器学习/深度学习 算法 C语言
5.2.1 Backbone(特征提取) 5.2.2 Neck(多尺度检测)
这篇文章介绍了YOLOv3目标检测模型中的Backbone(特征提取)部分,详细阐述了使用Darknet53作为骨干网络来提取图像特征的方法,并通过代码示例展示了如何实现Darknet53网络结构以及如何查看不同层级输出特征图的形状,同时还讨论了Neck(多尺度检测)的概念,解释了如何通过特征图的尺寸放大和融合来实现对不同尺寸目标的检测。
|
6月前
|
传感器 人工智能 芯片
BEV+Transformer
BEV+Transformer
63 3
|
6月前
|
计算机视觉
YOLOv5改进 | 2023Neck篇 | 利用Damo-YOLO的RepGFPN改进特征融合层
YOLOv5改进 | 2023Neck篇 | 利用Damo-YOLO的RepGFPN改进特征融合层
204 1
YOLOv5改进 | 2023Neck篇 | 利用Damo-YOLO的RepGFPN改进特征融合层
|
6月前
|
机器学习/深度学习 计算机视觉
YOLOv8改进 | 2023Neck篇 | 利用Damo-YOLO的RepGFPN改进特征融合层
YOLOv8改进 | 2023Neck篇 | 利用Damo-YOLO的RepGFPN改进特征融合层
284 0
YOLOv8改进 | 2023Neck篇 | 利用Damo-YOLO的RepGFPN改进特征融合层
|
6月前
|
机器学习/深度学习 Go 计算机视觉
YOLOv5改进 | Neck篇 | 利用ASF-YOLO改进特征融合层(适用于分割和目标检测)
YOLOv5改进 | Neck篇 | 利用ASF-YOLO改进特征融合层(适用于分割和目标检测)
384 0
|
机器学习/深度学习 算法 固态存储
FCOS:一阶全卷积目标检测(上)
本文介绍一下近期比较热门的一个目标检测算法FCOS(FCOS: Fully Convolutional One-Stage Object Detection),该算法是一种基于FCN的逐像素目标检测算法,实现了无锚点(anchor-free)、无提议(proposal free)的解决方案,并且提出了中心度(Center—ness)的思想,同时在召回率等方面表现接近甚至超过目前很多先进主流的基于锚框目标检测算法。此外,本算法目前已开源。
FCOS:一阶全卷积目标检测(上)
|
机器学习/深度学习 人工智能 算法
目标检测:RPN — Faster R-CNN 的主干
目标检测:RPN — Faster R-CNN 的主干
246 0
|
机器学习/深度学习 数据采集 编解码
R-FCN、Mask RCNN、YoLo、SSD、FPN、RetinaNet…你都掌握了吗?一文总结目标识别必备经典模型(1)
R-FCN、Mask RCNN、YoLo、SSD、FPN、RetinaNet…你都掌握了吗?一文总结目标识别必备经典模型
165 0
|
编解码 人工智能 固态存储
R-FCN、Mask RCNN、YoLo、SSD、FPN、RetinaNet…你都掌握了吗?一文总结目标识别必备经典模型(2)
R-FCN、Mask RCNN、YoLo、SSD、FPN、RetinaNet…你都掌握了吗?一文总结目标识别必备经典模型
260 0