ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

YOLOv26在智能交通中的实战:夜间小目标检测与边缘部署

YOLOv26在智能交通中的实战:夜间小目标检测与边缘部署

去年秋天,我们在一个路侧视觉项目里调试夜间的十字路口视频流。白天的检测效果已经调到验收线以上了,可一到晚上,YOLOv26之前的模型就开始“装瞎”:远处一辆没有开灯的黑色轿车,或者被路边灯光拉出长影的行人,经常整帧漏掉。白天指标再好,到了真实交通场景里,漏检就是事故隐患,系统没人敢用。YOLOv26在智能交通系统中的应用,要解决的核心问题不是榜单上多刷一个百分点,而是怎么让模型在夜间、逆光、遮挡、小雨和低分辨率这些真实条件下稳定工作。这篇文章我从选型思路、结构改进、多路视频落地、难例处理、踩坑排查到边缘量化部署,完整讲一遍。

1. 交通场景不是目标检测的普通考场:为什么测试了一圈,我选了YOLOv26

1.1 智能交通系统里,模型真正要面对的问题

很多人以为目标检测在交通场景里就是“找到车和行人”,实际上这可能是所有视觉任务里最不友好的场景组合。路口的摄像机动辄装在十几米高的横臂上,一辆普通轿车在画面里只有几十个像素高;早晚高峰的斑马线附近,人、电动车、自行车、三轮车叠在一起,互相遮挡;逆光时车辆轮廓完全融进背景,夜间又有路灯、车灯、广告牌产生的各种眩光。这些都不是标准数据集里能充分覆盖的情况。

我在项目里体会最深的一点是:交通检测的难点从来不是“能不能检出”,而是“在什么条件下还能不能稳定检出”。一个模型如果只在晴天白天的测试集上跑得漂亮,那它在真实路口的价值几乎是零。因为真正决定系统可用性的,是小目标、遮挡目标和低照度目标在极端条件下的漏检率。我们把候选模型拖到私有场景视频上做批量回放,很多模型在高分测试集上mAP很高,一旦切到雨天夜间的连续帧,漏检就像筛子一样止不住。

1.2 从系列前代模型到YOLOv26:选型对比中看到的几个关键变化

我们在做选型对比时,不是只看公开榜单,而是拿YOLOv26和几个旧版本直接放到同一个私有测试集上跑。这个测试集专门抽了不同时段、不同天气、不同摄像头的真实录像,标注了超过两万帧。表格里是我们在相同训练数据、相同输入分辨率(1280x1280)下的实测数据:

对比项前代系列模型(基线)YOLOv26
小目标(小于32x32像素)AP44.151.6
夜间时段漏检率21.4%12.2%
遮挡严重的密集场景漏检率17.8%10.5%
单路1080P视频推理延迟13.2ms9.1ms
连续帧目标ID跳变次数每千帧约32次每千帧约11次

这不是说YOLOv26是单点刷分刷出来的,而是它在结构设计上确实把交通场景里的几个痛处都照顾到了。后面我会拆开讲。最直观的感受是:小目标和夜间场景的提升不是靠“把模型调大”换来的,它的推理速度反而更快,这才是我们愿意往边缘设备上搬的原因。

1.3 “环境考”比“模拟考”重要:选型时最容易忽略的隐性指标

选型最容易踩的坑是只看精度不看稳定性。模型在实际视频流里是连续跑的,不是像学术评测那样一张一张看,所以有几个指标比mAP更值得关注:

  • 帧间稳定性:同样的目标在相邻帧里是不是都被检出。漏一帧就会导致跟踪轨迹断裂,下游的事件判断直接错乱。
  • 尾延迟:长时间运行之后,推理速度会不会因为缓存、持久对象等原因逐渐变慢。在8路、16路并发场景,这个问题尤其明显。
  • 内存占用:边缘盒子内存有限,模型再准、塞不进去就没有意义。

我们的结论是:YOLOv26值得用,不是因为它是“新版本”三个字,而是它在这些关乎系统稳定性的隐性指标上确实压住了旧模型。选型的时候,别急着看榜,先把部署约束、视频帧率、硬件算力这些前置条件列清楚,再回头挑模型,才不会走弯路。

2. YOLOv26的结构改进最值得关注的地方:小目标、动态分配与时序上下文

2.1 多尺度特征融合:不是堆FPN,而是跨层交叉注意力

YOLOv26在特征融合上的改动,不是简单地把更多层接到特征金字塔上。它用了一个跨层交叉注意力机制,让深层的语义信息能够反向去增强浅层的细节特征。通俗一点讲:以前是“高层信息往下传,低层细节往上拼”,现在两边在融合的时候会做一次“互相看重点”的操作,浅层知道该关注哪个区域,深层也会保留更细的边缘信息。

这个改动对交通场景特别重要。因为交通目标尺度跨度实在太大:一个路口的全景画面里,既有覆盖几十个像素的轿车,也有占满半个画面的公交车,还有只露半张脸的骑手。如果浅层细节和深层语义只是简单相加,小目标的轮廓特征很容易被大目标的响应淹没。交叉注意力相当于把融合权重交给网络自己学,而不是人为固定比例,小目标的细小特征在融合后更容易保留下来。实测中我们对比过,光这一项改动,小目标AP就有接近4个百分点的提升。

2.2 动态标签分配与解耦头:训练稳定性与漏检之间的平衡

交通数据集的标签天生就带着噪声。远处的车到底是一辆还是一个“像素块”,晴天能看清的人,到了雨夜可能连人都分不出来。YOLOv26在标签分配上改成了动态策略:不是提前把锚框和真实框匹配关系定死,而是在训练中根据当前模型的预测动态选择正样本。

这带来的直接好处是训练更稳。以前训练时如果某个小目标的IoU本来就低,用固定阈值匹配可能直接把它当成背景,模型根本学不到“这里有个目标”这件事。动态分配会在早期训练阶段给这些小目标更多机会。配合解耦头设计,分类和回归两个分支分别优化,也能避免“类别分对了,但框完全贴不准”的问题。

在交通项目里,框准不准比类别准不准更影响下游。违章停车判断要依赖框在画面里的稳定位置,框抖一次,停留时长的计算就会出错。解耦头让框的回归更稳定,我们跑连续帧验证的时候,检测框的抖动幅度明显比旧模型小了一截。

2.3 时序上下文信息:从静态图到视频序列的“作弊”

YOLOv26另一个很实用的改动是引入轻量级的时序上下文模块。它会在推理时参考前几帧的特征,而不是孤零零地对当前单帧做检测。这有点像一个经验丰富的路况观看者:看到一辆车的尾灯在上一帧已经亮起,这一帧哪怕它被广告牌挡了一下,也能判断它还在原位置。

这个机制给系统带来的提升是实打实的。夜间场景中,车辆会被路灯杆短暂遮挡,单帧模型很容易在这几帧里丢失目标,但有时序上下文加持后,模型能基于前后帧信息预测目标仍然存在,检测框不会突然消失。我们的测试里,连续帧的ID跳变次数大幅下降,跟踪稳定性也跟着上来了。

使用这个模块时有一点要注意:它会额外增加一点显存占用,因为它需要缓存前几帧的特征。边缘设备上如果显存吃紧,可以把缓存帧数从默认值调小,或者仅在夜间模式开启。我用下来的经验是:交通场景宁可稍微降一点帧率,也要把时序上下文开着,它对遮挡和闪烁场景的收益远大于那点性能损失。

2.4 我训练时用的核心配置表

模型结构只是基础,训练配置同样关键。以下是我在一个典型的交通数据集上用的配置,可以直接抄作业,但要根据自己的数据和硬件调整:

配置项我的设置说明
输入分辨率1280x1280交通小目标多,没必要用640去省算力,小目标掉点非常明显
训练轮数300 epoch交通数据量普遍不大,短训容易欠拟合
Batch Size32(单卡)显存不够就对半减,同时把学习率同步调低
优化器AdamW收敛比SGD快,配合warmup更稳
Mosaic增强前250轮开启,最后50轮关闭最后阶段关闭Mosaic,让模型适应真实分布,精度更稳
类别损失权重按类别样本频率反比设置平衡“轿车”和“三轮车”这种长尾差异

3. 从单帧检测到多路实时视频流:一条真实的落地链路

3.1 视频接入与帧同步:先解决系统肚子里的数据流

模型再强,接不进视频流也白搭。实际项目里,摄像头通常通过RTSP或类似协议把视频流传进来,平台侧要做拉流、解码、抽帧。这里最容易被忽略的是帧同步:多路视频不能各跑各的,推理服务必须用一个统一的帧调度器来管理各路视频的解码和推理请求。

我们采用的做法是:为每路视频开一个解码线程,解码出来的帧带时间戳进队列;推理侧维护一个批次队列,把不同路在同一时间窗口内的帧凑成一个batch,统一交给GPU推理。这样做的好处是把GPU利用率拉满,避免单路视频帧率波动导致GPU空闲。代价是队列管理复杂了一些,如果某一帧处理超时,必须有丢帧策略,不能无限堆积导致延迟越来越大。

3.2 检测到跟踪:不要只做目标检测,要做目标保持

智能交通下游系统需要的是“目标的连续轨迹”,而不是一串孤立的检测框。所以检测模型输出之后,还要接跟踪器。我们在项目里用的是ByteTrack方案。它和传统跟踪器的核心区别是:每一帧的检测框不仅仅是高分框,那些低分框(比如被遮挡到只剩半截的自行车)也会参与轨迹匹配。

YOLOv26本身帧间稳定性已经不错,加上ByteTrack之后效果更稳。在遮挡严重的路口,很多目标会在某几帧“消失”,单纯靠IoU匹配很容易把目标ID丢掉。ByteTrack会保留一个缓冲机制,短时间丢失的目标允许重新匹配回去,保持同一个ID。我们最后测试的ID跳变率从每千帧32次降到了11次,这个提升对整个系统的体验是决定性的。

3.3 事件识别与业务联动:从“看到什么”到“发生了什么”

检测加跟踪解决了“看到什么”,但智能交通系统最终要回答的是“发生了什么”。我们把跟踪器输出的轨迹交给业务规则引擎,由轨迹数据计算各种事件:

  • 逆行:目标运动方向与车道方向相反,且连续保持N帧
  • 违停:目标在禁停区域停留超过设定时间
  • 拥堵:区域内车辆平均速度低于阈值,且持续一定时间
  • 抛洒物:在无目标轨迹的情况下,背景区域出现新目标且原地不动

这些业务规则看起来简单,实际调试时却很讲究。比如违停事件不能直接用“停止不动”判断,因为车辆在排队等红灯也会停止,必须结合车道区域是否属于禁停区来判断。我们做了一个可配置的事件规则表,不同路口可以单独调参数,模型换版本时业务规则层完全不用动。

3.4 系统分层架构速览

我们最终跑通的系统可以分成四层:

  • 接入层:负责视频解码、抽帧、时间戳管理,承载多路摄像头并发接入
  • 推理层:YOLOv26模型推理、跟踪器更新、后处理逻辑,核心是保证低延迟和高稳定性
  • 业务层:事件规则引擎、区域判断、指标统计,把轨迹变成业务语义
  • 存储与展示层:结构化事件数据、截图证据、实时告警推送

每一层之间通过队列解耦,哪一层出问题都不会直接拖垮其他层。这个架构部署到现在,整体跑得很稳。

4. 夜雨、逆光、遮挡与低分辨率:我们把交通难例变成了训练资产

4.1 数据侧:不要只加样本,要加“失败模式”

很多团队在遇到模型漏检时,第一反应是“再去标一万张图”。但真正有效的做法,是分析模型在什么场景下失败,按“失败模式”去补数据。我们把历史视频按天气、时段、光照、目标大小分了层,每层都单独统计漏检率。

结果很有启发:夜间小目标车辆是最大的漏检来源,其次是逆光时段的二轮车,再然后是被大树阴影挡住的行人。针对每个失败模式去定向采集和标注,效率比盲目加数据高得多。我们后来训练集的增速不算快,但每次补的都是“模型最不会的那类样本”,模型迭代起来肉眼可见地变好。

4.2 图像增强与相机模拟:让模型提前“见鬼”

为了让模型在白天训练时也能学会夜间特征,我们大量使用了图像增强模拟。这不是简单的亮度降低,而是很多贴近相机物理特性的模拟:

  • 眩光模拟:把高亮光源周围叠加星芒和光晕扩散效果,模拟车灯和路灯的散射
  • 低照度模拟:降低亮度并加入随机噪声,模拟昏暗场景下的传感器噪声
  • 雨滴和雾气模拟:在画面上叠加透明条纹和局部模糊,模拟镜头上的水渍
  • 运动模糊模拟:对快速移动的目标做方向性模糊,模拟长曝光拖影

这些增强手段在公开数据上可能“不讨喜”,但在交通场景里非常有效。夜晚图像本来就难以大量采集,通过白天图像做物理模拟,能让模型提前见过各种极端效果。我们实验对比过,加了物理模拟增强之后,夜间漏检率又降了3个百分点左右。

4.3 难例挖掘与自训练:把易错样本筛进训练集

除了增强,我们还会从真实视频流里做难例挖掘。做法是让推理服务在线上跑一段时间,把置信度在一定区间内的检测框截图保存下来,比如置信度在0.3到0.7之间的预测框。这些框大概率是模型“认得不彻底”的目标,筛出来存到待复核队列里,由标注员快速判断是漏检、误检还是标签边界问题。

这里有个细节:难例挖掘一定要覆盖不同时段,不能只挖白天。我们的复核队列特意按“夜间抽帧比例翻倍”来采样,因为夜间的难例是模型最需要学习的内容。经过几轮难例回流,模型在长尾目标上的表现提升非常明显。

4.4 长尾类别平衡:三轮车和警示桶不该被淹没

交通场景的类别分布非常不均。轿车、公交车的样本量可能是三轮车的几十倍,但三轮车在城郊结合部的路口恰恰是高频目标。如果不做平衡,训练时模型很容易“学会”忽略小样本类别。

我的做法比较传统但很有效:给每个类别设定一个目标样本量,低于这个量就从历史视频里定向挖帧补标;同时给损失函数里低频类别的权重调高。另一个实用技巧是把相似类别合并:比如“三轮车”和“电动三轮车”如果不做严格细分,就合成一类,先把检出率做上去,类别细分等样本够了再拆。

5. 踩坑实录:周期性漏检、夜间误报与跟踪跳变的完整排查链路

5.1 排查链路一:八路视频同时跑,为什么每分钟固定漏检一次

现象很诡异:八路视频同时推理,每分钟左右会有一整帧的漏检,单独跑四路就没有这个问题。一开始我们怀疑是模型问题,但单帧输入时模型输出完全正常。

排查过程是这样的:先看推理日志,发现漏检发生时整批推理时间突然飙高,像是某一路视频帧的解码延迟把整个batch卡住了。再去看系统资源监控,GPU利用率并没有打满,反而是CPU和GPU之间的内存拷贝曲线出现规律性尖峰。最后定位到根因:解码线程没有做好同步,某一路视频在拷贝帧数据时独占内存总线,导致其他路的帧同步等待。

修复方案是给解码器加帧队列缓冲,并在拷贝阶段做锁控制,让各路的帧数据小批量地、分时地拷贝到GPU。改完以后周期性漏检彻底消失。这个坑给我的教训是:多路并发场景,绝对不能只看模型指标,数据链路的同步机制比模型更影响稳定性。

5.2 排查链路二:夜间灯光的星芒导致“车”凭空出现

夜间误报比漏检更难缠。有一段时间,系统会在路口灯光正下方凭空报“车辆出现”,而且在长曝光或镜头有轻微脏污时尤其严重。我们把截图调出来看,画面中心是一团非常亮的灯光,灯光周围有星芒状散射,模型把星芒的一个亮点当成了车顶。

一开始我们想通过后处理规则把这类误报过滤掉,比如限制检测框的最小置信度,调高之后确实能压住星芒误报,但真实的小目标车辆也被压没了。最后把问题交回给训练:我们专门做了一批“灯光负样本”,把各种路灯、车灯、广告牌眩光截图作为背景类样本,强行让模型学会区分“高亮区域的灯光散射”和“灯光下的车辆轮廓”。加上这批样本后,夜间误报率下降了一半以上。

灯光的负样本要注意多样性,不能只找同一种路灯,不同色温、不同角度、不同镜头的污渍形态都要覆盖。模型对这类高亮区块的学习能力很强,只要负样本足够充分,它是能学会“不要对灯光敏感”的。

5.3 排查链路三:同一辆车ID反复横跳

检测稳定了之后,跟踪又出问题。一辆车在穿过路口时,ID经常从A变成B再变回A。用户反馈说“这辆车好像瞬移了”,其实是ID跳变导致的轨迹混乱。

我们排查后发现,根因是目标在过路灯杆时被遮挡了两三帧,检测框消失后,跟踪器只能靠预测位置外推,而外推的位置和重新出现时的实际位置偏差太大,IoU匹配不上,于是生成了新ID。解决办法是把纯IoU匹配改成ByteTrack的低分框复用机制,同时还叠加了简单的运动预测。遮挡期间跟踪器不只看IoU,还会结合目标上一段运动速度来预测新位置,重新出现时优先匹配预测位置附近的检测框。

这个改动让ID跳变率大幅下降,而且是在不牺牲实时性的前提下。

5.4 小经验:每一个“玄学”问题,最后都会落到一个确定性环节

连续踩了几天坑之后我养成一个习惯:任何看起来“偶尔发生、没法复现”的问题,都不要先怀疑模型随机性。把视频回放、日志、资源监控三个数据源对齐到同一时刻,绝大多数问题最后都能落到一个确定性的根因上,要么是资源竞争,要么是后处理逻辑边界,要么是负样本缺失。

6. 让系统越用越准:数据闭环与模型持续迭代

6.1 难例回流与人工复核

模型上线不是终点。我们维护了一个从线上到训练集的闭环通道:线上推理服务每天把难例截图导出到待复核列表,标注员按优先级复核,确认后的样本进入训练集,定期增量训练,再灰度放回线上。

这个闭环的关键是“节奏要短”。我们最初按月迭代,后来改成两周一次。交通场景的季节变化、道路施工、灯杆安装位置变动都会让数据分布漂移,迭代周期太长,模型会慢慢“过时”。两周一次的节奏刚好能跟上环境变化,又不会给标注团队太大压力。

6.2 主动学习:用置信度做初筛

海量视频流里不可能每帧都让人工看,我们靠置信度区间来做初筛。规则很简单:置信度在0.3到0.7之间的检测框,既不像高置信度的“已确认目标”,也不像低置信度的“纯噪声”,大概率是模型没把握的区域,值得我们人工复核。

采样的比例也很重要。我们让审核列表按“夜间帧占60%、白天帧占40%”分配,特意偏重夜间,因为夜间难例的边际价值远高于白天。注意不要让主动学习变成变相增加误报的来源,通常是一定采样比例回流,叠加不确认的样本,四周后评估效果再决定是否扩大采样。

6.3 灰度发布与评估指标:不能只看mAP

模型能不能上线的最终判断,靠的是一套业务向的评估指标,不是单一mAP。我们内部跑这样几个维度:

  • 漏报率:按真值标签统计,漏检数除以真值总数,分时段、分天气统计
  • 误报率:每万帧里的虚假告警数
  • 事件识别准确率:违停、逆行这些业务事件判断得准不准,这个指标用户最能感知
  • 单路延迟:从视频解码到事件输出的端到端延迟,超时会直接毙掉方案

灰度发布时先切5%的路口跑一周,对比这五个指标。如果都达标,再逐步放大到全量。阶段发布不仅降低风险,也能让我们在中间发现原本样本量没覆盖到的新场景。

7. 边缘部署与量化:我们最终在项目里保留的方案

7.1 推理引擎、FP16/INT8与动态batch

训练出的模型要真正在边缘端跑起来,还需要一步格式转换和优化。我们用推理引擎把模型转换为优化的中间表示,并开启FP16精度。实测对比,FP16在精度几乎不掉的情况下,推理速度比FP32快约40%。如果对性能还不满意,再考虑INT8量化。

INT8量化一定要用真实的校正数据集,不能随便拿几张图。我们把白天、夜晚、阴雨三种场景的图像混合起来做校正集,跑出来的量化模型精度损失控制在了1个点左右。如果某个检测头对量化特别敏感,可以单独给该层保留FP16,其他层用INT8,这就是混合量化的思路。边缘部署不是一锤子买卖,量化后一定要在真实视频流回放验证过再上线。

7.2 硬件选型与部署形态

我们尝试过几种部署形态,最终形成了这样一个选型经验:

部署形态适合场景单路延迟(参考值)部署成本
中心GPU工作站机房统一处理多路视频8-10ms较高
边缘GPU盒子路口本地化部署,回传事件结果9-12ms中
专用NPU板卡极限低功耗、受限环境12-18ms低

在选择边缘盒子时,不要只看算力TOPS数字,还要看视频解码能力。很多小目标漏检问题,根源不是模型算不动,而是解码器在高帧率、多路并发时跟不上,导致丢帧。我们在两套不同盒子上测试过同样的模型,解码能力和芯片匹配好的那台,整体端到端延迟明显更稳。

7.3 最后留下的一套工程经验

讲讲从这轮项目里沉淀的几条经验,比较啰嗦但都是用钱买来的教训:

第一,不是模型越快越好,视频链路里的解码、拷贝、跟踪器后处理,任何一环都可能成为瓶颈。优化时不要只盯推理时间,要把端到端链路的每一段都量化出来。

第二,置信度阈值是最后的手段,不是第一手段。夜间漏检率高了,先看的是数据和增强,而不是把阈值调低导致误报满天飞。后处理规则越少,模型越干净,系统的可维护性越好。

第三,数据闭环比模型版本更重要。用了几轮迭代之后,我最深的感受是:真正让系统越跑越准的,不是换结构、换版本的那一下提升,而是每周都在持续进化的数据回流和评估节奏。如果让我重新做一遍这个项目,第一天就会先把难例回流的链路搭好,而不是等模型上线出了问题才开始补数据。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进