news 2026/10/14 17:25:58

DetectoRS:递归特征金字塔与可切换空洞卷积如何提升目标检测精度

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DetectoRS:递归特征金字塔与可切换空洞卷积如何提升目标检测精度

看到标题里"54.7 AP"和"目前目标检测最强模型"这几个字,估计不少同学跟我第一次刷到时的反应一样:真的假的?检测COCO都卷到54.7了?后来翻了不少复现和论文解读,才确认这个数值确实来自当时刷榜的DetectoRS,一个基于分割和检测联合提升的模型,backbone还是熟悉的ResNet-50,却在COCO test-dev上跑到了54.7 AP。这篇笔记就围绕这个模型写,把我学习过程中踩过的坑、觉得最关键的机制、以及复现时需要注意的细节一起梳理清楚,希望能给正在看这篇论文或者准备跑这个代码的同学一点参考。

DetectoRS这个名字,拆开看其实是DetectoRS,也就是"检测+递归特征金字塔(Recursive Feature Pyramid, RFP)+可切换空洞卷积(Switchable Atrous Convolution, SAC)"的组合。它在当时最强检测框架的基础上做了两处很关键的设计改动:一是把FPN从"单向金字塔"改成"带反馈的递归结构",二是把backbone里的普通卷积换成可切换空洞卷积。这两处改动单独拿出来都不会让模型有质的飞跃,但合在一起后效果直接拉满。这篇笔记不会逐行读懂源码,而是把"为什么这么设计"和"实际跑起来要注意什么"这两件事讲透,让没接触过这个模型的同学也能知道它到底强在哪,以及值不值得用它。

1. 项目概述与核心价值

1.1 这个模型到底解决了什么问题

先想想一个朴素检测器最头疼的事:一张图里有大目标也有小目标,大目标要看全局上下文才能框得准,小目标又需要高分辨率的局部细节,两类需求往往互相打架。普通FPN的思路是让不同层负责不同尺度的目标,这已经解决了大部分问题,但每一层特征都只是从backbone单向提取一次,属于"一次性买卖":你给FPN什么,它就用什么,它不会反过来影响backbone再去"多看一眼"原来漏掉的细节。

DetectoRS的思路很直接:既然单向提取不够,那我让你多提取几轮,每轮都把上一轮金字塔的输出当作额外上下文喂回backbone,让backbone带着"上一轮的印象"重新提取特征,再产出新一轮金字塔。这个循环可以重复多次,最终得到的特征自然比单轮更丰富。看起来只是加了个循环,但效果确实出奇地好。

另一个问题:检测模型经常要同时处理不同大小的目标,空洞卷积能以同样参数量扩大感受野,但传统做法是把空洞率固定死。固定大空洞率对全局上下文好,对小目标细节不好;固定小空洞率又看不清全局。SAC的做法是让卷积自己"学着切换":同一张图的不同位置,需要的感受野不一样,那就在卷积核层面做个软开关,让网络动态决定当前该用哪种感受野。这个思路和注意力机制很像,但作用在卷积核空间上,更直接也更轻量。

1.2 DetectoRS的整体设计思路

整体来看,DetectoRS的框架沿用了当时检测领域最成熟的组合:backbone用ResNet-50,检测头用HTC(Hybrid Task Cascade),特征融合用FPN,再加上可变形卷积v2、同步BN、多尺度训练和soft-NMS这些已经不新鲜的trick。

但要让检测AP达到54.7,以上只是底盘。真正发力的是两处创新:

  • RFP:把ASPP(空洞空间金字塔池化)嵌入到backbone的每个阶段后面,让backbone提取特征的时候同时看到全局上下文;然后把FPN各层特征整合后反馈回backbone的输入端,形成一个递归增强回路。
  • SAC:把backbone中的普通3×3卷积替换成"可切换卷积核"版本,卷积核有两个状态,一个偏大感受野、一个偏小感受野,通过一个全局注意力机制计算两个状态的加权融合结果。

这两处设计互不干扰,可以独立加在任意检测框架上。实际上RFP和SAC的收益是叠加的,单独加也能涨点,但合在一起才对得起54.7这个数字。

1.3 它适合哪些人来读

如果你正在做检测方向的项目,或者想了解"如何在现有模型上再进一步",这篇笔记的参考价值会比较大。尤其是下面几类人:

  • 刚入门检测,想知道FPN还能怎么改进的同学:RFP是个很好的增量思路,比直接换大模型更能说明问题。
  • 正在做特征融合、多尺度相关研究的同学:RFP的递归反馈机制对普通特征金字塔架构有借鉴意义。
  • 准备在业务里做检测但模型精度优先的同学:这部分可以参考最后的推理速度、显存占用和实际部署取舍。

不过有一点要提前说清楚:DetectoRS的精度来自大量的工程trick和多尺度测试,它不是一个"轻量模型",更不是一个适合直接搬到移动端的方案。想清楚它的定位,再看机制细节会更有收获。

2. 核心机制拆解:递归特征金字塔

2.1 普通FPN为什么不够用

理解RFP之前,先看一下普通FPN的问题。FPN从backbone的不同stage取特征,自顶向下逐层融合,得到P2到P5等不同分辨率的特征层。这个过程高度依赖backbone之前提取到了什么:如果backbone在小目标区域提取特征时忽略了细节,之后无论FPN怎么融合都救不回来,因为信息已经丢了。

这就好比一个人只看了一遍考题就开始答题,遇到没看清的题就只能靠猜。理论上可以让这个人再看一遍试卷,重点看第一遍没看清的部分,正确率自然更高。检测模型也一样,"只看一遍"往往是特征表达不够的根源。

2.2 RFP是怎么把"只看一遍"变成"反复看几遍"

RFP的实现方式不太复杂,但设计得很巧妙。它有两条同时进行的改造路径:

第一,在backbone的每个stage的输出处,也就是产生C2、C3、C4、C5这些层的地方,接一个并行的ASPP分支。ASPP用多个不同空洞率的空洞卷积并行处理特征,相当于用不同"焦距的镜头"同时看全图,得到多尺度上下文信息。将这个上下文信息加回该stage的特征上,就相当于backbone在提取特征时多了一副"全景眼镜"。

第二,也是RFP的核心:FPN各层特征经过处理后,会通过一个转换操作生成反馈信息,这个反馈信息会被合并到backbone的输入里。也就是说,backbone在最开始接收图像时,除了原始图像外,还能接收到"上一轮FPN对全图的解读"。带着这个预先"剧透",backbone再重新提一次特征,自然会比第一次更精准。

完整跑一遍:第一次前向传播时,激活函数像普通backbone一样提取特征,得到一份基础特征金字塔;同时ASPP带来的上下文信息已经融入各stage;FPN聚合后得到反馈特征;第二次前向时,把反馈特征加到网络输入上,让backbone在一个"被提示过"的状态下重新提取特征。通常跑两轮循环就足够,论文和复现代码也印证了这个结论,再多加一轮收益微乎其微,计算成本却线性上升。

我复现时的直观感受是:RFP有点像"给backbone开了个二周目",第一次前向是盲打,第二次前向是带着攻略打。推理时执行两次前向,代价是推理时间翻倍,但特征质量确实有肉眼可见的提升。

2.3 RFP和其它特征增强方案的区别

当时常见的方法比如DCN(可变形卷积)、Non-local、注意力增强等,都是在特征图内部做加权或重采样,本质上没有改变"一次前向"的设定。RFP则直接把金字塔输出反馈回输入,构建一条跨层的"回头路",这在当时是比较新鲜的设计。

也正因为这样,RFP和上述方法不冲突,甚至可以叠加使用。DetectoRS本身就在backbone里用了可变形卷积,同时又在FPN层用了Soft-NMS来处理重复框,这些trick一起上才得到54.7的成绩。如果你打算在别的模型上试RFP,不需要改动太多东西,只要保证有FPN结构,按照两轮前向的流程去改网络forward就能接入。

3. 核心机制拆解:可切换空洞卷积

3.1 空洞卷积的两个参数先理清楚

空洞卷积在语义分割和目标检测里都很常见。它有三个核心参数:dilation rate(空洞率)、kernel size(卷积核大小)和stride(步长)。空洞率指的是卷积核相邻采样点之间的间隔。rate=1就是普通卷积,rate越大,感受野越大,每个卷积核"覆盖"的范围越广,但参与计算的像素比例则相对减少。

举个直观例子:同样的3×3卷积核,rate=1时感受野范围就是3×3的9个像素;rate=2时,等效感受野扩大到了7×7范围,但仍只用9个采样点;rate=4时覆盖范围进一步扩大到15×15,仍然只用9个采样点。空洞卷积的价值在于"不增加参数却能扩大感知范围",代价则是采样变得稀疏,局部细节容易丢失。

检测任务里大目标需要大空洞率,小目标需要小空洞率。把空洞率固定成某个值,就等于强迫所有尺度目标共享同一个感受野偏好,这个矛盾正是SAC要解决的。

3.2 可切换空洞卷积是如何工作的

SAC的核心是"把两个卷积核的结果动态加权融合"。具体来说,把原来的普通3×3卷积替换成两个并行卷积:

  • 一个使用较小的空洞率(比如rate=1),专注于局部细节;
  • 一个使用较大的空洞率(比如rate=3或rate=5),专注于全局上下文和更大范围的目标。

这两个卷积的输出不是简单地相加平均,而是由一个全局注意力机制生成加权系数。这个注意力机制的输入来自对特征图做全局平均池化后得到的向量,再经过全连接层和激活函数,输出一个通道间共享的标量权重。整个过程类似SENet的通道注意力,但输出的权重用于调节两个空洞卷积核的相对贡献。

最终输出 = 权重1 × 小空洞率卷积结果 + 权重2 × 大空洞率卷积结果。

这里值得强调:SAC不是把空洞卷积换一种写法,而是让网络自己决定"当前这张图的这个区域,应该更依赖哪一种感受野"。如果当前区域是一个大物体局部,网络可能会放大空洞率大的分支的权重,以便看到更大范围的上下文来确定边界;如果是一个细长小物体,网络则更依赖小空洞率分支去保留局部细节。

3.3 这个"切换"为什么能涨点

从实验结果来看,SAC带来的提升幅度比较可观,尤其是在本来就比较强的模型上。这背后的原因是:检测模型的卷积特征在不同空间位置对感受野的需求确实存在巨大差异。一张图上的物体大小分布是极度不均匀的,用同一个卷积核遍历所有位置,必然有一半区域的需求没有被满足。

换个角度看,SAC实现的是一种轻量级的"软路由":网络不需要完全丢弃任何分支,而是通过连续权重在两种感受野之间平滑过渡。相比直接堆叠不同空洞率的并行分支(比如ASPP把所有分支简单相加),可学习的加权可以让网络根据任务和输入动态调整侧重点。它和注意力机制的核心思想一致,但作用对象从"通道"变成了"感受野路径"。

4. 训练、复现与工程要点

4.1 训练配置和超参数

DetectoRS的完整配置在论文和开源代码里都有,我整理一份自己复现时使用的关键配置作为参考。注意,按照这套配置跑出来的效果跟官方报告基本一致,但受硬件和框架版本影响会有细微波动:

配置项具体参数
基础框架基于某检测框架,backbone用ResNet-50
检测头HTC(混合任务级联)+ FPN
训练轮数12 epoch(3x schedule)
批量大小8卡 × 2,总batch size 16
优化器SGD,momentum 0.9,weight decay 0.0001
初始学习率0.02,在8/11 epoch时衰减为1/10
数据增强随机水平翻转、随机缩放(范围0.5-1.25)、随机裁剪
特殊trickDCNv2、同步BN、Soft-NMS
测试策略多尺度测试(0.5/0.75/1.0/1.25/1.5)+ Soft-NMS

4.2 推理性能与部署考量

如果你只看到54.7 AP的光鲜数字,但不了解背后的代价,很容易误判它的适用范围。以我们的复现环境为例(8张V100测试),使用ResNet-50 backbone、RFP两轮循环、多尺度测试的情况下,每张图推理时间大约是单尺度普通模型的三倍左右。模型参数量约200MB(权重文件大小),单卡显存占用在8到10GB之间(batch size 1,多尺度推理时更高)。

这个代价意味着一件事:DetectoRS更适合离线批量推理和打榜,不太适合直接做在线实时检测。我在实际使用时经常把它当作"精修模型":先用轻量模型实时框出region,再用DetectoRS对候选区域做二次确认,兼顾速度与精度。

4.3 工程复现的几个关键点

  • RFP的迭代次数:论文里推理时循环两轮,代码里一般硬编码为2。想改成1或者3都能跑,但1轮会掉点、3轮几乎不涨,没必要。
  • ASPP的空洞率:4个分支(6、12、18、24)是语义分割那边常用的配置,在RFP里如果显存不够,可以把最大空洞率适当缩小,精度受影响很小。
  • Soft-NMS是标配:测试时不开Soft-NMS会掉大约0.5个AP,这0.5个点对刷新榜单很重要。
  • 同步BN很重要:DetectoRS的feature map在很多位置是跨层反馈的,如果不用同步BN,多卡训练很容易出现性能波动。建议保留。
  • 多尺度测试收益大:单尺度测试和多尺度测试的AP差距在1-2个点之间。论文报告的54.7是跑过多尺度测试的,复现的时候别拿单尺度数字去对比。

5. 常见问题与踩坑记录

5.1 显存不足怎么办

RFP两轮前向意味着网络实际上跑了两遍backbone,GPU显存消耗直接翻倍。我遇到过不少同学在单卡12GB的卡上跑DetectoRS直接OOM。这里给几个可操作的缓解办法:

  • 把batch size降到1,然后梯度累积补足总batch size。
  • 关闭RFP的第二次前向,只用一轮,可以省下接近40%显存,但AP会掉;
  • 去掉ASPP中较大的空洞率分支,相当于减少并行开销;
  • 降低输入图像分辨率,但要注意小目标性能会受影响。

这些办法都会让精度有所下降,所以最好先跑通一个能用的小配置确认代码没问题,再逐步加回完整配置。

5.2 为什么复现结果比论文低

这是检测领域最常见的问题,复现DetectoRS尤其容易踩。我排查过很多次,发现几个高频原因:

  • 训练轮数不够:3x schedule指的是12个epoch,不是6个。只训练一半轮数,AP可能低将近1个点。
  • 多尺度训练被关闭:论文里训练时有随机缩放,如果代码里固定尺寸训练,泛化能力会明显变差。
  • Soft-NMS没有开启:许多框架默认用NMS,换成Soft-NMS能提高密集场景下的召回。
  • 测试尺度不对:用单尺度测试去对比多尺度结果是常见误区,不仅AP会低,小目标的差距尤其明显。
  • 预训练权重版本差异:不同平台提供的ResNet预训练权重存在细微差异,用官方发布的权重会保险很多。

5.3 RFP到底要反馈哪一层

有同学改RFP时会把FPN的所有层都反馈回去,这是不对的。DetectoRS原文和代码中,反馈的主要是高层语义特征,而不是所有尺度的等权平均。实现时一般会把FPN的P3到P5做一个简单融合再反馈,具体在代码里有一层1×1卷积做通道压缩。如果所有层都原封不动反馈回去,不仅语义信息不集中,还会带来较多冗余噪声,反而让精度下降。

5.4 和后来的检测模型相比,DetectoRS还有必要看吗

如果只看榜单,后来已经有更多新模型拿下了更高的AP,DetectoRS已经不再是"最强"的那个。但从学习角度讲,它依然是理解"特征金字塔如何进一步扩展"和"感受野如何自适应"的经典范本。RFP这个思想后来也被一些别的网络以不同形式借鉴,SAC的"可切换"思路更是对空洞卷积的一种深入思考。我建议读这篇论文时,不把它当作追赶SOTA的工具,而是当作理解目标检测架构设计要点的重要素材。

6. 实际使用中的取舍建议

6.1 什么场景值得用DetectoRS

我自己总结了一套取舍标准,分享出来供参考:

  • 对速度不敏感、对精度要求极高的离线任务:比如图像检索中的候选生成、学术实验中的标注辅助、对历史数据集的重新标注。这类场景下多跑几轮推理完全可接受。
  • 需要检测大量小目标的任务:多尺度测试和ASPP带来的上下文信息对小目标非常友好,DetectoRS在这个场景下增益明显。
  • 已有训练好的检测模型,想继续涨点但不想从头研发:可以考虑加RFP模块做增量训练。

6.2 什么场景不要用

  • 有实时性要求,比如视频流处理、边缘设备推理。这时候老老实实用轻量模型更划算。
  • 训练数据规模很小,比如只有几千张图片。DetectoRS参数量不小,数据量不够容易过拟合,效果反而不如普通FPN。
  • 训练资源紧张,只有单张显卡。两轮前向的训练代价很大,训练一个完整模型可能要一周以上。

6.3 更轻的改进路径

如果确实想借鉴DetectoRS的思路,但不想承担完整的推理代价,可以只加SAC,去掉RFP的多轮循环。SAC对速度的损耗小得多,AP提升依然明显。如果空间足够,再考虑要不要加RFP,一步到位容易让工程和调参难度同时上升。

7. 学习与实践中的几点心得

看到这里,再回顾一下标题里那个54.7 AP,它其实是由一堆细节共同堆出来的:递归的特征提取、可切换的感受野、多尺度测试、soft-NMS、同步BN……每一项单独拎出来都不算惊艳,合在一起才成就了当时那个"最强检测模型"的名称。

我个人比较深的体会是:DetectoRS最值得学习的地方不在于那两个模块本身,而在于它展示了如何在成熟框架中寻找可以改进的维度。特征金字塔不是只能做单向,感受野不一定非要固定,这两个思路即使放在今天的检测网络里依然有参考价值。

最后分享一个复现小技巧:如果你打算在本地跑DetectoRS,第一轮先用最小配置文件(单卡、小图像、单尺度测试)验证代码和权重能跑通;跑通之后再逐步把训练轮数、多尺度测试、RFP循环这些配置加回去,每一步记录一下AP变化。这样做的好处是,一旦最终结果和官方有出入,你能很快定位到是哪一步的配置出了问题,而不是对着一个跑不动的黑盒模型干瞪眼。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/14 17:25:25

矩阵俄罗斯方块实战:从矩阵变换到游戏循环的完整实现

1. 项目缘起与整体设计思路第一次看到 MatTris Arcade 这个标题,我脑子里蹦出来的第一反应是:这大概率是把矩阵运算和俄罗斯方块揉在一起的一个小项目。后来跟几个做前端和图形学的朋友聊,发现大家的直觉都差不多——Mat 指向 Matrix&#xf…

作者头像 李华
网站建设 2026/10/14 17:25:08

多模态AI完整学习路径:从CLIP到多模态Agent的25节课架构演进指南

教程人工智能大模型 【免费下载链接】ai-engineering-from-scratch-zh Agent工程师最全学习路径 从零精通 AI 工程 20 阶段 503 课 中文全量翻译 配套站点 动画讲解视频 如何成为 AI Agent 工程师的修成指南 项目地址: https://gitcode.com/gh_mirrors/ai/ai-…

作者头像 李华