好久没有做下来一个个敲字进行记笔记了,最近SOC需要增加一个视频检测模块,需要学习一下新东西,买了本书,也找到了对应的笔记。
但是这个系列文章学习。作者希望有一定的基础,而我恰好没有。所以就边COPY作者的文章,边把一边学习,一边陌生的词汇,和图片的解释进行记录。(发现上年纪了,不动手直接看,真的好容易走神)
向输出这么优秀文章的前辈致敬。
- 学习教案:https://zhuanlan.zhihu.com/p/364372881
- 作者:Kissrabbit、
- 作者书籍:《YOLO目标检测》
0.目标检测
计算机视觉(Computer Vision)是一种古老的学科,同时也是当下人工智能领域中最火热的研究点之一。无论是控制专业,机械专业,宇航专业,还是材料专业,生化专业等,都会有很多人乐此不疲地转入CV这一坑中,由此足以见得计算机视觉本身的“诱惑力”。
暂且不说每个人从事该领域的初衷是什么,但随着计算机视觉越来越受研究者们的关注,计算机视觉技术得到了长足的发展。
那么,计算机视觉要解决什么样的问题呢?
太多太多了,即使是写一本大头书,怕是也难详尽。所以,我们只聚焦其中一点——目标检测(object detection,后面我们将用缩写OD来指代)。
于是,我们可以问“目标检测”究竟是干嘛的呢?回答也很简单:就是要用矩形框把图片中感兴趣的物体框选出来,比如下面这张图:

给定一张图片,我们设计好的模型能够定位出图片中我们所感兴趣的物体,同时标注其所属类别,如左边的蓝色框框选出了黑贝,右边的黄色框框选出了哈士奇(看得出来,这只哈士奇血统挺纯)。至于如何设计此模型,此模型又是如何实现这一功能的,我们后续会一一展开。
听起来,OD是一个很简单的问题,似乎没什么难度,对我们人类来说,实在是过于简单了。然而,计算机视觉最有意思的一点就在这:人觉得容易的事,计算机反倒吃力得很。
在以前——深度学习时代之前——研究者们对这一问题的研究路线基本就是:
- 第一步:从输入图像中提取人工视觉特征(如HOG);
方向梯度直方图,Histogram of Oriented Gradients。核心思想是:局部物体的外观和形状,能够通过梯度方向的分布(直方图)很好地描述出来。图像中物体的边缘(比如物体的轮廓)通常是颜色或亮度变化明显的地方。HOG 特征就是通过捕捉这些边缘的方向信息,来描述物体的形状。它不太关注颜色和绝对亮度,因此对光照变化有一定的适应性。
- 第二步:将提取出的视觉特征输入给分类器(如SVM)进行分类。
向量机(SVM)是一种非常强大且经典的监督学习算法,主要用于分类任务。它的核心思想非常直观:找到一个最优的决策边界,以便最好地区分不同类别的数据,并且这个边界要尽可能地远离所有类别的数据点。核心思想就是:依靠最关键的那些样本点,找到一个能让所有类别都“间隔最大化”的决策边界。对于线性不可分的情况,通过核函数映射到高维空间来实现线性可分。类似在混在一起的红豆和绿豆之间划一条最宽、最公平的分界线(比如一根筷子),保证两边的豆子都离这根线尽可能远。这样即使有新豆子掉下来,也不容易放错边。
以现在的技术眼光来看,这种做法十分的粗糙,尽管在行人检测领域,这一做法在那个时代基本能够实现实际部署,但那主要是得益于人体本身结构不算太复杂,尤其是行走中的人,大部分都比较正常,鲜有“奇行种”,但想做出一个可靠的通用检测器,则存在很大的困难。
直到2014年,一道希望之光照射了进来。
在这一年,著名的R-CNN工作的问世,不仅仅大幅度提升了当时的benchmark数据集PASCAL VOC的mAP,同时也意味着深度学习技术正式进军目标检测领域。后续的优化工作注入Fast R-CNN、Faster R-CNN等相继出现。
| 关键词 | 是什么? | 主要特点或用途 |
|---|---|---|
| R-CNN | 2014年提出的基于区域的卷积神经网络方法,是深度学习成功应用于目标检测的开山之作。 | 首次用CNN(卷积神经网络)提取目标特征替代传统手工特征,大幅提升检测精度,但训练繁琐、速度慢。 |
| PASCAL VOC | 一个经典的计算机视觉数据集,包含图像分类、目标检测、语义分割等任务。 | 曾是目标检测领域的基准数据集之一,用于评估和比较不同算法的性能,其目标检测任务包含20个常见物体类别。 |
| mAP | 均值平均精度,是评估目标检测模型性能的核心指标。 | 综合考量了分类精度和定位准确性,mAP值越高,通常意味着模型整体性能越好。 |
| Fast R-CNN | R-CNN的改进版本,旨在解决R-CNN速度慢、训练复杂的问题。 | 通过RoI Pooling层和多任务损失函数等方式,实现了端到端训练,显著提高了检测速度和精度。 |
| Faster R-CNN | Fast R-CNN的进一步发展,是两阶段检测器的代表作。 | 引入了区域提议网络,替代了耗时的选择性搜索,使区域提议、特征提取、分类和回归全部在一个网络中完成,进一步提高了效率和精度。 |

而在2015年,又一个革命性的工作——YOLO(You Only Look Once)问世。YOLO以其GPU实时(real-time)检测速度:TITAN X上的40+FPS,及其简洁的模型架构备受研究者们的瞩目和喜爱。

自此,目标检测两大流派诞生了:一个是以R-CNN为始祖的two-stage派系,一个是以YOLO为始祖的one-stage派系。前者往往准确度更高但速度上较慢,后者往往更快但准头略差一些。
纵观科学发展史,“大道至简”这一道理总是有效的。大概或许由于这个原因,one-stage派系在随后的几年得到了长足的发展,每年的计算机视觉顶会(CVPR、ECCV、ICCV)中的目标检测工作大多都是one-stage模型,如SSD、RetinaNet、FCOS、CenterNet等。
Two-stage尽管有着其本身的优势,但相较于更加简洁、潜力更大的one-stage派系来说,热度已经降下来了。
因此,入门目标检测领域,学习one-stage工作是更为主流的一个选择。
从深度学习时代开始,目标检测的框架也基本明确了下来:一个常见的目标检测网络,其本身往往可以分为一下三大块:

Backbone network,即主干网络,是目标检测网络最为核心的部分,大多数时候,backbone选择的好坏,对检测性能影响是十分巨大的。
Neck network,即颈部网络(脖子网络?说实话,这个不翻译过来比较好……),Neck部分的主要作用就是将由backbone输出的特征进行整合。其整合方式有很多,最为常见的就是FPN(Feature Pyramid Network),有关FPN的内容,我们会在展开介绍Neck的时候再次提到的。
Detection head,即检测头,这一部分的作用就没什么特殊的含义了,就是若干卷积层进行预测,也有些工作里把head部分称为decoder(解码器)的,这种称呼不无道理,head部分就是在由前面网络输出的特征上去进行预测,约等于是从这些信息里解耦出来图像中物体的类别和位置信息。
| 关键词 | 是什么? | 主要特点或贡献 |
|---|---|---|
| CVPR/ECCV/ICCV | 计算机视觉领域最顶尖、影响力最大的三个国际学术会议。 | 在这些会议上发表的工作通常代表了该领域的最新进展和最高水平。 |
| SSD | Single Shot MultiBox Detector,是One-Stage目标检测器的经典代表作之一。 | 其主要贡献在于在不同尺度的特征图上进行预测,能更好地检测不同大小的目标,尤其在速度和精度之间取得了较好的平衡。 |
| RetinaNet | 另一个著名的One-Stage目标检测器。 | 它通过引入Focal Loss损失函数,有效解决了目标检测中正负样本(前景和背景)极度不平衡的问题,从而在保持速度的同时大幅提升了精度。 |
| FCOS | Fully Convolutional One-Stage object detector,一种无锚框(Anchor-Free)的One-Stage目标检测器。 | 它摒弃了预先设定锚框的做法,直接对特征图上每个点进行预测,简化了检测流程,减少了超参数,并取得了优异的性能。 |
| CenterNet | 同样属于Anchor-Free的One-Stage目标检测器的代表之一。 | 它将目标表示为一个点(通常是中心点),然后直接预测该点的属性(如尺寸、偏移等),进一步简化了检测流程,思路非常新颖。 |
我们可以为以上任意部分单独去设计一个模块,然后“插进去”即可。很多目标检测的优化工作就是这么来的,比如2018年的ECCV上的RFBNet,就是在SSD基础上,设计了RFB模块插进Neck部分,从而显著提升了模型性能。
对于这两个图的理解是这样的!
🧠 核心思想:像“组装赛车”一样理解模型优化
- 基础车型(SSD):假设SSD是一台已经设计好的基础款赛车,性能不错,能跑(能检测目标)。
- 定制升级件(RFB模块):研究人员觉得这台车的“引擎进气系统”(感受野)不够高效,于是自己单独设计了一个更强大的新进气系统(RFB模块)。
- 安装升级(插进Neck):他们把这个新设计的RFB模块,拆掉原车对应的旧部件,然后“插进去”,替换掉原来的普通进气道。
- 性能提升(RFBNet):组装完成后,新车(RFBNet)的引擎能更高效地吸入和混合空气(融合不同尺度的特征),从而爆发更强动力,成绩(mAP,检测精度)自然就显著提升了。
这就是你引用的那句话“我们可以为以上任意部分单独去设计一个模块,然后‘插进去’即可”的真正含义。RFBNet就是这种思想的一个经典实践。
🔍 详解两张图
现在我们来看你的两张图,它们分别展示了“升级件”本身和“升级后的整车结构”。
第1张图:RFB模块详解(“升级件”的蓝图)
这张图告诉你,RFB这个“升级进气系统”内部是怎么设计的。它的核心目标是让网络具备更灵活、更强大的“视野”(感受野),从而更好地观察不同大小的物体。
!https://raw.githubusercontent.com/sanghoon/pva-faster-rcnn/master/models/pvanet_example/example_rfb.png
- 它模仿了人类视觉:人眼看东西时,视觉中心区域(中央凹)会投入更多细胞,感受野更精细。RFB模块通过多分支卷积来模拟这个过程。
- 多分支结构(Multi-branch):这是RFB的核心。它用多个不同尺寸的“镜头”(即不同膨胀率
rate的3x3空洞卷积)同时去观察输入的特征。rate=1:标准卷积,看细节。rate=3:空洞卷积,视野更大一点,看中等目标。rate=5:空洞卷积,视野最大,看大型目标。
- Shortcut(快捷连接):图中标出的
Shortcut就是跳远比赛中的助跑。它让信息可以直接从起点传到后面,避免了层层传递可能造成的信息损耗,让训练更稳定、更高效。 - 最后拼接(Concatenation):把不同“镜头”看到的信息全部拼接在一起,形成一个信息更全面、更丰富的特征。再经过一个
1x1 Conv做一下整合,最终输出。
简单总结第1张图:RFB模块是一个多分支结构,它同时用多种不同的“视野”去观察特征,然后把看到的结果综合起来,形成一种更强大的新特征。
第2张图:RFBNet整体结构(“升级后的整车”图纸)
这张图展示了如何把上面设计好的“RFB升级件”安装到原来的“SSD基础车型”上。
!https://raw.githubusercontent.com/ruinmessi/RFBNet/master/doc/rfb_net_structure.png
这张图可以分为左右两大部分:
- 左侧 - Backbone(主干网络:VGG16):
- 这就像是赛车的引擎本体。它的任务是接收输入图像(300x300的猫图),然后逐层提取特征。
- 它会产生多个不同尺寸的特征图,图中标注了
Conv4_3 (38x38)和Conv7_fc (19x19)。这些特征图就像引擎在不同转速下产生的不同动力。
- 右侧 - Neck & Head( neck就是Extra Layers,头部是Detection Layers):
- 这部分是进气道和涡轮增压系统(Neck),以及最后的动力输出轴(Head)。
- 关键操作:研究人员把SSD原本这里的一些普通卷积层,替换成了他们自研的RFB模块(图中标出的RFB-s和RFB)。
- 为什么这里很重要?:目标检测需要检测不同大小的物体。Neck部分的不同层负责处理不同尺度的特征(38x38负责小目标,19x19负责中等目标,10x10和5x5负责大目标)。在每一层都换上视野更灵活的RFB模块,就能让每一层都更好地处理对应尺度的目标。
- 经过RFB模块增强后的特征,最后送到
Detection Layers(检测层)去直接预测物体的类别和位置。
简单总结第2张图:RFBNet就是把SSD网络中用于多尺度预测的关键部分(Neck),全部换成了性能更强的RFB模块,从而全面提升了对各种大小目标的检测能力。
✅ 总结给你(小白友好版)
- SSD:一个很好的目标检测模型,但还有提升空间。
- RFB模块:研究人员发明的一个新部件。它的特点是**“多眼看世界”**(多分支),能同时捕捉细节和轮廓,让网络“看”得更准。
- RFBNet:把SSD模型里的几个普通部件拆掉,换上新发明的RFB部件。组装完成后,新模型性能大幅提升,这就是一次成功的模型优化。
好滴咱们继续
接下来,就让我们较为详细地来探讨每一部分的内容。
1.Backbone:目标检测网络的主体结构
通常,为了实现从图像中检测目标的位置和类别,我们会先从图像中提取出些必要的特征信息,比如HOG特征,然后利用这些特征去实现定位和分类。而在深度学习这一块,这一任务就交由backbone网络来完成。深度学习的强大之处就在于其特征提取的能力,在很多任务上都超越了人工特征。
当然,这里提出的是什么样的特征,我们是无从得知的,毕竟深度学习的“黑盒子”特性至今还无法真正将其面纱揭开。
从某种意义上来说,如何设计好的backbone,更好地从图像中提取信息,是至关重要的,因为特征提取不好,自然会影响到后续的定位检测。
早在目标检测任务之前,深度学习技术就已经在图像分类领域中发挥了重大的作用,大力促进了这一领域的发展,尤其是在ResNet系列的工作问世后,图像分类任务几乎达到了一个顶峰——从ImageNet比赛不再举办这一点就可以窥见一斑。虽然后续这个领域还在陆陆续续地出现些新工作(如GhostNet、ShuffleNet、ResNet各种升级版本、EfficientNet家族等)、提供了很多新的idea,不过基本上已经不再是当年那种百花齐放的盛况了。
深度学习技术能够这么出色地完成图像分类任务,基本上也就表明了深度学习技术确实在图像特征提取这一块有着十分出色表现和巨大的潜力。
因此,Backbone这一部分通常就是将诸如VGG、ResNet等模型搬过来(去掉最后的global avgpooling和softmax层),这一部分的参数初始化就直接使用在ImageNet上训练好的参数。这一模式也就是后来所说的“ImageNet pretrained”概念。
不过,自从Kaiming He的《Rethinking ImageNet Pre-training》发表之后,这一概念似乎也就不是必要的了——一个目标检测模型完全可以随机初始化所有的参数,包括backbone网络的参数,只要训练足够久,也可以达到很高的性能。https://wxa.wxs.qq.com/tmpl/oc/base_tmpl.html
当然,得是训练足够久,而且要精心调参,正所谓天下没有免费的午餐(早餐和晚餐也不免费。),既然设计了一个backbone,不想去ImageNet上预训练,那就得多花些时间和精力来训练detector了~因此,目前ImageNet pretrained的思想仍旧是主流,毕竟只需要在ImageNet上训练一次backbone,就可以永久使用了~
Backbone恒久远,Pretrain一次永流传~
白话一下
| 关键词/概念 | 是什么? | 传统认知/作用 | 当前观点/新认知(来自何恺明等) |
|---|---|---|---|
| Backbone(骨干网络) | 目标检测模型中的特征提取基础网络,通常是成熟的分类网络(如VGG, ResNet)改造而来。 | 接收输入图像,输出供后续网络(Neck、Head)使用的特征图,包含了边缘、纹理、形状等信息。 | 作用没有改变,它仍然是特征提取的核心。但研究指出,其参数不一定需要ImageNet预训练,随机初始化后充分训练也能达到很好效果。 |
| ImageNet Pre-training | 一种迁移学习策略:在ImageNet大型分类数据集上预训练Backbone,将其学到的参数作为目标任务初始权重。 | 普遍认为必要:1. 提供良好初始权重,加速收敛;2. 提升模型在目标任务(尤其是数据少时)的泛化能力和最终精度。 | 并非绝对必要:在足够数据(如COCO)和计算资源下,Backbone随机初始化并充分训练,最终精度可媲美ImageNet预训练模型。 |
| 《Rethinking ImageNet Pre-training》 | 何恺明等人于2018年发表的重磅论文,对ImageNet预训练的必要性提出了挑战。 | - | 指出ImageNet预训练的主要优势是加速训练初期收敛,但不一定能提高最终精度或提供正则化防止过拟合。 |
| 随机初始化 (Random Initialization) | 所有网络参数(包括Backbone)使用随机值初始化,不加载任何预训练权重。 | 传统认为这会导致收敛慢、性能差,尤其Backbone深时难以训练。 | 论文表明,配合合适的训练技巧(如Group Normalization, SyncBN)和更长的训练时间,随机初始化也能达到很高性能。 |
| “训练足够久” | 指随机初始化模型需要更多迭代次数和计算资源进行训练。 | - | 这是不用ImageNet预训练的“代价”:需要付出更多训练时间和计算成本来学习特征。 |
🧠 深入理解BackboneBackbone的作用是从原始图像中逐层提取从低级到高级的特征(如边缘→纹理→部件→物体)。常见Backbone如VGG、ResNet、MobileNet等,它们在设计上各有特点,例如ResNet通过残差连接缓解了深层网络的梯度消失问题。
🔍 ImageNet预训练的传统优势与争议ImageNet预训练的核心思想是迁移学习:希望Backbone在ImageNet上学到的通用视觉表征(如识别边缘、纹理、常见物体)能有助于新的视觉任务。这在目标数据集较小时尤为重要,能降低过拟合风险。 然而,何恺明等人的研究指出,ImageNet预训练的主要优势在于大幅缩短模型训练初期的收敛时间,因为模型无需从零开始学习低级特征。但对于最终精度,只要训练迭代足够,随机初始化也能达到同样水平。此外,对于定位精度要求极高的任务(如关键点检测),ImageNet预训练的帮助可能更有限。
⚖️ 为何预训练仍是主流尽管“从头训练”(Train from Scratch)在理论上是可行的,但在实践中,ImageNet预训练依然是更实用、更经济的选择:
- 计算成本与时间:从头训练一个Backbone需要巨大的计算资源和时间。对大多数研究者、开发者和企业而言,直接使用预训练模型能显著降低开发门槛和成本。
- 数据依赖:如果目标任务的数据集非常小,预训练模型提供的良好起点仍然是宝贵的。
- 实践惯性:预训练模型提供了稳定可靠的基线,便于快速迭代和实验。
💡 给你的启示
- 理解概念:要明白Backbone是特征提取器,ImageNet预训练是一种为其提供初始权重的策略。
- 知其所以然:何恺明的工作揭示了预训练的真正价值主要是加速收敛,而非不可替代。
- 实践选择:
- 若你计算资源充足、不介意训练时间,且追求极致性能(或在某些特定领域),可以尝试深入研究“从头训练”。
- 对于大多数常见任务和实际应用,从ImageNet预训练的Backbone开始进行微调(Fine-tuning),依然是高效、可靠且主流的做法。
下面是一些常用的Backbone模型。Backbone(骨干网络)是深度学习模型的核心特征提取部分,它的选择直接影响模型的性能和效率。
下面我用一个表格帮你快速梳理这些常见的Backbone网络,方便你对比和查阅:
| 模型名称 | 核心创新/特点 | 常见变体 | 典型应用场景 |
|---|---|---|---|
| VGG | 结构简洁统一,全部使用堆叠的3x3小卷积核来增加深度,证明了网络深度对性能的重要性。 | VGG-16, VGG-19 | 图像分类、目标检测(如Faster R-CNN的Backbone)、风格迁移 |
| ResNet | 引入残差连接(跳跃连接),解决了极深网络的梯度消失和退化问题,使得训练成百上千层的网络成为可能。 | ResNet-18, ResNet-50, ResNet-101 | 图像分类、目标检测、语义分割等几乎所有视觉任务的基础Backbone |
| ResNeXT | 在ResNet基础上引入**“基数”(Cardinality)概念,采用分组卷积**,在不显著增加参数量的情况下提升模型表达能力。 | ResNeXt-50, ResNeXt-101 | 图像分类等需要高精度的任务,常用于刷榜 |
| ResNet+DCN | 在ResNet中引入可变形卷积(DCN),使卷积核能自适应地学习采样位置,更好地处理几何形变的对象。 | ResNet-50-DCN, ResNet-101-DCN | 目标检测、实例分割(特别是处理非刚性物体),“涨点神器” |
| DarkNet | 结构简洁,专注于效率与速度的平衡。DarkNet-53借鉴了ResNet的残差连接思想。 | Darknet-53(用于YOLOv3), Darknet-19 | YOLO系列目标检测算法的默认Backbone |
| CSPNet | 通过跨阶段局部网络结构,优化梯度流动,减少计算量的同时提升学习能力。 | CSPResNet, CSPDarknet | 目标检测(如YOLOv4及其变体) |
| MobileNet | 专注于移动端和嵌入式设备的轻量级网络,使用深度可分离卷积大幅减少计算量和参数量。 | MobileNet v1/v2/v3 | 手机、嵌入式设备上的实时图像分类、目标检测、人脸识别等 |
| ShuffleNet | 专为极低计算能力设备设计,使用通道混洗和分组卷积,在保持精度的同时大幅加速。 | ShuffleNet v1/v2 | 移动端实时视觉应用(对算力、功耗要求苛刻的场景) |
🧠 如何选择Backbone?
选择Backbone就像给任务挑选合适的“发动机”,没有绝对的最好,只有最合适。你可以从以下几个方面考虑:
- 任务需求与性能瓶颈:
- 追求高精度(如学术研究、刷榜):优先考虑 ResNet101、ResNeXt、ResNet-DCN。
- 追求速度与精度平衡(如一般目标检测):ResNet50、CSPResNet 是不错的选择。
- 追求极致速度(如实时视频处理、嵌入式设备):MobileNet、ShuffleNet 等轻量级网络是首选。
- 硬件资源:
- 计算资源充足(服务器、高端GPU):可以选用更深、更复杂的模型,如 ResNet101、ResNeXt。
- 计算资源有限(移动端、边缘设备):选择轻量级网络,如 MobileNet、ShuffleNet。
- 项目阶段:
- 快速原型验证:从 ResNet50 或 VGG16 开始,因为它们结构经典,预训练模型丰富,容易复现和调试。
- 性能优化与部署:考虑 CSPNet(减少计算量)、MobileNet/ShuffleNet(移动端部署)。
- 领域特性:
- 任务中涉及大量非刚性物体或复杂几何变形时,可以尝试 DCN。
- 使用 YOLO 系列做目标检测时,可以优先了解其配套的 Darknet 或 CSPDarknet Backbone。
💡 简单总结一下
- VGG:结构规整易懂,是理解CNN的经典教材。
- ResNet:深度学习中的“常青树”,通过残差连接解决了深度网络的训练难题,应用极其广泛。
- ResNeXt:ResNet的升级版,通过分组卷积提升模型能力,常用来冲击更高精度。
- ResNet+DCN:处理形变目标的“利器”,为卷积操作增加可学习的自由度。
- DarkNet:YOLO系列的“专属发动机”,为目标检测的实时性而优化。
- CSPNet:“减负”又“增效”,通过优化结构减少计算量并提升性能。
- MobileNet/ShuffleNet:专为移动端而生,是轻量化和高效计算的代表。
2.Neck:更好地利用网络所提取的特征信息
上面已经目标检测模型中的backbone部分,其作用归根结底就是一句话:提取图像中有用的信息。当然,什么是有用的信息是一句很笼统的话,总之是这么个意思。然而,由于backbone网络毕竟是从图像分类(image classification)任务迁移过来的,其提取特征的模式可能不太适合与detection。因此,在我们最终从这些特征中得到图像中若干目标的类别信息(classification)和位置(location)信息之前,有必要对它们做一些处理。
这一部分,因为是在backbone之后,detection head之前,因此,被称为“Neck”。
相较于backbone常使用ImageNet Pretrained model,neck部分反倒没有什么说道。既然它的作用是将backbone的信息好好地整合一下,因此,研究者们自由发挥的空间也就会大得多了,很多模块被提出了出来。这里我们介绍几个常见的。
最有名的,莫过于FPN(Feature Pyramid Network)了:

在SSD之前,不论是Faster R-CNN还是YOLO,他们都只是在backbone输出的最后一层很粗糙的特征图(feature map)上去做检测的。在CNN中,有一个很关键的概念叫做“感受野”(receptive field),大抵的意思就是这一张特征图的pixel能包含原始图像中的少个像素。
直观上来看,backbone最后输出的很粗糙的特征图——通常都是stride=32,即经过了32倍降采样——具有很大的感受野,这对于大物体来说是很友好的,但对于小物体而言,过大的感受野且不说容易“失焦”,经过多次降采样,小物体的信息也很容易被丢失掉了。
为了解决这么个问题,SSD在三个不同大小的特征图上进行预测,即上图中的(c),但CNN随着网络深度的增加,每一层的特征图所携带的信息量和信息性质也不一样——浅层包含的细节信息、轮廓信息、位置信息等更多,深层包含的语义信息更多。
因此,FPN的工作就是在检测前,先将多个尺度的特征图进行一次bottom-up的融合,也就是上图中的(d),这被证明是极其有效的特征融合方式,几乎成为了后来目标检测的标准模式之一。
白话一下:我们得弄明白SSD、FPN和SPP这些目标检测中的关键技术是如何解决多尺度检测问题的。这对初学者来说确实是个关键概念。
简单来说,SSD、FPN和SPP都是为了让模型能更好地“看见”并“识别”图像中不同大小的物体。
为了让你能快速了解它们的核心思想和特点,我准备了一个表格:
| 技术名称 | 核心思想 | 主要优势 | 典型应用 |
|---|---|---|---|
| SSD | 多尺度预测:直接在Backbone不同层次的特征图上独立进行预测。 | 结构相对简单,一次前向传播即可完成检测,速度较快。 | SSD300, SSD512, MobileNet-SSD |
| FPN | 特征金字塔融合:通过自上而下和横向连接,将深层语义信息与浅层细节信息融合,形成丰富的特征金字塔。 | 显著提升小目标检测性能,特征表达更丰富,已成为现代检测系统的标准组件。 | Mask R-CNN, Faster R-CNN with FPN, RetinaNet |
| SPP | 空间金字塔池化:对单一特征图进行多种不同尺度的池化,再拼接成固定长度的向量。 | 使网络能处理任意大小的输入图像,并融合不同尺度的特征,提升对物体尺度变化的鲁棒性。 | SPP-Net, YOLOv3-SPP, YOLOv4 |
🧠 深入理解“感受野”与多尺度检测的挑战
“感受野”非常关键。感受野 指的是特征图上的一个点,对应原始输入图像上的区域大小。
- 深层特征图(如
stride=32):经过多次下采样,感受野很大,有利于捕捉图像的高级语义信息(比如“这是一辆车”),但空间位置比较粗糙,小物体的细节信息可能已在多次下采样中丢失。 - 浅层特征图(如
stride=4或8):感受野较小,保留了丰富的细节、边缘和位置信息,有利于精确定位和小物体检测,但语义信息较弱,难以判断“是什么”。
早期的检测模型(如提到的Faster R-CNN和YOLOv1) 大多只在Backbone输出的最后一层(即最深、感受野最大)的特征图上进行预测。这对于大目标来说没问题,但对于小目标,因为细节信息已经丢失,检测效果就不太理想。
SSD、FPN、SPP这些技术,都是为了更好地利用不同层次的特征信息,来解决多尺度目标(尤其是小目标)检测的难题。
- SSD的多尺度预测
SSD的创新在于它直接在Backbone网络的不同深度抽取了多个尺度的特征图(例如尺寸为38x38, 19x19, 10x10, 5x5, 3x3, 1x1),并在每一层都独立地进行目标检测(即预测类别和边界框偏移)。
- 浅层特征图(如38x38):感受野小,负责检测小目标。
- 深层特征图(如19x19, 10x10等):感受野大,负责检测中、大目标。
- PriorBox (Default Box):在每一层特征图的每个点上,SSD会预设一系列不同大小和长宽比的候选框(PriorBox),网络学习的是如何调整这些候选框以匹配真实物体。
SSD的优势是速度快、结构相对简单。但其每个特征层的信息是“独立”使用的,没有进行不同层级间的特征融合。
- FPN的特征金字塔融合
FPN解决了SSD中不同层级特征“各自为战”的问题。它的核心是构建一个具有强语义信息的特征金字塔,其中每一层都融合了深层和浅层的特征。
FPN的工作流程通常包括:
- 自下而上路径:就是普通的Backbone(如ResNet)前向传播,逐步提取特征,得到不同尺度的特征层(C2, C3, C4, C5)。
- 自上而下路径:从最深的特征层(C5)开始,进行上采样,使它的尺寸变大。
- 横向连接:将上采样后的深层特征与相同尺寸的浅层特征(通过1x1卷积调整通道数后)进行融合(如相加)。这样,浅层特征就获得了来自深层的丰富语义信息。
- 融合后的每一层特征(P2, P3, P4, P5)都可以用于最终的目标检测。
FPN的优势是它创造出的每一层特征图都既有高分辨率(来自浅层),又有强语义(来自深层),特别有利于小目标检测。FPN已成为许多现代检测模型的标准组件。
- SPP的空间金字塔池化
SPP模块通常被插入到Backbone和检测头之间。它的主要作用是消除输入图像尺寸必须固定的限制,并融合不同尺度的特征信息。
SPP对单个特征图进行并行处理:
- 使用多个不同尺度的池化窗口(例如1x1, 5x5, 9x9, 13x13)对输入特征图进行最大池化操作。
- 将所有这些不同尺度的池化结果拼接成一个固定长度的向量,再送给后续的全连接层或检测头。https://wxa.wxs.qq.com/tmpl/oc/base_tmpl.html
SPP的优势:
- 解决输入尺寸限制:无论输入图像尺寸如何,SPP都能输出固定长度的向量。
- 多尺度特征融合:不同大小的池化窗口提取了不同尺度的特征,增加了模型的鲁棒性。
- 极大增加感受野:大的池化核(如13x13)能显著增大感受野,有助于捕获全局上下文信息。
在YOLOv3和YOLOv4中,SPP模块被成功应用,通过融合多重感受野特征,提升了检测精度,尤其是对不同尺度目标的适应性。
💡 如何选择与总结
- SSD:提供了一个简单直接的多尺度检测框架,速度上有优势,是理解多尺度预测的基础。
- FPN:通过特征融合极大地优化了特征金字塔的质量,尤其提升了小目标的检测性能,是现代检测架构的基石。
- SPP:专注于解决输入尺寸限制和融合多尺度上下文信息,能有效提升模型的鲁棒性和精度。
这些技术常被结合使用。例如,一个模型可能使用FPN来构建特征金字塔,并在其输出上应用SPP模块进一步提取特征。
SPP模块,这是很常用的一个Neck结构,下图便是SPP的结构示意图。

下面来看看YOLOv3中一个非常巧妙且高效的模块——SPP模块(空间金字塔池化)。
🧠 核心思想:像用“不同网眼的渔网”捞信息
想象一下,Backbone网络(主干网络)就像一台抽水机,把一张图片“抽”上来,最后产生了一池子水(即stride=32的特征图),这池水里混合了各种信息(物体的轮廓、颜色、纹理等)。
现在,我们需要分析这池水里到底有什么东西(是鱼?是水草?还是石头?)。但是,这些东西大小不一:
- 小鱼(小物体)需要很密的网才能捞起来。
- 大鱼(大物体)需要很大的网才能一次性捞起来。
SPP模块做的就是这件事:它同时用四张不同网眼的渔网(1x1, 5x5, 9x9, 13x13的maxpool)去捞这同一池水。
- 1x1的网:网眼极细,能捞起水里最微小的信息碎片(捕捉非常精细的细节)。
- 13x13的网:网眼巨大,一次能捞起一大片区域,能看清大鱼的全貌(捕捉全局的、整体的信息)。
- 5x5和9x9的网:网眼适中,负责中等大小的信息。
最后,我们把这四张网捞到的东西全部堆在一起(即cat拼接操作),这样我们就得到了一个既包含细节,又包含整体的、信息极其丰富的“战利品集合”(即融合后的新特征图)。
这个过程就是SPP模块的核心:利用不同大小的池化核,从同一个特征图中提取不同尺度的信息,然后融合在一起。
🔍 讲讲图片
现在,我们再看你提供的图片,就非常容易理解了:
- 最下方的四个方块:代表四张不同的“渔网”(即四种不同尺寸的最大池化操作)。
- 向上的蓝色箭头:代表同时用这四张网去“捞”同一池水(即对同一个输入特征图进行并行处理)。
- 中间的“cat”:代表把四张网捞上来的东西全部倒在一起,拼接起来。
- 最上方的方块:代表最终形成的信息超级丰富的新特征图,它将被送入后面的网络(如FPN)继续处理。
⚖️ 为什么它“性价比”极高?
文章说它“计算量增加几乎可以忽略不计”和“高性价比”,是因为:
- 参数为零:Maxpool(最大池化)是一种固定操作,没有任何需要学习的权重参数。它只是在一个区域内取最大值。增加它,不会增加模型的参数数量。
- 计算量极小:相比卷积等复杂运算,池化操作的计算开销非常小。
- 效果显著:这个简单的操作却极大地丰富了特征的“感受野”。让网络同时拥有了“显微镜”(看细节)和“望远镜”(看全局)的能力,因此能更好地检测出不同大小的物体,从而显著提升模型性能。
用打游戏的比喻就是:你几乎没花任何金币,就给你的英雄装备了一个神器,让他的攻击同时带有“破甲、溅射、吸血、暴击”四种效果,战斗力瞬间飙升。
🗺️ 它在YOLOv3中的位置
文中提到它被添加在 stride=32的特征图之后,FPN之前。
stride=32的特征图:这是Backbone网络最后输出的、最“深”的一层特征图。它经过了32倍的下采样,非常“粗糙”,但感受野最大,包含的语义信息最丰富(知道“有什么”),但细节丢失严重(不知道“具体在哪”)。- SPP模块的作用:就是在这张包含丰富语义信息的特征图上,进行多尺度特征提取和融合,让它既保留丰富的语义信息,又融合了多尺度的上下文信息。
- 然后送给FPN:FPN负责将这份已经由SPP增强过的、深层的语义信息,传递并融合到浅层的特征图(包含精确定位信息)中去,最终实现精准的检测。
💎 总结
所以,SPP模块就是一个:
- 思想简单:用多张不同网眼的网捞鱼,然后全倒在一起。
- 效果拔群:极大提升模型对不同大小目标的检测能力。
- 几乎免费:不增加参数,计算开销极小。
正因为这种“花小钱办大事”的特性,它从YOLOv3开始,后续的YOLOv4、PP-YOLO等优秀模型都继承了这一设计。希望这个解释能帮你完全理解它!
除此之外,还有:
| 模块名称 | 核心思想 | 主要特点与优势 | 典型应用场景 |
|---|---|---|---|
| RFB | 模拟人类视觉感受野,通过多分支+空洞卷积增大和多样化感受野。 | 结构轻量,能有效提升轻量级模型的特征表示能力,在速度和精度间取得良好平衡。 | RFBNet (基于SSD的改进) |
| ASPP | 捕捉多尺度上下文信息,通过并行使用不同膨胀率的空洞卷积来应对物体尺度不一的问题。 | 能有效处理同一图像中不同大小物体的分割问题,增大感受野的同时保持分辨率。 | DeepLab系列 (语义分割) |
| SAM | 注意力机制,通过通道注意力和空间注意力两个独立维度,让模型关注重要特征。 | 轻量且通用,可即插即用到任何CNN架构中,聚焦关键信息,抑制无关信息。 | 各种CNN backbone的增强模块 (如ResNet+SAM) |
| PAN | 增强特征金字塔的信息流,在FPN自顶向下的基础上,增加自底向上的二次融合路径。 | 加强底层定位信息的传播,缩短了低层特征与顶层特征之间的信息路径,更好地融合定位和语义信息。 | YOLOv4, YOLOv5等目标检测模型 |
3.Detection head:负责检测与定位。
一张图像,在经过了backbone和neck两部分的处理后,就可以准备进行最终的检测了。
也许有人会好奇,经过两部分的处理后,网络输出的东西长什么样子呢,这里,笔者展示三张经由ShuffleNet和PAN处理后得到的三个尺度的特征热力图,如下所示:



