资讯详情

资讯详情

小目标无人机检测与跟踪实战:从CVPR Anti-UAV Workshop到红外多模态攻坚

每年CVPR都有大大小小不少Workshop但老实说绝大多数人只盯着主会论文对Side Event基本是“刷个标题”就算看过了。不过2020年的Anti-UAV Workshop是个例外——至少对我这种常年跟安防视觉打交道的人来说这个workshop的那点含金量一点不比主会某些poster低。原因很简单它拉了一个实际的难题出来办了一个能直接检验你算法水平的挑战赛还把数据和评测标准都公开了。澎思科技是主要组织方之一赛道围绕“低空小目标无人机检测与跟踪”展开用的数据既有可见光也有红外。当时不少做检测和跟踪的同行都下水试了一把我在这个任务上也踩了不少坑这篇就把这些过程整理出来给打算入门或复现的人作个参考。1. 这个比赛的底层逻辑为什么传统检测器在“无人机反制”上吃瘪1.1 你要面对的目标和普通行人检测不是一回事做目标检测的人都有一个惯性拿到新数据集先跑个YOLO或者Faster R-CNN看看baseline。诚然在COCO这种常规尺度、常规光照的数据集上这些模型已经快到天花板了。但Anti-UAV的数据一上来就把这个惯性打破了。首先目标尺寸极小。无人机在几十米甚至上百米外反映到画面上通常只有几十个像素甚至十几个像素。什么概念一张1080P的图像一个10x10像素的目标面积只占全图大概百万分之一级别。常规检测器为了兼顾多尺度通常会在FPN特征金字塔的浅层特征上做预测底层特征图的感受野小、分辨率高理论上对高分辨率小目标有利。但问题是网络在浅层提取的语义信息很弱而小目标本身的上下文信息又极度匮乏导致浅层头很容易把背景纹理误判成目标。更麻烦的是这个挑战赛的视频里无人机不光小还经常出现在云、楼顶、树木、电线杆等复杂背景里。目标颜色和背景融为一体可见光下分界线模糊红外下又可能出现“低对比度大动态范围”的双重麻烦。1.2 检测和跟踪是“两个赛道”但本质是一套组合拳Anti-UAV Challenge分了Detection和Tracking两个方向。很多人误以为这是一个“先检测后跟踪”的流水线问题实际上组织方对两个任务的数据切分、评测方式完全不同体现在工程上就是两种解题思路的碰撞。Detection赛道给的是单帧图像或者视频中的关键帧要求你输出全图中的目标框和类别置信度评估维度就是经典的平均精度AP以及帧间的连续准确率——也就是不仅看单帧准不准还看你在整个序列上有没有“闪烁式”的漏检和误检。Tracking赛道则给了第一帧的框要求你在后续帧里持续跟踪目标位置评测往往是基于中心位置误差和重叠率的综合指标类似VOT系列的思路。不过Anti-UAV的数据里包含大量快速移动、突然转向、短暂遮挡甚至是红外热交叉的片段这会把很多只依赖移动模型如卡尔曼滤波或外观模型如相关滤波的跟踪器瞬间打回原形。我在测试中发现单纯把检测和跟踪拼起来是能“跑通”的但效果落差很大。检测器在某一帧漏检了跟踪器就会飘跟踪器飘了后续的检测区ROI又会产生大量误检这个误差累积效应在长序列上几乎是灾难性的。所以真正能拿到高分的队伍基本都是“检测模型跟踪后处理”联合调优而不是两个模块简单串联。1.3 关键指标别只看APMPDP和MPRT才是“裁判真实意图”这就引出评测指标的问题。Anti-UAV Challenge里有两个核心指标经常被新手忽略MPDPMean Pixel-wise Detection Precision和MPRTMean Pixel-wise Tracking Precision。MPDP本质上是对检测框和真实框的逐像素IoUIntersection over Union在全序列上的平均再按像素位置精度去算Precision。相比标准COCO的mAPMPDP更强调“框得准不准”而不仅仅是“框没框到”。一个常见现象是你用常规检测器得到一帧的IoU0.6的框AP可以很高但在MPDP上就被拉下来了因为它逐像素做相似度计算对框的边界位置很敏感。MPRT则是对跟踪结果每一帧做加权中心误差和重叠评价。这个指标很重要的一点是它在计算最终分数之前会对跟踪失败的帧做一个惩罚性处理——简单说你的跟踪器一旦在某帧彻底Lost后面不管怎么追都会在这个指标上留下一个很难补回来的坑。我用表格整理一下我在多次尝试中总结的指标特性对比指标评测对象对边界位置敏感度对长序列稳定性敏感度最容易被忽视的点AP / mAP检测框分类定位中等低单帧评估没有时间维度MPDP检测框逐像素精度高中全序列平均对抖动惩罚重MPRT跟踪结果中心误差与重叠较高高失败后不可逆惩罚简单来说你如果把精力全放在把检测AP刷高而忽略框的边界稳定性和时间连续性最后的竞赛分数大概率不会理想。这也是这个挑战赛最有价值的地方它逼着你在“常规目标检测”舒适区之外去重新思考“小目标长时序多模态”背景下的算法评估方式。2. 五大核心技术点拆解为什么这些方法有效哪些只是看起来有效2.1 多尺度特征融合小目标检测的“最后一公里”针对小目标业界通用的答案基本是“多尺度特征融合”。但这里有两个容易被忽视的细节。第一不是所有FPN都是有效的。传统的FPN自顶向下传递高层语义但小目标在高层特征图里可能已经消亡——因为经过了多次下采样一个10像素的目标在stride32的特征图上连半个像素都不到。所以有效的做法是“浅层特征图加大”或者干脆在输入阶段就做大分辨率推理。我记得当时不少参赛队把输入分辨率从640x480拉到960x1080加上滑窗或者切块推理MPDP立竿见影地涨了几个点。代价是显存和推理速度但比赛不重速度的话这条路线性价比很高。第二要加强对目标尺度先验的利用。AMR-Net或类似方法里有一招叫“多尺度anchor分配”训练时根据目标实际大小把标签分配给不同层级的特征图让每层只管自己尺度范围内的目标。这比让所有层都去检测所有尺度的目标要稳定得多。训练时我也在Loss里对小目标的回归误差做了加权例如只对面积小于32x32像素的GTGround Truth框增加定位损失权重实测在低分辨率红外图像上能更早收敛。2.2 时序信息与“伪标签”的博弈Anti-UAV的数据绝大多数是视频序列这意味着你手上的信息不止是空间上的一帧还有时间上的连续性。最朴素也最有效的方法是把邻近帧的检测结果做“时域聚合”对连续5帧的检测框做非极大值抑制NMS或者加权平均能显著减少单帧的偶然性漏检和误检。但时域信息也有可能反噬。如果你做了强时序增强比如把多帧叠加输入网络一旦目标出现快速相对运动帧与帧之间会形成“拖影”效果。这个在可见光数据里还能容忍但在红外数据里拖着尾巴的亮点几乎会被模型当成一个更大的目标而且框会向尾巴方向偏移。我自己的策略是训练时随机选取相邻3-5帧作为候选输入推理时回归到单帧相当于把时序当作一种数据增强手段而不是模型输入的硬编码。这个方法在当时的Infrared测试集上MPRT提升了大约2个百分点代价是训练时间拉长。至于“伪标签”在水到渠成时可以用但不建议一上来就玩。半监督学习和自训练在目标域和源域差异大的时候很容易把检测器的错误预测固化下来。尤其在小尺度无人机这种目标上一个错误的高置信度框往往比没有框更可怕——因为后续跟踪器会基于这个错误框持续跟错。如果要试用伪标签我建议只在Confidence 0.95的框上做回填并且只在验证集指标改善的情况下继续迭代。2.3 红外模态的“对比度骗局”不能直接套用RGB网络的预处理很多做检测的人拿到红外图像后的第一反应是把单通道复制成三通道喂给ImageNet预训练网络。这个操作能用但效果很差。原因也很直白ImageNet的预训练特征大多是基于可见光的颜色、纹理和边缘统计而红外图像的核心信息是“温差分布”局部对比度、动态范围和噪声模型都不一样。处理红外数据时我有几个更实的心得推荐在输入网络前做局部对比度归一化比如CLAHE限制对比度自适应直方图均衡而不是简单的全局Min-Max归一化。因为红外视频里的目标经常出现在大面积均匀背景中全局归一化会把对比度拉低目标反而更不清晰。如果做数据增强不要套用颜色抖动ColorJitter那一套改为亮度抖动和局部遮挡更有意义。红外的“颜色”不是真实的可见光反射率换个色调相当于无意义地破坏物理信息。训练时把红外图像当作单通道输入然后网络第一层用随机初始化后面层加载预训练权重。这个做法能至少把起点拉高一个档次而不是从头训练整个网络。因为不少参赛队伍在数据上吃了“预处理一刀切”的亏最后成绩差在水准之上但始终没到顶尖。可见非视觉模态的数据处理是整个解决方案里不可跳过的一环。2.4 跟踪方法选型相关滤波快但容易崩检测跟踪稳但“延时”是隐伤在Tracking赛道上我先后尝试了三种主流思路各自优劣非常明显。第一种是传统相关滤波家族比如KCF、SRDCF。它们在小目标、低分辨率、目标外观简单比如一个亮点的情况下速度极快而且跟踪很稳。但问题在于无人机一旦被遮挡、出现相似目标另一架无人机、飞鸟干扰相关滤波器很难通过外观模型分辨出来经常会把相似目标当成本体跟过去一旦跟错基本回不来。第二种是Siamese类跟踪器比如SiamFC、SiamRPN。它们在VOT上有不错表现但在部分Anti-UAV序列上出现了“目标尺度突变”处理不足的问题尤其是红外图像里目标从一个小点忽然放大成一个有轮廓的平面物体时模板更新策略如果太慢就很容易丢失目标。第三种是基于检测器的跟踪Tracking-by-Detection当时的主流做法是“检测器 卡尔曼滤波 IoU匹配”。这种方案在小目标数据集上最稳定因为只要检测器不犯原则性错误跟踪误差就能控制在一定范围内。缺点是推理速度偏慢对计算资源要求高。我最后的方案是“检测做主力相关滤波做补充”主跟踪器用基于检测的KalmanIoU当检测置信度连续几帧低于阈值时切换成一个轻量的相关滤波跟踪器做短期维持直到检测器再次锁定目标。这个“组合拳”思路在当时的测试集上稳定性和成功率均有明显提升。2.5 数据增强的“场景级”思路别把天空切片拼来拼去常规目标检测的数据增强是“几何变换颜色变换混合裁剪”但对于Anti-UAV这种小目标场景有一类增强比所有通用增强都管用——场景级复制粘贴。做法是从训练集中挑选一些目标姿态清晰、轮廓完整的小目标图像块然后随机粘贴到背景图像的不同位置包括天空、楼顶、海面、树林等同时做随机尺度缩放和旋转。这个方法的技术要点在于“交互式标注”粘贴的目标要和背景进行边缘羽化处理或局部像素融合否则模型学会了通过“目标边缘的硬边界”来识别无人机泛化性会很差。我还试过用GAN做红外域的图像风格迁移将可见光目标迁移到红外背景上但效果不稳定。主要原因还是域差距太大生成的伪图像物理一致性差。如果是想补充红外数据更建议直接从训练集里手动截取目标区域做仿射变换而不是指望大规模生成网络。3. 实战流程复盘从准备数据到提交结果的完整闭环3.1 环境与代码库选型我当时的实验环境是PyTorch 1.4 CUDA 10.2用单张RTX 2080Ti做验证主力训练用两张卡。代码基础基于mmdetection系列原因很简单它自带RetinaNet、FCOS、ATSS等多种检测器配置方便统一做对比实验。跟踪端我用了基于PySOT的框架需要说的是初版直接跑在Anti-UAV上效果很一般因为PySOT的默认参数是为通用视频目标设计的对“极小目标快速运动”并不友好。如果今天复现我会直接用更新的框架如mmtrack、Ultralytics等但核心流程是一样的先做数据清洗和标注检查再训练检测器然后把检测结果灌进跟踪器最后按官方评测脚本计算MPDP和MPRT。3.2 数据准备与预处理挑战赛提供了已标注的RGB和红外视频帧序列。第一步是把所有视频帧按序列号抽出来然后按照官方划分的train/val组织目录。当时有个小坑是有一部分图像是GIF格式或者带有不同编码方式的JPEG直接按后缀读会出现丢帧或者颜色通道错乱我最后统一用OpenCV的VideoCapture接口逐帧读取并转成PNG保存从根上规避了格式兼容问题。红外图像在预处理上我用了“分位数归一化CLAHE”的组合。分位数归一化主要是抗异常值红外图像里偶尔会出现太阳或热源直接把全局最大像素拉到255会严重压缩其余像素的动态范围让目标几乎不可见。具体做法是取99.5%分位数作为上限0.5%分位数作为下限然后再通过CLAHE提升局部对比度。3.3 检测模型训练流程检测器我用的是ATSSAdaptive Training Sample Selection它在小目标上的anchor分配方式天然比RetinaNet/Faster R-CNN更灵活。输入分辨率在训练时直接设为1024x1024主干网络用ResNet-50。训练细节如下优化器SGDmomentum0.9weight_decay0.0001初始学习率0.01warmup 500步cosine annealing降到1e-5Batch size单卡16实际因为显存限制用梯度累积到等效16Epochs24轮存储每5轮的checkpoint用于早停训练期间记录了两个最重要的曲线信号loss曲线必须平滑下降和验证集MPDP如果连续3轮不涨就该调整超参数而不是干等。测试时增强TTA对最终分数有正向作用。我用了多尺度推理原图、0.8倍、1.2倍和水平翻转把三组检测结果做加权NMS合并。这块能把MPDP提高1~2个百分点代价是推理时间接近原来的4倍但比赛只需要离线提交结果完全值得。3.4 跟踪器的整合与调参跟踪流程分两条线正常跟踪状态和跟踪丢失状态。正常状态下用检测器输出的最高置信度框做Kalman预测再用IoU匹配做数据关联。这里要重点调两个参数IoU匹配阈值和置信度门限。我尝试过一组参数扫描发现置信度在0.45~0.55之间、IoU阈值在0.3~0.4之间时跟踪的漏跟和漂移最少。跟踪丢失状态的处理也很关键。当连续5帧内检测器返回的最高置信度框低于置信度门限时我切换到相关滤波跟踪器对最近可靠框周围区域做短期追踪。如果相关滤波在接下来10帧内能找回高置信度检测框则切换回检测跟踪否则判定目标彻底Lost重新在全图范围内用低置信度阈值做目标搜索。我用一个表总结一下核心参数和经验值基于我的实验组合仅供参考模块参数实验区间我最终选择备注检测器输入分辨率640~12801024太高显存不够太低小目标丢检测器置信度阈值0.3~0.60.5太低误检多影响跟踪稳定性跟踪IoU匹配阈值0.3~0.50.35过高匹配不上过低会乱配跟踪Kalman过程噪声0.1~1.00.3目标机动性强噪声不能太小切换丢失判断帧数3~105太短误切换太长漂移拉不回来3.5 提交结果的避坑官方评测脚本有几个小地方容易踩雷。一个是输出格式框坐标一律是绝对像素坐标不是归一化坐标我第一次提交时因为把坐标当成了归一化值整个MPRT直接崩了。另一个是帧序错位检测结果必须逐帧对齐我建议在输出csv或txt时额外保存视频序列ID和时间戳字段方便事后查错。还有一个细节评测中会对某几帧标注“无法判断”或“忽略帧”这些帧不要输出任何框否则会被当作误检惩罚。4. 常见问题与排查技巧实录4.1 指标和分数对不上先检查坐标和帧对齐一次我在本地按评测脚本算MPRT明明是0.58提交到官方榜单却变成了0.42。排查了很久发现问题出在我输入给跟踪器的检测框坐标参考系本地测试我用了裁剪后的图像区域去跑检测器得到的是裁剪坐标系下的框坐标没有加回裁剪偏移量就直接喂给跟踪器导致跟踪在每一帧都偏移一个固定量整体精度被拉低。这类问题建议在一开始就写一个独立的“数据流校验”函数随机抽10帧手工标注目标框然后跑完整检测跟踪流水线打印每一帧的坐标、时间戳、置信度和标注逐项对比。这一步能帮你提前暴露大部分坐标和时序错位问题省下大量调试时间。4.2 红外图像上模型不收敛八成是预处理的问题很多人拿到红外图像后直接用默认ImageNet均值[0.485, 0.456, 0.406]做归一化发现Loss下降极慢甚至验证集指标完全不动。这是因为红外图像像素分布规律与自然图像差异太大默认均值和方差完全不匹配。我的建议是单独统计训练集红外图像的像素均值和标准差然后用自定义数值做归一化。我当时的统计结果是均值大概在87左右、方差在48左右不同设备会有差异请务必自己统计直接替换默认参数后Loss下降速度立刻正常。这条经验在可见光数据和红外数据混合训练时尤其重要建议分模态分别做数据加载和归一化。4.3 检测器泛化差同一场景还行换一个场景就废这是Anti-UAV任务里最典型的“参赛陷阱”。有些队伍能在测试集上刷出高分但把模型用于新场景比如换个城市、换种无人机型号立刻崩溃。原因在于训练数据里有些序列的背景和目标姿态高度重复模型学到的是“特定场景的记忆”而不是“无人机的一般特征”。缓解手段有两个一是强制做场景级的留一验证把几个序列单独留出看模型在未见序列上的表现而不是只做随机帧切分二是在数据增强时对目标区域做更激进的亮度扰动和模糊处理迫使模型学习目标的结构特征而不是特定纹理。4.4 跟踪失败后恢复不了需要“重检测”机制前文提到过切换相关滤波跟踪器维持短期状态但真正让跟踪成绩不崩的关键是“重检测”机制。具体做法是在目标Lost之后把置信度阈值下调让检测器在全图产生更多候选框然后用这些候选框和历史轨迹做一次全局最优匹配目标是找回目标而不是避免误检。这个机制可以显著提高长视频上的跟踪成功率但也会带来少量误检需要在提交前整体权衡。4.5 时间成本控制不要盲目迷信SOTA模型打这种比赛有一个很现实的问题参赛时间有限显卡资源有限。我见过有些选手一开始就上Cascade R-CNN多尺度训练大分辨率结果训练一轮就要大半天最后根本没时间做迭代调参。我的建议是先跑通一个中等复杂度baseline比如ATSSResNet-50输入1024确保完整流程无bug再逐步升级模型。如果时间允许第二梯队可以试EfficientDet或YOLOX这类推理较快的模型因为小目标任务里“多轮调优”带来的收益通常大于“单体模型”的增益。最后的经验分享我实际打了一轮Anti-UAV Challenge之后最深的体会是这个任务并不能用“目标检测”或“目标跟踪”任何一个单点知识来解决。它逼着我把检测、跟踪、多模态预处理、时域后处理串成一条完整链路并且每一步都要磨合。网上的公开方法不少但真正想在评测指标上稳步提高靠的还是“逐项消融实验脏数据清洗对指标的极端敬畏”这三件事。如果后面有人想复现或拓展这个方向我给两个落地建议。第一优先做一个“可视化调试工具”把检测框、跟踪轨迹、置信度和热力图同时画在视频帧上肉眼查看错误模式往往比看数字更快第二把测试集和训练集的正负样本分布差异量化出来尤其是在“红外目标与背景温度接近”的场景里这个差异很多时候才是性能瓶颈的真正来源。另外试试把这类小目标检测跟踪能力迁移到边缘设备上也是很有价值的应用方向。毕竟这类算法最终是要落到机场、体育场馆、重要基础设施的低空防护场景里的在算力有限、环境复杂的条件下还能保持稳定才算是真正扛住了实战检验。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →