尧图精选

视频目标检测综述:从逐帧基线到时序建模与工程取舍

🕒 发布时间:2026/10/1 18:01:06 📁 来源:尧图网络
我印象很深的一次经历是拿一个在 COCO 上刷到不错成绩的检测器直接逐帧丢进一段路口监控视频里跑。单帧抽出来看框得挺准可当我把结果连成序列播放时画面里就出现了一种很别扭的抖动感——同一辆车在相邻两帧里的框忽大忽小偶尔还会凭空消失一两帧再跳回来。那一刻我才真正意识到视频目标检测video object detection和静态图像目标检测根本不是一个问题它多出来的那部分麻烦恰恰藏在帧与帧之间。这篇综述想聊的就是这件事。视频目标检测指的是给一段帧序列输出每一帧里目标的类别和边界框并且要求这些结果在时间轴上保持稳定、一致。它服务的场景非常具体——自动驾驶感知、路口车流统计、体育赛事回放分析、长视频内容审核、无人机巡检凡是输入是视频流而不是单张图的地方都可能用到。这篇文章面向的是已经会跑图像检测器、准备把模型推到视频上的工程师以及想快速摸清这个方向脉络的学生。我会尽量把主流技术路线、数据集、评测口径和自己踩过的坑讲清楚不绕弯子。1. 视频目标检测到底比图像检测难在哪1.1 逐帧跑图像检测器的那种错觉很多人第一次做视频检测思路都很朴素把视频拆成帧逐帧送进 Faster R-CNN 或者 YOLO输出框收工。这个方法在论文里有个正式名字叫逐帧基线frame-by-frame baseline它确实能出一个不低的分。原因也不难理解ImageNet VID 这个主流基准只有 30 个类别而且都是相对好认的类别单帧检测器本身已经足够强。但问题在于逐帧基线完全放弃了时间维度上的信息。它的每一次前向传播都是失忆的不知道上一帧发生了什么。这会带来两类直接后果一是时序不一致同一目标在连续帧上的检测结果会出现框的抖动、类别跳变、置信度剧烈波动二是难帧失效一旦某一帧出现运动模糊、遮挡或者特殊姿态检测器当场就崩只能等到目标重新变得清晰才恢复。而人类看视频时几乎不会遇到这个问题我们的大脑天然会利用前后帧来脑补当前帧被遮挡的部分。所以视频检测的核心命题可以一句话概括怎么把帧间的冗余信息转化成对当前帧检测的帮助。这个冗余是视频相对图像最大的额外资源用不用、怎么用就分出了后面要讲的各种技术路线。1.2 视频里那些专门让检测器翻车的样本类型如果只看单帧视频里真正困难的帧其实来自几个非常固定的模式理解了它们后面选方案就有了靶子。**运动模糊motion blur**排在第一位。高速运动的物体在快门时间内发生位移边缘被拉成一条糊带纹理信息几乎消失。这类帧单帧检测器基本靠运气。紧随其后的是视频失焦video defocus也就是摄像机对焦没跟上目标运动整帧都软。它和运动模糊不同后者是局部糊前者往往影响一大片区域。**部分遮挡partial occlusion**是最常见也最致命的。前车挡住后车、行人走进广告牌后面、雨伞遮住半张脸这些帧里目标的有效像素大幅减少检测器往往给出一个置信度很低的框或者干脆漏检。有意思的是遮挡通常只持续几帧前后帧的目标都是完整的这就给时序信息留出了发挥空间。**形变shape deformation和尺度变化scale variation**在动物、行人这类非刚体目标上尤其明显。人从直立到弯腰、从远处走到近处外观变化剧烈但语义上是同一个实例。还有一类容易被忽略的是罕见姿态rare pose比如侧躺的狗、翻倒的摩托车。这些姿态在训练集里出现次数很少模型没见过自然认不出但如果前后帧该目标一直以正常姿态出现时序建模就能把它锚定住。提示做方案评估时建议把验证集按上述类型抽样切片单独看模型在每类难帧上的表现。只看总体 mAP你会完全看不出模型到底补的是哪块短板。1.3 mAP 之外评测协议里藏着的门道视频检测沿用图像检测的 mAP 作为主指标但细节上有几个地方必须注意否则你复现出来的数字和别人对不上。ImageNet VID 的评测通常设定IoU 阈值 0.5对每个类别算平均精度再对 30 个类求平均。看起来和 COCO 差不多区别在于它是按视频组织样本的一个视频里的帧是连续采样的而不是随机打散的图片。这意味着评测时不能打乱帧序任何依赖时序的处理都必须按原顺序执行。还有一个常被忽视的点不同论文在报告 VID 结果时用的验证集划分不完全一致。有的用官方 555 段验证集有的用自己切出来的 minival两者数字能差一两个点。所以当你看到某某方法 82.9 mAP这种结论时先确认它是在哪个划分上测的否则横向比较毫无意义。另外推理速度在视频场景里的权重远高于图像。一段 1080p、30fps 的视频如果要实时处理单帧预算只有 33 毫秒还得算上解码、预处理和后处理。这就导致一个很现实的取舍FGFA 这类靠密集光流做特征聚合的方法精度漂亮但慢得离谱工业落地基本用不了而 DFF、Tracktor 这类方法牺牲一点精度换来数倍加速反而更受工程侧欢迎。这个取舍贯穿了整个领域的发展。2. 时序信息到底怎么塞进去三条主路线把时序信息引入检测从在哪一层介入来分大致有结果级、特征级和端到端三条路线。它们不是互斥的很多强方案是两两组合。2.1 结果级后处理Seq-NMS 与 Tubelet 拼接最轻量的做法是完全不碰检测网络只在输出结果上做文章。代表工作是 Seq-NMS。它的思路非常直白先把每一帧的检测框都拿到然后在时间轴上找那些位置相近、类别相同的框把它们连成一条轨迹片段对这条片段内的框做置信度重打分——轨迹连续、框稳定的片段自动加分孤立的、闪烁的框自动降分甚至剔除。这个方法的妙处在于零训练成本随便什么检测器做完都能往上套立刻能拿到一两个点的提升而且时序抖动会明显减轻。它的局限也很明显如果某个目标在某几帧里被彻底漏检了Seq-NMS 连不上这条轨迹也就救不回来。它只能筛选和平滑不能生成。同样属于这一层的还有T-CNN 里的 tubelet 思路用光流把高分框向前后帧传播传播过去的框作为提议再送进分类器二次确认。本质上是用运动信息补出可能被漏掉的候选再用分类网络把关。2.2 特征级聚合光流对齐、DFF 与 FGFA把时序信息提前到特征层面是精度更高但也更重的做法。核心难点在于相邻帧的特征图在空间上是对不齐的目标移动了它的特征自然也移动了直接相加就是错位叠加反而引入噪声。解决办法是用光流做形变对齐warp。具体来说给定当前帧 t 和邻近帧 k先用光流网络算出从 k 到 t 的位移场然后用双线性采样把第 k 帧的特征图搬到 t 帧的坐标系下公式化地写就是让每个像素按光流指向的位置去采样邻近帧特征。对齐之后多帧特征才有资格放在一起做加权平均。**DFFDeep Feature Flow**的思路是在这里做减法只在关键帧上跑完整的主干网络提特征非关键帧则直接用光流把关键帧的特征传播过来主干网络完全跳过。这样整体计算量能砍掉一大截速度提升非常可观代价是传播过来的特征会有漂移尤其当关键帧间隔拉大时误差会持续累积。所以 DFF 的性能高度依赖关键帧的选取策略和光流质量。**FGFAFlow-Guided Feature Aggregation**走的是相反方向做加法对当前帧取前后各若干帧论文里常用前后各 10 帧全部用光流对齐到当前帧然后学习一组权重把它们聚合起来。相当于让当前帧看了一大圈邻居把被遮挡、被模糊掉的信息从别的帧里捞回来。它的精度是这条路线里公认的标杆之一比逐帧基线能有明显提升但代价是要对每一帧都算十几路光流推理速度慢到几乎无法实时。之后的MANet在 FGFA 基础上做了个很实用的改进不再对全图特征做对齐聚合而是只在目标实例所在的区域上做用的是所谓的实例级光流。这样既省了计算又避免了背景区域光流噪声的干扰精度还略有提升。这张表大致能看出这几种特征级方法的取舍方法时序信息介入方式相对速度精度表现主要短板逐帧基线无最快基准时序抖动、难帧失效DFF关键帧特征传播快略高于基线长间隔误差累积FGFA多帧光流对齐聚合很慢高光流开销巨大MANet实例级光流聚合慢很高仍需逐帧光流2.3 端到端与注意力MEGA、RDN、TransVOD特征级聚合这条路走到后面大家发现一个共同瓶颈局部邻域聚合的信息范围太窄而且光流本身在遮挡区域算不准越依赖它就越是把误差引进来。于是研究重心逐渐转向两类新思路。一类是扩大时序感受野并引入全局记忆。MEGA 是代表它同时做两件事在局部用邻近帧做特征增强在全局维护一份长时记忆把整个视频里出现过的相关区域特征缓存起来通过注意力机制调出来用。这样做的好处是哪怕目标被遮挡了很长一段时间远超前后几帧的范围只要它在视频早期出现过记忆模块里就还有它的特征。另一类是用关系建模替代显式对齐。RDN关系蒸馏网络不再强求把特征按光流搬来搬去而是建模目标和目标、帧和帧之间的空间与语义关系用关系蒸馏的方式把一个视频里所有目标实例聚合起来形成更稳定的表示。它绕开了光流精度这个软肋。再往后就是Transformer 路线的介入比如 TransVOD它把 Deformable DETR 那套端到端、无需锚框和 NMS 的框架搬到了视频场景加了一个时序编码器来建模帧间依赖。这类方法的一大优势是流程干净少了手工设计的后处理但训练成本高对数据和算力的要求也明显更重短期内还不太适合资源有限的团队直接上。2.4 检测即跟踪Tracktor 这条捷径如果说前面几条路线都在拼命挖特征、算光流那 Tracktor 给出的是一个让人拍大腿的观察你根本不需要为视频单独设计一个检测器图像检测器自己就能做跟踪。具体做法是利用 Faster R-CNN 这类两阶段检测器里的边界框回归头。把上一帧某个目标的框作为当前帧的候选区域送进回归头让它预测这个框应该往哪挪、挪多少回归结果就当成该目标在当前帧的检测框。整个过程不需要任何额外的关联网络、不需要光流、不需要重新训练检测器直接拿现成的模型就能用。它靠的就是回归头本身具备的把框对齐到目标上的能力而这个能力天然是时序连续的。实测下来这个方法在 ImageNet VID 上能拿到相当有竞争力的成绩而且速度比 FGFA 这类方法快一个数量级。它的主要弱点在于回归依赖上一帧的框一旦目标被完全遮挡导致轨迹中断恢复起来就吃力另外它假设帧间运动不大遇到剧烈运动或者镜头切换也会失手。所以工程上常见的做法是把 Tracktor 和逐帧检测做融合——每帧同时跑一次完整检测和一次回归传播用检测结果去校正漂移的轨迹用轨迹去填补漏检的帧。注意Tracktor 这类方案对检测器的回归头质量非常敏感。如果你用的是单阶段检测器回归头的空间先验和两阶段不太一样直接套用效果会打折扣需要先验证一下。3. 主数据集和基准上的真实差距3.1 ImageNet VID绕不开的那块试金石做视频检测ImageNet VID 是躲不过的。它有 30 个类别训练、验证、测试三段视频规模在百万帧量级标注基本都是密集的边界框。它的场景相对干净——多是自然纪录片、体育片段镜头运动温和标注质量也高所以被当作学术对比的标准擂台。这个数据集最值得注意的特征是类别少但视频长。单个视频动辄上千帧同一个实例会在很长的时间跨度里持续出现。这对需要维护长时记忆的方法比如 MEGA很友好但对只做局部邻域聚合的方法来说就有点浪费。另外因为类别都是 COCO/ImageNet 里常见的那些单帧基线本身就能拿到很高的分数所以想把 mAP 再往上顶几个点难度其实相当大——论文里方法之间的差距常常只有一两个点却要靠大量光流计算换来。3.2 YouTube-BB、UA-DETRAC 这些偏工程的替代品真实的工业场景往往和 ImageNet VID 差别很大。如果你做的是路口监控、车载感知那UA-DETRAC更贴近它是交通监控视角固定机位、俯视角度、密集车流标注量大遮挡和尺度变化都非常严重。在这类数据上FGFA 那种通用方法的表现未必比一个调好的逐帧检测器加轨迹平滑更好因为固定机位下背景建模本身就能贡献大量信息。YouTube-BB则是另一个极端类别少、标注稀疏它是按秒级间隔采样的不是每帧都标、场景极其多样、质量参差。它的价值在于规模大、来源广适合做预训练或者考察模型的泛化能力但直接拿它当评测基准会很不稳定因为标注密度不够漏检很难判定。这里有个经验选数据集之前先想清楚你的部署场景是不是固定机位、是不是密集小目标、遮挡有多严重。学术基准漂亮不代表业务上能用很多时候真正决定效果的是数据分布本身。3.3 标注这件事坑比想象中深视频标注的成本远高于图像而且难度也高。图像里一个目标标一个框就完事视频里你得保证同一个实例在跨帧之间 ID 一致框的位置连续、不跳。这就对标注工具和标注规范提出了很高要求。实践中常见的几个问题值得提前防范。一是标注间隔不一致有些数据集为了省成本隔帧标中间帧靠插值结果就是运动剧烈的地方框会飘。二是实例 ID 断裂目标被遮挡几帧后重新出现标注员给了个新 ID这会让依赖轨迹连续性的方法直接失效。三是边界框风格不统一有的标可见部分框有的标完整推断框混在一起训练会让模型学到矛盾的回归目标。我自己吃过一次亏用一批自采数据训练时发现模型在遮挡场景下特别爱把框收缩到可见区域。查了半天最后发现是标注规范里写了框住可见部分而预训练模型学的是框住完整目标。规范不统一带来的损失比换个模型架构大得多。4. 自己搭一条视频检测流水线要做的取舍4.1 关键帧策略省算力的第一刀如果你的算力有限最关键的一刀就是决定哪些帧值得跑完整检测。最朴素的做法是固定间隔取关键帧比如每 10 帧跑一次。DFF 论文里用的就是这么个策略思路是帧间运动不大时特征传播能兜住大部分信息关键帧只起到重置误差的作用帧间运动剧烈时误差累积快间隔就该缩小。更聪明的做法是自适应选帧。用光流大小、帧间差异或者一个轻量的打分网络来判断当前帧的新鲜度如果和上一个关键帧差别不大就继续传播差别超过阈值就强制跑一次完整检测。这样在静止机位的监控场景里能省下大量计算在运动剧烈的行车场景里又能保证精度。需要提醒的是关键帧间隔对最终精度的影响是非线性的。从 1 帧拉到 5 帧精度掉得不多从 5 帧拉到 20 帧精度会断崖式下滑。所以调这个参数时别只看速度曲线一定要同步画精度曲线找到那个拐点。4.2 光流选型精度和显存的拉锯战只要你的方案涉及特征对齐就绕不开光流网络的选型。我大致分三档来说。第一档是传统的 TV-L1 这类变分方法CPU 上也能跑精度在简单场景够用但速度慢、对快速运动不友好现在基本只在轻量场景里见到。第二档是FlowNet / PWC-Net / LiteFlowNet这一系列学习型光流网络精度和速度取得了不错的平衡PWC-Net 在业界用得尤其多模型小、推理快是大多数论文的默认选择。第三档是RAFT这类迭代优化的高精度方案精度明显更好尤其在遮挡边界和大位移上但迭代推理的开销也上去了实时场景要慎重。显存是另一个必须提前算的账。假设你在推理时要缓存前后各 5 帧的特征图主干输出是 1/16 分辨率、256 通道输入 1080p那么单帧特征约是 (1080/16)×(1920/16)×256 ≈ 2.2M 个浮点数按半精度算约 4.4MB十帧就是 44MB看起来不多但如果你缓存的是 1/4 分辨率的浅层特征或者聚合时要同时持有所有帧的完整特征显存会迅速吃满。做过一次实测把聚合窗口从 5 帧拉到 10 帧峰值显存翻了将近一倍而 mAP 只涨了零点几个点。4.3 后处理与追踪参数怎么调不管你用哪条路线后处理环节通常都有几个参数需要实调。置信度阈值在视频里和图像里不是一个调法。图像里你会为了减少误检把阈值调高视频里因为有时序平滑兜底阈值可以适当放低让更多低分框进入轨迹关联阶段靠轨迹连续性去伪存真。NMS 的 IoU 阈值同理视频中同一目标在相邻帧的框高度重叠如果阈值太严轨迹很容易被切断。如果用 Tracktor 这类回归传播方案轨迹中断判定的条件要仔细设连续多少帧回归失败算中断、中断后多久允许重新关联、关联时用什么相似度度量。这些参数没有通用最优值必须结合你的目标运动速度和帧率来定。我的经验是先把目标在连续帧间的位移统计出来让关联阈值覆盖住 95% 分位的位移量剩下的极端情况交给完整检测兜底。4.4 把推理速度拉回来的一些手段精度和速度的平衡是视频检测最现实的问题。除了前面说的关键帧稀疏和光流裁剪还有几招比较有效。一是降低光流计算的分辨率。光流本来就是对低分辨率更鲁棒在 1/4 尺度上算完再上采样速度提升明显而特征对齐对精度的要求没到像素级那么苛刻。二是只在感兴趣区域算光流。MANet 的思路已经证明了这点背景区域的光流对检测几乎没有帮助白白消耗算力。你可以先用一帧检测结果圈出 RoI只在这些区域周围算光流。三是模型量化与推理引擎优化。把主干网络和光流网络都转成半精度、再用推理引擎做图优化通常能拿到一倍以上的加速精度损失在小数点后一位以内。这里要注意的是方块采样warp这类操作在某些推理引擎上支持不佳可能需要自定义算子值得提前验证。四是异步流水线。把解码、检测、光流、后处理拆成不同线程或不同设备上的阶段用队列串起来让 GPU 始终有活干。这在实时视频流场景里往往比优化单个模型更有效。5. 落到真实项目里那些文档不会写的细节5.1 训练和评测的口径必须对齐一个特别隐蔽的坑是训练采样策略与推理时不一致。训练时为了控制显存几乎所有方法都只采样短的帧序列比如 3 帧或 5 帧来构造时序推理时却要在长视频上连续跑几百帧。如果模型在短序列上学到的时序依赖在长序列上会因为误差累积而逐渐漂移表现就会比验证时差一截。解决办法有几个一是在训练时随机采样间隔更大的帧模拟长序列的误差累积二是在推理时定期重置也就是强制插入关键帧把累积的特征漂移清掉三是直接监控长序列推理时置信度的分布变化一旦发现整体置信度持续下滑就说明漂移已经开始需要调整策略。5.2 长尾类别和类别不均衡视频数据里的类别分布比图像更极端。以交通场景为例小汽车占绝大多数救护车、警车这类特殊车辆可能整段视频里只出现几次。模型对长尾类别的检测质量会明显更差而且因为这些目标往往还是高速运动的问题会更突出。一个比较实用的缓解手段是利用轨迹信息做重采样。把每个实例的完整轨迹看作一个样本而不是把每一帧的框看作独立样本。这样长尾类别里那些虽然出现帧数少、但轨迹完整的实例权重就不会被头部类别的海量帧淹没。另外在评测时按类别分组看结果单独盯住那几个关键的长尾类比看总体 mAP 有用得多。5.3 遮挡后恢复最考验时序建模的场景前面提了很多难帧类型但我的经验里最能拉开方法差距的是遮挡后恢复。目标被遮挡几帧到几十帧重新出现时逐帧检测器只能当做一个全新目标重新检出ID 会断而且重新出现的那几帧常常因为姿态特殊而被漏检。而带记忆的方法能把遮挡前的特征调出来做匹配几乎是立刻就能恢复。要验证这一点可以在验证集里专门筛出遮挡片段统计遮挡结束后 N 帧内成功恢复检测的比例。这个指标在通用评测里是看不到的但它对业务的价值远高于几个点的 mAP。我做过的一次对比里两种方法的总 mAP 只差 0.8但遮挡恢复率差了将近 20 个百分点而这个差异直接决定了业务方能不能接受。提示如果你的场景里遮挡频繁路口、人群、货架建议在上线前专门构造遮挡测试集。用已有的检测框人为地在若干帧内涂黑目标区域就能快速造出一批可控的遮挡样本。6. 最后聊几句个人体会折腾了这几个方向之后我现在给团队做视频检测方案基本遵循一个顺序先跑透逐帧基线并记录它的失效模式再判断这些失效模式是不是时序问题。如果逐帧本身精度就不够那说明是检测器或者数据的问题上一堆时序模块纯属浪费算力只有当失效集中在遮挡、模糊这种典型时序问题上才值得引入时序建模。另外别一上来就冲最复杂的方法。实测下来一个调好的逐帧检测器加一层结果级的轨迹平滑往往就能解决八成的时序抖动问题成本几乎为零。等到这层兜不住了再考虑光流对齐或者记忆模块收益和成本才匹配得上。技术选型这件事能简单解决的绝不往复杂走这是我踩了不少坑之后最实在的一条经验。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →