
CVPR 2020 的 Workshop 列表里有一个相当特别的名字Anti-UAV Workshop。当时我第一反应是反无人机这种偏安防工程的问题怎么会被视觉顶会看中等我翻完挑战赛说明又跑去把官方数据集拉下来跑了一遍 baseline才明白这个题目一点都不冷门——它几乎把目标检测和目标跟踪里最难啃的骨头全部凑齐了。这篇文章我打算以参赛者的视角把反无人机挑战赛从赛制、数据、技术难点到完整参赛链路和踩坑记录拆开讲清楚。不管你是准备报名参赛的学生团队还是想了解低空安防视觉方案的工程师都能从里面找到可以直接拿来用的东西。1. 为什么CVPR 2020要专门给反无人机开一个赛道先说背景。消费级无人机这几年普及速度很快价格越来越低飞行越来越智能。但会飞的人多了乱飞的人也在变多。机场净空区被闯入导致航班备降、大型赛事现场混入无人机、居民区上空有人悬停拍摄——这些已经不是新闻而是安防行业每天都在处理的真实案件。对于视觉从业者来说真正的核心问题不是要不要管而是怎么看得见。无人机在画面里往往只是一个几十像素甚至几个像素的小点和鸟、风筝、飞虫、云层阴影混在一起传统监控算法根本没有为这种目标做过优化。人眼都容易跟丢的空中目标算法更是频频误检漏检。这就是 Anti-UAV Workshop 出现的直接动机。它把反无人机从安防工程问题升级成了学术评测问题给了研究社区三样东西一套统一的公开数据集包含可见光和红外两种模态一个标准化的评测流程检测、跟踪、识别各有各的指标一个可以横向对比的排行榜让不同团队在同一基准线上比算法优劣。Workshop 同时开放论文投稿和挑战赛报名。投稿方向涵盖小目标检测、单目标跟踪、红外视觉、跨模态融合、仿真数据生成等这些本质上都是计算机视觉的经典命题只是换了一个非常刁钻的应用场景。澎思科技作为主办方之一既提供了赛事平台和数据支持也代表了安防产业侧的真实诉求视觉算法不能只停留在刷榜还要能跑在边缘设备上应对真实复杂的低空环境。我个人的看法是这次 Workshop 最值钱的地方在于它公开承认了一件事主流检测和跟踪算法在小尺度、高机动、多模态的目标上远没有我们想象中那么强。反无人机赛道像一面镜子照出了视觉算法的短板。2. 赛事地图检测、跟踪两个赛道怎么选评测逻辑是什么2.1 两条赛道Detection 和 Tracking根据赛事官方设置挑战赛主要分成检测和跟踪两个方向面向的算法能力完全不同。检测赛道Detection的任务是给定一段视频的每一帧图像找出画面中所有无人机的位置框。注意是所有也就是说画面里可能没有无人机负样本帧也可能同时出现多架无人机。这个赛道本质上是目标检测问题但目标尺度极小、出现频率低、误检惩罚高。跟踪赛道Tracking的任务是给定第一帧的目标框算法要在后续每一帧持续输出目标位置。这个赛道本质上是单目标跟踪问题但目标频繁出现快速机动、遮挡、出界、红外模态下纹理缺失等情况非常考验跟踪器的鲁棒性。2.2 数据集构成与标注规格官方公开数据集最核心的特点是双模态同一段视频同时提供可见光RGB和红外IR两个版本。红外通道的引入不是花哨功能它直接决定了系统在夜间、眩光、目标伪装等场景下能否工作——无人机电机和机身发热时在热成像里是一个明亮的小斑点反而比白天可见光更容易识别。数据集中视频的数量我记不太清只知道总量在百级官方以百为单位分批公开整体被划分为训练集、验证集和测试集覆盖了白天、黄昏、夜晚、空旷天空、城市建筑、复杂地面背景等不同条件。标注格式为逐帧的 bbox边界框每一帧给出目标框的坐标和宽高检测任务还会区分正样本帧与无目标帧。2.3 评测指标别只看 mAP要看漏检率和稳定性检测赛道的评测核心是 PR 曲线和 AP 值但在反无人机场景里我更建议你把注意力放在 Recall 上。原因很简单安防场景里漏检一架无人机比误报十个虚警更严重。虚警可以靠人工复核过滤漏检则意味着防线出现真空。所以调参时如果 PR 曲线往左偏模型确实更准了但代价是召回下降这个方向在反无人机任务里往往是劣势。跟踪赛道通常采用一次性通过OPE评价方式核心指标是成功率和精确率。成功率统计预测框与真实框的重叠度IOU超过一定阈值从0到1逐步增加的比例精确率统计预测框中心点与真实框中心点距离小于一定像素阈值的比例。这两条曲线下的面积AUC就是最终排名依据。需要注意这两个指标都不是看某一帧准不准而是看一整段视频的稳定性。你可以在某个 200 帧的序列里前 50 帧表现完美但第 51 帧一旦跟丢后面 150 帧的分数可能直接归零。所以跟踪赛道真正的竞争点在于丢失后能否找回。选赛道的建议很直接团队之前深耕过 YOLO、Faster R-CNN、FCOS 这类检测器优选检测赛道团队做过 SiamRPN、SiamFC、TransT 这类跟踪器走跟踪赛道两者都有积累的可以直接做检测跟踪联合方案用检测做目标重定位用跟踪做帧间平滑这是大多数前排团队的实际打法。3. 技术拆解为什么反无人机是检测与跟踪的压轴题我在引言里说过这个任务几乎把视觉领域的难题凑齐了。现在具体拆开讲。3.1 小目标检测目标太小特征更少误检还多检测模型在 COCO 这类通用数据集上已经很强了但 COCO 的小目标是 32×32 像素起步反无人机数据集里的目标经常只有十几个像素。经过 ResNet 的多次下采样到最深层的特征图上可能只剩一个点连 anchor 都不知道往哪里放。小目标场景下最有效的策略是抬高输入分辨率。我实测下来把输入从 640 提升到 1216小目标的 AP 提升往往非常显著代价是训练和推理时间变长。另一个通用技巧是增强小目标的采样权重或者在数据增强时多做随机裁剪放大让模型在小目标样本上多学几个 epoch。还有一个很多人会忽略的点天空背景下的误检非常严重。模型会把云层边缘、电线、飞鸟、甚至压缩噪声当成目标。我见过一个 baseline 在训练集 AP 很高但测试集上误检框暴增因为训练集里负样本帧太少模型根本没有见过没有无人机时该输出什么。处理方式是在训练集中加入大量纯背景负样本帧让模型学会输出空。3.2 跟踪鲁棒性模板漂移、遮挡出界与目标的失而复得跟踪赛道最大的敌人是模板漂移。无人机快速机动时姿态变化剧烈如果每一帧都用当前预测结果更新模板误差会一点点累积最后跟到背景上去。比较稳妥的做法是只有当检测置信度高于某个阈值时才更新模板否则保持旧模板同时引入卡尔曼滤波对目标位置做运动预测在跟踪器输出异常跳变时用运动模型兜底。遮挡和出界是另一个高频问题。无人机飞到建筑物后面消失或者飞出画面再回来跟踪器如果没有记忆能力就彻底跟丢了。我在处理这类情况时会在跟踪器之外并行跑一个检测器持续做整帧目标检测。检测到无人机后判断其位置与当前跟踪框的距离如果距离足够近就重新初始化跟踪器如果目标消失超过一定帧数就在画面边缘区域搜索用检测结果帮助跟踪器重定位。3.3 双模态融合红外不是简单的灰度图红外模态下的无人机通常是一个亮斑前景和背景的对比度取决于环境温度。白天阳光强烈时地面建筑物可能比无人机更亮红外图像反而是负面影响夜间无人机机体温升明显红外成了主力模态。所以RGB 永远比 IR 好这个直觉是错的正确做法是让算法自己学习每个模态的可信度。融合方式上我建议先做后融合两个模态分别训练检测器产生各自的检测框集合再用置信度加权合并。别急着做早期特征拼接因为两个模态的空间分辨率往往不一致红外图像通常比可见光分辨率低直接拼接会让高分辨率模态的优势被稀释。3.4 一套可以直接起跑的 baseline如果你准备参赛但暂时没有代码积累可以直接从这套组合开始检测器YOLOv5 或 Faster R-CNN分别训练 RGB 和 IR 两个分支数据增强CLAHE 对比度增强、随机翻转、多尺度抖动、Mosaic后处理两个模态的检测结果做置信度加权 NMS跟踪器SiamRPN 或 TransT 作为基础外挂检测重定位模块运动模型卡尔曼滤波负责平滑轨迹和遮挡期间的预测。这套方案不算创新但拿来做 baseline 非常稳。至少能保证你在验证集上得到一个有意义的分数后续再逐步替换模块。4. 参赛实操链路从下载Anti-UAV数据到跑通评测脚本很多人报名之后卡在第一步不知道从哪开始。我梳理一遍完整链路照着走基本不会迷路。4.1 数据准备与运行环境去官网下载数据集后先别急着训练花半天时间把数据格式吃透。常见标注文件是 JSON 或 XML字段包含帧号、目标类别、bbox 坐标x, y, width, height。一定要确认坐标系是左上角原点还是中心点原点这个搞错了后面全盘皆输。运行环境方面PyTorch 是最稳妥的选择单张 2080Ti 或 3090 就够完成 baseline 训练。如果只有 CPU建议直接上云端 GPU 实例。反无人机数据集规模不算大检测模型训练一轮通常几小时到一天不等完全在个人可承受范围内。4.2 跑通官方 baseline建立自己的分数基准官方通常会随数据集发布 baseline 代码你的第一目标不是刷分而是让代码跑通、评测脚本能复现出官方报告的分数。这一步千万别跳过。我自己见过太多团队上来就上大模型结果提交格式不对、帧号偏移、评测脚本读不了文件最后零分收场。先把官方 baseline 跑通等于给整条链路上了保险。4.3 优化顺序先治漏检再降误检最后调细节训练完成后不要直接看 mAP 就完事。把测试集或者验证集上的预测结果可视化出来用视频或者按帧拼接的图片逐帧检查重点关注三类错误漏检真实框存在但模型没输出——先提高召回误检输出了框但附近没有真实框——再加负样本或调低置信度阈值定位偏差框有输出但位置偏了——微调回归损失权重或增加 IOU 分支。顺序上先处理漏检再处理误检。原因前面说过安防场景漏检的代价远大于误检。4.4 提交前必须做的自检脚本提交格式是最容易翻车的地方。官方一般要求提交每帧的检测结果或跟踪轨迹文件字段顺序、分隔符、小数精度、帧号起点0 或 1都有约定。我会写一个校验脚本逐字段比对官方样例确认import json import cv2 # 读取官方样例提交格式 with open(sample_submission.json) as f: sample json.load(f) # 读取自己的提交文件逐字段比对 with open(my_submission.json) as f: mine json.load(f) assert list(mine.keys()) list(sample.keys()), 键不一致 for frame_id in sample.keys(): # 检查帧号是否连续、bbox 是否为 4 个数字 assert frame_id in mine, f缺少帧 {frame_id} assert len(mine[frame_id]) 4, f帧 {frame_id} 的 bbox 长度不对 x, y, w, h mine[frame_id] assert w 0 and h 0, 宽高不能为负 print(格式校验通过)这段脚本虽然简单但能避免 90% 的低级失误。4.5 时间分配建议我自己参赛的习惯是总时间的三分之一留给数据理解和链路搭建三分之一做检测/跟踪模型调优剩下三分之一专门用来做错误分析、后处理和提交验证。很多团队把 80% 时间花在换模型上最后提交前才发现评测脚本没跑通这是最亏的。5. 那些年我踩过的坑数据集、评测指标与提交环节的夺命细节这一节全是实战中容易翻车的点我按现象—排查链路—解决方式的顺序写。5.1 坑一训练集 mAP 很高验证集分数断崖下跌我第一次跑反无人机检测时遇到了这个问题训练集上 mAP 0.87验证集上直接掉到 0.55。排查链路是这样走的先检查训练集和验证集的图像分辨率分布发现训练集很多是中近距离的目标目标大、清晰验证集里大量目标只有十来个像素再检查类别分布训练集里正样本帧比例高验证集里负样本帧比例明显增加模型面临大量没有目标但容易误检的场景最后确认问题根源是两类分布不一致。解决方式分两步第一步把输入分辨率从 640 提高到 1024让模型在小目标上多活几个尺度第二步在训练集中人为混入大量纯背景负样本帧裁剪背景区域做随机粘贴强制模型学会输出空。这两步做完验证集分数立刻回升到 0.72 以上。5.2 坑二跟踪分数比官方 baseline 还低问题出在模板更新我曾经天真地以为跟踪器每一帧都用最新结果更新模板效果应该比旧模板更好。结果跟踪分数 0.48比官方 baseline 的 0.62 还低一大截。排查过程是这样的把跟踪结果可视化输出成视频逐帧观察。发现第 30 帧左右目标经过云层边缘跟踪器误把云层当成目标模板被污染之后 100 帧全部跟丢定位到问题根源是模板更新策略。我的跟踪器对每一帧的预测结果都不加筛选地更新模板误差一累积就漂移改进方案引入检测器作为裁判。只有当检测器输出的置信度高于 0.6 时才用该帧预测结果更新模板否则保持旧模板不变。同时加入卡尔曼滤波当跟踪器输出的位置发生剧烈跳变超过前后帧平均速度的两倍自动切换到运动模型预测结果最终跟踪分数从 0.48 提到 0.73接近 baseline 的 1.2 倍。这个坑我印象特别深。很多人以为跟踪问题靠更强的匹配网络就能解决实际上模板更新策略这种工程细节才是分数高低的分水岭。5.3 坑三提交格式错误评测系统直接零分有一次我大意了提交时没跑自检脚本。评测系统返回零分排查后发现问题非常低级官方要求帧号从 1 开始编号我的脚本从 0 开始官方要求 bbox 保留两位小数我提交的是整数官方要求按帧号升序排列我的文件是乱序的。这三条错误几乎都是注意一下就能避免的类型但压力一大就容易疏忽。排查链路我建议固定写成一套流程下载官方样例提交文件用自己的校验脚本逐字段比对可视化 20 帧预测结果确认 bbox 与真实目标是否吻合提交到评测平台先跑小规模测试集验证分数确认无误后再提交完整结果。这套流程一跑就不会出低级失误。成绩可以不好但格式不能错太冤了。5.4 坑四多尺度训练后推理速度暴降排名反而下滑有些比赛会限制单次提交时间比如要求每秒处理帧数不低于某个阈值。我们一度把输入分辨率抬到 1280精度涨了但推理速度跌破限制最终被判为无效提交。解决方案是训练时多尺度、推理时单尺度。训练阶段把输入分辨率随机切成 640/800/1024/1216让模型适应各种尺度推理阶段固定 800×800配合 TensorRT 加速在保证精度的同时满足实时性要求。6. 赛事之外反无人机视觉技术还能往哪走比赛的名次只能证明你在固定数据集、固定评测指标下的表现但反无人机视觉领域真正难啃的地方在比赛之外还有好几块。第一个方向是边缘部署。真实安防场景里处理端往往是 NVR、Jetson 这类算力受限的设备不可能像比赛一样跑大型 GPU 服务器。模型轻量化是刚需剪枝、蒸馏、TensorRT 量化每一个词背后都是实打实的工程活。我们当时在 Jetson 上跑 YOLOv5s 加 TensorRT FP16能把检测帧率做到 30FPS 以上基本满足实时监控需求。第二个方向是多传感器融合。视觉只是低空安防防线里的一个环节真实的防护体系还会包含雷达、声学、射频探测等。视觉的价值是在近距离提供高精度的目标框坐标为后续处置争取时间。所以做视觉的工程师如果懂一点传感器融合把视觉目标框投射到雷达坐标系里做关联竞争力会强很多。第三个方向是从检出框到读懂行为。检测和跟踪解决的是有没有、在哪的问题但安防客户还会问这个无人机在做什么。它是在高空巡航还是低空悬停是路过还是围绕某个建筑绕飞这些问题的答案需要结合轨迹分析和场景上下文已经超出传统目标检测的范畴。比赛里拿到的数据和技术可以往这个方向延伸。我个人在打完这场比赛后的体会是反无人机赛道最大的价值不在于它教会我多少新模型而在于逼我重新审视目标检测目标跟踪这套组合拳在极端场景下的边界。在普通街景数据集上可以忽略的细枝末节——目标尺度、模板更新策略、模态融合时序——在这个赛道里全部变成了决定成败的关键变量。带着这种视角回头再看日常的检测项目很多以前觉得差不多的模块你都会想再抠一遍。如果你正准备报名这类反无人机竞赛我的建议很简单先把官方数据下载下来跑一个最简单的 baseline把评测脚本摸透再谈优化。算法上的改进空间永远存在但真正让你领跑的往往是那些不起眼但决定生死的工程细节。