
CVPR 2020 的 Anti-UAV Workshop 向外界征稿和招募参赛队伍时我第一反应不是“又一个学术比赛”而是“这个方向终于被顶会正式摆上台面了”。反无人机这个赛道近几年在安防圈子里一直很热但真正用计算机视觉方法去系统性地做检测、跟踪、识别的公开评测其实并不算多。CVPR 作为计算机视觉领域的顶级会议愿意专门为这个主题开 Workshop 并配套挑战赛说明学术界和产业界已经形成了共识低空小型无人机的视觉感知是一个值得投入、也有巨大落地空间的研究方向。这篇文章我想从一个参赛者兼从业者的角度把这次挑战赛背后的技术逻辑、任务拆解、方案选型和实战经验完整梳理一遍。不管你是准备打比赛的学生还是想在安防、智慧城市项目里引入无人机检测能力的技术人员这篇文章应该能帮你少踩几个坑。1. 为什么“反无人机”成了 CVPR 关注的焦点先说个大背景。消费级无人机这几年的出货量增长非常快航拍、物流、农业测绘、电力巡检都在用甚至很多普通家庭都有一台。但带来便利的同时黑飞、误闯禁飞区、隐私窥探等问题也在增加。传统的反无人机手段多集中在雷达和射频干扰上可雷达对低空小目标并不友好尤其是那种轴距只有二三十厘米的小四旋翼反射截面小速度又不快很容易被当成鸟或者直接被杂波淹没。视觉感知的优势在于它是“被动”的不发射信号也不会干扰其他设备。摄像头便宜、部署灵活可以通过图像上的外观特征把目标从复杂背景里分离出来。但麻烦也在这里无人机的视觉特征实在不突出它小、快、形状复杂多变远的时候可能只有十几个像素近的时候又带有桨叶旋转和遮挡再加上天空背景的云、光线变化甚至飞鸟、纸飞机这些干扰物都会让检测模型头疼。所以这个方向其实是计算机视觉里一个非常典型的“小目标高动态强干扰”场景天然适合拿去逼着算法团队卷出更好的模型。CVPR 上这类 Workshop 的意义不只是组织一场比赛它实际上是在把安防场景里最棘手的问题抽象成一个可以量化、可复现、可横向比较的评测基准让研究者和工程师有一个共同的对标平台。对产业界来说这样的比赛还有一个隐性价值它把需求方的指标带进了学术圈。比如安防项目里要的不是离线跑出漂亮的 mAP而是在边缘设备上、在复杂天气下、在目标快速运动时依然能稳定地把框画准。Anti-UAV 挑战赛的数据集和评价方式很大程度上就是在模拟这种真实场景的压力。2. Anti-UAV 挑战赛赛道设计与任务拆解2.1 主线任务检测与跟踪整个挑战赛的核心任务可以概括为两件事检测Detection和跟踪Tracking。检测任务的输入是一段视频帧序列模型需要对每一帧输出无人机的位置包围框并且要区分目标与背景。这听起来和通用目标检测差不多但实际做起来你会发现反无人机的检测更接近“在一张全是天空和云的图里找一个很小的黑点”正负样本的分布极端不平衡大部分区域都是背景目标可能只占画面的千分之几。跟踪任务则是给定第一帧的目标框后续帧中持续锁定这个目标。这个任务更考验算法的时序建模能力和目标外观建模能力。无人机在空中运动时姿态会不断改变可能在某一帧是俯视的“十字形”下一帧就变成侧面的“一字形”原地悬停时又几乎看不出位移这种外观剧变对跟踪器的模板更新策略是个很大考验。这两个任务并不是孤立的。实际应用中检测负责“发现目标”跟踪负责“锁定目标”两者经常被串联成一套完整的感知流水线。比赛把两者分开评测但很多参赛队伍最后提交的方案其实是检测跟踪融合的这也很符合工程直觉。2.2 数据集的成色决定了比赛的含金量一个挑战赛能不能打很大程度要看数据集。Anti-UAV 的数据集在设计上是有意往“难”里做的包含了不同背景的复杂场景比如城市、郊野、海面覆盖了不同光照条件和时间段目标的尺度差异也很大。有些镜头里无人机大得占满半个画面有些则在画面边缘飞过只有一小团模糊的像素。我在处理这个数据集时最直观的感受是它并不“干净”。很多帧里的目标实际上是模糊的甚至被其他物体短暂遮挡过。这对依赖清晰纹理特征的模型来说很不友好但也正是这种“脏数据”才贴近真实场景。训练集和测试集的分布差异也明显有的方案在验证集上成绩不错一到测试集就掉点原因就是模型记忆了训练集里的背景模式而不是真正学到了无人机本身的特征。评测指标上检测任务会看 mAP 这类通用指标但为了更贴近实际需求也会关注不同尺度下的召回率。跟踪任务则偏向成功率Success Rate和精确率Precision也就是在允许一定误差范围内跟踪器能“锁住”目标多少帧。这套指标组合非常像产业界做算法选型时会考虑的方式既看准不准也看稳不稳。2.3 检测跟踪组合拳的合理性比赛把检测和跟踪拆开但从安防系统的角度看这两者的结合才是完整方案。单纯做检测每一帧独立预测会引起框的抖动和闪烁单纯做跟踪如果初始化没做好错一次就全错了而且无法发现新进入视野的目标。我在实际项目中通常的做法是用一个较慢但精度较高的检测器做稀疏帧检测用跟踪器做帧间密集关联检测结果用来校正跟踪漂移跟踪结果用来平滑检测抖动。这个思路也完全可以迁移到 Anti-UAV 挑战赛的框架里。提交方案时只要把两套结果做对齐和融合就能在评测中呈现更稳定的表现。3. 核心技术点解析与方案选型3.1 小目标检测为什么那么难无人机目标最大的特点就是“小”。深度学习检测模型通常依靠下采样后的特征图来感知目标对于像素面积小于 32×32 的小目标在下采样四倍甚至八倍之后真正能用于分类和回归的特征只剩下几个点。你可以把它想象成在一张海报上找一根头发丝你把海报缩小之后头发丝就彻底消失了。应对小目标的第一条路是保留高分辨率特征。FPN特征金字塔这类结构就是干这个的利用不同尺度的特征图分别预测不同大小的目标让小目标在高分辨率的浅层特征上做检测。第二条路是多尺度训练把输入图片随机缩放让模型见多识广不至于对尺度过于敏感。但光有结构还不够。小目标的另一个问题是背景干扰的比例太大。天空场景里云的边缘、飞鸟、甚至树叶的间隙都可能产生类似小无人机的纹理响应。我测试过几种检测器YOLO 系列在速度上有优势但小目标召回率偏低Faster R-CNN 系列精度高一点但对算力要求也高。后来用了带 FPN 的单阶段检测器配合更敏感的正样本分配策略才把小目标的召回拉上来。3.2 检测方案单阶段与两阶段之争在反无人机场景里选检测器本质上是在精度、速度和内存之间做权衡。两阶段检测器如 Faster R-CNN的候选区域生成和分类是分开的精度更有保障但在边缘设备上跑实时推理的代价很高。单阶段检测器如 YOLO、FCOS把分类和回归一步到位速度优势明显但在极端小目标上容易出现漏检。我的建议是不要一开始就迷信某个框架而是先跑通一个轻量的 baseline然后把问题聚焦在反无人机的特殊难点上样本不均衡、目标尺度小、背景杂乱。比赛和真实项目的核心套路是先把召回率打上去再用更精细的后处理压误检。对于输入分辨率我一般会开得比标准 COCO 设置更大一些比如 1280×720 或 1600×960。无人机在画面里占据的像素本来就少输入分辨率不上去后面的努力都是白费。但是分辨率上来了推理速度就下来了所以也要考虑硬件算力。3.3 跟踪方案Siamese 系列是主力反无人机的跟踪任务目前主流的做法还是基于 Siamese 网络的跟踪器。SiamFC 提出的互相关计算思路把跟踪问题变成了模板匹配后来 SiamRPN 加入了区域提议网络让跟踪器能同时预测目标的尺度和位置速度和精度都上了一个台阶SiamRPN 又解决了深层网络训练不稳定问题在目标外观变化剧烈时表现更好。我在实测中发现纯 Siamese 跟踪器在无人机场景里有两个致命弱点。一是模板不更新目标外观变化一大跟踪就丢了二是对形变太敏感无人机转动桨叶、改变朝向时模板匹配的得分会急剧下降。所以实际使用时我会加一个“模板更新”的机制当跟踪置信度高时用当前的跟踪结果替换或融合旧模板置信度低时则保持旧模板不变避免污染。另外跟踪与检测的融合在 SiamRPN 类框架里也是可以做到的。把检测器输出的目标框作为候选区域输入到跟踪器的分类分支里重新打分能让跟踪器在目标重新出现后迅速找回。这个做法在比赛里属于比较实用的涨点手段不需要改动模型结构只改推理逻辑。3.4 实时性安防场景的隐性门槛比赛评测可能只看精度指标但反无人机系统的真实部署必须考虑实时性。安防场景里无人机出现到完成威胁动作往往只有几十秒如果检测加跟踪的流程跑不到 10 帧每秒以上反应速度就跟不上。我在项目里常用的压缩手段有三个模型剪枝、TensorRT 加速、输入分辨率动态调节。模型剪枝把不重要的通道去掉可以在几乎不掉点的情况下缩小模型体积TensorRT 做算子融合和精度校准能把推理速度提升 1.5 到 3 倍输入分辨率动态调节则是根据目标的大小自适应缩放目标小的时候用高分图目标大的时候用低分图平衡精度和速度。比赛和工程的差距也在这里。很多参赛方案在 GPU 上跑得飞快但部署到 Jetson 或者工控机上就变得不可用。如果一开始就以边缘设备为目标方案选型和模型设计都会有很大不同。4. 实操过程与参赛经验分享4.1 先把数据分析做透再谈模型拿到 Anti-UAV 数据集的第一件事不是急着喂给模型而是做数据可视化。我会把训练视频抽帧拼接成网格图逐一查看目标的尺度分布、出现频率、背景类型。这个习惯帮我发现了不少关键信息一部分目标在画面里长期处于高度模糊状态直接学习这类样本会干扰模型的收敛有些视频的背景纹理极其单一模型很容易记住背景区域的特征。针对这些情况我会把训练数据做分层采样让模型在采样的每个 batch 里都能看到不同背景、不同尺度的目标。如果一个 batch 里全是同一个场景的相似帧模型会很快过拟合到这个场景的纹理上导致泛化能力下降。这个细节对最终成绩的影响很大。4.2 数据增强针对性比花哨更重要通用目标检测里的数据增强策略在反无人机场景里不能直接照搬。像随机裁剪这类操作很容易把目标裁掉或者让目标出现在边缘区域反而增加学习难度。我比较推荐的是随机亮度对比度调整、轻微旋转、随机缩放和 MixUp。旋转操作要非常小心因为无人机的形状有一定方向性旋转 90 度后可能变得像一只奇怪的鸟模型反而学不到有效特征。亮度和对比度调整倒是很实用因为无人机视频里光照变化极为常见尤其是日出日落时段目标与背景的对比度会剧烈变化。MixUp 这种把两张图融合的做法原本是用来做图像分类的但用在检测任务里也能提升鲁棒性尤其能缓解背景过拟合。我实际试下来加了 MixUp 之后模型在验证集上的误检率下降了一个档次。4.3 训练细节学习率、NMS 阈值的学问训练一个反无人机检测器最容易被忽视的是学习率策略和 NMS 阈值。小目标的响应本来就弱如果学习率设置得过激进模型会优先学习容易分类的大目标特征小目标的梯度信号被淹没。我一般用小学习率配长训练周期让模型慢慢把细节特征也学到。NMS 阈值的选择也很有意思。阈值设得高重叠的框容易被保留导致误检变多阈值设得低两个相近的小目标可能被合并成一个框导致召回下降。在不同的测试集 slice 上最优阈值可能差异很大。我会在验证集上做一个小网格搜索而不是直接沿用默认值。还有一个容易被忽略的操作是置信度阈值和 NMS 的协调。检测器输出的低置信度框不一定全错有些是目标很小但位置正确的框。如果把置信度阈值一刀切设得太高这类框都会被过滤掉。更稳妥的做法是先用低阈值保召回再靠 NMS 和跟踪器的时域约束来去噪。4.4 涨点记录我的几个有效操作说几个我自己实测有效的操作按收益从高到低排一下输入分辨率从 640×640 提升到 1280×720召回率提升最明显代价是训练时间翻倍但值得。使用加权 BCE Loss 替代普通分类损失让模型更关注小目标上的低置信度响应。在检测器输出端做多帧时域 NMS把连续帧的检测结果合并能显著抑制突发性的误检。简单 EMA指数移动平均更新模型参数测试集上大约能稳定涨 0.5 个点。对测试集做 TTATest-Time Augmentation特别是水平翻转和多尺度推理能涨 1 到 2 个点但推理时间会成倍增加。要提醒的是TTA 这类操作在比赛里可以用但部署到实时系统里就要慎重了。工程上要在精度和延迟之间找到一个明确的平衡点而不是无脑堆测试时增强。5. 常见问题与排查技巧实录5.1 模型把飞机、鸟、风筝误检成无人机这是反无人机落地时最典型的误检类型。排查思路是先把误检框的置信度分布拉出来看看如果置信度普遍很低说明模型是对纹理模式产生了过拟合如果置信度也很高说明特征层面没有区分开。我的处理方式是在训练数据里加入“困难负样本”。从测试集或者公开视频里截取大量飞机、飞鸟、风筝这类干扰物图片作为负样本重新训练。实验显示这种做法比单纯调 NMS 阈值和置信度阈值有效得多。真正的区分能力还是要从训练数据里来。5.2 远处的无人机总是漏检漏检问题大多数出在目标尺度和输入分辨率上。排查时我会先把漏检帧的目标框面积统计出来如果普遍小于某个像素阈值就说明模型的下采样倍率对这个尺度的目标不敏感。解决办法是提升输入分辨率或者用基于高分辨率特征图的检测头。如果在提升分辨率之后仍然漏检那就要检查特征金字塔各层级的分配逻辑了。有些实现里小目标会被强制分配到很深的特征层而那里的小目标响应已经几乎消失。手动调整 anchor 的尺度和层级匹配通常能解决问题。5.3 跟踪器中途漂移无法找回目标跟踪漂移的根源通常是模板污染。跟踪器用了一段被错误框污染的模板之后后续帧匹配到的目标就越来越偏。我处理这个问题的办法是设置一个高置信度区间来触发模板更新只有连续多帧得分都高才更新模板。如果得分波动剧烈则停止更新并把检测器拉回来的框作为临时模板重新初始化。另一个常见情况是目标被遮挡后重新出现跟踪器已经彻底丢失了目标位置。这时候需要在跟踪器旁边常驻一个检测器当跟踪得分持续低于阈值时用检测结果重新初始化跟踪。这个策略虽然看起来笨重但却是很多安防产品里实际在用的方案。5.4 模型的训练损失在下降但测试指标不动这种情况多半是过拟合。反无人机数据集的规模不算大模型一旦学得太多就会把训练集里的背景细节记下来。验证集和测试集背景不同指标自然上不去。缓解方式不外乎数据增强、加 DropBlock 这类正则化手段、用更大的预训练模型做初始化。但我更推荐一个习惯在训练过程中定期保存 checkpoint并用验证集做评估选还停留在“泛化更优区域”的模型而不是追求训练损失最低的那个。5.5 硬件算力不够方案跑不动如果目标是 Jetson 这类边缘设备我建议在方案选型阶段就限定模型参数量和推理时间。优先选轻量级骨干网络比如 MobileNetV3 或者带 depthwise 卷积的 backbone放弃太重的大模型。剪枝后要重新微调否则精度会掉很多。另一个实用方案是做成“双速”系统用高分辨率低帧率的检测通道保证发现用低分辨率高帧率的跟踪通道保证锁定。两者配合起来既能在目标微小的时候通过高分图发现又能在目标出现后快速锁定整体算力需求却不会线性增长。最后再分享一个实操中的小技巧我个人在参加这类比赛和做相关项目时养成了一个习惯无论评测指标多么漂亮一定留一份推理阶段的“失败 case”截图集。每跑完一次测试就把误检、漏检、跟丢的典型帧截下来贴上标签放到一个文件夹里。后续换模型、调参数的时候就打开这个文件夹逐个看比单看指标数字有用得多——很多问题不在指标上暴露但一眼看到画面就知道模型错在哪里。这个习惯在打 Anti-UAV 比赛时帮了大忙。有一版模型的 mAP 数据看起来没有变化但通过观察失败 case 库我发现新增的误检大多集中在一种特定建筑的背景上。顺着这个线索换了几张负样本重训误检明显减少指标也随之提升。如果你也在处理这类小而杂的视觉目标检测问题不妨试试这个办法。