超大分辨率图像下的目标检测问题研究¶
本文写于2026年07月23号晚上十点
摘要¶
超大分辨率图像目标检测可以先看成一个很实际的取舍:整图缩小后只需检测一次,但远处车辆和行人可能缩成几个像素;保留原始尺寸能看清目标,却常常放不进显存;把原图切成许多小块虽然能保住细节,又会反复处理空地、海面和道路,还可能把目标切在边缘。问题的关键因此不是一味增大输入,而是在有限显存和时延内,找出真正值得细看的区域,同时保留判断目标所需的局部纹理、尺度和周围场景。
本文限定分析历年代表性论文,并按它们改动检测流程的位置进行归类。从可交叉的计算环节处理图像或切片选区、特征位置稀疏计算、全局与局部协同、超分辨率、尺度与感受野、动态标签分配以及多代理分类。它们回答的是三个不同问题:哪里需要细算,保留多大范围的图像和上下文,以及怎样让微小、密集或旋转目标得到可靠的训练信号。区域方法会受第一遍漏检限制,稀疏方法依赖掩码和硬件内核,表征增强不能找回输入中已经消失的像素,监督方法也不会自动减少大图计算。理解这些边界后,才能判断某个模块究竟解决了哪一段问题。
一、问题描述¶
1.1 任务界定¶
“超大分辨率”没有一条固定的像素分界线。只要原图在目标硬件上不能以看清小目标所需的尺度直接送进检测器,必须缩小、切片或分阶段处理,就属于本文讨论的问题。所选论文中的图像从约 1920×1080 的远景图,到 2000×1500 的无人机图、4000 像素宽的航拍图,再到 29200×27620 的卫星整景。尺寸相差很大,矛盾却相同:缩小会丢细节,原尺寸密集计算又太贵。 已有研究以无法直接送入常规检测器的 Gaofen-2 大图说明整图输入的现实限制;另一项实验表明,即便原图已经完成预处理,仅给 RetinaNet 增加一层高分辨率 \(P_2\) 特征,检测头的 FLOPs 和内存也会增加约 300%。
为什么图像长宽只增加一倍,计算压力却会明显变大?设输入大小为 \(H\times W\),密集卷积检测的空间计算量可粗略写为
其中,\(l\) 表示网络层,\(c_l\) 概括该层输入、输出通道带来的计算系数,\(k_l\) 是卷积核边长。图像长宽都放大 \(s\) 倍后,空间位置数会变成原来的 \(s^2\) 倍,中间特征占用也随之增长。反过来缩小输入虽能省算力,却可能让原本只有十几个像素的目标在连续下采样后只剩一个响应点,甚至完全消失。QueryDet 把它概括为“高分辨率特征有用,但在所有位置运行检测头太贵”;SuperYOLO 还指出,YOLOv5 早期的 Focus 重排和连续步长下采样会进一步损伤小目标的空间结构。
图 1 不同数据形态下的问题实例。(a)Gaofen-2 卫星整景达到 29200×27620 像素,1024×1024 切片中同时存在大量空背景与少量有效块;(b)无人机街景中目标分布不均,密集区需要局部高分辨率处理,稀疏区均匀精检会浪费计算;(c)旋转微小目标不仅面积小,还伴随方向先验错配和不同尺度上的正样本数量失衡;(d)同一遥感场景在 RGB 与红外模态中的目标可见性不同,单模态缩放会进一步削弱弱小目标。
四幅图对应四种不同难点。卫星整景太大,而且多数切片没有目标;无人机图虽然较小,缩放后的行人和车辆可能只剩个位数像素,并集中在少数路口;DOTA 一类遥感图中的目标还会任意旋转;VEDAI 的 RGB 与红外图已经配准,问题变成怎样用较小代价利用两种模态。 因而,“超大分辨率图像下的目标检测”并不等价于“小目标增强”,而要看它改的是选区、特征分辨率、上下文、尺度知识,还是训练标签。
1.2 从“检测整幅图”转向“分配有限计算”¶
普通检测器默认整张输入都要算,研究重点通常放在骨干、特征金字塔、检测头和损失函数。超大图检测还要先回答一个问题:哪些图像块、特征块或空间位置值得进入后面的昂贵计算?为了把各论文放到同一坐标系中,本文使用下面的分析式。它不是某篇论文直接训练的损失,而是对这些方法共同目标的概括:
把这条式子解读一下就是:在尽量不漏掉真实目标的前提下,一边降低检测错误,一边减少真正送入昂贵阶段的区域。式中,\(\Omega\) 表示“被选中的地方”。在 OAN 中,它是通过门控的固定切片;在 CZDet、YOLC 与 GLSAN 中,它是从原图裁出的矩形;在 QueryDet 与 CEASC 中,它是 FPN 上被激活的位置;在 ESOD 中,它还包含被保留的特征块和候选中心。
\(\theta\) 表示整个检测系统中通过训练学到的参数,例如卷积核、分类器和框回归器。若想把选择器与检测器分开写,可以记成 \(\theta=(\phi,\psi)\):\(\phi\) 是“选哪里”的参数,\(\psi\) 是“如何检测”的参数。这两个符号只是为了说明职责,不表示所有论文都按同一种方式联合训练。
\(L_{det}(\theta;\Omega)\) 表示检测误差,通常包含类别、目标置信度和框回归损失,旋转检测还要计算角度或旋转框几何误差。分号强调 \(\Omega\) 不是一组普通权重,而是在决定检测器能看到哪些内容。真实目标若已经被排除在 \(\Omega\) 之外,后面的检测器再准确也找不回来。
\(C(\Omega)\) 表示处理这些选区要花多少资源。它可以用像素数、激活位置数、FLOPs、峰值显存或端到端时延来量化,不同论文的口径并不相同。\(\lambda\) 是误差和成本之间的权重,不是学习率;\(\lambda\) 越大,分析式越看重少算区域。不过,它的数值会随成本单位和归一化方法变化,不能脱离输入尺寸与硬件单独比较。
\(R_{target}(\Omega)\) 是选区对真实目标的覆盖率,\(r_0\) 是允许的最低值。覆盖可以按“目标框至少有多少面积在选区内”计算,也可以按“目标中心是否落在激活位置”计算。例如,OAN 在过滤 30% 切片时仍报告 99.74% 的目标召回2。测试系统用粗框、objectness 热图、查询分数或稀疏掩码近似这个约束。选区过大,成本降不下来;选区过小,漏掉的目标无法恢复。ESOD 因此把框覆盖召回 \(BPR_{box}\) 与中心召回 \(BPR_{ctr}\) 分开统计:前者看切片有没有包住目标,后者看稀疏头还能不能访问目标中心4。
二、问题特点¶
2.1 目标的绝对尺度小,尺度跨度却很大¶
原图像素多,不等于送进网络后的目标也大。2000×1500 的无人机图若缩到短边 600,GLSAN 观察到部分行人只剩约 8 像素;连续下采样后,这类目标很难保留稳定的边缘和中心。裁出局部再放大虽然能增加目标像素,同一类别又会因为飞行高度、裁块范围和缩放倍数呈现很大的尺度差异。MSCD 正是从这种尺度波动出发,但也指出普通多尺度训练让各尺度分别学习,多尺度测试还会重复推理912。
2.2 空间分布同时具有全局稀疏和局部密集¶
目标在整张图上很稀疏,却会在路口、停车场和港口内突然变得拥挤。ESOD 的 VisDrone 示例把图像均匀分成 8×8 后,约 73.7% 的小块没有目标;因此,模型既要跳过大片空背景,又不能把拥挤区压得太小或从中间切开4。
2.3 细节与上下文存在双向依赖¶
超大分辨率图像中的目标往往需要结合周围场景才能判断。道路、跑道和水域不仅是背景,也为车辆、飞机和船舶提供了类别与位置线索。整体缩放会同时压缩目标纹理和邻域结构,切片边界则可能把目标与相关场景分到不同图块;即使目标本身仍被保留,原有的空间关系也可能变得不完整。对小目标而言,自身纹理不足与上下文缺失还会相互放大:目标越小,类别判断越依赖周围环境,而保留的视野越窄,可利用的环境线索就越少。因此,大图检测中的“看清目标”和“看全场景”并不是同一件事,两者常在有限输入范围内互相制约78。
2.4 旋转目标检测中方向变化、弱特征和样本分配互相放大误差¶
俯视图中的车辆、船舶和桥梁可以朝任意方向,同一类别还可能具有很大的长宽比和尺度差异。对面积很小的旋转目标,中心偏移一两个像素、宽高略有变化或角度出现轻微误差,都可能使预测框与真实框的重叠面积明显下降,IoU 因而剧烈波动。目标经过连续下采样后通常只对应少量特征点,可用于判断位置和方向的纹理十分有限;不同方向与尺度的目标能够覆盖的有效位置数也不一致,容易造成正样本数量和质量不均。方向变化、弱特征与样本不平衡由此相互叠加,使旋转小目标的定位和训练信号比水平框目标更不稳定510。
2.5 效率不能只用 FLOPs 描述¶
FLOPs 只统计主要算子的理论运算次数,不能直接代表一幅大图从输入到输出所需的时间。完整流程还包含图像读取、裁切与缩放、batch 组织、检测框坐标还原以及结果合并,这些操作未必被计入 FLOPs;中间特征的尺寸、内存访问方式和硬件并行能力也会影响实际速度。同样的理论运算量在不同输入尺寸、batch 大小、算子实现和硬件上可能对应不同的帧率,较低的 FLOPs 也不一定意味着较低的峰值显存。因此,大图检测的效率需要同时考察处理区域数量、FLOPs、峰值显存、端到端时延和硬件环境,不能用单一指标代替17。
2.6 数据到底有多大,目标到底有多小¶
阅读数据统计时要先分清三个尺寸。原图尺寸是传感器得到的完整画幅,模型输入尺寸是训练或测试前缩放后的大小,切片尺寸则是从原图截取的局部窗口。三者分别反映传感器覆盖范围、网络实际接收的像素数量以及单次处理的视野,不能互相替代。例如,DOTA 原图可达 4000×4000,在部分实验设置中会被截成 1024×1024 的窗口;VEDAI 的原始裁片可为 1024×1024,实际输入又可能缩至 512×512211。如果把原图、切片和模型输入写成同一种“图像大小”,就会误判场景覆盖范围以及目标进入网络后还剩多少像素。下表只采用所选论文正文能够逐页复核的数据;原论文没有给出某项统计时,表中直接写明“未报告”,不以常见数据集版本补数。
表 1 数据集规模、图像尺寸与目标分布统计。
| 数据集 | 数据规模与原始画幅 | 所选论文中的处理尺寸 | 目标尺度、密度与统计口径 |
|---|---|---|---|
| DOTA-v1.0 / v1.5 / v2.0 | v1.0 有 2,806 张、188,282 个实例和 15 类,原图为 800×800 至 4000×4000;v1.5 沿用图像并补充微小实例与 1 个类别;v2.0 有 11,268 张、1,793,658 个实例和 18 类,还包含 29200×27620 的 Gaofen-2 与 7360×4912 的机载图像。2 | 原图切为 1024×1024,stride 为 824,相邻切片重叠 200 像素。2 | v1.5 专门补标更小实例,但所选材料未给出全数据集目标宽高分位数;不同标注版本的微小目标数量和实例总数不能混用。2 |
| VisDrone-DET | 10,209 张,训练/验证/测试为 6,471/548/3,190,共 10 类;原图为 960×540 至 2000×1500。56 | 不同实验分别使用 1024×640 和 1333×800 的模型输入,均为缩放后尺寸。56 | 8×8 均匀分块后超过 70% 为空;另一统计口径下 FR 为 10.2%,按 COCO 面积分档的小/中/大目标占 68.56%/28.68%/2.76%。FR 的精确计算式未在原文给出,不能将其等同于空块率或像素覆盖率。64 |
| UAVDT | 50 段视频,训练/测试为 23,258/15,069 帧,共 3 类;不同论文将原始画幅写为 1024×540 或约 1080×540,未解释宽度口径差异。564 | 不同实验分别使用 1024×640 和 1000×600 的模型输入。56 | 平均每帧 18 个目标;一项统计给出目标像素约占 4.9%、约 84% 小块为空,另一项给出 FR=5.11%,小/中/大目标占 74.87%/23.01%/2.12%。两组比例来源和定义不同,不能合成统一数值。64 |
| TinyPerson | 1,610 张,训练/测试为 794/816,图像主要为 1920×1080。4 | 所选材料未将其统一缩放成一个数据集定义尺寸。4 | 目标通常小于 20×20 像素,平均每图 25 个目标,目标像素约占 0.87%,约 89% 小块为空;“小于 20×20”是绝对边长,不是 COCO 面积分档。4 |
| VEDAI | 数据集段写有 1,246 个 RGB/IR 配准裁片和 11 类;实验段每折为 1,089 张训练、121 张测试,合计 1,210 张,并保留 8 个样本较多的类别,两种口径相差 36 张。上游 AGRC 影像约 16000×16000、12.5 cm/像素,VEDAI 裁片为 1024×1024 或 512×512。11 | 训练和测试输入均为 512×512,不能与 1024×1024 原始裁片混用。11 | 车辆在广阔背景中仅占几十像素,原文未给出完整宽高分位数;RGB/IR 裁片已配准,缩放后的目标像素数与原始裁片不同。11 |
| HRSC2016 / FAIR1M-v1.0 | HRSC2016 有 1,061 张和 2,976 个舰船实例;FAIR1M 有 15,266 张、超过 100 万实例、5 个大类和 37 个细类,所选材料未给出统一原图尺寸范围。8 | HRSC2016 将长边缩至 800;FAIR1M 先取 0.5、1.0、1.5 三种缩放,再切成带 500 像素重叠的 1024×1024 子图。8 | 所选材料未给出可统一比较的目标宽高分位数,因此不能仅凭“旋转目标”推定具体像素分布。8 |
| DroneBolts / DIOR | DroneBolts 有 1,950 张,训练/测试为 1,500/450,共 2 类,原图超过 4000×3000;DIOR 有 23,463 张、192,472 个实例,训练/测试为 11,725/11,738,每图 800×800。1112 | DroneBolts 分别使用 1500×2000、1200×1600、900×1200 三种输入;DIOR 使用 512×512。1112 | 所选材料只说明细小螺栓任务和 DIOR 实例规模,未给出统一宽高分位数;DIOR 与 DIOR-R 的标注统计对应关系也未说明,不能直接混用。11129 |
空块率、目标像素占比和 FR 不是同一种量,COCO 面积分档与“小于 20×20 像素”的绝对边长描述也不能互换。VisDrone 的 3,190 张测试数是所选论文使用的合并统计;其他研究若只取某个测试子集,样本数会不同。按这些口径,VisDrone 与 UAVDT 的难点是小目标多且局部拥挤,TinyPerson 更接近目标绝对尺寸极小且整图前景稀疏,DOTA 还叠加了超大画幅和任意方向。数据形态不同,后续处理时需要保留的信息范围也不同。
2.7 常规解决方案及其适用边界¶
所选论文并不是从空白处开始设计新模块,它们都在回应一些常见做法。下表把每条路线的输入到输出过程、直接优点和缺点分开列出。
| 常规路径 | 从输入到结果的基本做法 | 优点 | 缺点 |
|---|---|---|---|
| 整图缩放 | 把 \(H\times W\) 原图 resize 到固定尺寸,再做一次密集检测 | 只推理一次,不需要裁块、坐标回映或结果融合;全局场景完整 | 小目标会在下采样中消失,同一图内的尺度差距也会被压缩2512 |
| 均匀滑窗或重叠切片 | 用固定窗口覆盖整图,每块分别 resize、检测、回映,再做 NMS | 能保留局部像素,现有检测器和训练框架可以直接复用 | 空背景块也要完整推理;重叠区域重复计算;边界目标可能被截断或重复预测24 |
| 多尺度训练、测试或图像金字塔 | 为同一图像建立多个缩放版本,各自检测后融合 | 同一目标能在不同有效尺度上出现,容易接入两阶段检测器 | 多尺度测试会按尺度数重复推理;各尺度独立处理时没有直接交换实例知识9 |
| 粗检后裁块放大 | 先在全图粗检或估计密度,再从原图裁块、放大、精检并融合 | 细算集中在少数候选区,通常比遍历全部固定切片更省 | 第一阶段漏掉的目标无法在第二阶段恢复;区域数和尺寸随图像变化;裁剪、缩放与坐标回映增加时延和误差35612 |
| 全位置高分辨率 FPN 和检测头 | 增加 \(P_2\) 等细粒度特征层,在每个空间位置分类和回归 | 小目标保留更多特征点,通常比只用低分辨率层更容易定位 | 最大特征图上的检测头 FLOPs、激活量和显存会快速增长147 |
| 朴素稀疏卷积或固定稀疏率 | 依据前景 mask 跳过背景位置,或为每层预设固定激活比例 | 理论上能直接减少高分辨率检测头的卷积位置 | 被跳过的背景不再提供上下文;固定比例不能适应不同图像和 FPN 层;不规则算子的时延不一定按 FLOPs 同比例下降47 |
| 推理前超分辨率 | 先为整图或裁块生成更大的图,再送入检测器 | 可能增加小区域的可见纹理,也能同局部裁块组合 | 整图重建本身成本高;视觉重建质量不等于检测可分性;真实模糊、噪声和压缩可能不同于训练退化1112 |
| 静态 anchor、IoU 分配和单一类别权重 | 固定先验位置与形状,用 IoU 或规则选正样本,每类只学习一个分类中心 | 训练与推理流程成熟,额外状态少 | 旋转小框的轻微偏差会造成先验错配和正样本失衡;一个类别中心难以表示同类目标的多峰外观610 |
后文的论文正是从这些失效点进入。OAN 在固定切片的共享主干后筛掉空块;CZDet、YOLC、GLSAN 与 UFPMP-Det 改变第二次精检区域的产生和组织方式;QueryDet、CEASC 与 ESOD 把高分辨率计算限制到被查询或被 mask 激活的位置;MSCD 把多尺度信息留在训练期交换;SuperYOLO 将多模态融合前移,并把 SR 作为训练约束;DCFL 与 UFPMP-Det 分别改变正样本标签分配和类别表示。这些改动并不互相等价:图像选区决定模型是否还能看到目标像素,特征稀疏决定内部哪些位置继续计算,监督与表征方法则决定已保留的信息能否学好。
三、解决方案分类与共同框架¶
图 2 本文按计算域、分辨率/上下文以及监督/分类三个约束维度建立的方法分类;为保证 A4 下的可读性,三个并列维度排为三行,同一行的两个方法框也表示并列路线,而非固定的前后处理步骤。
可以本文引用论文放到同一条处理流水线上。\(G\) 表示先用低成本方式看一眼全图,\(S\) 表示挑出值得继续处理的块或位置,\(F\) 表示在这些地方保留更多细节或上下文,\(D\) 表示输出类别和框,\(M\) 表示把不同块的结果拼回原图。论文中的“全局观察、选择、高保真处理、预测、融合”说的就是这五步,只是有些方法会省掉或合并某一步。
检测器内部常见的三个名称也可以按作用理解。骨干网络把像素逐步变成特征;neck 或 FPN 把不同分辨率的特征合并,让大目标和小目标各有可用层;检测头在这些特征上输出类别、置信度和框。后文说“跳过检测头”,表示骨干+neck可能已经算完;说“减少 neck 计算”,则表示更早就缩小了待处理特征。
以一张大图为例,最直观的两条基线是整图缩小和固定切片。整图缩小可写成 \(I\rightarrow I_\downarrow\rightarrow D(F(I_\downarrow))\),只运行一次检测器,但小目标像素减少。固定切片则把原图变成 \(\{W_j(I)\}\),每块都经过骨干、特征金字塔和检测头,局部框再映射回原图做 NMS。它保住了局部像素,也保留了空块、重叠区和重复预测的成本。OAN 在固定切片的后半段加一道门;CZDet、YOLC、GLSAN 和 UFPMP-Det 则只让少量候选区域进入第二次精检。
网络内部也有同样的“全算还是选着算”。骨干和 FPN 在第 \(l\) 层产生 \(P_l\in\mathbb R^{B\times C_l\times H_l\times W_l}\),普通检测头会在全部 \(B H_l W_l\) 个位置做分类和回归。加入 \(P_2\) 后,小目标有了更细的特征网格,检测头却也要在最大的特征图上逐点运行。QueryDet 让粗层告诉细层查哪些位置,CEASC 在检测头里用 mask 跳过位置,ESOD 还把选择提前到浅层特征,使 neck 也少处理一部分区域。它们仍要先产生某些密集特征,不能理解成整张高分辨率特征图从一开始就完全没有计算。
还有一组论文不负责“挑地方”,而是负责“把已经看到的地方学得更好”。普通检测器往往用固定 anchor 或特征点匹配真值框,每个类别也只有一个分类权重,骨干的上下文范围由固定卷积决定。LSKNet 改上下文范围,MSCD 改尺度知识的传递,DCFL 改正样本标签分配,SuperYOLO 用训练期重建约束特征,UFPMP-Det 则让一个类别拥有多个表示中心。用公式概括,普通密集检测是 \(\hat B=D(F(I))\);图像选区方法是 \(\hat B=M(\{D(F(R_j(I)))\}_{j\in\Omega})\);特征稀疏方法只在 \(\Omega\) 对应的位置运行检测头 \(D(F(I)|_{\Omega})\)。后文会先说明每个方法改动了哪一段,再进入具体公式。
3.1 张量形状的阅读约定¶
shape 表示一个张量的每一维分别装什么数据。本文统一用 NCHW 顺序:\(B\) 张图、每张 \(C\) 个通道、每个通道高 \(H\)、宽 \(W\)。例如 \(1\times3\times1024\times1024\) 表示一张三通道的 1024×1024 图,而 \(1\times256\times16\times16\) 表示同一批次的一张 256 通道特征图。这个写法只是为了追踪模块之间的数据,不表示所有作者代码在内存中都使用完全相同的布局。
| 符号 | 形状 | 含义 |
|---|---|---|
| \(B\) | 标量 | 批大小;大图部署通常为 1,但训练可大于 1。 |
| \(I\) | \(B\times C_{in}\times H\times W\) | 输入图像或已 resize 的裁块;\(C_{in}\) 随 RGB、红外或融合输入而变。 |
| \(P_l\) | \(B\times C_l\times H_l\times W_l\) | 第 \(l\) 个骨干/FPN 特征图。\(H_l,W_l\) 由输入尺寸和 stride 决定。 |
| \(N\) | 标量或长度维 | 当前图像中被保留的切片、裁块、候选位置或 proposal 数;它通常随内容变化。 |
| 框集合 | \(N\times4\) 或 \(N\times5\) | 水平框采用 \((x_1,y_1,x_2,y_2)\) 或等价参数;旋转框额外含角度。类别与置信度单独附着。 |
| 稀疏特征 | \(N\times C\) 或 \(N\times C\times H_p\times W_p\) | 仅把激活位置或被保留 feature patch 堆叠。 |
| \(K_{\mathrm{cls}},d_{\mathrm{reg}}\) | 标量 | 分类类别数与单位置框回归维度;它们随水平框、旋转框和 anchor 设计而变,不在不同基检测器之间强行统一。 |
\(H_l,W_l,C_l,N\) 说明模块保留或改变了哪一维,并不是跨论文通用的固定配置。 密集特征通常保留 batch 维;裁块、框和稀疏坐标的数量会随图像内容变化,所以常写成长度为 \(N\) 的表。除非另作说明,本文将这类 \(N\) 行表按单张图记;实际 batch 会分别保留每张图的表,或额外附一列 batch 索引,绝不跨图像配对。后文会逐一说明每个模块收到什么 shape、改变哪一维、输出什么。
3.2 源代码在方法解释中的位置¶
论文图告诉读者作者想做什么,源码则能确认程序实际在哪一步停止计算、坐标按什么顺序保存、训练与测试是否走同一条路径,以及默认参数怎样生效。因此,代码不是附带证明,而是方法说明的一部分。本文只保留会改变算法含义的短段,不罗列模型注册和框架初始化。
四、图像与切片级区域选择¶
4.1 OAN:在共享主干之后门控检测器¶
图 3 OAN 的完整大图检测流程:原图先切为重叠块,所有块共享骨干;OAN 预测网格 objectness map,门控器只把高于阈值的块送入检测头,再把局部框映射并合并。
固定切片会把原图分成许多块。不论一块里面有十个目标还是完全空白,它都要先过骨干,再过 FPN、RPN、RoI head 或一阶段检测头。OAN 不改变切片,也不重新生成自由形状区域;它只在骨干已经算出特征后判断“这块还有没有必要进入后半个检测器”。所以,它节省的是检测器后段,不是每张切片的骨干计算。用符号写,基线是 \(I\rightarrow\{W_j\}\rightarrow\{F_j\}\rightarrow\{D(F_j)\}\),OAN 在 \(F_j\) 与 \(D\) 之间加门。
若把整张 1024×1024 切片压成一个“有目标/无目标”的标签,微小目标的响应很容易被大片背景淹没,含目标的切片也可能被误筛掉。OAN 因而不直接训练整片二分类器,而是把判断拆成网格级 objectness:只要某个局部格保留高响应,整张切片仍会进入原检测器。这个辅助分支解决的是切片筛选的召回问题,并不在网格内直接完成类别识别或框回归。2
具体地,给定一张 1024×1024 的切片,OAN 从 ResNet 的 \(C_5\) 特征分出轻量分支,经一个 3×3 stride-2 卷积得到 16×16 的语义网格,再逐格预测 objectness activation。论文的结构图可把后两次逐格变换理解成 1×1 映射;作者公开实现则先按网格切分特征,再以两个全连接层完成同一位置的通道变换。目标框中心所在格被标为正样本,目标类别不参与这一分支的标签;Focal Loss 用于处理绝大多数网格为空的情形。训练后,一张切片先产生共享特征和 activation map,只有该 map 的最大值超过阈值,原先的检测头才接收这一张已经计算好的特征2。
shape 的变化可以按一张切片往下追。1024×1024 的 RGB 切片为 \(W_j\in\mathbb R^{B\times3\times1024\times1024}\),ResNet-50 的 \(C_5\) 输出为 \(B\times2048\times32\times32\)。一个 3×3、stride 2 的卷积把它变为 \(B\times256\times16\times16\)。作者配置取 \(S=16\),每个空间格因而只含一个 256 维向量。分格后,张量可看成 \(B\cdot16\cdot16\) 行,每行依次经过 \(256\to512\to1\) 的 MLP,再还原为 \(M\in\mathbb R^{B\times1\times16\times16}\)。
\(C_5\) 提供“这里像不像有物体”的高层语义,3×3 卷积负责降通道和对齐 16×16 网格,MLP 负责给每格打分。论文图中的“两个 1×1 卷积”可以理解为逐格共享的通道映射2。
设切片被划分为 \(S\times S\) 个网格,\(M(i,j)\in[0,1]\) 是第 \((i,j)\) 格的 objectness 分数。若任一真值框中心落入该格,标签 \(\hat P(i,j)=1\),否则为 0。OAN 的监督为
其中 \(\operatorname{FL}\) 是 Focal Loss。网格而非整块二分类的作用在于:一个只占切片很小面积的目标仍能在局部格上形成正监督,不会被整块背景比例淹没。对两阶段检测器,总损失为 \(L=L_{\mathrm{RPN}}+L_{\mathrm{box}}+L_{\mathrm{class}}+\lambda L_{\mathrm{OAN}}\);一阶段检测器去掉 \(L_{\mathrm{RPN}}\)。\(\lambda\) 只平衡辅助门控与原检测任务,并不直接控制推理时通过多少切片2。
官方实现摘录(oan.py、oan_obb_two_stage.py、oan_obb_single_stage.py 与 huge_img_inference.py):
x = self.oan_conv(x)
_, _, H, W = x.shape
x = self.grid_partition(x, grid_size=W // self.grid_num)
all_num_grid = x.size(0)
x = x.view(all_num_grid, -1)
x = self.fc1(x)
x = self.act(x)
x = self.fc2(x)
gt_list = img.new_ones(B, H // grid_size, W // grid_size)
gt_list[i, (cy // grid_size).long(), (cx // grid_size).long()] = 0
pred_label = F.sigmoid(x)
value, _ = torch.max(pred_label, dim=0)
return value <= self.filter_thr
x = self.extract_feat(img)
if self.oan.simple_test(x):
return [np.empty((0, 6), dtype='float32')] * len(self.CLASSES)
x = self.neck(x)
outs = self.bbox_head(x)
for win in windows:
data = collate([data], samples_per_gpu=1)
results.append(model(return_loss=False, rescale=True, **data))
for dets, win in zip(_cls_result, windows):
bboxes = bt.translate(dets[:, :-1], win[0], win[1])
这里 grid_partition 先把通道置到末维,再把 \(B\times16\times16\) 个位置拆成独立网格;当 \(W/\texttt{grid\_num}=1\) 时,view 的输入就是 \((B\cdot256)\times256\),fc1 和 fc2 的输出依次为 \((B\cdot256)\times512\) 与 \((B\cdot256)\times1\)。这给出上述 shape 的实现依据。代码还揭示一个容易混淆的标签约定:数学式中的 \(\hat P=1\) 表示“正样本”的二值事件,而 get_gt 中的 0 是唯一前景类别的类别索引,1 是背景索引;二者不是 objectness 概率的正负反转。
当前推理先把大图按固定窗口切成带重叠的 1024×1024 切片;超大图脚本在 for win in windows 中逐张处理,并以 samples_per_gpu=1 调用模型2。每张切片都会先经过骨干网络和 OAN。对第 \(j\) 张切片的第 \((u,v)\) 个网格,OAN 先输出一个实数 logit \(z_{j,u,v}\),再经 sigmoid 得到
这里 \(M_j(u,v)\) 是该网格的 objectness 分数:训练时,只要某个真值框的中心落入该格,它就是正样本,因此这个分数表示“该格是否可能含有目标中心”,不是类别概率,也不是最终检测框的置信度。1024×1024 切片被分成 16×16 格时,每格在输入图上约对应 64×64 像素;\(s_j\) 则是 256 个格中最高的 objectness 分数,用来回答“整张切片是否值得继续检测”。当 \(s_j\leq T\) 时,函数直接返回空框,neck 和 bbox_head 都不执行;当 \(s_j>T\) 时,整张切片的全部骨干特征 x 原样送入 neck 和 bbox_head。它不会把 map 中的高分格裁出来,也不会只让检测头计算某几个有效格或把多个有效切片重新组合成一个小 batch。全部窗口完成后,代码再按 win 的坐标偏移把各切片的框映回原图,并做合并 NMS。
图 3a OAN 从共享骨干特征压缩到 16×16 objectness map;红色高响应格对应包含目标中心的局部网格。
推理门控写为
其中 \(F_j\) 是第 \(j\) 张完整切片的共享骨干输出,\(M_j\) 是对应的 16×16 activation map,\(T\) 是激活阈值,\(f_\Theta\) 表示 neck 与检测头的后半段计算,\(\varnothing\) 是直接返回的空结果。门关闭时并不计算 \(f_\Theta(0)\)。论文给出以最近 2,000 次 activation map 的均值和标准差估计 \(T\) 的统计式;固定仓库则默认 generate_dy_thr=False,DOTA 配置直接给 filter_thr=0.18。即便开启统计函数,该函数也只累计数值而没有把新值写回 filter_thr,所以这个固定提交的实际阈值应按配置中的固定值理解2。
OAN 的优点是改动位置靠后,不需要另建区域网络,也不改变原检测头。网格中任一小区域出现高分就能保留整块,比整块二分类更不容易淹没微小目标;作者在五种检测器和多个场景中都报告了提速2。
更具体地说,这个“网格推理”在固定提交中只完成了切片级的筛选,并没有完成网格级的后续计算。simple_test 把 256 个 sigmoid 分数取最大值后只返回一个布尔量;代码并未保留高分网格的坐标集合
也没有把 \(\mathcal A_j\) 变成 neck 或检测头能够使用的裁块、稀疏坐标或特征索引2。因此,一格超过阈值时,整个 1024×1024 切片的骨干特征仍会原样进入后半段;其余 255 格中的低分背景并不会被跳过。16×16 map 的空间信息在当前推理中只用于提高“该切片应保留”的召回,而没有真正控制切片内部哪些位置继续计算。
它的缺点也由此分成两层:所有切片仍要先经过主干;被保留的切片又仍按完整面积运行 neck 和检测头。检测头本来就轻、空片比例不高,或主干占总时延较大时,收益都会缩小;一格高响应也会让同片的大量背景继续参与计算,这里处理的不够细致。反过来,门控阈值产生的假阴性会直接变成不可恢复的漏检,切片分类准确率也不能单独反映这种目标级风险。
4.2 CZDet:把密度区域变成检测器自己的一个类别¶
图 4 CZDet 的训练与推理:密度裁块被标为新增类别,推理时检测并放大后进行第二次共享检测。
高分辨率航拍图若先缩到检测器的常规输入尺寸,小目标会在 resize、后续下采样和背景响应中继续变弱;均匀裁片虽能提高局部像素尺度,却不会随目标只在少数位置聚集的分布调整。密度裁块希望把第二遍检测留给真正拥挤的区域,但常见做法还要接入密度图或聚簇提议网络,使选区与检测成为两套训练、两套误差链。3
常规的粗到细检测通常需要一个独立密度估计器先给出 RoI,再把 RoI 交给检测器。CZDet 把这一步改写成数据收集和标注问题:在整理训练数据时,根据真值目标的空间聚簇得到矩形区域,并把每个区域标成新增类别 density crop。因此,同一个检测器在第一遍既输出基础类别,也输出“这里应该再放大一次”的新类别的框(RoI),网络结构本身只增加一个分类通道。
density crop 不是新增的一类待识别物体,而是“这里值得放大复检”的选区标签。训练时,由真值预先生成的裁块标签给检测器一个稳定的密集区定义;测试时,同一类别预测出的置信度又筛出进入第二遍的候选区域。这样,选区、基础类别检测和候选置信度都由同一个检测器产生。3
数据收集时,先扩张用于生成新增类别的真值框,再按两两 IoU 的连通关系反复合并,得到包含密集小目标但面积不过大的候选。每个候选在原图训练样本中保留为 density crop 标注,同时额外从原图裁出、缩放为另一张训练图像,裁块内部的原有基础目标框也同步变换。于是训练时检测器同时见到“带 crop 类的全局图”和“只含放大后基础目标的局部图”;推理时它才有能力先预测 crop,再识别 crop 内更大的目标3。
缩小后的全局图本来就可能难以识别其中的大量微小目标;把密集裁块放大后加入训练集,会使裁块内目标以更大的像素尺度出现,减轻全局图与局部图之间的极端尺度差异,也让第二遍推理的输入不脱离训练分布。3
CZDet 改变的是送入检测器的图像,不是某个固定检测头。对 batch 内单张图,缩放后的全局输入为 \(I_g^{(b)}\in\mathbb R^{C_{in}\times H_d\times W_d}\);由数据收集和标注得到、或由第一遍预测得到的 \(N_{\mathrm{crop}}\) 个 density crop,其坐标表为 \(D\in\mathbb R^{N_{\mathrm{crop}}\times4}\)。第 \(i\) 个框回到原图裁切后,图像 shape 为 \(C_{in}\times h_i\times w_i\);不同聚簇区的 \(h_i,w_i\) 可以不同。
官方裁块辅助函数的 CROPSIZE=512 是默认实参,实际训练或推理调用可以被配置覆盖;它把裁块短边缩放到所给尺寸并保持长宽比。因此输出应写成 \(C_{in}\times h_i'\times w_i'\),不能都写成 512×512。裁块标注模块把许多真值框归并为 \(N_{\mathrm{crop}}\) 个区域,cropper 改变目标在输入中的像素尺度,坐标模块记录平移与缩放,供第二遍框回到原图。基检测器可以是 Faster R-CNN 或 FCOS,它们的 proposal 和 anchor 形状不同,因而没有必要伪造一个统一的检测头输出 shape3。
官方实现摘录(box_utils.py 与 crop_utils.py):
connectivity = (overlaps > cfg.CROPTRAIN.CLUSTER_THRESHOLD)
cluster_members = bboxes.tensor[cluster_components]
x1, y1 = cluster_members[:, 0].min() - 20, cluster_members[:, 1].min() - 20
x2, y2 = cluster_members[:, 2].max() + 20, cluster_members[:, 3].max() + 20
crop_area = np.array([int(x1), int(y1), int(x2), int(y2)])
transform = Resize(CROPSIZE)
crop_region = torch.as_tensor(crop_region.transpose(2, 0, 1))
crop_region = transform(crop_region)
这段代码对应一种固定的两阶段实现,而不是 Algorithm 1 的逐字翻版。程序先把每个真值框整体向外扩 20 像素,在形成一个聚簇裁块时又在最小外接矩形四周各留 20 像素;compute_crops() 连续调用两次 compute_one_stage_clusters()。因此,不能把这段代码简单说成“只执行一次 \(\sigma=20\) 的扩张”。它把 \(\vartheta\) 落到 CLUSTER_THRESHOLD,并将裁图与缩放分为两个明确阶段。保留长宽比意味着回映时必须同时记录横、纵方向的实际缩放因子;把 \(h_i',w_i'\) 误写成固定方形会掩盖这一坐标变换。
图 4a CZDet 的密度裁块标签生成算法。3
图 4a 的 Algorithm 1 只在收集训练样本、补充 density crop 标注时使用,不参与测试时的 crop 置信度筛选、第二遍检测或 NMS。输入是一张原图的真值框集合 \(B=\{b_a\}_{a=1}^{n_0}\),其中 \(b_a=(x_{1a},y_{1a},x_{2a},y_{2a})\in\mathbb R^4\);输出是训练中新增类别的裁块框集合 \(D\)。为使状态变化清楚,以下用上标表示合并轮次:
这里 \(\sigma\) 是每个真值框向外留出的像素边距,\(D^{(r-1)}\in\mathbb R^{n_{r-1}\times4}\) 是第 \(r\) 轮开始时的候选框表,\(O^{(r)},C^{(r)}\in\mathbb R^{n_{r-1}\times n_{r-1}}\)。\(C\) 是经过阈值化的 IoU 邻接矩阵,只表示一跳重叠关系,并不是已经求出的完整连通分量。
每一轮先根据当前 \(D^{(r-1)}\) 重新计算 \(O^{(r)}\) 和 \(C^{(r)}\),再清空本轮的新集合 \(D^{(r)}\)。内层贪心步骤选择直接重叠邻居最多的种子框
并把集合 \(S_{a^*}\) 中框的最小外接矩形加入 \(D^{(r)}\):
论文伪代码随后将所选行写为 \(C_{a^*}=0\),再继续处理其余行;本文不把这一步扩写成“已经找到了全部连通分量”。一轮结束后才统一执行 \(D^{(r)}\leftarrow\operatorname{filter\_size}(D^{(r)},\pi)\),保留满足 \(|d|/|I|\le\pi\) 的裁块。\(|d|\) 与 \(|I|\) 分别是裁块和原图面积,\(\pi\) 是最大面积比例,不是边长或 resize 上限。外层固定执行 \(N\) 轮;下一轮面对的是刚合并出的较大矩形,原本未直接相交的两个目标簇便可能在新的尺度上继续合并。\(\sigma,\vartheta,N,\pi\) 依次控制留白、邻接强度、合并轮数和裁块面积上限3。
固定提交的代码与这份伪代码仍有边界差别。代码把两次 compute_one_stage_clusters() 作为具体的两轮实现;最大连接数为 1 时立即停止,不为孤立框生成裁块,也不会移除这个孤立框。只有处理连接数大于 1 的组时,代码才从候选中一并移除该组成员。论文的 filter_size(D, \pi) 按最终裁块面积过滤,代码却以成员面积比例的规则跳过某些组,两者不能视为等价实现。上述差异解释了代码如何落地,不应反过来改写 Algorithm 1 的含义。
图 4b CZDet 以同一检测器预测并复检 density crop,与独立区域提议或固定切片的多阶段路径形成对照。3
局部训练样本和第二遍推理都必须同步更新坐标。若裁块左上角为 \((x_d,y_d)\),宽高为 \((w_d,h_d)\),检测器输入为 \((W,H)\),则裁块内点 \((x,y)\) 的输入坐标为 \(((x-x_d)W/w_d,(y-y_d)H/h_d)\),预测框回到原图时执行逆变换。这个仿射映射把第一遍的 crop 框、第二遍的基础类别框和原图坐标系接在一起;过细长或过大的 crop 会令坐标记录、插值取整和后续检测器 resize 更敏感,从而放大映射误差。
CZDet 的优点是把选区任务交给原检测器,只增加一个类别,无须独立密度网络。第二遍只处理预测到的局部,密集区中的小目标会以更大的像素尺度再次进入同一检测器。
它的缺点是 crop 类的召回决定了第二遍能看到什么。训练时的聚簇规则若与测试场景不一致,或某个大聚簇因面积规则没有获得相应的 density crop 标签,第一遍就较难学到稳定的选区依据;论文没有交代测试是否还按同一面积条件过滤。测试时第一遍 crop 置信度过低,区域便不会进入局部精检。两次检测、可变形状 resize 和坐标回映也会增加时延与几何误差。
4.3 YOLC:从中心热图中直接寻找少量聚簇区¶
该工作面对的并不只是小框回归不准,而是航拍图像中的信息与计算分布不匹配:整幅图像很大,目标本身又小,车辆和行人却常聚在少数区域。把整图缩小会压缩这些目标的有效像素;按固定网格逐块检测虽能放大局部,却会让大量纯背景块也进入检测器。已有聚簇裁块方法能够压低背景计算,但往往要分别检测每个裁块,或增加额外的区域提议网络,速度和模型复杂度仍是代价。YOLC 的出发点是在保留全图检测的同时,只为少量密集区域再做局部精检。5
图 5 YOLC 以高分辨率中心热图产生少量密集裁块,全图与裁块共享检测器。5
YOLC 需要从同一套全图预测中判断“哪里有目标、哪里已经形成聚簇”,因而需要一张既保留位置又能反映局部密度的中间图。作者选择以关键点为中心的无 anchor 检测器 CenterNet 为起点:每个目标中心在热图上对应一个高响应峰,峰的位置可用于检测。LSM 并不把连续热图直接当作密度图,而是先取出高响应位置,再统计它们在规则网格中的聚集程度;这样便可复用检测器的热图来选区,不必另接一个区域提议网络5。
作为基线,CenterNet 从整图特征预测中心热图和框参数,再直接输出全图检测结果。对于极小目标,原始热图相对输入缩小 4 倍,目标中心可能只剩少数甚至一个热图点;它既不足以稳定定位,也无法可靠地决定哪些位置值得第二次处理。YOLC 因而将热图提升到接近输入尺度,使它同时服务于中心监督和区域调度。
这里增加的不是第二套选区网络。热图支路在一层卷积后接两层反卷积,把中心热图恢复到与全图输入相同的空间尺度;它仍是 CenterNet 的中心预测输出,却能给 LSM 提供足够细的空间位置。论文还在中心峰解码前施加 Gaussian filter,用以平滑同一目标附近的多峰并抑制假阳性;原文没有给出滤波核参数,也没有说明它是否以同一实现作用于 LSM 输入。5
把测试过程看成“先用整图找密集区,再回到原图放大这些区域”。第一遍检测并不只给出粗框,还给出一张与图像位置对应的中心热图:某个位置的分数越高,表示模型越相信附近有目标中心。它不是一组已经完成的检测框,也不直接等于目标个数。LSM 不直接在热图上检测目标,而是把它转换成少量待裁的原图矩形。为避免符号混淆,下面把保留的高密度网格数记为 \(K_g\),把网格合并后最终保留的裁块数记为 \(k\);二者都只是调度数量,不是类别数或目标数5。
实际测试按以下六步进行:
- 将整张图送入检测器一次,得到全图的粗检测框和高分辨率中心热图。粗框覆盖整图,热图则指出哪些位置可能有目标中心。
- LSM 用阈值把热图变成二值位置图:高于阈值的位置记为 1,其他位置记为 0。一个值为 1 的位置只是“中心候选”,并不能直接当成一个已经确定的目标框。
- 在二值位置图上覆盖规则网格,并统计每个网格内为 1 的位置数。例如,论文的算法示意将图划为 \(16\times10\) 个格子。计数高表示该小块内中心候选更聚集,并不等于已经去重后的真实目标数。
- 将所有格子按这个计数排序,保留 top-\(K_g\) 个密集格子作为候选。\(K_g\) 控制进入下一步的格子数,避免把整幅图重新逐块检测;此时保留的仍是网格单元,不是最终裁块。
- 把边或角相接的候选格子合并成一个矩形区域;再按面积排序,至多保留 \(k\) 个区域,并向四周扩 1.2 倍。合并让一个跨越多个格子的目标簇只对应一块裁图,外扩则尽量保住边缘目标及其邻域。
- 用这些矩形从原始高分辨率图中裁出真实像素,resize 后送入同一个检测器做第二遍精检。论文的融合规则是在裁块对应区域以精检框替换第一遍粗框,并不再对全图结果额外执行一次 NMS;它没有进一步给出框归属或重叠裁块的处理细则。
前面的六步涉及三套尺寸和坐标:传感器得到的原图、第一遍全图检测的输入,以及第二遍局部检测的输入。论文说明了“从原图裁出密集区、resize 后复检”的过程,却没有公开全图 resize/pad 的具体坐标规则。下面的 \(T_g\)、\(S_{g\to o}\) 和 \(T_d\) 因而只是为说明数据流引入的记号,不是 YOLC 额外增加的网络模块;若第一遍没有改变原图尺度,\(T_g\) 与 \(S_{g\to o}\) 都可以看作恒等映射。
| 记号 | 形状或坐标系 | 在流程中的含义 |
|---|---|---|
| \(I_o\) | \(\mathbb R^{C_{in}\times H_o\times W_o}\) | 原始航拍图像;\(C_{in}\) 是输入通道数,\(H_o,W_o\) 是原图高、宽。 |
| \(I_g\) | \(\mathbb R^{C_{in}\times H_g\times W_g}\) | 第一遍送入检测器的全图输入。\(T_g\) 记录从 \(I_o\) 到它的预处理。 |
| \(H_{\mathrm{hr}}\) | \(\mathbb R^{K_{\mathrm{cls}}\times H_g\times W_g}\) | 与 \(I_g\) 同空间尺度的类别中心热图;\(K_{\mathrm{cls}}\) 是类别数。 |
| \(M\) | \(\{0,1\}^{H_g\times W_g}\) | Algorithm 1 实际接收的二维二值位置图。值为 1 只表示中心候选,并不等于一个已确定目标。 |
| \(R_j^g,R_j^o\) | 各为一个矩形 | 第 \(j\) 个裁块在全图输入坐标、原图坐标中的位置。为便于书写,下文采用 \((x_1,y_1,x_2,y_2)\) 表示矩形。 |
| \(I_j^c\) | \(\mathbb R^{C_{in}\times H_d\times W_d}\) | 从原图裁出第 \(j\) 个区域后,送入第二遍检测器的局部输入。 |
| \(\mathcal B^g,\mathcal B_j^c,\hat{\mathcal B}\) | 框集合 | 分别为全图粗框、局部精检框和融合后的输出框。 |
把 batch 维暂时省略,一张图的流程可写为
第一行的 \(T_g\) 是全图的预处理,第二行的 \(D_\theta\) 是参数为 \(\theta\) 的检测器;两次调用共享同一套 \(\theta\)。全图调用同时取出已解码的粗框 \(\mathcal B^g\) 与高分辨率中心热图 \(H_{\mathrm{hr}}\)。YOLC 用一层卷积和两层反卷积把原本相对输入缩小 4 倍的 CenterNet 热图恢复到 \(H_g\times W_g\),使热图位置与全图输入位置一一对应5。
第三行特意没有把 \(H_{\mathrm{hr}}\) 直接传给 LSM。Algorithm 1 的输入是二维二值图 \(M\),所以要先把多类别热图变成一张位置图,再按热图阈值 \(\eta\) 二值化。\(\mathcal A\) 仅表示这个“从类别维得到位置响应”的步骤;论文没有说明它采用逐类并集、最大值还是其他规约,不能把它擅自写成某一种实现。\(\Pi_{\mathcal B}\) 也只是“从检测器输出中取框”的记号,局部调用产生的热图在此不参与后续计算。后文 GWD 的 \(\tau\) 是另一项损失超参数,和这里的 \(\eta\) 没有关系。
LSM 在第四行中被压缩为一个算子,其内部的离散选择可展开为
其中,\(G_{ab}\) 是规则网格的第 \((a,b)\) 个单元,\(q_{ab}\) 是其中中心候选的个数;它衡量候选聚集程度,不是去重后的真实目标数。\(\mathcal G\) 保留计数最高的 \(K_g\) 个格子,\(\operatorname{CC}_{8}\) 把边或角相接的格子组成八邻域连通块,\(\operatorname{box}\) 为该连通块的最小外接矩形。论文先按面积排序,最多留下 \(k\) 个矩形,再由 \(\operatorname{enlarge}_{1.2}\) 将它们外扩为原来的 1.2 倍,故 \(n_R\leq k\)。这也说明 \(K_g\) 是候选网格数,而 \(k\) 才是实际复检的裁块数5。
第五、六行处理的是容易被省略的坐标转换。\(R_j^g\) 位于 \(I_g\) 坐标系,\(S_{g\to o}\) 用第一遍预处理记录把它还原为原图矩形 \(R_j^o\),并以同一规则把全图粗框 \(\mathcal B^g\) 换到原图坐标;随后才从 \(I_o\) 裁真实像素。\(T_d\) 则记录裁块 resize 或 pad 到 \(H_d\times W_d\) 的过程。若 \(T_d\) 仅是无 padding 的缩放,且 \(R_j^o=(x_{1j},y_{1j},x_{2j},y_{2j})\)、\(w_j=x_{2j}-x_{1j}\)、\(h_j=y_{2j}-y_{1j}\),局部框 \(b_j^c=(x_j^c,y_j^c,w_j^c,h_j^c)\) 的 \(x_j^c,y_j^c\) 为中心坐标,则
也就是说,中心坐标要先按裁块比例放大再加上裁块左上角偏移,框宽和高只按同一比例放大。若实际预处理含 padding 或其他几何变换,还要先撤销这些变换;论文没有给出这部分规则,因此不能用上式替代真实实现。末行的 \(\operatorname{replace}_{\mathrm{paper}}\) 同样是概念算子:论文只说明以对应区域的精检结果替换粗结果且不再做全图 NMS,没有公开粗框归属、重叠裁块冲突等判定细则。它把两套已经回到原图坐标的框集合合成 \(\hat{\mathcal B}\),而不是让热图本身参与框融合5。
前面的选区与放大只解决“在哪里看得更大”,并不会自动改进框回归。原始 CenterNet 将中心热图、框尺寸和中心偏移分别优化:\(L_{\mathrm{det}}^{\mathrm{base}}=L_k+\lambda_{\mathrm{size}}L_{\mathrm{size}}+\lambda_{\mathrm{off}}L_{\mathrm{off}}\)。其中 \(L_{\mathrm{size}}\) 通常逐项比较宽、高,\(L_{\mathrm{off}}\) 校正离散热图坐标带来的中心偏移。论文指出,逐坐标的 \(L_1\) 对尺度变化敏感,也不能表达中心、宽和高共同构成的整体定位质量;相同的 \(L_1\) 未必对应相同的 IoU。因此,作者把一个水平框整体表示为二维高斯,并用 GWD 同时度量中心差异和尺度差异。5
YOLC 还修改了框回归目标。下面的 \(B=(x,y,w,h)\) 是水平框,\((x,y)\) 为框中心、\(w,h>0\) 为宽和高;下标 1、2 分别表示预测框和与它匹配的真值框。它把一个框临时表示为二维高斯 \(\mathcal N(\mu,\Sigma)\),其中
这里的 \(\mu\) 记录框中心,\(\Sigma\) 的两个对角元素由半宽、半高的平方构成;它不是检测器额外预测出的不确定性。对两个水平框,这种表示的二阶 Wasserstein 距离可化为
前两项是中心偏差,后两项是尺度偏差。\(W_2\) 是几何距离,不是类别置信度或 IoU;两个框完全相同时它为 0。论文取 \(f(z)=\ln(1+z)\),再用调节常数 \(\tau\) 控制距离到 affinity/loss 的转换,并在实验中设 \(\tau=1\):
再给出 GWD 与 \(L_1\) 联合的损失表达
\(L_k\) 是 CenterNet 的改进 Focal Loss,用于中心热图;\(L_1\) 延续尺寸回归约束;两个 \(\lambda\) 是平衡不同损失数值范围的权重。论文还给出 \(\tau=1\) 时的导数
大框在训练初期常有较大的 \(W_2\),上式的分母随之增大,GWD 的梯度会变小;因此作者保留 \(L_1\) 来维持大目标的尺寸学习。论文的损失小节给出了上述 GWD+\(L_1\) 表达,但没有把检测头中初始框、精检框及其他分支的全部损失汇总关系逐项公开;它足以说明回归项的设计,不能据此虚构一张完整的实现级损失图5。
高分辨率热图负责保留小目标中心,GWD 改变框的监督方式,检测头本身还需要适应细小目标的边界。常规卷积在固定 3×3 采样格上提取回归特征,而有效纹理和边界未必正好落在这些固定位置。回归支路因而并行预测初始框与偏移场,把偏移限制在初始框内,再由可变形卷积在自适应采样位置生成细化框;初始框和细化框分别接受真值监督,前者提供粗定位,后者承担位置与尺寸细化。5
图 5a YOLC 的检测头:高分辨率类别中心热图支路与带可变形卷积的初始—细化回归支路。5
热图支路则在普通卷积和两层反卷积之后,以按类别分组的卷积分别产生各类别的中心热图。这样的拆分让不同类别学习各自的细粒度响应,并减少一条分支同时拟合全部类别中心的负担;输出仍是类别中心热图,可同时服务于中心检测和 LSM 的位置选择。对该支路,热图张量为 \(H_{\mathrm{hr}}\in\mathbb R^{K_{\mathrm{cls}}\times H_g\times W_g}\);回归支路的偏移通道数取决于可变形卷积配置,原论文没有公开一个可跨实现复用的固定值。5
YOLC 的优点是区域选择直接复用中心热图,不需要另做 crop 标注,也不需要独立选区网络。高分辨率热图既提供检测中心,又提供密集区域,通常只需少量裁块。
它的缺点也来自这两个任务共用一张热图:热图漏掉小目标时,LSM 会同时失去检测证据和调度依据。网格、阈值和 top-\(K\) 对城市密度、飞行高度和传感器尺度敏感;局部替换的坐标若有偏差,边缘目标可能重复保留,也可能被整片删掉。
五、特征与位置级稀疏计算¶
图像裁块一次至少保留一个矩形,矩形内部的背景仍会完整计算。特征级方法把单位缩小为一个 feature patch,甚至特征图上的一个点,因此能跳过更多背景。代价是张量不再规则整齐,程序要额外建立坐标索引、调用稀疏卷积并处理每张图都不同的激活数量。QueryDet 在 FPN 层与层之间传位置,CEASC 在检测头内部生成 mask,ESOD 则从浅层骨干后就开始选块。
5.1 QueryDet:由粗层查询细层¶
图 6 QueryDet 的完整流程:查询位置由低分辨率 FPN 层逐级传到高分辨率层,分类、回归和下一层查询均在稀疏位置执行。1
普通 FPN 检测器即使加入了更细的 \(P_2\),也会把同一套分类、回归卷积密集地作用于 \(P_5\) 到 \(P_2\) 的全部位置。小目标需要 \(P_2\) 的细节,却只覆盖其中很小一部分位置;瓶颈由此落在检测头,而不是先前已经生成 \(P_2\) 的骨干和 FPN。
这里有一个不能颠倒的先后关系:常规分类与回归头负责给出最终类别和边界框,若先在细层的每个位置完成这两类预测,再用分数筛掉背景,想省掉的高分辨率密集检测头已经执行完了。要在这部分开销发生之前决定哪些细层位置值得访问,就需要一条先在较粗层运行、只追求高召回定位的分支。QueryDet 因而在较粗的 FPN 层并列加入 query head。它不输出类别或初始框,只给出“这个栅格是否接近本层定义的小目标”的单通道概率;其正样本范围由后文的 \(D_l(x,y)<s_l\) 给出。粗层给出的只是足以调度细层的位置,而非最终定位;只有被许可的位置才继续取得细层特征并进入分类、回归头。query head 的作用不是重复检测,而是把“先在哪儿算”与“目标是什么、框在哪里”分成两个任务。1
它保留密集骨干和 FPN,并在各层增加 query head。推理从较粗层开始,query score 超过阈值的点被映射到相邻高分辨率层,取出相应的 value features;分类、回归和下一次 query 都只在这些索引上执行,直至 \(P_2\)。原检测头的卷积权重被重用为 sparse convolution,因此改动发生在检测头的空间计算,而非特征金字塔的生成。级联传递而不从粗层直接跳到 \(P_2\),是因为一次映射会把很小的粗层候选扩展成大面积的细层位置,迅速抵消稀疏性1。
第 \(l\) 层原本是完整特征图 \(P_l\in\mathbb R^{B\times C_l\times H_l\times W_l}\)。query head 为每个空间位置输出一分,得到 \(V_l\in\mathbb R^{B\times1\times H_l\times W_l}\)。阈值化后,不再保存整张分数图,而是只保存激活位置的坐标 \(Q_l\in\mathbb R^{N_l\times3}\) 和对应特征 \(Z_l\in\mathbb R^{N_l\times C_l}\)。三列坐标按 \((b,y,x)\) 排列,\(N_l\) 是真正要继续计算的位置数,通常远小于 \(B H_lW_l\)。
相邻细层的长宽扩大 2 倍,所以一个粗层点会展开成至多 4 个细层 key;去重前有 \(N_{l-1}\le4N_l\)。gather 从仍然密集的 \(P_{l-1}\) 中取出这些行,sparse convolution 只处理它们。分类与回归输出分别为 \(N_l\times d_{l,\mathrm{cls}}\) 和 \(N_l\times d_{l,\mathrm{reg}}\),尾维随 RetinaNet、FCOS 或 RPN 的类别和框参数而变化。query head 负责找位置,坐标展开负责跨 stride 对齐,gather 负责取特征,sparse head 才真正省去其余位置的检测头卷积。公开快速推理代码还限制 \(B=1\),因此算法公式中的 batch 维不等于该实现支持任意部署批量1。
图 6a QueryDet 的 FLOPs 分解:加入高分辨率 \(P_2\) 后,密集检测头成为主要成本;CSQ 只保留被查询位置以降低该部分计算。1
若第 \(l\) 层查询位置为 \(q_l^o=(x_l^o,y_l^o)\),相邻的第 \(l-1\) 层空间尺寸扩大 2 倍,则它映射为四个 key:
所有目标查询的 key 并集构成稀疏索引 \(\mathcal K_{l-1}\)。实现时用这些索引从密集 FPN 特征 \(P_{l-1}\) 取出 value feature,再把原四层密集检测头的卷积权重装入 sparse convolution。下一层 query 只能从当前已激活位置继续产生,因此计算域沿 \(P_5\rightarrow P_4\rightarrow P_3\rightarrow P_2\) 逐级细化;若直接把一个粗层位置一次映射到 P2,候选面积会随层差指数扩大,稀疏性很快消失。
官方实现摘录(qinfer.py):
N, _, qh, qw = query_logits.size()
assert N == 1
pidxs = torch.where(torch.sigmoid_(query_logits).view(-1) > self.score_th)[0]
y = torch.div(pidxs, qw).int()
x = torch.remainder(pidxs, qw).int()
sparse_features = feature_value.view(fc, -1).transpose(0, 1)[sparse_inds]
sparse_indices = torch.stack(
(torch.zeros_like(sparse_ys), sparse_ys, sparse_xs), dim=-1)
sparse_tensor = spconv.SparseConvTensor(
sparse_features, sparse_indices.int(), (fh, fw), 1)
pidxs 是一维展平索引,除以 qw 得到 \(y\),取余得到 \(x\),故代码坐标顺序确为 \((b,y,x)\)。每个 key 周围还会展开一个边长为 \(2\cdot\texttt{context}+1\) 的邻域,以保证 3×3 检测头卷积具有所需上下文。于是代码中应区分目标 key 数 \(N_{\mathrm{key}}\) 与包含邻域后的 sparse_indices 行数 \(N_{\mathrm{ctx}}\ge N_{\mathrm{key}}\):前者决定最终需要取回的预测,后者决定稀疏卷积实际访问的特征位置。这个区别解释了为什么公式中的 4 倍坐标展开不是最终 CUDA 张量的精确行数。
训练仍采用密集分类/回归,query target 由目标中心到特征位置的距离生成,使用 Focal Loss;P2 样本数量远大于其他层,故各层损失需重新加权,防止小目标层主导优化。推理才启用 CSQ。方法能接入 RetinaNet、FCOS 以及两阶段 RPN,说明其抽象单位是 FPN 空间位置而非特定 anchor 形式1。
具体地,设第 \(l\) 层小目标中心集合为 \(\{(x_l^o,y_l^o)\}\),任一特征位置 \((x,y)\) 到最近中心的距离为
其中 \(s_l\) 是原文用于定义本层小目标及其 query 正样本范围的阈值,\(V_l^*\) 是 query 真值图。第 \(l\) 层的联合损失为
\(U_l,R_l,V_l\) 分别是分类、框回归和查询输出,带星号者为真值,\(L_r\) 在 RetinaNet 实现中为 Smooth \(L_1\),\(\beta_l\) 用来压低 P2 海量样本对总梯度的支配。训练保持密集是为了让 query head 在所有位置得到稳定监督;推理才根据阈值 \(\sigma\) 取 \(V_l>\sigma\) 的位置执行级联稀疏计算1。
QueryDet 的优点是保留 \(P_2\) 对小目标的细节,同时省去高分辨率检测头的大部分逐点卷积;同一思路还能接到 RetinaNet、FCOS 和两阶段 RPN 上。
它的缺点是骨干与 FPN 仍要生成高分辨率特征,节省范围只在检测头。论文还观察到两类失败:查询位置正确但检测头定位失败时,选择召回高也不等于检测质量高;大目标位置被误激活时,精度未必下降,稀疏率却会变差1。
5.2 CEASC:稀疏检测头中的全局上下文补偿¶
图 7 CEASC 由 CESC 与 AMM 构成:前者补偿稀疏卷积的上下文,后者按 FPN 层自适应控制掩码激活率。7
在普通检测头中,每个 FPN 层都要经过四个密集 Conv-GN-ReLU 层,分类和回归支路也被迫在相同位置做计算。直接删去背景位置虽能降 FLOPs,却会让小目标失去周围统计信息;把所有图像都设成同一个稀疏率,又会混淆空旷图像和拥挤图像。CEASC 因而把“哪些位置算”和“被跳过背景如何仍参与归一化”分开处理。
稀疏化后并非只剩“保留多少位置”一个问题。航拍图像的前景比例会随飞行高度、观察视角和 FPN 层而变化:固定激活率偏高时,背景计算仍然很多;偏低时,前景及其邻域又可能覆盖不全。即使 mask 没有漏掉目标,常规稀疏卷积和归一化也只接触激活元素,背景上下文与稳定统计量会一并缺失。AMM 处理前一个数量问题,CESC 处理后一个表示问题:前者让被选位置仍能利用整层特征的统计信息,后者决定这一层应激活多少位置。7
对第 \(i\) 个 FPN 输入 \(X_i\),分类支路和回归支路先各自预测 mask,再仅在 mask 为 1 的位置执行原有的 3×3 卷积。与此同时,CESC 从完整 \(X_i\) 经点卷积得到全局特征 \(G_i\),把 \(G_i\) 的统计量和残差信息送回每个稀疏层;因此背景不会被逐点卷积,却仍影响激活位置的归一化。训练期另保留密集辅助支路,用其特征约束稀疏支路,同时由 AMM 根据该层正样本比例约束 mask 激活数;推理时密集辅助支路和随机采样都删除,只按确定性的 mask 执行稀疏卷积7。
第 \(i\) 层输入为 \(X_i\in\mathbb R^{B\times C_i\times H_i^{\mathrm{sp}}\times W_i^{\mathrm{sp}}}\)。分类和回归各自产生一张单通道 mask,shape 都是 \(B\times1\times H_i^{\mathrm{sp}}\times W_i^{\mathrm{sp}}\)。假设其中 \(N_i\) 个位置为 1,数学上只有这 \(N_i\) 处做 3×3 卷积。官方接口并没有先把它们整理成 \(N_i\times C_i\) 的特征表,而是把完整 \(X_i\)、硬 mask 和活动坐标一起交给自定义 CUDA 内核。
CESC 的 1×1 卷积在完整输入上产生 \(G_i\in\mathbb R^{B\times C_i\times H_i^{\mathrm{sp}}\times W_i^{\mathrm{sp}}}\),它与稀疏层 shape 相同,可以提供全图均值、方差和残差。mask network 决定哪些坐标执行重卷积,CESC 保留被跳过背景的统计,密集辅助分支在训练期提供同 shape 教师特征,AMM 则把激活比例 \(N_i/(B H_i^{\mathrm{sp}}W_i^{\mathrm{sp}})\) 拉近这一层的正样本比例。这里 mask 负责省计算,\(G_i\) 和教师分支负责降低稀疏化带来的信息损失7。
图 7a CEASC 细节:AMM 用激活率监督 mask,CESC 将全局特征 \(G_i\) 送入 CE-GN,并只在二值 mask 激活处执行 3×3 稀疏卷积。7
对第 \(i\) 个 FPN 层,输入 \(X_i\in\mathbb R^{B\times C\times H\times W}\) 经共享的 3×3 mask kernel 得到 soft score \(S_i\)。二值掩码定义为
其中 \(g_1,g_2\) 是独立 Gumbel 噪声,\(\tau\) 是温度,\(\sigma\) 是 sigmoid。训练时前向得到硬 0/1 决策,反向仍借助 Gumbel-Softmax 的连续近似传梯度;推理时去掉随机噪声。分类头和回归头分别预测 \(H_i^{\mathrm{cls}}\) 与 \(H_i^{\mathrm{reg}}\),因为分类需要判别纹理,回归更关注边缘与几何位置,两者不应被同一掩码强行绑定7。
官方实现摘录(sparseconv_utils.py 与 sparse_conv_net.py):
if not self.training:
hard = (x >= 0).float()
return Mask(hard)
self.nonzero_hard = torch.nonzero(hard[0][0], as_tuple=True)
if self.training:
return self._slow_forward(input, hard, pw, self.weight, self.bias, gn)
return self._fast_forward(input, hard, pw, self.weight, self.bias,
self.isbias, self.base, gn)
训练支路的 _slow_forward 先执行密集 F.conv2d,再以 mask 和 MSE 一致性约束近似稀疏结果;推理支路才调用自定义 Sparse_conv2d CUDA 算子。因此“稀疏卷积加速”是官方代码的 inference fast path,而不是训练时已经减少所有卷积。hard[0][0] 还说明该实现的 fast path 只支持 batch size 1;上文保留 \(B\) 是为了描述算法张量,但若直接复用该仓库部署,必须把这一约束计入吞吐评估。
设第 \(j\) 个稀疏卷积层的输出为 \(L_{i,j}\),点卷积提取的全局特征为 \(G_i\),上下文增强归一化为
\(w,b\) 是可学习仿射参数。常规 sparse GN 只用激活位置估计统计量,目标很少时均值和方差不稳定;CE-GN 改用完整 \(G_i\) 的统计量,并以残差补回压缩的背景上下文。训练期密集分支输出 \(C_{i,j}\),一致性损失
只比较掩码激活位置,避免要求稀疏分支重建所有背景。\(L\) 是 FPN 层数,每个检测子头含 4 个 Conv-GN-ReLU 层7。
固定 90% 稀疏率之类的手工规则无法适应不同图像与 FPN 层。AMM 由检测器标签分配结果计算每层正样本比例,并惩罚预测 mask 激活率与该比例的偏差。总损失由检测损失、稀疏—密集特征一致性损失和 mask 比例损失组成7。
AMM 的目标激活率来自已有标签分配器。若 \(C_i\) 是第 \(i\) 层分类真值,则
\(\operatorname{Pos}\) 统计前景或激活元素,\(\operatorname{Numel}\) 统计全部元素。总目标为 \(L_{\mathrm{total}}=L_{\mathrm{det}}+\alpha L_{\mathrm{norm}}+\beta L_{\mathrm{amm}}\)。这项约束只规定一层大致激活多少位置,不直接保证每个目标都在 mask 内;检测损失和密集一致性负责提供另两项训练信号。
CEASC 的优点是把“减少位置”和“保留背景统计”分开处理,分类与回归还能各自选择不同位置,也不需要像 QueryDet 那样跨层传递查询。论文在 GFL V1 上报告 GFLOPs 下降约 71.4%、FPS 提升约 60%7。
它的缺点是训练期保留密集辅助路径,训练成本并不稀疏;公开 fast path 还受 batch size 1 和自定义 CUDA 内核限制。GFLOPs 与 FPS 的降幅不同,实际收益对硬件和稀疏算子实现很敏感。
5.3 ESOD:从“先找再检”扩展到颈部与检测头¶
图 8 ESOD 复用骨干浅层进行 object seeking,在特征域自适应切片,并用稀疏检测头输出结果。4
若只在检测头稀疏化,浅层高分辨率特征仍需完整通过 neck;若另建图像级筛选器,筛选和检测又会各做一次特征提取。ESOD 把选择器接在共享浅层特征之后,并让它产生一个类别无关的 objectness mask。这个 mask 不是额外的结果,而是后续两处计算共同依赖的控制信号。
共享浅层特征只解决了“不要重复提特征”,还要决定浅层究竟预测什么。论文没有让 ObjSeeker 在这里直接回归粗框:浅层特征容量有限,小目标的框回归不稳定;只预测 density map 又主要反映中心数量,不能保证保留完整前景。于是 ObjSeeker 只输出类别无关的 objectness mask,把“前景在哪里”与“属于哪一类、框多大”分开;后两项仍由后续 neck 和检测头完成。4
一张测试图的路径为“浅层骨干特征 \(F\) \(\rightarrow\) ObjSeeker 输出 \(\hat M\) \(\rightarrow\) AdaSlicer 依据 \(\hat M\) 取前景 feature patch \(\rightarrow\) neck 只处理这些 patch \(\rightarrow\) SparseHead 只在 \(\hat M\) 的候选中心卷积 \(\rightarrow\) 局部框”。这样,先找物体和再检测使用同一份浅层特征。
浅层骨干输出 \(F\in\mathbb R^{B\times C_s\times H_s\times W_s}\),ObjSeeker 把它压成单通道 objectness 图 \(\hat M\in[0,1]^{B\times1\times H_s\times W_s}\)。测试时,AdaSlicer 把 mask 中的激活中心变成区域表 \(D\in\mathbb R^{N_P\times5}\),每行保存 \((b,x_1,y_1,x_2,y_2)\)。按这些坐标切出的固定大小 feature patch 堆叠为 \(F_P\in\mathbb R^{N_P\times C_s\times H_P\times W_P}\)。
从这一步开始,neck 的 batch 维不再是原图数,而是被选 patch 数 \(N_P\)。neck 只聚合这些块,SparseHead 又把 mask 中的候选中心整理为 \(N_a\times C_h\) 的特征表,只在 \(N_a\) 行上分类和回归。ObjSeeker 把整张浅层特征变成前景几何,AdaSlicer 把不规则前景装进规则 patch batch,neck 处理被选块,SparseHead 处理块内候选点4。
neck 只处理已选 patch 后,patch 内仍有大量非目标位置;若检测头恢复为密集卷积,检测头这一段的冗余仍会保留。为避免这一段重新变成密集计算,SparseHead 直接复用 ObjSeeker mask 的局部极大值作为卷积坐标,而不再学习第二张 head mask。这会把检测头计算限制在候选中心,并避免额外 mask 分支带来的参数、计算和优化负担;类别判断与精确框回归仍由检测头在这些中心完成。4
ObjSeeker 还需要把框标注变成像素级监督。由框生成的 Gaussian 能稳定给出中心与范围,却不能表示目标的精确外形;SAM 伪掩码可补充形状先验,但原论文指出它对小目标会漏检。混合标签因此同时保留两者共同确认的区域,并在 SAM 为空时退回 Gaussian,避免初筛分支得到空监督。4
对真值框 \((x_c,y_c,w,h)\),Gaussian 先验为
使中心响应为 1、框边界响应为 \(\tau\)(论文取 \(\tau=0.5\))。设 SAM 伪掩码为 \(M^S\),混合监督为
Hadamard 乘积把 SAM 的形状边界限制在框中心先验内;当 SAM 完全漏掉小目标时回退到 Gaussian,避免产生空监督。ObjSeeker 用 Focal Loss 与 Dice Loss 按 20:1 组合,前者处理像素正负不平衡,后者约束整体前景重叠4。
图 9 ESOD 的 ObjSeeker 监督:Gaussian mask 提供稳定的框内中心先验,SAM mask 提供形状信息但可能漏掉小目标,混合 mask 将两者相乘并在 SAM 为空时回退。4
掩码给出的是零散激活位置,后续 neck 却需要固定大小的 feature patch。若仍按规则网格均匀切分,目标容易跨块,保留块内也会留下许多背景,无法充分节省后续聚合计算。AdaSlicer 的职责正是把这些不规则前景位置组织成少量固定尺寸的矩形 patch:先以候选中心放置块,再平移块以覆盖更多激活位置,从而把可供 neck 处理的规则输入与前景选择联系起来。4
AdaSlicer 将 \(\hat M\) 的局部最大值当作候选中心,将局部均值当作尺度线索;它先放置固定大小的 feature patch,再平移 patch,使同一 patch 覆盖更多激活而少带背景。完整贪心算法每次选出一个 patch、删除已覆盖中心并继续迭代;简化算法从规则候选一次并行筛选、平移,速度更高但更容易截断跨 patch 的大目标。无论使用哪种实现,只有这些 patch 进入后续 neck,SparseHead 也只在保留 mask 中心处卷积4。
设浅层特征为 \(F\),预测掩码为 \(\hat M\),AdaSlicer 输出
\(N_P\) 是最终特征块数量,\((H_P,W_P)\) 是固定块尺寸,\(F_N\) 是 neck,\(H_{\mathrm{sp}}\) 是只在掩码局部峰值处计算的稀疏头,\(B'\) 是局部预测。完整算法先用 3×3 max pooling 找中心,用 9×9 average pooling 估计目标尺度,再从最大目标开始初始化块;通过 \(\Delta x=\min x_a-x_1\)、\(\Delta y=\min y_a-y_1\) 平移左上角,以缩掉空边并覆盖更多激活点。每轮删去已覆盖中心,直到候选为空。简化算法取消循环并行处理规则候选,因此速度更高,但大目标更容易跨块被截断4。
官方实现摘录(train.py 与 common.py、common.py):
# train.py
pred = model((imgs, [masks]) if (use_gt and warmup_flag) else imgs,
hm_only=opt.hm_only)
# HeatMapParser.forward
if self.training:
return self.uni_slicer(x, mask_pred, self.ratio, self.threshold, device)
total_clusters = self.ada_slicer_fast(mask_pred, self.ratio, self.threshold)
for bi, clusters in enumerate(total_clusters):
for x1, y1, x2, y2 in clusters:
patches.append(x[bi, :, y1:y2, x1:x2])
offsets.append(torch.tensor([bi, x1, y1, x2, y2]))
return torch.stack(patches), torch.stack(offsets).to(device)
# HeatMapParser.uni_slicer
patches = _slice(feat)
return patches, self.grid_off
这段代码同时固定了两个容易混淆的事实。其一,use_gt and warmup_flag 为真时,训练脚本把 (imgs, [masks]) 传入模型;warm-up 结束后,模型只接收 imgs。真值 mask 因此是掩码相关模块的 warm-up 输入条件,不能被表述成“真值 mask 生成训练期自适应裁块”。其二,HeatMapParser.forward 的训练分支无条件调用 uni_slicer,而 uni_slicer 的 _slice(feat) 只按规则网格切分完整特征;mask_pred 没有参与筛除这些 patch。只有推理分支调用 ada_slicer_fast,由阈值和局部极大值生成 offsets 中的自适应块。
规则训练切片给检测器提供覆盖整张浅层特征的 \(B\cdot\texttt{ratio}^2\) 个 patch,不会因为早期预测 mask 不可靠而让某一区域失去检测监督。测试时才只保留 AdaSlicer 选中的块,所以训练和推理的 patch 组织并不相同。
ESOD 的优点是一个浅层 objectness mask 同时控制 feature slicing 与 SparseHead。它不仅少算检测头,也让 neck 少处理大量背景,比只在后段门控的 OAN 和只稀疏检测头的 QueryDet 覆盖更多计算阶段。
它的缺点是同一张 mask 连续控制裁块、特征聚合和候选中心。一次漏激活会沿三个模块传递,并同时影响框覆盖与中心访问;训练期规则切片和测试期自适应切片还带来明确的计算组织差异。
六、全局—局部协同与超分辨率¶
把局部裁大以后,目标像素会增多,但读者也容易忽略一个代价:裁块外的道路、水域和整体布局消失了。若对整图做超分辨率,重建成本又会很高。GLSAN 保留一条全图粗检和一条局部细检路径,并只对小子区做 SR;SuperYOLO 则完全不在测试时输出 SR 图,而是把重建当作训练信号。两者都提到超分辨率,实际改动的一个是推理流程,一个是训练特征。
6.1 GLSAN:全图粗检、聚类选区与局部超分辨率¶
图 10 GLSAN 的全局粗检、自适应区域选择、局部超分辨率与精检融合。12
整图缩放把整幅场景压到检测器输入尺寸,能保住全局布局却丢掉小目标细节;把原图均匀裁块则使每个局部块都具有细节,却多次运行检测器并切断远处上下文。GLSAN 不把两条路径二选一,而是先让一张低分辨率全图给出全局预测,再用这份预测决定少量原图子区是否值得做局部处理。
一次测试的顺序是“缩放全图 \(I_\downarrow\) \(\rightarrow\) 共享检测器粗检 \(d(I_\downarrow)\) \(\rightarrow\) 粗框写入 OS map \(\rightarrow\) SARSA 聚类、padding 得到子区 \(I_i^c\) \(\rightarrow\) 仅对足够小的子区做 LSRN \(\rightarrow\) 同一检测器精检 \(\rightarrow\) 局部框回映并与全局框 NMS 融合”。SARSA 不需要额外训练,它对 OS map 中高置信坐标做 K-means,将拥挤目标组成固定数量的区域,再用以中心为基准的 padding 限制裁块尺寸和长宽比;实际裁取始终回到原始图像,而不是在已缩放全图上二次裁剪12。
对 batch 内第 \(b\) 张图,缩小后的全图输入为 \(I_\downarrow^{(b)}\in\mathbb R^{C_{in}\times H_g\times W_g}\)。粗检测得到 \(N_g\) 个水平框,坐标表为 \(B^l\in\mathbb R^{N_g\times4}\),类别和置信度另行保存。把框的置信度铺回空间后得到二维 OS map \(OS\in\mathbb R^{H_g\times W_g}\),阈值化后只留下 \(N_q\) 个坐标点 \(Q\in\mathbb R^{N_q\times2}\) 供 K-means 聚类。
粗检输出的是一组彼此独立的框,局部精检却需要数量受控的矩形区域。SARSA 因而不直接逐框裁图:它先把每个粗框的 objectness 写回覆盖位置形成 OS map,阈值去掉低分坐标,再把余下位置交给 K-means。这样既保留粗框的空间范围,也不让低可信区域进入后续选区;论文没有定义多个粗框覆盖同一像素时应如何聚合,本文不把它补写成 max 或 sum。12
SARSA 把这些点归为 \(N_r\) 个矩形。第 \(i\) 个矩形回到原图裁出后是 \(C_{in}\times h_i\times w_i\),小裁块经 LSRN 变为 \(C_{in}\times\tilde h_i\times\tilde w_i\),再由共享检测器 resize 到固定接口。全局检测器把整图压成粗框,OS map 把框恢复为空间密度,SARSA 决定裁哪里,LSRN 只改变小裁块尺寸,坐标模块记录每个局部块在原图中的位置12。
用 \(d(\cdot)\) 表示共享检测器,\(I\) 表示缩放全图,\(I^c\) 表示从原始图像裁出的子区,\(I^s\) 表示经 LSRN 放大的子区,最终结果为
其中 \(\operatorname{merge}\) 是坐标回映后的 NMS。若全局粗框集合为 \(B^l=\{(b_k^l,p_k^l)\}\),GLSAN 在粗框覆盖的像素上写入分数,形成
\(\alpha\) 是全图下采样比例,\(Q\) 是进入 K-means 的高置信坐标集合,\(t_{\mathrm h}\) 排除低分背景。这里不是直接对框中心聚类:一个高置信粗框在 OSmap 中贡献一片坐标,因而面积和置信度都会影响聚类密度。K-means 将 \(Q\) 分为 \(N\) 簇,逐簇取最小外接矩形;论文默认 \(N=4\),过小会把相距很远的密集区合成大块,过大则增加局部推理次数12。
offsets_per_img, part_imgs_per_img = self_adaptive_crop(
results[i]['instances'].pred_boxes.tensor.cpu().numpy(), image,
self.cluster_num, self.crop_size, self.padding_size, self.normalized_ratio)
part_result = self.batched_inference(aug_inputs_per_img, detected_instances,
do_postprocess)
part_offset = torch.tensor(offset[i]).to(self.device).flip(0)
part_offset = part_offset.repeat(part_boxes.shape[0], 2)
merged_boxes.append(part_boxes + part_offset)
self_adaptive_crop 保存的偏移是图像数组切片顺序 \((y_1,x_1)\),而检测框是 \((x_1,y_1,x_2,y_2)\),故合并前代码先 flip(0),再重复为 \((x_1,y_1,x_1,y_1)\)。这正是式 \(\operatorname{merge}\) 中“坐标回映”的具体操作;若将 offset 表误写成直接可加的 \((x,y)\),局部框会在两轴上错位。
对外接矩形 \((x_1,y_1,x_2,y_2)\),SARSA 先计算中心 \((x_0,y_0)=((x_1+x_2)/2,(y_1+y_2)/2)\),再令
最终裁块以 \((x_0,y_0)\) 为中心、宽高为 \((w^c,h^c)\)。交叉放入另一维尺寸的一半,是为了把长宽比约束在约 \([0.5,2]\);\(S_{\mathrm{th}}\) 则阻止过小裁块被强行拉伸。这个 padding 不是普通边界留白,而是在检测器固定输入尺度下同时控制目标有效放大倍数和裁块形状。
裁块从原图取回并不意味着细节已经足够:极小子区仍需适配检测器的固定输入接口,普通 bicubic 或 resize 只会放大采样点,不能补充小目标的语义细节;把最小裁块阈值调大也不能产生新信息。LSRN 因而只为尺度较小的裁块提供可学习的放大,而不是先对整幅原图做一次高成本超分辨率。12
LSRN 采用 EDSR 思路,但训练集没有真实成对高分辨率图像,作者把原图作为重建目标、其 0.5 倍 bicubic 图作为输入。测试时只对尺度低于阈值的裁块运行 LSRN,较大裁块直接 resize,以避免无收益的 SR 计算。同一检测器在训练中既要处理缩小全图,也要处理裁切、放大的局部图,两类输入的尺度分布不同;SARSA 产生的裁块和 LSRN 输出因此也被加入检测训练集,使共享权重见过这两类输入。12
图 11 GLSAN 的 LSRN:训练时把原图当重建目标、二次下采样图当输入;推理时只把尺度低于阈值的原图子区送入 LSRN。12
若第 \(i\) 个子区尺度为 \(s_i^c\),局部输入按条件写为
\(S_{\mathrm{sr}}\) 是是否执行 SR 的尺度阈值,论文取 500 像素。这里 \(s_i^c=\sqrt{h_iw_i}\):它是裁块面积 \(h_iw_i\) 的平方根,等价于同面积正方形的边长,而不是直接以面积判定。该条件避免对最终仍会被 resize 缩小的大裁块浪费 SR 计算,也防止把“是否裁块”和“是否超分”误解为同一个决策。12
GLSAN 的优点来自三条信息同时保留:原图裁块带回真实像素,LSRN 增强小块细节,全图粗结果补充局部裁剪之外的目标和场景。相比只做局部裁切,它不会完全丢掉全图预测。
它的缺点是一条较长的级联误差链。粗检测漏掉的目标不会进入聚类;固定 \(K\) 在极稀疏和极密集图像上都可能产生不合适的区域;由自降采样数据训练的 SR 只学到设定退化,面对真实传感器模糊、压缩和噪声时可能失配。全局与局部两次检测也形成固定时延。
6.2 SuperYOLO:把超分辨率留在训练期¶
图 12 SuperYOLO 的像素级多模态融合与辅助 SR 分支。在作者的 VEDAI 配置中,实线检测路径接收 512\(\times\)512 输入;虚线 SR 分支以 1024\(\times\)1024 RGB/IR 图像为重建目标并输出同尺寸结果,只在训练期使用。11
局部超分并不是利用高分辨率信息的唯一形式。上一节的 GLSAN 在测试时先挑出小裁块,再通过 SR 增强细节,因此重建网络仍属于部署路径。SuperYOLO 面向另一种输入条件:RGB 和红外已像素级配准,既要避免两套检测骨干造成的重复计算,也不希望把 SR 网络串在检测器前。它把多模态融合提前到骨干入口,把 SR 改成训练期的重建约束;测试时只保留一条 YOLO 检测路径。1112
原 YOLOv5 的 Focus 模块会把隔点像素重排到通道维,缩小空间网格以减少后续卷积;代价是小目标的空间关系在网络入口就被压缩。遥感小目标本来只占几十个像素,作者因而去掉 Focus。模型仍以 \(H/n\times W/n\) 的低分辨率输入控制计算,去掉 Focus 只是避免又发生一次过早的分辨率损失。11
推理路径从低分辨率 \(I_{\mathrm{RGB}},I_{\mathrm{IR}}\) 开始:YOLOv5 的 Focus 模块被移除,以免奇偶像素重排过早损失空间结构;两模态经紧凑的像素级 MF 模块融合为 \(F_o\) 后,只通过一条 YOLO 主干和检测头输出框。论文图示把 MF 概括为通道注意与跨模态空间调制;固定提交的作者代码中,两条单模态 SE 调用被注释掉,实际运行的是两次 1×1 mask、残差增强、48/16 通道投影以及拼接后的一个 SE 模块。部署时既没有第二条骨干,也没有 SR 图像生成步骤11。
若 RGB 和 IR 各走一条骨干再融合,特征提取会随模态数重复;若到预测结果再融合,又需保留多套检测结果。MF 被放在骨干之前,是为了把同一坐标的两路输入先合成一条特征流,后续只运行一次主干和检测头。11
两路输入已经像素级配准。RGB shape 为 \(I_R\in\mathbb R^{B\times3\times H/n\times W/n}\),红外为 \(I_I\in\mathbb R^{B\times1\times H/n\times W/n}\),\(n\) 是输入下采样因子。MF 不改变高和宽,只把 RGB 路投影为 48 通道、IR 路投影为 16 通道,再输出 \(F_o\in\mathbb R^{B\times64\times H/n\times W/n}\)。从这里往后只有一条 YOLO 主干。
即使入口不再用 Focus,主干内连续的 stride=2 仍会把检测特征缩到远小于输入的网格,普通上采样难以找回已经丢失的纹理和模式。因此,SR 不在检测器前面生成一张部署图,而是在训练时从共享主干分出重建支路,用高分辨率目标把空间细节的约束回传给主干。它同时取低层和高层:低层保留局部纹理与模式,高层携带语义;先把高层上采样到低层网格后融合,再由编码器—解码器生成重建图。11
SR 分支只在训练时读取共享主干的低层特征 \(F_{\mathrm{low}}\in\mathbb R^{B\times C_L\times H_L\times W_L}\) 和高层特征 \(F_{\mathrm{high}}\in\mathbb R^{B\times C_H\times H_H\times W_H}\),解码为重建图 \(S\in\mathbb R^{B\times C_{out}\times H_{\mathrm{HR}}\times W_{\mathrm{HR}}}\)。MF 负责把同一坐标的 RGB/IR 信息合成一条 64 通道特征流;SR decoder 负责用高分辨率目标约束共享特征。测试时 decoder 和 \(S\) 都不再出现11。
图 13 SuperYOLO 对 MF 的概念图:图中画出了单模态 SE 与空间调制的设计意图。该图不等同于固定提交中的逐语句执行顺序;下文以作者代码说明,单模态 SE 调用在该版本中被注释,实际 SE 位于 48+16 通道拼接之后。11
设下采样并配准的两模态为 \(I_R\) 和 \(I_I\),令 \(r_3(\cdot)\) 表示把单通道图复制到 3 个 RGB 通道。代码实际先把两路缩放为 \(0.5I_R,0.5I_I\),再用 1×1 卷积生成空间调制图 \(m_R=f_R(0.5I_R)\)、\(m_I=f_I(0.5I_I)\),并执行
\(\odot\) 是逐元素乘,分号表示通道拼接。直接拼接两幅图会默认所有位置和通道同等可靠;MF 因而以 1×1 mask 做每路的空间筛选,以残差避免 gate 抑制掉原始纹理,再在拼接后用 SE 重标定联合通道。固定提交中,两路张量在 torch.cat 之前没有互相作为对方的输入,因此模态间的信息交互从拼接后的 SE 开始,而不是由两张 mask 显式交换。这里把每路都预先经过 SE 或把 mask 解读为对方模态产生的调制,只对应论文图示的概念化描述,不应被当作该提交版本的实际算子顺序。由于融合发生在骨干之前,部署只需一条骨干,但它也要求 RGB/IR 像素级配准;若两模态错位,逐元素乘会把几何误差直接写入融合特征11。
官方实现摘录(common.py):
x_left = x_left_ori * 0.5
x_right = x_right_ori * 0.5
x_mask_left = self.mask_map_r(x_left).repeat(1, 3, 1, 1) * x_left
x_mask_right = self.mask_map_i(x_right) * x_right
out_IR = self.bottleneck1(x_mask_right + x_right_ori) # 16 channels
out_RGB = self.bottleneck2(x_mask_left + x_left_ori) # 48 channels
out = self.se(torch.cat([out_RGB, out_IR], 1)) # 64 channels
这段实现把公式中的通道数、广播和残差位置固定下来:repeat(1, 3, 1, 1) 不是一般的跨模态注意力,而是为 1 通道 RGB mask 匹配 RGB 的 3 个通道;最终 64 通道来自 48+16,而不是任意 \(C_f\)。更直接地看,在 torch.cat 之前 x_left 只参与 RGB 路的表达式,x_right 只参与 IR 路的表达式;该版本的代码实现的是两路同模态 gate 加一次融合后 SE,而非原始输入层的显式交叉 mask。这个差异说明多模态模型必须同时说明论文图、固定代码版本和两个输入的 channel 维。
这条 SR 支路的尺寸关系如下。训练样本先保留一对像素级配准的 1024\(\times\)1024 图像:\(X_R\in\mathbb R^{B\times3\times1024\times1024}\) 为 RGB,\(X_I\in\mathbb R^{B\times1\times1024\times1024}\) 为 IR。检测主干实际接收的却是它们经二倍双线性下采样后的 \(I_R=D_2(X_R)\in\mathbb R^{B\times3\times512\times512}\) 与 \(I_I=D_2(X_I)\in\mathbb R^{B\times1\times512\times512}\)。在固定的 RGB+IR+MF 配置中,SR decoder 以这条 512\(\times\)512 检测路径上的低、高层特征为输入,输出由三通道 RGB 与一通道 IR 组成的 \(S\in\mathbb R^{B\times4\times1024\times1024}\)。也就是说,1024\(\times\)1024 图像在训练时既是下采样的来源,也是重建监督的目标;检测头从不直接在该尺寸上运行11。
这一配置中的中间 shape 也能从固定代码逐层对上。512\(\times\)512 融合输入在 SRyolo_MF.yaml 的第 4 个主干输出处形成 \(F_{\mathrm{low}}\in\mathbb R^{B\times128\times128\times128}\),第 8 个输出处形成 \(F_{\mathrm{high}}\in\mathbb R^{B\times512\times32\times32}\)。decoder 先把高层特征上采样到 128\(\times\)128 并与低层特征融合为 64 通道,再由 EDSR 的 \(\times8\) pixel-shuffle 上采样得到四通道 1024\(\times\)1024 重建结果。低层负责保留局部纹理和边界,高层提供更大的语义范围;二者结合后才要求同一组共享特征同时满足检测与重建11。
作者这样安排,是在小目标细节与部署成本之间取折中。若让 noFocus 检测器直接处理 1024\(\times\)1024 输入,论文表 IV 的计算量为 81.5 GFLOPs;改为 512\(\times\)512 后是 20.4 GFLOPs。直接缩小虽然省下约四分之三的计算,却会压缩车辆的纹理、边缘和相对位置。SR 分支因此不是要在测试时生成一张“更清晰的检测图”,而是要求共享骨干仅凭 512\(\times\)512 输入,也能解码回 1024\(\times\)1024 的像素内容;重建误差的梯度迫使低、高层特征保留对微小目标有用的空间信息。测试时 decoder 被删去,\(S\) 不送入检测头,部署仍是 512\(\times\)512 的单条检测路径。这里有一处论文内部的表述差异:Figure 2 的图注写 MSE,而损失函数小节的式 (8) 写 \(L_1\);固定训练代码也调用 torch.nn.L1Loss()。下文以损失小节和代码共同支持的 \(L_1\) 为准11。
为便于写出损失,将两路高分辨率监督图沿通道记为 \(X=[X_R;X_I]\),并以 \(S\) 表示对应的四通道重建结果。原论文采用的重建项为
\(l=0,1,2\) 表示三个输出层上的定位、目标置信度与分类损失,\(a_l,b_l,c_l\) 是层权重,\(c_1,c_2\) 是论文层面的任务权衡。作者公开训练脚本在启用 --super 时把这一项写为 \(L_{\mathrm{impl}}=L_o+0.1L_s\);在 RGB+IR 模式下,\(L_s\) 是 RGB 三通道重建误差与 IR 单通道重建误差之和。SR 的梯度通过共享骨干回传,所以推理删除解码器后仍能保留训练期学到的高分辨率表征偏好11。
官方训练与返回逻辑摘录(为标清本实验下的张量大小,首行和行尾注释由本文补充;train.py、SRyolo.py、deeplabedsr.py 与 edsr.py):
# paper configuration: image / ir_image are 1024×1024 supervision targets
image = imgs.to(device, non_blocking=True).float() / 255.0
ir_image = irs.to(device, non_blocking=True).float() / 255.0
if down_factor > 1: # 1024 // 512 = 2
imgs = F.interpolate(image, size=[i // down_factor for i in image.size()[2:]],
mode='bilinear', align_corners=True)
irs = F.interpolate(ir_image, size=[i // down_factor for i in ir_image.size()[2:]],
mode='bilinear', align_corners=True)
pred, output_sr, _ = model(imgs, irs, opt.input_mode) # detector sees 512×512
loss, lbox, lobj, lcls = compute_loss(pred, targets.to(device))
if opt.super:
if opt.input_mode == 'IR':
sr_loss = 0.1 * torch.nn.L1Loss()(output_sr, ir_image)
elif opt.input_mode == 'RGB':
sr_loss = 0.1 * torch.nn.L1Loss()(output_sr, image)
else:
sr_loss = 0.1 * (
torch.nn.L1Loss()(output_sr[:, 0:3], image) +
torch.nn.L1Loss()(output_sr[:, 3:], ir_image[:, 0:1]))
loss += sr_loss
if self.training:
if self.sr:
output_sr = self.model_up(y[self.l1], y[self.l2])
return x, output_sr, y
return x, y
因而 0.1 是启用 --super 后该脚本采用的实现权重,并不是论文中已经固定的 \(c_2\),也不是命令行的默认训练状态:--super 用 store_true 定义,未显式传入时为关。RGB+IR 模式的重建损失确实拆成 RGB 三通道和 IR 一通道两项,而不是只对 IR 监督。model_up 仍只在训练分支被调用。这一实现细节支持“SR 是训练期辅助”的结论,却不能被扩展为“推理时仍执行 SR 后再检测”。
论文损失的三层记号也不能直接照搬到这个固定配置。SRyolo_MF.yaml 把 P4/16、P5/32 的 anchor 和 head 都注释掉,只保留 P3/8 的一个检测输出(SRyolo_MF.yaml 与 第 62–72 行):
anchors:
- [10,13, 16,30, 33,23] # P3/8
# - [30,61, 62,45, 59,119] # P4/16
# - [116,90, 156,198, 373,326] # P5/32
# [[17, 20, 23], 1, Detect, [nc, anchors]]
[[17], 1, Detect, [nc, anchors]]
所以固定提交中的 \(L_o\) 只有一个 P3/8 输出项;论文式 (9) 仍用于说明原文的三层损失写法,两者不能混为同一条实际计算路径。固定提交只保留 P3/8,并把 P4/16、P5/32 输出注释;这不是常规三层 YOLO 头的必然形式。论文在 VEDAI 的消融中将其归因于该数据中的目标主要处于小尺度,因而去掉面向中、大尺度的两条输出支路。这个理由只覆盖该数据与配置,不能外推为所有遥感检测都应删掉 P4/P5。11
SuperYOLO 的优点是把两种额外成本留在训练或输入端:RGB/IR 在骨干之前融合,检测阶段只运行一条主干;SR 解码器只在训练时提供重建监督,部署时不再生成高分辨率图。
它的缺点是不能恢复低分辨率输入中原本不存在的真实高频信息。\(L_1\) 重建追求像素保真度,与分类可分性和定位敏感性并不完全一致;RGB 与红外没有严格配准时,像素级 gate 会把错位直接写入融合特征。它也不负责选择超大图中的处理区域。
七、尺度交互、感受野与知识迁移¶
这一组方法不裁图,也不直接跳过背景位置。它们处理的是另一层问题:目标已经进入网络后,模型应该看多大范围的周围环境,以及同一目标在不同缩放尺度上学到的知识怎样汇到一次推理中。LSKNet 改骨干的空间感受野,MSCD 则只在训练期增加多尺度分支。
7.1 LSKNet:对每个空间位置选择感受野¶
图 14 LSK 模块以串行分解大核产生多级感受野,再进行空间位置相关的核选择。8
固定卷积骨干为每个位置给出相同的感受野。遥感图中的港口、道路、跑道和孤立车辆却依赖不同范围的背景:范围过小看不到结构关系,范围过大又会混入无关纹理。LSKNet 的目标不是把背景位置跳过,而是在检测器进入 FPN、RPN 或预测头之前,把常规 backbone 替换为能按空间位置选择上下文范围的 backbone。
这里不是把所有卷积核一律换大。小目标仅靠局部外观难以区分时,需要借助周围场景;但足球场、环岛和道路交叉口所需的范围并不相同。统一使用一个大核只能给出一种上下文范围,计算代价也高;若仍沿用按通道选择卷积核的做法,又无法表示同一张图不同位置的范围需求。因此,作者先用串行 depth-wise 大核显式留下由小到大的多个候选感受野,再在空间维度上为每个位置选择其中更合适的一项。8
因此其数据流始终是 \(I\rightarrow\) 多个 LSK backbone stage \(\rightarrow\) 标准检测 neck/head \(\rightarrow\hat B\),训练和推理没有额外的选区或辅助分支。每个 LSK 模块串行堆叠逐渐增大的卷积核和 dilation 的 depth-wise convolution,产生多个理论感受野;各级特征经 1×1 卷积压缩、拼接后,由平均池化、最大池化和轻量卷积生成位置相关的选择图,再逐位置组合这些候选并调制输入特征。它改变的是送给下游检测器的表征,而不是下游需要处理的图像面积8。
图 14 展示的是 block 内负责空间选择的 LSK 模块,而不是完整的 LSKNet block。完整 block 还包含随后的 FFN 残差子块:LSK 处理“这个位置该看多大范围”,FFN 负责通道混合与特征细化。论文没有把 FFN 设为另一条选区或蒸馏分支;它与 LSK 一起构成可替换的 backbone block。8
LSK 模块的输入和输出 shape 相同,都是 \(B\times C\times H\times W\),所以它可以直接替换普通 backbone block。输入 \(X\) 依次经过多个 depth-wise convolution,得到若干 \(U_i\in\mathbb R^{B\times C\times H\times W}\)。这些卷积只改变每个位置能看到的范围,不改变空间网格。每个 \(U_i\) 再经 1×1 卷积压到 \(C'\) 通道,成为 \(\tilde U_i\in\mathbb R^{B\times C'\times H\times W}\)。
\(N_k\) 个候选拼成 \(B\times(N_kC')\times H\times W\),池化和轻量卷积为每个位置产生 \(N_k\) 个选择权重 \(A\in\mathbb R^{B\times N_k\times H\times W}\)。末端投影把选择结果还原为 \(Y\in\mathbb R^{B\times C\times H\times W}\)。depth-wise 分支产生不同感受野,1×1 卷积控制通道成本,\(A\) 决定每个 \((h,w)\) 更依赖哪个范围。这里 \(N_k\) 是卷积核候选数,不是裁块数量8。
上面的 \(N_k\) 是便于推导的通用记号。作者公开的 LSKNet 默认模块实际固定 \(N_k=2\):第一支为 5×5 depth-wise 卷积,第二支在第一支输出上再接 7×7、dilation=3 的 depth-wise 卷积。后者的有效核为 19×19,与前面的 5×5 串联后理论感受野为 \(5+(19-1)=23\),因此两个候选分别对应 5 和 23 的累计感受野;它们不是任意数量的并行大核。
大核分解需要满足
其中 \(k_i,d_i,RF_i\) 分别是第 \(i\) 个 depth-wise convolution 的核大小、dilation 和累计理论感受野。\(d_i\le RF_{i-1}\) 用来避免采样点之间出现未被前级覆盖的空洞。特征递推为 \(U_0=X,\ U_{i+1}=F_i^{dw}(U_i)\),每级再用 1×1 卷积得到 \(\tilde U_i\)。因此串行结构不只近似一个大核,而是显式保留 \(N_k\) 个逐渐扩大的上下文候选8。
候选拼接 \(\tilde U=[\tilde U_1;\ldots;\tilde U_{N_k}]\) 后,沿通道做平均池化与最大池化,轻量卷积输出 \(N_k\) 张空间图:
每个像素位置拥有一组独立的核选择权重 \(\sigma(\widehat{SA}_i)\),这是 LSK 与按通道选择 kernel 的 SKNet 的核心区别。同一幅图中的港口、跑道与孤立车辆可以使用不同的上下文范围,而不必整图共享一个核尺度8。
官方实现摘录(lsknet.py):
self.conv0 = nn.Conv2d(dim, dim, 5, padding=2, groups=dim)
self.conv_spatial = nn.Conv2d(dim, dim, 7, padding=9, groups=dim, dilation=3)
attn1 = self.conv0(x)
attn2 = self.conv_spatial(attn1)
attn1 = self.conv1(attn1) # B, C/2, H, W
attn2 = self.conv2(attn2) # B, C/2, H, W
sig = self.conv_squeeze(agg).sigmoid() # B, 2, H, W
attn = attn1 * sig[:, 0].unsqueeze(1) + attn2 * sig[:, 1].unsqueeze(1)
return x * self.conv(attn)
这里 padding=2 与 padding=9 保持两条张量的 \(H,W\) 不变,conv1/conv2 都压缩到 \(C/2\) 后才拼接和生成两张选择图。代码中的 sig[:,0]、sig[:,1] 直接对应公式中的 \(\sigma(\widehat{SA}_1)\)、\(\sigma(\widehat{SA}_2)\),末尾是乘性调制 \(X\odot S\),而不是把选择后的注意力简单加回输入。
LSKNet 的优点是串行分解大核,在相同理论感受野下比单个超大 depth-wise kernel 使用更少参数和 FLOPs,同时留下两个中间尺度供每个空间位置选择。与按通道选择卷积的 SKNet 相比,它能让机场、港口和道路区域使用不同范围的背景8。
它的缺点是只改变“看多大范围”,不改变“哪些位置不算”。直接在整幅超大图上运行时,显存和空背景计算仍然存在;大感受野还可能把无关背景混入微小目标特征。作为已选区域的 backbone 时,LSK 模块与外部选区仍是两个独立环节。
7.2 MSCD:训练期跨尺度互教,推理期只保留原尺度¶
图 15 MSCD 的共享权重多尺度分支与 ACSKD:各尺度只在训练期并行,知识汇入原尺度分支。9
尺度变化并非把同一图 resize 几次就能消掉。常规多尺度训练把不同缩放图分别处理,跨尺度信息最多间接沉入共享参数;为了保住精度,测试时往往还要让各尺度重复推理后再合并。论文指出,这类特征虽具有尺度感知性,却不天然尺度不变:低分辨率会损伤小目标,高分辨率也未必给大目标最合适的观察范围。MSCD 要解决的不是再增加一个测试尺度,而是把多个尺度中对同一目标有用的信息汇入最终要部署的原尺度分支。9
PMBA 因而不是多套独立检测器的集成。它把原尺度与各缩放图同时送入结构和参数相同的分支,让不同尺度的检测损失共同更新同一套 FPN、RPN 和检测头。这样保留多尺度样本与不同感受野的训练信号,又不为每个尺度复制参数;真正把一个尺度的内容传给另一个尺度,则由后面的 ACSKD 完成。9
PMBA 在一次训练中把原尺度、上采样和下采样图像并行送入同一套共享 FPN、RPN 和检测头,先让所有分支按普通检测损失收敛。第二阶段从原尺度分支的 proposal 出发,经几何变换在其他尺度找到同一旋转区域,取出对应 RoI 特征,并由 ACSKD 判断哪一尺度的预测更可靠后进行蒸馏。部署时这些附加尺度分支、proposal 对齐和蒸馏损失都不再执行,模型只沿原尺度的普通两阶段检测路径输出结果9。
原尺度图像为 \(I_0\in\mathbb R^{B\times C\times H\times W}\),第 \(m\) 个训练分支是缩放后的 \(I_m\in\mathbb R^{B\times C\times s_mH\times s_mW}\)。PMBA 不把它们在通道上拼起来,而是让同一套 FPN、RPN 和检测头分别处理每个尺度。这样参数量不随分支数增加,但每个尺度仍要保存自己的特征和激活。
对 batch 内第 \(b\) 张图,原尺度产生 \(N_0^{(b)}\) 个旋转 proposal,写成 \(R_0^{(b)}\in\mathbb R^{N_0^{(b)}\times5}\),五个数对应中心、宽高和角度。几何变换 \(T_mT_0^{-1}\) 把这些框映射到尺度 \(m\),得到同样是 \(N_0^{(b)}\times5\) 的 \(R_{0\rightarrow m}^{(b)}\)。对应的 RoI 特征提取操作从两个尺度抽出一一对应的 \(Z_0,Z_m\in\mathbb R^{N_0^{(b)}\times C_r\times H_r\times W_r}\)。PMBA 提供多尺度观察,坐标变换保证同一个 proposal 对齐,ACSKD 在同 shape 特征之间做蒸馏;测试只保留 \(I_0\rightarrow R_0\rightarrow Z_0\)9。
仅有 PMBA 还不能把不同尺度的整张特征图直接相减:缩放后它们的空间尺寸不同,且高分辨率特征通常更利于小目标,低分辨率特征有时反而更适合大目标。若把所有尺度的全图特征或预测等权蒸馏,既缺少一一对应,也会把不适合该目标的知识传回原尺度;航拍检测中大量背景还会使输出层蒸馏被背景主导。ACSKD 因而先用 proposal 确定“在哪里蒸馏”,把同一旋转区域映射后抽成同 shape 的 RoI 特征;随后再判断“哪一尺度值得蒸馏”。9
设原图 \(I_0\in\mathbb R^{B\times C\times H\times W}\),尺度分支为 \(I_m\in\mathbb R^{B\times C\times s_mH\times s_mW}\),共享检测器由 FPN \(F\)、RPN \(R\) 与检测头 \(H\) 构成。多分支检测目标为
其中 \(T_m\) 包含各尺度独立的数据增强和旋转框坐标变换,\(G\) 表示完整两阶段检测器,\(\hat Y\) 是归一化类别与旋转框真值。权重共享不会随分支数增加模型参数,但训练激活和图像处理成本仍随分支增加。推理只计算 \(G(I_0)\),训练成本则由多尺度分支承担9。
ACSKD 以两阶段检测器 proposal 为桥梁:将原尺度旋转 proposal 通过几何变换映射到其他尺度,从各尺度 FPN 中抽取对应 RoI 特征。对某 proposal,若另一尺度分支的检测损失低于原尺度分支,两者损失之差作为正蒸馏权重;否则权重截为零。这样,小目标更可能吸收高分辨率分支知识,大目标可吸收低分辨率下更合适的上下文,而不是无差别平均。正、负 proposal 的蒸馏分别归一化,避免海量背景控制梯度9。
这里的教师并不预先固定为高分辨率分支。令 \(y_i=H(F_0(b_i^{0,R}))\) 为原尺度 RoI 的预测,\(y_i^m=H(F_m(b_i^{0\to m,R}))\) 为同一物理区域在尺度 \(m\) 的预测;\(\hat y_i\) 对正 proposal 是对应的类别和旋转框真值,对负 proposal 是背景,\(L_{\mathrm{det}}\) 是所选两阶段检测器在该 proposal 上的常规检测损失。只有尺度 \(m\) 的损失更低时,\(w_i\) 才为正:它才在当前训练状态下向原尺度提供指导,且差距越大权重越大。9
对原尺度 proposal \(b_i^{0,R}\),其在第 \(m\) 个尺度的几何对应框为 \(b_i^{0\to m,R}=T_mT_0^{-1}(b_i^{0,R})\)。自适应权重为
只有当尺度 \(m\) 的预测损失更低时 \(w_i>0\),该分支才作为教师。蒸馏损失将正、负 proposal 分开归一化:
另一尺度特征只提供停止梯度的指导,知识单向汇入原尺度。若不分开归一化,数量远多于正样本的背景 proposal 会淹没目标尺度信息9。
ACSKD 不从训练第一步就开启。论文的理由是初期各尺度特征对尺度变化尚不够鲁棒,此时用检测损失判断教师优劣并不可靠;因此第一阶段仅优化多分支检测目标,待模型收敛后才加入蒸馏项:
其中 \(\alpha\) 是蒸馏损失的权重;第二阶段保留所有尺度的普通检测监督,只额外把可信尺度的 RoI 知识压回原尺度。9
MSCD 的优点是把多尺度知识压回原尺度分支,测试时仍只运行一次普通两阶段检测。作者在 DOTA-v1.0、DOTA-v2.0 与 DIOR-R 上以 RoI Transformer 获得约 6.50、6.59、7.12 个 AP50 点提升,部署不增加参数和计算9。
它的缺点是“部署免费”由更重的训练换来。多个尺度同时前向会增加显存和时长,训练还要分成普通检测与蒸馏两个阶段。现有 proposal 对齐建立在 RPN、旋转 RoI 和两阶段特征上,不能直接套到一阶段密集预测或 DETR query。
八、动态监督、前景重组与分类建模¶
这一章处理两个看似不同、实际都发生在“目标怎样被表示”上的问题。DCFL 不改测试图像,而是在训练时重新决定哪些特征点算正样本;UFPMP-Det 一方面把分散前景重排成一张 mosaic,另一方面让同一类别拥有多个特征中心。前者改变监督,后者同时改变推理输入和分类头。
8.1 DCFL:让先验、实例表示和标签分配共同动态化¶
图 16 DCFL 的动态先验捕获、跨层粗匹配与后验细筛选。10
普通单阶段旋转检测会把每个 FPN 特征点同固定 anchor 或固定 point prior 绑定,再用 IoU 一类规则分配正样本。对于极小旋转框,轻微平移或角度偏差就可能使 IoU 变为零;分类分支若从另一个空间位置采样,分类特征、回归特征和最终实例又会进一步错位。DCFL 先让先验位置随回归分支动态移动,再把宽松的高斯几何匹配逐步收紧为结合当前分类质量和语义中心的正样本集。
仅把 IoU 阈值或正负样本规则改成自适应仍不够:候选先验及其后方的采样位置还停在规则网格上,许多微小旋转目标的主体附近依然没有合适候选。PCB 因而先更新 prior,并让回归分支的 offsets 同时引导分类分支取特征;它要修复的是“先验位置—采样特征—实例主体”的空间对应关系,而不只是重新划分正负样本。10
图 16a DCFL 的问题动机:固定先验与实例位置/形状不匹配,且不同角度和尺度获得的正样本数量不均衡。10
对每个候选特征点,Prior Capturing Block 先从回归分支的 deformable offsets 得到动态位置,并以该位置和旋转框形状构造 Gaussian prior;同一组 offsets 同时控制分类分支的 DCN 采样。随后 GJSD 用这些 prior 与真值 Gaussian 做跨 FPN 层粗筛,\(PT\) 按当前分类分数和旋转 IoU 重新排序,DGMM 再用几何中心与语义中心过滤候选。因而它不是把若干分数并列相加,而是按“对齐先验 \(\rightarrow\) 扩大候选 \(\rightarrow\) 用当前预测重排 \(\rightarrow\) 几何与语义双重收紧”的顺序构造训练标签10。
第 \(l\) 个 FPN 特征为 \(P_l\in\mathbb R^{B\times C_l\times H_l\times W_l}\)。对 batch 内第 \(b\) 张图,其切片 \(P_l^{(b)}\in\mathbb R^{C_l\times H_l\times W_l}\) 有 \(n_l=H_lW_l\) 个候选点;批量维只是在外层把各图并行送入网络。PCB 为每个点预测 deformable offsets,整批张量为 \(\Delta O_l\in\mathbb R^{B\times2n\times H_l\times W_l}\),\(n\) 是采样点数。单图的每个候选根据 offsets 得到一个二维中心 \(\mu\) 和 \(2\times2\) 协方差 \(\Sigma\),二者合起来表示可移动、可旋转的 Gaussian prior。
训练时,每张图各自把全部 FPN 候选同该图的 \(N_{gt}^{(b)}\) 个真值配对,形成 \((\sum_l n_l)\times N_{gt}^{(b)}\) 的 GJSD 匹配矩阵;固定实现的 assigner 也是逐图调用,而不是把不同图像的候选和真值混入一张大矩阵。粗筛为每个真值留下 top-\(K\) 行,\(PT\) 再缩为 top-\(Q\),DGMM 输出正样本布尔 mask。PCB 对齐采样位置,GJSD 给出连续几何距离,\(PT\) 用当前预测重排,DGMM 完成末级筛选。单图分类和旋转回归分别输出 \((\sum_l n_l)\times K_{\mathrm{cls}}\) 与 \((\sum_l n_l)\times5\);匹配矩阵只在训练时出现10。
设特征点映射到原图的静态位置为 \(s\),特征步长为 \(s_t\),DCN 学到 \(n\) 个二维 offsets \(\{\Delta o_i\}\),动态先验中心为
论文把 \(\tilde s\) 作为高斯均值 \(\mu_p\),并用预设旋转框 \((w,h,\theta)\) 构造
于是先验 \(N_p(\mu_p,\Sigma_p)\) 同时表达可学习中心和旋转形状。offset 还用于分类分支的 deformable sampling,使“用哪个位置回归框”和“从哪个位置提分类特征”共享空间依据,缓解分类与定位分支各看不同区域的问题10。
这里同一组 offsets 实际承担两项彼此关联、但不能混为一谈的工作。其一是更新先验坐标:\(n\) 个偏移的平均位移经特征步长换算后,把规则网格上的静态 anchor 中心 \(s\) 移到 \(\tilde s\),供 Gaussian prior 和后续标签分配使用;预设 \((w,h,\theta)\) 仍由 \(\Sigma_p\) 表达。其二是重新取样并聚合特征。为避免与原图坐标 \(s\) 混淆,记特征图上的输出位置为 \(q\)。普通卷积按固定核坐标 \(\{p_i\}_{i=1}^{n}\) 计算 \(y(q)=\sum_i w_i x(q+p_i)\),而可变形卷积改为
也就是说,每个 \(\Delta o_i\) 都把一个核采样点从原来的规则位置移到新的位置;坐标不是整数时,由双线性插值从原特征图取得该处的值,再由卷积权重 \(w_i\) 聚合。它并非把已经得到的单个 anchor 特征简单平移,而是在更贴近目标的位置重新组成该 anchor 的表征。DCFL 再将回归分支预测的 offsets(以及实现中的调制 mask)传给分类分支的 DCN,使动态 prior 的中心、回归特征和分类特征采用同一套空间对齐依据10。
先验位置能够移动后,仍要决定每个真值该从哪些层、哪些邻近点获得监督。只在单个 FPN 层取候选,极端尺度或角度的目标可能落到不合适的层;把所有层都完全放开,又会留下过宽的候选范围并拖慢收敛。CPS 因而只保留真值附近、相邻层上的有限候选。GJSD 被放在这一步,是因为它既能比较附近但尚未重叠的 Gaussian prior 与真值,又能以闭式形式计算,适合对大量候选作排序。10
标签分配分为粗、细两步。粗阶段计算 dynamic prior Gaussian 与真值 Gaussian 的 Jensen–Shannon divergence,按 GJSD 散度从小到大跨 FPN 层选取 top-\(K\) Coarse Positive Samples,避免固定 IoU 把极端角度或尺度目标困在单层。细阶段以分类置信和旋转 IoU 的平均值重新排序,再用双分量 Dynamic Gaussian Mixture Model 筛选:一个分量位于几何中心,另一个位于候选特征推断的语义中心。最终正样本同时满足几何与当前模型后验质量10。
粗筛采用具有闭式解的 generalized JSD。对先验 \(N_p\) 与真值 \(N_g\),令
\(N_p=N(\mu_p,\Sigma_p)\) 是候选特征点的动态 prior:\(\mu_p=\tilde s\in\mathbb R^2\) 是 offsets 更新后的中心,\(\Sigma_p\in\mathbb R^{2\times2}\) 将该 prior 的宽、高和旋转方向编码为二维形状。\(N_g=N(\mu_g,\Sigma_g)\) 是与它配对的真值旋转框的 Gaussian 表示,其中 \(\mu_g\in\mathbb R^2\) 是真值中心,\(\Sigma_g\in\mathbb R^{2\times2}\) 编码真值的宽、高和方向。\(N_\alpha=N(\mu_\alpha,\Sigma_\alpha)\) 不是第三个检测框,而是由前两者构造的中间 Gaussian。\(\Sigma^{-1}\) 是协方差的逆,也称 precision;它越大,表示该方向的分布越集中。因此,式中的 \(\Sigma_\alpha\) 与 \(\mu_\alpha\) 都按 precision 加权,而不是把两个中心和两个协方差直接做算术平均。\(\alpha\in[0,1]\) 控制两者的权重,论文取 \(\alpha=0.5\),使 prior 与真值等权;\(\operatorname{KL}(A,B)\) 表示用分布 \(B\) 近似 \(A\) 时的 Kullback--Leibler 散度,本身并不对称10。
把第 \(i\) 个 prior 与第 \(g\) 个真值代入后,GJSD 的输出记为 \(d_{ig}\)。它是几何散度而不是“越大越好”的检测分数:\(d_{ig}\) 越小,两个 Gaussian 的中心、尺度和方向越接近。微小旋转框即使还没有重叠,IoU 也可能已经为零;GJSD 仍会给附近候选连续的比较值。训练时,对每个真值 \(g\),模型在全部 FPN 层的动态 priors 上计算 \(d_{ig}\),保留最小的 \(K\) 个作为 CPS。固定实现的 rotate_metric_calculator.py 先把它转为 \(a_{ig}=1/(1+d_{ig})\),再取最大的 top-\(K\),两种写法的候选集合等价;CPS 只是后续 \(PT\) 与 DGMM 的输入,并不是最终正样本10。
粗阶段故意放宽候选范围,CPS 只表示“值得继续判断”的几何候选,并不等同于最终的高质量监督。细阶段才引入 \(PT\),把当前分类置信和定位质量纳入排序,先从 CPS 中留下更可能形成正确预测的中间样本。单一几何中心也不足以描述实例内部真正提供判别信息的位置,因此 DGMM 再把几何中心与由中间样本确定的语义中心共同用于末次筛选。10
细筛先计算第 \(i\) 个候选成为正确预测的质量分数。为与代码保持一致,令 \(z_i\) 是类别 logit,\(\operatorname{Cls}(D_i)=\max_c\sigma(z_{i,c})\)。论文文字可写成归一化平均值,而作者实现按下式计算等价的排序量:
选出 top-Q 中间正样本,再以双分量 DGMM 过滤。\(PT_i^{\mathrm{code}}\) 只是 \(PT_i^{\mathrm{paper}}\) 的正常数倍,故 top-Q 排序不会改变。第一个高斯中心是旋转框几何中心 \((c_x,c_y)\),第二个中心是这些中间样本位置的均值,作为当前网络认为更有判别力的语义中心;两者协方差均由真值旋转框给出。候选只有在至少一个真值的 DGMM 密度高于阈值时才保留。这个顺序解释了“coarse-to-fine”:GJSD 粗筛扩大候选、\(PT\) 用当前预测质量重排、DGMM 再限制候选不要偏离实例几何与语义中心,而不是一次用多个分数直接相加。
官方实现摘录(coarse2fine_assigner.py 与 dotav1_test_dcfl_r50_3x.py):
gt_max_overlaps, _ = overlaps.topk(self.topk, dim=1)
can_pos_iou = self.iou_calculator(gt_bboxes, can_bbox_pred, mode='iou')
can_pos_cls, _ = torch.max(can_pos_scores, 1)
can_pos_quality = can_pos_iou + can_pos_cls.sigmoid()
gt_max_quality, gt_argmax_quality = gt_poscan.topk(topq, dim=1)
assigned_pos_prior = torch.zeros((num_gt, topq, 5), device=device)
gaussian = 0.7 * gaussian_gt + 0.3 * gaussian_pt
inside_flag = gaussian >= torch.exp(torch.tensor([-self.gauss_thr]))
# published DOTA-v1 configuration: topk=16, topq=12, gauss_thr=0.6
assigned_pos_prior 的 shape 是 \(N_{gt}\times Q\times5\),末维是旋转框 \((x,y,w,h,\theta)\),而不是只保存二维中心。topk=16、topq=12 和 gauss_thr=0.6 是该公开 DOTA 配置的具体工作点,不是论文方法在任何数据集上必须使用的常数;它们使“粗候选数、细候选数和 DGMM 门限”成为可复现、也必须重新标定的三个接口。
DCFL 的优点是把固定 IoU 的一次分配拆成连续几何粗筛、当前预测重排和几何—语义细筛,训练完成后仍保持普通单阶段推理。作者在 DOTA-v1.5 的小车辆、船舶、储罐上相对基线报告约 12.19、7.56、15.69 点提升,收益集中在微小旋转类别10。
它的缺点是只改善训练监督,不减少输入像素,也不能补回前级选区已经漏掉的目标。coarse top-\(K\)、posterior top-\(Q\) 与 DGMM 阈值会随目标尺度、角度和类别分布改变候选集合,动态流程本身也增加了训练期匹配成本。
8.2 UFPMP-Det:把稀疏前景打包,再以多个类别代理分类¶
图 17 UFP 将不同尺度前景区自适应缩放后打包为统一 mosaic,区别于图像金字塔和逐簇推理。6
无人机图像中,小目标比例高;直接采用图像金字塔会增加计算负担,均匀切片又会产生大量低前景比小块,甚至截断实例。粗到细路线虽能先找出密集区,但粗检测给出的子区仍较粗、背景较多,并且通常需要逐区精检。UFP 处理“哪些像素值得送入精检以及怎样组织它们”,MP-Det 则处理“同一类别的特征应由几个中心表示”;两者分别对应计算浪费和分类混淆,而不是同一模块的两项功能。6
论文的两级流程从粗检测器在原图给出候选框开始:候选框先按比例扩张,FRG 合并彼此足够接近的框,得到少量前景区域;每个区域再按内部目标的平均尺度决定是否放大,随后按 packing 规则拼成一张 mosaic。精检测器只对这张 mosaic 运行一次,框再按各自的缩放、平移逆变换回原图。这样,原来“一个簇一次精检”的循环变成“许多簇一次打包精检”,但首阶段漏掉的前景仍不会进入 mosaic6。
论文把粗结果用于产生前景区域,并没有在方法段明确写成“将粗检测框与精检测框拼接后融合”。固定提交的评估脚本先保存 first_results,但在精检框回映后执行 finale_results = new_second_result,再对每个类别的这些回映框做 NMS。因此,这份脚本实际输出的是精检框,不应把它描述成粗、细两路结果的并集。它是作者给出的评估工具实现,能裁定该版本的控制流;并不能替代论文对两阶段设计动机的说明。
对单张原图,\(I\in\mathbb R^{C_{in}\times H\times W}\),粗检测产生 \(N_{\mathrm{coarse}}\) 个框,坐标表为 \(B_c\in\mathbb R^{N_{\mathrm{coarse}}\times4}\)。FRG 合并邻近框后得到 \(B_r\in\mathbb R^{N_r\times4}\),通常 \(N_r<N_{\mathrm{coarse}}\)。每一行对应一个大小可变的裁块 \(C_{in}\times h_r\times w_r\);检测器装载这些图像时才在外层补 batch 维。
尺度调整把目标过小的区域放大,packing 再把 \(N_r\) 块写入一张 mosaic \(I_M\in\mathbb R^{C_{in}\times H_M\times W_M}\)。固定工具实际返回由 strip packing 决定的 new_width 和 new_height,所以 \(H_M,W_M\) 在打包后才确定,并非 UFP 函数内预先固定的画布尺寸;后续检测器的数据管线仍可能按其配置 resize。程序同时保存每块来自原图的什么位置、被放到 mosaic 的什么位置以及缩放倍率。FRG 减少区域数,尺度调整改变目标像素大小,packing 把 \(N_r\) 次独立精检变成一次规则图像推理,回映模块再用元数据恢复原图坐标6。
粗检测框不能原样作为 packing 单元:作者认为这些前景子区既可能没有充分包住真值,也常彼此重叠。外扩的作用是先粗略覆盖目标及其邻域;FRG 随后才合并外扩后仍高度重叠或相近的区域,避免同一片前景被拆成多个重复精检任务。6
把扩张后的粗框集合记为 \(B_c\)。论文的 Algorithm 1 每轮取面积最小的框 \(A\),对另一框 \(B\) 构造二者最小外接矩形 \(C=\operatorname{enclose}(A,B)\)。合并条件为
左侧是两个前景框面积,右侧是合并后需要处理的总区域;只有二者足够接近或重叠、合并不会引入过多空背景时,才用 \(C\) 替换 \(A,B\)。迭代到没有满足条件的 \(B\) 后,将 \(A\) 放入区域集 \(B_r\)。FRG 后保留下来的区域尺寸仍不一致,较小区域中的目标依旧只占少量像素,因此还需按区域内目标的平均尺度进行放大。小于固定尺度(论文使用 96×96)的区域按比例放大,再用 packing 算法排入一张 mosaic。由此,UFP 同时减少精检图像数量、提高前景区域比例并缩窄目标尺度分布。6
这里的 packing 不是把所有裁块 resize 成同一种大小后按固定宫格拼接。对第 \(r\) 个 FRG 区域,记原图裁块宽、高为 \((w_r,h_r)\),尺度调整倍率为 \(\rho_r\),工具先只把它看成待摆放的不可旋转矩形 \((\hat w_r,\hat h_r)=(\rho_rw_r,\rho_rh_r)\)。随后调用 PHSPPOG 条带装箱启发式算法:给定一个候选画布宽度 \(W\),它按矩形高度由大到小放置裁块;每放入一个裁块,就把右侧或下方剩余空白用一条水平或垂直切线分成子矩形,并递归优先填入恰好匹配、单边匹配或能够完全容纳的下一个裁块。这样所有矩形互不重叠,裁块方向也不交换。固定工具在 \(300\) 到 \(2666\) 像素间二分尝试 \(W\):若本次装箱高度 \(H(W)>W\),说明画布过窄而增大 \(W\);反之缩小 \(W\),以得到宽高接近的 mosaic。output_shape=[1333,800] 在该函数中没有参与计算,实际 \(W_M,H_M\) 由最终放置结果的最大右边界和下边界决定。6
得到布局后,程序才从原图取像素:建立零填充画布 \(I_M\in\mathbb R^{C_{in}\times H_M\times W_M}\),将原图裁块 resize 到 \((\hat w_r,\hat h_r)\),粘贴在装箱器给出的左上角 \((u_r,v_r)\)。每一块同时记录为 \(t_r=(x_{1r},y_{1r},w_r,h_r,u_r,v_r,\rho_r)\),所有记录组成 \(T\in\mathbb R^{N_r\times7}\)。因此精检框 \((x',y',w',h')\) 若落在该块内,回到原图时只需执行 \(x=x_{1r}+(x'-u_r)/\rho_r\)、\(y=y_{1r}+(y'-v_r)/\rho_r\)、\(w=w'/\rho_r\)、\(h=h'/\rho_r\)。这张 mosaic 的空白处只是零填充背景;它的作用是把若干不规则裁块变成一次可送入普通检测器的规则图像,而不是让不同裁块在内容上融合。固定实现中相应的 Packing、PHSPPOG 与回映代码共同给出了这条路径。6
论文算法与固定工具也有两个可复现性差异。ForegroundRegionGeneration 使用 for idx in range(num_bbox) 顺序扫描,并没有复现 Algorithm 1 的 argmin |A| 选框;同一组候选框换一种输入顺序,工具的合并过程可能不同。论文把小区域调到 96×96 附近,固定工具则以平均实例面积离散给出 \(<32^2\mapsto4\)、\(<96^2\mapsto2\)、其余 \(\mapsto1\) 三种倍率。这里的倍率来自已合并区域中粗框的平均面积,不是把裁块本身统一缩成 96×96。
UFP 改善的是精检输入,不能改变分类头对类别分布的假设。常规分类头为类别 \(i\) 只学习一个权重向量 \(w_i\),等价于把该类看作围绕一个特征中心分布。无人机的高度、视角和天气会拉大同类特征距离,而语义相近类别又容易混淆,单中心边界难以同时容纳类内变化并区分类间相似性。MP-Det 因而为每一类配置多个 proxy,让一个类别由多个局部特征中心共同表示。6
在这一表示下,类别 \(i\) 配置 \(K_i\) 个 proxy,以 soft assignment 聚合相似度;\(K_i\) 可以随类别变化。多个 proxy 容易坍缩到同一中心,BoIW 在训练中用队列维护每类实例特征词汇,定期以 K-means 估计各簇比例,并把该比例作为最优传输的边缘分布来分配实例到 proxy;额外对比损失提高队列词汇的代表性。测试时保留的是学到的多 proxy 分类头,队列、K-means 和最优传输不会再参与一次检测6。
分类部分处理的是另一组 shape。类别 \(i\) 的 \(N_s\) 个正样本特征堆成 \(X_i\in\mathbb R^{N_s\times D}\),\(K_i\) 个 proxy 堆成 \(W_i\in\mathbb R^{K_i\times D}\),相乘后得到 \(N_s\times K_i\) 的相似度表。表中一行表示一个实例像哪些 proxy,一列表示一个 proxy 接收了哪些实例。
BoIW 还维护队列 \(V_i\in\mathbb R^{N_q\times D}\),K-means 用这 \(N_q\) 行历史特征估计 \(K_i\) 个真实簇的比例。当前参与最优传输的 \(N_t\) 个实例产生 \(N_t\times K_i\) 的传输矩阵,\(N_t\) 不必等于队列长度。测试时,多 proxy 分类头仍把一个 \(D\) 维特征同多个类内中心比较;队列、K-means 和传输矩阵全部删除。mosaic 改变推理时怎样组织图像,BoIW 改变训练时怎样分配分类特征6。
对类别 \(i\) 的 \(K_i\) 个 proxy \(\{w_i^k\}\) 和实例特征 \(x\),余弦相似度 \(s_i^k=(w_i^k)^\mathsf Tx/(\|w_i^k\|\|x\|)\)。论文将多代理分类 logit 写为
softmax 权重让最相似的 proxy 贡献更大,但不是只取最大值,所以实例可在相邻子簇之间平滑过渡。多个 proxy 并不会自然分工:当实例—proxy 的簇分配高度不均衡时,它们容易收敛到相似位置。若最优传输仍把每个 proxy 的边缘分布设为均匀的 \(p_i(k)=1/K_i\),又等于假定类内各子簇同样大,这未必符合真实数据。BoIW 因而为每类维护容量为 \(N_q\) 的队列 \(V_i\),定期 K-means 得到各簇比例 \(p_i(k)=|c_i^k|/|V_i|\),以此作为 proxy 的最优传输边缘,而实例边缘 \(q_i(j)\) 通常均匀;额外对比损失让这份用于估计分布的词汇表保持代表性。6
官方实现摘录(mp_head.py):
self.proxies = nn.Parameter(torch.randn(sum(self.proxies_list), self.feat_channels))
centers = F.normalize(self.proxies, p=2, dim=1)
feat = F.normalize(feat, p=2, dim=1)
simInd = feat.matmul(centers.t())
for i in range(self.num_classes):
sub_sim = simInd[:, pre_pos:pre_pos + self.proxies_list[i]]
prob = F.softmax(sub_sim * self.gamma, dim=1)
simClasses.append(torch.sum(prob * sub_sim, dim=1)[:, None])
pre_pos += self.proxies_list[i]
simClasses = torch.cat(simClasses, dim=1) * self.gamma
proxies_list[i] 正是 \(K_i\),代码把所有类别的 proxy 拼成一个 \(\sum_iK_i\) 行的参数矩阵,再按类别切片计算 softmax 加权相似度。这里还存在一个论文与固定实现必须分开的细节:论文式的 softmax 直接作用于 \(s_i^k\),而代码实际使用 \(\operatorname{softmax}(\gamma s_i^k)\),并在加权和之后再乘一次 \(\gamma\)。固定提交中的数值路径是
也就是说,\(\gamma\) 同时使类内竞争和最终 logit 更尖锐,不能把论文公式逐字当成该提交的数值路径。默认 num_words=200 的类别词汇表和最优传输更新只在训练时出现;这使公式中的 \(N_q\) 与 \(K_i\) 都应被理解为配置相关的维度,而非所有类别共用的固定常数。
UFP 的图像重组也有明确的坐标记录。官方工具先把区域宽高乘以各自放大倍率,再用 strip-packing 排入同一张画布;每个区域留下 7 个数,方便精检框回到原图(unified_foreground_packing.py):
avg_areas = avg_areas / cnt
if avg_areas[idx] < 32 * 32:
scale_factor[idx] = 4
elif avg_areas[idx] < 96 * 96:
scale_factor[idx] = 2
else:
scale_factor[idx] = 1
boxes.append([w * factor, h * factor])
height, rectangles = phsppog(width_mid, boxes, sorting='height')
result.append([
foreground_region[idx, 0], foreground_region[idx, 1], _w, _h,
x, y, factor
])
return result, new_width, new_height
这段代码把论文的“自适应缩放”落实为 1、2、4 三档,也显示了 output_shape 没有参与 new_width,new_height 的返回计算。每行 result 可写为 \((x_s,y_s,w_s,h_s,x_m,y_m,a)\in\mathbb R^7\):前四项确定原图裁块,\((x_m,y_m)\) 是它在 mosaic 的左上角,\(a\) 是放大倍率。精检框先从 mosaic 坐标减去 \((x_m,y_m)\),再除以 \(a\),随后加回 \((x_s,y_s)\)。这里的 7 列元数据正是 UFP 能把“一次 mosaic 检测”接回多块原图的原因,而不是普通图像拼接的附属信息。
固定评估脚本的结果处理也值得直接给出,因为它避免把粗检与精检的关系说错(ufpmp_det_eval.py):
first_results = my_inference_detector(coarse_detecor, LoadImage()(data))
result = np.concatenate(first_results)
rec, w, h = UnifiedForegroundPacking(result[:, :4], 1.5, input_shape=[width, height])
second_results = my_inference_detector(mp_det, LoadImage()(data, img_data=next_image))
finale_results = []
for first_result in first_results:
finale_results.append(first_result)
# Map second_results from each packed chip back to the original image.
finale_results = new_second_result
前两行把粗框变成 packing 元数据,第三行只对 mosaic 做精检。虽然脚本一度把粗框写入 finale_results,随后又用回映后的 new_second_result 覆盖它,再对这些精检框 NMS。这个细节限定了本文对固定源码的描述:粗检测负责选区,最终输出由回映精检框构成。
图 18 BoIW 的队列更新:标签分配后的正样本被采样为实例词汇,新特征插入队列并移除最旧条目;队列用于估计类内簇比例,而不在推理时参与检测。6
设参与检测的类别数为 \(N_{\mathrm{cls}}\)(论文式中写作 \(N_c\),这里改名以避免同粗检测框数混淆),代价矩阵 \(C_i=1-S_i\) 由实例—proxy 余弦相似度得到,传输计划满足
对应匹配损失为 \(L_{\mathrm{ot}}=N_{\mathrm{cls}}^{-1}\sum_i\operatorname{tr}(C_i^\mathsf TP_i^*)\)。总训练目标
还加入词汇队列上的对比损失 \(L_{\mathrm{cl}}\)。最优传输强制各 proxy 接收与真实簇比例相符的样本质量,对比项让同类队列更紧、异类更分离;队列、K-means 和 Sinkhorn 只增加训练成本,推理仍是普通 multi-proxy 分类头6。
UFPMP-Det 的优点是同时减少精检调用次数和改善分类表示。论文的消融显示,UFP 将 VisDrone 前景比例从 10.2% 提到 24.5%,小目标占比从 68.56% 降到 6.96%,说明 packing 不只是少生成图像,也把目标放到了更合适的有效尺度6。
它的缺点是粗框召回、区域合并、mosaic 排布和坐标回映连成新的误差链。第一阶段漏掉的目标不会进入 mosaic;来自不同原图或相距很远的区域被拼接后,边缘会出现非自然上下文;packing 规则在训练与测试不一致时还会产生分布偏移。
所有方法的输入、计算位置和部署路径已在前文逐一说明。表 2 将这些信息放在同一口径下,便于比较每条路线实际选择了什么、推理时保留了哪一段计算,以及它最先暴露的风险。
九、横向归纳:方法之间真正不同的是什么¶
9.1 选择粒度决定收益上限与实现难度¶
选择单位可以从大到小排成四档:固定切片、自由矩形、feature patch、单个特征点。单位越小,留下的背景通常越少,张量和内存访问却越不规则。OAN 只决定一张固定切片是否继续,最容易接到现有系统;CZDet、YOLC 和 GLSAN 产生自由矩形,要额外裁图、resize 和回映;ESOD 继续缩小到 feature patch;QueryDet 与 CEASC 只算被激活的点,但依赖稀疏卷积和动态索引。稀疏率高并不自动表示端到端更快,硬件不擅长小 batch 和不规则张量时,较大的规则图像块反而可能更快。
选择器的两类错误后果不同。空背景被误选通常只是多花计算,真实目标被排除却会直接漏检。若 \(R_i\) 定义为目标已经通过前 \(i-1\) 级后,再通过第 \(i\) 级的条件召回率,那么多级系统的目标召回为
OAN 只有切片门控一级;ESOD 的同一 mask 连续控制切片和 sparse head;GLSAN 与 UFP 则先依赖粗框,再依赖区域生成。即使每一级的召回看起来都很高,连续相乘后仍会下降。最终 mAP 还会把选择器漏检与检测头错误混在一起,不能单独说明是哪一级出了问题。
9.2 高分辨率的三种含义不可混用¶
论文里的“高分辨率”至少指三件事。CZDet、YOLC 和 GLSAN 会回到原图裁出局部,增加的是真实图像像素;QueryDet 与 ESOD 保留 \(P_2\) 或浅层 feature patch,增加的是网络内部的空间位置;SuperYOLO、LSKNet 和 MSCD 让低分辨率输入学到更好的重建、上下文或尺度知识,改变的是特征表示。第三种方法可能减轻下采样造成的精度损失,却不会重新得到已经丢失的原图像素。若只写“使用高分辨率”,这三种完全不同的计算条件就会被混在一起。
9.3 上下文保留有四种路径¶
裁块和稀疏计算都会丢背景,各论文用四种方式保留上下文。GLSAN 直接保留一次全图预测;CZDet 以外扩裁块、YOLC 以聚簇区域保留部分局部邻域,ESOD 则围绕激活中心选取固定大小的 feature patch;CEASC 不逐点计算背景,只把全局均值、方差和残差送回稀疏层;LSKNet 仍在密集特征上使用较大感受野。这四种信息量不同:完整全图框最丰富但要多一次检测,局部区域会增加待处理面积,全局统计便宜但表达有限,大核则仍需密集计算。道路、水域和跑道等结构若直接决定类别,均值与方差未必足够。
9.4 训练成本与推理成本可以交换,但不能消失¶
额外成本可以放在训练,也可以留在测试。SuperYOLO 和 MSCD 用更重的训练换取单分支推理;OAN、CEASC 和 ESOD 在训练时学习选择信号,测试靠跳过部分算子节省时间;CZDet、YOLC、GLSAN 和 UFPMP-Det 在测试时仍要做第二遍检测或前景重组。因此,“推理不增加参数”没有说明训练显存,“GFLOPs 下降”也没有包含裁块、索引和后处理。训练 GPU 时、峰值显存、预处理、模型推理和后处理是不同成本。
9.5 适用条件对照¶
| 场景条件 | 优先考虑 | 原因 | 不宜单独采用 |
|---|---|---|---|
| 空切片比例极高,已有成熟检测器 | OAN | 改动小,直接门控后段 | LSKNet/DCFL,不能跳过空块 |
| 目标明显聚簇,允许两次检测 | CZDet 或 YOLC | 只放大少量密集区 | 均匀切片,背景成本高 |
| FPN 高分辨率检测头成为瓶颈 | QueryDet 或 CEASC | 位置级削减检测头 | 仅做图像 SR,部署更重 |
| 颈部和检测头都被背景拖累 | ESOD | 浅层找物后切特征并稀疏检测 | OAN,只省检测后段 |
| 局部细节与全图语义都关键 | GLSAN | 显式保留全局与局部结果 | 仅紧裁局部,语义可能断裂 |
| 有配准 RGB/IR,要求单路部署 | SuperYOLO | 多模态+训练期 SR,测试删除辅助枝 | 推理串联 SR,开销较大 |
| 尺度变化大但推理预算固定 | MSCD | 多尺度知识汇入单尺度分支 | 多尺度测试,重复推理 |
| 旋转微小目标正样本不稳定 | DCFL | 动态 prior 与粗到细匹配 | 只增大输入,监督错配仍在 |
| 同类外观多峰且类别相似 | UFPMP-Det 的 MP-Det | 多 proxy 表达类内分布 | 单 proxy 分类头 |
| 目标上下文范围随位置变化 | LSKNet | 空间位置相关大核选择 | 固定大核或固定局部窗口 |
所选方法的计算粒度、推理路径与主要边界整理如下表:
| 路线 | 方法 | 选择/增强粒度 | 新增机制/额外代价 | 推理期关键行为 | 主要收益 | 首要风险 |
|---|---|---|---|---|---|---|
| 图像/切片级选择 | OAN | 固定切片的网格 objectness | 轻量分支 | 空块跳过检测头 | 通用、易接入 | 主干仍遍历全部块 |
| 图像/切片级选择 | CZDet | 密度裁块 | 新增 crop 类与裁块增强 | 两次共享检测 | 无额外区域网络 | crop 类漏检 |
| 图像/切片级选择 | YOLC | 中心热图的 top-K 聚簇 | 高分辨率热图 | 少量裁块精检并替换粗结果 | 密集小目标友好 | top-K/网格敏感 |
| 特征/位置稀疏 | QueryDet | FPN 空间索引 | 查询头 | 粗层向细层级联稀疏检测 | 保留 P2 细节 | 查询召回与稀疏内核 |
| 特征/位置稀疏 | CEASC | 检测头逐层硬 mask | 密集辅助路径 | 分类/回归分头稀疏卷积 | 上下文补偿 | 硬件加速不稳定 |
| 特征/位置稀疏 | ESOD | 前景特征块与中心 | ObjSeeker | 自适应切片+稀疏头 | 同时省颈部和头部 | mask 错误级联 |
| 全局—局部/SR | GLSAN | 粗框聚类子区 | SR 与数据增强 | 全局粗检+局部精检 | 细节与全局兼顾 | 两阶段时延 |
| 全局—局部/SR | SuperYOLO | 表征级增强 | 多模态与 SR 分支 | 删除 SR,仅单路检测 | 部署无 SR 开销 | 需配准多模态 |
| 尺度/上下文 | LSKNet | 像素位置的感受野 | 大核选择模块 | 密集但动态选上下文 | 遥感表征增强 | 不直接省大图计算 |
| 尺度/知识迁移 | MSCD | proposal RoI 跨尺度 | 多分支自蒸馏 | 原尺度单分支 | 单尺度部署、多尺度知识 | 训练昂贵、偏两阶段 |
| 监督/先验 | DCFL | 动态 prior、anchor 与正样本 | 动态匹配 | 常规单阶段推理 | 旋转微小目标监督更稳 | 不直接降低像素成本 |
| 前景/分类 | UFPMP-Det | 前景区域与类内代理 | 粗检、队列、OT | mosaic 一次精检 | 提高前景率与类内表达 | 依赖粗检与坐标映射 |
十、现有论文还没有回答清楚的问题¶
下面只讨论这几篇篇论文自己的实验还不能回答什么,不额外拼接材料池之外的“未来方向”。这些空缺来自评测口径、默认参数或训练假设,表示现有证据的范围,不暗示某个新模块一定能解决。
10.1 各论文的选区召回不是同一个指标¶
OAN 报告过滤一定比例切片后的目标召回,ESOD 分别计算目标框覆盖 \(BPR_{box}\) 和目标中心覆盖 \(BPR_{ctr}\),YOLC 则通过裁块数 \(k\) 观察精度与速度245。三种数字分别描述切片是否通过、特征块是否包住目标、用了多少局部裁块,不能直接横向排名。现有实验没有在同一输入、检测器和硬件下把目标召回固定到同一水平,因此较低 FLOPs 既可能来自更有效的计算组织,也可能只是选区更激进。
10.2 区域规则换一个场景是否还有效,证据不足¶
CZDet 的扩张像素 \(\sigma\)、IoU 阈值 \(\vartheta\) 和最大裁块比例 \(\pi\),YOLC 的网格、热图阈值与 top-\(K\),GLSAN 的簇数 \(N\) 与多个尺度阈值,OAN 的门控阈值 \(T\) 都会同时改变召回和计算量23512。论文在各自数据集上给出了默认值或消融,却没有共同覆盖飞行高度、城市密度和传感器分辨率的系统变化。因而,跨数据集掉点究竟来自检测器本身的域偏移,还是区域规则失配,现有结果无法分开。
10.3 少做了多少运算,不等于快了多少¶
QueryDet 要建立跨层索引,CEASC 要为分类和回归分别产生硬 mask,ESOD 的完整 AdaSlicer 还包含循环选块。CEASC 在 GFL V1 上把 GFLOPs 从 524.95 降到 150.18,降幅约 71.4%,FPS 却从 13.46 增至 21.55,增幅约 60%;ESOD 也另给出更容易并行、但可能截断大目标的简化切片算法47。这些结果已经表明索引、内存访问和动态 shape 会消耗时间。论文所用 GPU、输入尺寸、batch 与稀疏内核又不相同,现有数字不能说明哪一种选择粒度在同一设备上最快。
10.4 背景删到什么程度仍不会伤害识别,没有统一结论¶
CEASC 用全局均值和方差补偿稀疏卷积丢掉的背景,LSKNet 为不同位置选择不同感受野,GLSAN 则完整保留一次全图预测7812。三者保留的信息分别是低维统计、大范围密集特征和完整检测结果,信息量与成本都不同。所选论文没有在同一任务上测量背景保留比例同小目标分类、定位之间的关系,因而更高稀疏率不能直接解释成更好的系统。道路、水域和跑道这类结构是否能被均值、方差代替,也会随类别变化。
10.5 训练时模拟的退化与真实成像退化没有被分开¶
GLSAN 用原图与 bicubic 二次下采样图训练 LSRN,SuperYOLO 用 \(L_1\) 重建约束骨干,MSCD 把 0.5、1.0、1.5 倍图像的 proposal 级知识蒸馏到原尺度91112。三者学到的是局部超分图像、像素重建偏好和跨尺度检测知识,不能互换。所选实验没有系统拆开运动模糊、压缩、传感器噪声和模态错位,也没有统一给出新增训练显存与时长。现有证据只覆盖论文设定的数据生成方式,不能外推到任意真实退化。
十一、结论¶
超大分辨率图像检测归根到底是在决定“哪里值得花高分辨率计算”。OAN、CZDet、YOLC、GLSAN 和 UFPMP-Det 选择图像块,QueryDet、CEASC 和 ESOD 选择特征位置,SuperYOLO、LSKNet 与 MSCD 改善已经保留下来的表示,DCFL 改善训练监督,UFPMP-Det 内的 MP-Det 部分改善分类。它们没有统一排名,因为省掉的计算阶段不同,依赖的前提不同,漏检发生的位置也不同。
实际系统通常要把这些职责组合起来:前段缩小待处理区域,中段保留足够细节和上下文,后段再处理旋转、尺度或类内外观变化。评价时不能只看最终 AP,还要同时看选区召回、实际处理面积、目标截断、峰值显存与端到端时延。只有把省下的成本和每一级引入的错误放在一起,才能判断一个方法是否真正适合超大图目标检测算法部署。
参考文献与链接¶
-
Yang, C., Huang, Z., & Wang, N. (2022). QueryDet: Cascaded Sparse Query for Accelerating High-Resolution Small Object Detection. 2022 IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR), 13658–13667. DOI 及论文页面. ↩↩↩↩↩↩↩↩↩↩
-
Xie, X., Cheng, G., Li, Q., Miao, S., Li, K., & Han, J. (2024). Fewer is More: Efficient Object Detection in Large Aerial Images. Science China Information Sciences, 67(1), 112106. DOI 及论文页面. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩
-
Meethal, A., Granger, E., & Pedersoli, M. (2023). Cascaded Zoom-in Detector for High Resolution Aerial Images. 2023 IEEE/CVF Conference on Computer Vision and Pattern Recognition Workshops (CVPRW), 2046–2055. DOI 及论文页面. ↩↩↩↩↩↩↩↩↩↩
-
Liu, K., Fu, Z., Jin, S., Chen, Z., Zhou, F., Jiang, R., Chen, Y., & Ye, J. (2025). ESOD: Efficient Small Object Detection on High-Resolution Images. IEEE Transactions on Image Processing, 34, 183–195. DOI 及论文页面. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩
-
Liu, C., Gao, G., Huang, Z., Hu, Z., Liu, Q., & Wang, Y. (2024). YOLC: You Only Look Clusters for Tiny Object Detection in Aerial Images. IEEE Transactions on Intelligent Transportation Systems, 25(10), 13863–13875. DOI 及论文页面. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩
-
Huang, Y., Chen, J., & Huang, D. (2022). UFPMP-Det: Toward Accurate and Efficient Object Detection on Drone Imagery. Proceedings of the AAAI Conference on Artificial Intelligence, 36(1), 1026–1033. DOI 及论文页面. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩
-
Du, B., Huang, Y., Chen, J., & Huang, D. (2023). Adaptive Sparse Convolutional Networks with Global Context Enhancement for Faster Object Detection on Drone Images. 2023 IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR), 13435–13444. DOI 及论文页面. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩
-
Li, Y., Hou, Q., Zheng, Z., Cheng, M.-M., Yang, J., & Li, X. (2023). Large Selective Kernel Network for Remote Sensing Object Detection. 2023 IEEE/CVF International Conference on Computer Vision (ICCV), 16748–16759. DOI 及论文页面. ↩↩↩↩↩↩↩↩↩↩↩↩↩
-
Wang, K., Wang, Z., Li, Z., Teng, X., & Li, Y. (2024). Multi-Scale Cross Distillation for Object Detection in Aerial Images. In Computer Vision – ECCV 2024, LNCS 15107, 452–471. DOI 及论文页面. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩
-
Xu, C., Ding, J., Wang, J., Yang, W., Yu, H., Yu, L., & Xia, G.-S. (2023). Dynamic Coarse-to-Fine Learning for Oriented Tiny Object Detection. 2023 IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR), 7318–7328. DOI 及论文页面. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩
-
Zhang, J., Lei, J., Xie, W., Fang, Z., Li, Y., & Du, Q. (2023). SuperYOLO: Super Resolution Assisted Object Detection in Multimodal Remote Sensing Imagery. IEEE Transactions on Geoscience and Remote Sensing, 61, 1–15. DOI 及论文页面. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩
-
Deng, S., Li, S., Xie, K., Song, W., Liao, X., Hao, A., & Qin, H. (2021). A Global-Local Self-Adaptive Network for Drone-View Object Detection. IEEE Transactions on Image Processing, 30, 1556–1569. DOI 及论文页面. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩
