然后是原图:
下面解释这三张热力图是如何得到的,以及它们代表了什么。
这是一个非常典型的多尺度目标检测模型(如YOLO系列)的特征可视化结果。整个过程可以分解为以下几个步骤:
- 骨干网络 (Backbone) 进行特征提取
- 模型:ShuffleNet(一个高效的轻量级卷积神经网络,常用于移动端或需要实时性的场景)。
- 输入:您的原图(第4张图,室内聚餐场景)。
- 过程:原图被输入到ShuffleNet中,网络像一套层层递进的过滤器,由浅入深地提取图像特征。
- 输出:在网络的不同深度,会自然地产出不同尺度的特征图。通常,我们会取其中的三个或四个关键层作为输出:
- 浅层特征 (
stride=8): 分辨率高,包含丰富的细节信息(如边缘、纹理、角点),但语义性低(不知道是什么东西)。 - 中层特征 (
stride=16): 兼顾了细节和语义信息。 - 深层特征 (
stride=32): 分辨率低,细节大量丢失,但语义信息非常丰富(能理解图像中有“人”、“瓶子”、“杯子”等)。
- 浅层特征 (
这三张热力图,正是对应了这三个尺度的特征图经过后续处理后的可视化结果。
- 颈部网络 (Neck) 进行特征融合
- 模型:PAN (Path Aggregation Network)。
- 输入:ShuffleNet骨干网络输出的
stride=8, 16, 32的特征图。 - 过程:PAN的结构非常巧妙,它进行了双向的特征融合:
- 自顶向下 (Top-down):将深层的高语义特征(
stride=32)进行上采样,然后与中层的特征(stride=16)进行融合。这样,中层特征就获得了更强的语义信息。 - 自底向上 (Bottom-up):将融合后的中层特征再进行下采样,与更浅层的特征(
stride=8)进行融合。这样,浅层的高分辨率特征也获得了良好的语义信息。
- 自顶向下 (Top-down):将深层的高语义特征(
- 目的:经过PAN处理后,每一个尺度的特征图都同时包含了高分辨率的细节信息和强语义信息。这使得模型无论在哪个尺度上进行预测,都能既“看得清”(定位准),又“认得懂”(分类对)。
这三张热力图,就是PAN模块处理并输出到检测头(Head)之前的、三个不同尺度的最终特征图的可视化结果。
- 热力图的含义
热力图上的颜色代表了该位置特征激活的强弱。
- 蓝色/紫色:表示低激活,该区域的特征对当前任务的响应较弱。通常对应的是图像中不那么重要的背景区域,如墙壁、窗帘、桌面空白处。
- 绿色/黄色/红色:表示高激活,该区域的特征被强烈激活。通常对应的是图像中的关键目标或显著区域。
结合图片分析:
stride=32的热力图 (第3张图):- 分辨率最低,最粗糙。
- 黄色块集中在中下部,这非常符合您的原图:人群和餐桌正好位于画面中下部。这表明最深层的特征已经准确地“理解”了图像中最重要的物体大致分布在什么区域。
stride=16的热力图 (第1, 2张图):- 分辨率中等。
- 高激活区域(绿色/黄色)变得更加分散和清晰,已经开始从“一大片”区域中分离出多个独立的激活点。这对应了网络正在识别出多个独立的物体,如不同的人、餐盘、瓶子等。
stride=8的热力图 (您文字中提及,但未提供图):- 分辨率最高,最精细。
- 高激活区域会进一步细化,甚至可能勾勒出物体的轮廓。例如,人物的边界、瓶子的形状等会变得更加清晰,为最终的边界框精准定位提供信息。
总结
三张热力图,是一个 “ShuffleNet (骨干) + PAN (颈部)” 结构的目标检测模型的工作原理可视化:
- ShuffleNet 从原图中提取了三种不同抽象程度的特征(浅、中、深)。
- PAN 通过复杂的上下融合路径,让这三种特征互相增强,最终使得每个尺度的特征都“又清晰又懂语义”。
- 这些融合后的特征被送到检测头(Head)去预测物体的具体位置(边界框)和类别。
- 热力图的颜色显示了网络关注的焦点,暖色区域就是它认为“有重要物体”的地方。从
stride=32到stride=8,网络的关注点从粗粒度的物体区域逐步细化到细粒度的物体轮廓和位置。
这是一个非常优美且高效的过程,也是现代目标检测技术的核心思想之一。
随后,在这样的特征图上,通过添加几层卷积即可进行识别和定位。Detection head并不像前两部分那样,有那么多的说道和自由发挥的空间,这一部分通常就是普通的卷积,如下图的RetinaNet:
这张图非常经典,它清晰地展示了 RetinaNet 这个单阶段目标检测器(One-Stage Detector) 的核心架构。
RetinaNet的核心贡献除了这个结构,更重要的是提出了 Focal Loss,解决了单阶段检测器中正负样本极不平衡的问题,从而在保持高速的同时达到了媲美两阶段模型的精度。
主要关注的 “三条并行的分支” 这个描述需要稍微修正一下,以便更准确地理解。更准确的描述是:RetinaNet 为 FPN 输出的每一个尺度的特征图,都配备了两个独立的、结构相同的并行子网络(分支)。
下面我们来分部分详细解读图中的四个模块 (a), (b), (c), (d):
🧩 图 (a): Backbone(骨干网络) - 特征提取器
- 是什么:通常是 ResNet。它的任务是充当“特征提取器”。
- 做什么:接收输入图像,并逐层卷积、下采样,提取出从低到高不同层次的特征。
- 输出什么:它会输出多个不同尺度的特征图(通常取自不同深度的层,如图中可能标注的 C3, C4, C5)。这些特征图:
- 浅层(如C3):分辨率高,包含丰富的细节信息(如边缘、角落),利于小物体检测和精确定位。
- 深层(如C5):分辨率低,感受野大,包含丰富的语义信息(能判断出“这是一个人”、“这是一个杯子”),但细节丢失严重。
🧩 图 (b): FPN(特征金字塔网络) - 特征融合与多尺度处理
- 是什么:Feature Pyramid Network,是目标检测领域的里程碑式模块。
- 做什么:解决目标尺度不一的难题。它接收Backbone输出的多尺度特征,并通过自上而下(Top-Down)的上采样路径和横向连接(Lateral Connection),将深层的强语义信息与浅层的高分辨率细节信息进行融合。
- 输出什么:输出一套新的、多尺度的特征金字塔(如图中标注的 P3, P4, P5, P6, P7)。这个金字塔的每一层都具有强语义信息,但分辨率(尺度)不同。
- P3/P4(较高分辨率):更适合检测中小物体。
- P5/P6/P7(较低分辨率):更适合检测中大物体。
- 重要性:FPN 使得模型只需要一套检测头,就能高效地处理所有尺度的物体。
🧩 图 (c) & (d): Detection Head(检测头) - 核心预测部分
Detection Head 不是一个,而是一套共享的、轻量级的子网络,它会被应用到 FPN 输出的每一个层级(P3-P7)上。
对于 每个层级 的特征图,检测头都会执行以下两条并行的分支:
- 图 (c): Classification Subnet(分类子网络)
- 任务:预测每个锚点(Anchor)位置上是否存在物体,以及这个物体属于哪个类别。
- 结构:如图所说,由 4 层普通的 3x3 卷积层堆叠而成,每层都配有 ReLU 激活函数。最后再用一个 3x3 卷积(其输出通道数为
num_anchors * num_classes) 输出最终的分类预测。 - 输出:对于特征图上的每一个点(对应原图的一片区域),它会输出
K * A个值(K是类别数,A是锚框数量),通常经过 Sigmoid 激活后表示每个锚框内是各类别的概率。
- 图 (d): Box Regression Subnet(边界框回归子网络)
- 任务:预测每个锚点(Anchor)位置上,其锚框(Anchor Box)需要如何微调(偏移),才能更精确地匹配到真实物体的边界框。
- 结构:与分类子网络完全一样!也是由 4 层普通的 3x3 卷积层堆叠而成。最后用一个 3x3 卷积(其输出通道数为
num_anchors * 4) 输出最终的回归预测。4代表边界框的四个偏移量(通常是[dx, dy, dw, dh])。 - 输出:对于特征图上的每一个点,它会输出
A * 4个值,表示每个锚框需要调整的偏移量。
🔁 整体工作流程总结
- 输入:一张图片输入 Backbone (a),得到多层特征。
- 融合:这些特征送入 FPN (b),生成融合了语义和细节的多尺度特征金字塔
[P3, P4, P5, P6, P7]。 - 预测:对于金字塔的每一层(如P3):
- 将其分别输入分类子网 (c) 和回归子网 (d)。
- 两个子网共享相同的输入,但各自进行前向传播,互不干扰(并行),分别输出该类别的分类结果和边界框的偏移量预测。
- 汇总:将所有层级的所有预测结果汇总起来,经过后处理(如非极大值抑制 NMS),得到最终的检测结果(类别 + 边界框)。
💡 核心要点
- “三条并行的分支”: 两条并行的分支(Class 和 Box Subnet),这套双分支结构被重复应用在了 FPN 输出的多个层级(通常是5个) 上。
- “每个分支由4层普通卷积堆叠而成”:这种设计是共享权重和轻量化的体现。同一个分类子网(同一组参数)会用来处理P3, P4, P5...所有层级的特征,回归子网同理。这样设计大大减少了参数量,提高了效率。
- 优势:这种结构将复杂的检测任务解耦了。一个分支专心负责“是什么”,另一个分支专心负责“在哪里”,两者分工合作,最终由模型综合判断,取得了非常好的效果。
微信扫描下方的二维码阅读本文

Comments NOTHING