☰
基于计算机视觉的行人与非机动车规范系统:从检测跟踪到行为判定的工程实践
2026/10/22 3:07:53 网站建设 项目流程

1. 从"人管人"到"算法管秩序":这套系统到底在解决什么

路口执勤的协管员吹着哨子、挥着小旗,高峰期一过,该闯红灯的照样闯,该逆行的照样逆行。这不是协管员不负责,而是人的注意力有物理上限——一个人盯四个方向、盯几百米范围、盯十几个小时,漏判是必然的。我参与过几个路口的秩序治理项目,最深的体会是:靠人力维持的秩序,本质上是一种"高成本、低覆盖、不可追溯"的秩序。而"基于计算机视觉的行人及非机动车规范系统"要干的事,就是把这套秩序从"人盯"变成"机器看",从"事后无据"变成"全程留痕"。

先把这套系统说清楚。它的核心输入是路口或路段的视频流,核心处理单元是计算机视觉算法,核心输出是三类东西:违规行为的识别结果、结构化的证据数据、可用于治理决策的统计报表。它盯的对象很明确——行人和非机动车(电动自行车、自行车、三轮车等),也就是交通参与者里最灵活、最难管、也最容易出事故的那一类。机动车有车牌、有年检、有扣分体系约束,管起来相对容易;行人和非机动车数量大、轨迹随机、没有强制标识,传统手段基本管不住,这正是视觉算法能发挥价值的地方。

这套系统适合谁来参考?我把它分成三类读者。第一类是做智慧交通、城市治理相关项目的工程技术人员,你们关心的是算法选型、部署架构、误报控制这些硬骨头;第二类是交通管理、社区治理方向的产品和方案人员,你们关心的是这套系统能识别哪些行为、数据怎么用、落地成本多少;第三类是对计算机视觉落地感兴趣的学习者,你们想通过一个真实场景理解检测、跟踪、行为判定是怎么串起来的。不管你是哪一类,这篇文章都会尽量把"为什么这么做"讲透,而不是只丢一堆术语。

需要提前说明的是,行人及非机动车规范系统不是一个"单点算法",而是一条完整的链路:视频接入 → 目标检测 → 多目标跟踪 → 轨迹分析 → 行为判定 → 证据生成 → 数据上报。任何一环掉链子,最终结果都不可信。我见过太多项目死在"检测很准但跟踪一断,行为判定全乱"上。所以下面我会按这条链路的逻辑,把每个环节的关键决策和踩坑经验摊开讲。

2. 行人与非机动车的检测:为什么通用模型直接拿来用会翻车

2.1 检测目标的三类难点,决定了模型不能照搬

很多人第一反应是:目标检测现在这么成熟,直接拿个开源模型跑不就行了?我一开始也这么想,实测下来发现完全不是一回事。行人及非机动车场景有三类特有的难点,通用模型(在常规数据集上训练的)往往处理不好。

第一类是小目标密集。路口监控的视角通常是俯视或斜俯视,一个行人在1080P画面里可能只有30到60像素高,非机动车稍大一点,但高峰期一个画面里挤几十个目标,密集遮挡非常严重。通用检测模型在小目标上的召回率会明显下降,尤其是被前车挡住一半的电动车,很容易漏检。

第二类是类别细粒度。系统不只要区分"人"和"车",还要区分"行人"和"骑行的人"、"电动自行车"和"自行车"、"两轮车"和"三轮车"。因为不同类别的规范要求不一样——行人闯红灯和电动车闯红灯,处置逻辑不同;电动自行车和自行车在部分路段的通行规则也不同。这就要求模型在类别定义上做细化,而不是用COCO那种粗粒度类别。

第三类是姿态与遮挡的多样性。行人可能是站立、行走、奔跑、蹲坐;非机动车可能是正常骑行、载人、载货、撑伞。撑伞这个场景特别典型,伞会大面积遮挡人体上半身,通用模型经常直接漏检。我在一个南方多雨城市的项目里就吃过这个亏,后来专门补了一批撑伞样本才把召回率拉回来。

2.2 数据标注:决定上限的不是模型而是标注质量

我个人的经验是,这类项目里标注质量对最终效果的影响,远大于模型结构的选择。同样一个检测模型,标注规范做得好和做得差,mAP能差十几个点。这里分享几条实操中总结的标注规范。

  • 框的边界要统一:行人框是框到头顶到脚底,还是框到可见部分?非机动车是框车身还是连人带车?这个必须在标注规范里写死。我建议行人和非机动车分开标注,非机动车框只框车身,人另标一个框,这样后续做"骑行 vs 推行"判定时才有依据。
  • 遮挡目标要标:被遮挡超过50%的目标,很多团队选择不标,我觉得这是错的。遮挡目标恰恰是模型最容易漏的,必须标,而且要标"遮挡"属性,训练时可以用一些针对遮挡的增强策略。
  • 难例要单独管理:夜间、逆光、雨雾、撑伞、载货这些场景的样本,要单独建一个难例集,训练时保证难例的采样比例,否则模型会在简单样本上过拟合。

提示:标注一致性检查一定要做。具体做法是让两个人标同一批1000张图,算一下框的IoU一致性,如果平均IoU低于0.85,说明标注规范有歧义,得回去改规范,而不是继续标。

2.3 模型选型:精度和速度的平衡点在哪

检测模型的选择,本质是在精度、速度、部署成本三者之间找平衡。我列一个实际项目里常用的对比,供参考。

模型类型代表方案优点缺点适用场景
两阶段检测基于区域提议的方案精度高,小目标友好速度慢,显存占用大离线分析、对实时性要求低的卡口
单阶段检测YOLO系列、SSD类速度快,易部署小目标精度略弱实时路口监控主流选择
Anchor-FreeFCOS、CenterNet类超参少,密集场景好训练调参需经验密集小目标场景
Transformer类DETR系列端到端,无需NMS训练慢,小目标一般研究验证、算力充足场景

实测下来,实时路口场景我一般选单阶段检测的较新版本,配合针对小目标的改进。具体改进方向有三个:一是提高输入分辨率(比如从640提到960或1280),小目标召回会明显提升,代价是推理变慢;二是加一个高分辨率特征融合分支,把浅层特征利用起来;三是用切片推理(把大图切成小块分别检测再合并),这个对超小目标特别有效,但要注意块与块之间的目标拼接问题。

推理速度上给个参考:一张1080P图,在主流GPU上,单阶段模型做到30到50毫秒是合理的,也就是20到30 FPS。如果一路视频要实时处理,这个速度够用;如果一台设备要处理8路、16路,就得考虑模型量化、TensorRT加速,或者多卡分摊。

3. 多目标跟踪:行为判定的地基,断了就全乱

3.1 为什么跟踪比检测更关键

检测是"每一帧里有什么",跟踪是"这个目标从哪来、到哪去"。行为判定几乎全部依赖轨迹——闯红灯要看目标在红灯期间是否越过停止线,逆行要看目标的运动方向是否与规定方向相反,这些都是时序上的判断,没有稳定的跟踪ID,根本无从谈起。

我踩过最惨的一个坑:检测模型精度很高,但跟踪ID频繁跳变,同一个行人被分配了五六个ID,结果系统把一个人的一次闯红灯判成了五次,误报率直接爆表。后来复盘发现,问题出在跟踪器的关联策略上——目标被遮挡几帧后重新出现,跟踪器没能把它和原来的ID关联起来。所以跟踪的稳定性,直接决定了整个系统的可信度。

3.2 跟踪方案的选择与关联策略

主流的多目标跟踪方案分两类:一类是检测+关联的两步法(先检测,再用运动模型和外观特征做匹配),另一类是联合检测跟踪的一步法。工程落地里,两步法更常见,因为模块解耦、便于调试。

两步法的核心是关联,关联的核心是代价矩阵,它由两部分组成:运动代价(用卡尔曼滤波预测位置,算预测框和检测框的距离)和外观代价(用ReID特征算相似度)。这里有几个实操要点。

  • 卡尔曼滤波的参数要调:行人运动速度慢、方向变化随机,过程噪声不能设太大,否则预测位置飘;非机动车速度快,过程噪声要相应放大。我一般对行人和非机动车用两套参数。
  • ReID特征要针对场景训练:通用的行人ReID模型在非机动车上效果很差,因为非机动车的外观差异大(颜色、车型、载物)。如果算力允许,建议在场景数据上微调一个ReID模型;如果不行,至少要用颜色直方图这类轻量特征兜底。
  • 遮挡处理要有专门逻辑:目标被遮挡时,检测会丢失,此时跟踪器要进入"预测模式",靠卡尔曼滤波维持轨迹,同时降低关联阈值,等目标重现时优先和预测位置匹配。遮挡超过一定帧数(比如30帧)再判定轨迹终止。

3.3 轨迹后处理:把抖动和碎片轨迹清理掉

原始跟踪输出往往很脏,需要后处理。我常用的几个手段:一是轨迹平滑,用滑动平均或样条拟合把轨迹的抖动去掉,这样算运动方向才准;二是短轨迹过滤,长度小于一定帧数(比如10帧)的轨迹直接丢弃,这些多半是误检或瞬时遮挡产生的碎片;三是轨迹合并,如果两条轨迹在时空上高度重叠且外观相似,很可能是同一个目标被拆成了两条,要合并。

注意:轨迹后处理会引入延迟,实时系统里要权衡。我的做法是"在线轻量后处理+离线精细后处理"——在线只做短轨迹过滤保证实时性,离线再做平滑和合并用于证据生成。

4. 行为判定:把"轨迹"翻译成"违规"的规则引擎

4.1 违规行为的定义要先和业务方对齐

这一步最容易被技术人员忽略,但恰恰是最重要的。什么叫"闯红灯"?是越过停止线就算,还是完全通过路口才算?电动车"逆行"是相对于机动车道还是非机动车道?"不戴头盔"的判定标准是什么?这些定义如果技术人员自己拍脑袋定,做出来的系统业务方一定不认。

我的做法是:在写代码之前,先和业务方一起把每一条违规行为的判定规则写成文档,明确触发条件、时间窗口、空间范围。比如闯红灯,我们最终定义成"在红灯相位期间,目标从停止线外侧移动到停止线内侧,且移动距离超过阈值"。这个定义既避免了目标在停止线附近抖动导致的误判,又保证了判定的可解释性。

4.2 几类典型违规的判定逻辑

下面拆解几类最常见的违规行为,讲清楚判定逻辑。

闯红灯:核心是"红灯相位 + 越线"。系统需要拿到信号灯的相位信息,这有两种获取方式——一种是直接对接信号机(最可靠),一种是通过视觉识别信号灯颜色(有延迟和误判风险)。拿到相位后,对每条轨迹判断:在红灯期间,轨迹是否从停止线一侧穿越到另一侧。这里要处理一个边界情况:目标在绿灯末尾越线、红灯亮起时还在路口内,这不算闯红灯,判定时要看越线时刻的相位,而不是看目标在路口内的时刻。

逆行:核心是"运动方向与规定方向夹角超过阈值"。规定方向可以从车道线、道路标定得到。判定时不能只看瞬时方向,要看一段窗口内的平均运动方向,否则目标稍微拐一下就会误判。我一般用1到2秒的窗口算平均方向,夹角超过120度才判逆行。

不戴头盔:这是非机动车治理的重点。判定逻辑是"检测到骑行的人 + 头部区域未检测到头盔"。这里的技术难点是头盔检测——头盔小、颜色多样、和头发容易混。我的经验是单独训一个头盔检测模型,并且把"戴头盔"和"不戴头盔"都作为正样本训练,而不是只训"头盔"一个类,这样模型能学到区分性特征。

载人、载货:判定逻辑是"非机动车框内检测到多个人体"或"检测到超出车身范围的货物"。载人相对好判,载货比较难,因为货物形态千奇百怪。我的做法是设定一个车身外接框的膨胀区域,如果检测到物体持续超出这个区域,就判载货。

4.3 规则引擎的工程实现

规则引擎我建议做成可配置的,而不是硬编码。因为不同路口、不同城市的规则不一样,硬编码意味着每换一个地方就要改代码。具体做法是把每条规则抽象成"条件 + 动作",条件包括时间条件(相位、时段)、空间条件(区域、方向)、目标条件(类别、属性),动作用来触发证据生成和上报。规则用配置文件描述,引擎负责解析和执行。

这样做还有一个好处:规则可以灰度上线和快速回滚。新规则先在小范围跑,观察误报率,没问题再全量推。我见过硬编码规则的系统,改一条规则要重新发版,运维成本极高。

5. 证据生成与误报控制:让每一条判定都站得住脚

5.1 证据链要包含什么

违规判定不能只给一个结论,必须给一条完整的证据链,否则业务方没法用、当事人也没法信服。一条合格的证据链通常包含:违规类型、发生时间、发生地点(路口/路段编号)、目标轨迹、关键帧截图(至少三张:违规前、违规中、违规后)、短视频片段(前后各几秒)、目标特征(用于人工复核)。

这里有个细节:关键帧的选取要能自证。比如闯红灯,三张图要能看出"红灯亮着 + 目标在停止线外 + 目标在停止线内",缺一张都说不清楚。我一般用轨迹和停止线的交点时刻作为"违规中"的关键帧,前后各取一个时间点。

5.2 误报的三大来源与压制手段

误报是这类系统的头号敌人。误报多了,业务方就不信任系统,最后系统就沦为摆设。我把误报来源归为三类,分别讲压制手段。

第一类:检测误报。把广告牌上的人像、树影、反光当成目标。压制手段是提高检测置信度阈值 + 加一个基于轨迹的过滤(真实目标的轨迹是连续的,误检的"目标"往往只出现一两帧)。另外可以在ROI(感兴趣区域)上做限制,只处理路面区域,把广告牌、建筑排除掉。

第二类:跟踪误报。ID跳变导致一次违规被判多次。压制手段是前面说的轨迹后处理 + 违规去重(同一目标在短时间内的同类违规只记一次)。

第三类:规则误报。规则本身设计不合理导致的误判。比如闯红灯判定没考虑"绿灯末尾越线"的情况。压制手段是规则上线前用历史数据回测,统计误报率,把边界情况补进规则。

误报来源典型表现压制手段效果参考
检测误报广告牌人像、树影被识别提高阈值+轨迹连续性过滤+ROI限制可降低60%以上
跟踪误报一次违规判多次轨迹后处理+违规去重可降低80%以上
规则误报边界情况误判历史数据回测+规则细化视规则复杂度而定

5.3 人工复核环节不能省

我一直坚持一个观点:全自动的违规判定,在现阶段不应该直接用于处罚,必须有人工复核环节。系统的角色是"筛子",把海量视频筛成少量疑似违规,人工只复核这些疑似案例,效率提升几十倍,但最终判定权还在人手里。这样既发挥了算法的效率优势,又避免了算法误判带来的争议。

复核界面要做好,要让复核人员一眼能看清证据链,能快速播放短视频,能一键确认或驳回。驳回的案例要回流到难例库,用于后续模型迭代。这个闭环建起来,系统才会越用越准。

6. 部署架构与算力规划:别让算法死在工程上

6.1 边缘计算还是中心计算

这是个绕不开的架构选择。边缘计算是把算法部署在路口的前端设备上,视频不出本地,只上传结构化结果和证据;中心计算是把视频回传到中心机房统一处理。两者各有优劣。

边缘计算的好处是带宽省、延迟低、隐私好(视频不出场),缺点是前端设备算力有限,能跑的模型规模受限,且设备分散运维麻烦。中心计算的好处是算力集中、模型可以跑大的、运维方便,缺点是带宽压力大(多路高清视频回传很吃带宽)、延迟高。

我的建议是混合架构:前端做轻量检测和跟踪,把轨迹和关键帧传回中心,中心做复杂的行为判定和证据生成。这样既省带宽,又能跑复杂逻辑。实测下来,这种架构下前端只需要跑检测+跟踪,算力需求降低一半以上。

6.2 算力估算方法

算力规划不能拍脑袋,要算。我给出一个估算方法:总算力 = 路数 × 单路帧率 × 单帧推理耗时对应的算力。举个例子,假设单帧检测+跟踪在目标GPU上耗时40毫秒,一路视频25 FPS,那么一路需要约1个GPU的算力(因为40ms×25=1000ms,刚好占满)。如果要处理16路,理论上需要16个GPU,但通过批处理(把多路视频的帧拼成一个batch一起推理)可以提升GPU利用率,实际可能只需要8到10个GPU。

这里有个经验:批处理是提升吞吐的关键。单帧推理GPU利用率往往只有30%到50%,把4到8帧拼成一个batch,利用率能提到80%以上,吞吐翻倍。代价是延迟增加(要等凑够一个batch),但对非实时场景可以接受。

6.3 稳定性:7×24小时运行的真实挑战

实验室里跑通和现场7×24小时稳定运行,是两码事。我遇到过的问题包括:摄像头夜间红外切换导致画面突变、雨雪天气镜头模糊、设备过热降频、网络抖动导致视频流中断。这些都要在架构里考虑。

我的做法是:加一个健康监测模块,实时监控每一路视频的帧率、画面质量(用清晰度指标)、算法耗时。一旦某路异常,自动告警并降级处理(比如跳过该路或降低帧率)。另外,算法进程要有守护机制,崩溃了自动重启。这些工程细节看着不起眼,但决定了系统能不能真正用起来。

7. 数据闭环与持续迭代:系统上线只是开始

7.1 为什么上线后精度会下降

很多团队以为模型训练好、系统上线就完事了。实际上,上线后精度下降是常态。原因有几个:场景变化(新修了路、换了摄像头角度)、目标变化(新车型、新穿着)、季节变化(夏天撑伞、冬天穿厚衣服)。模型是在历史数据上训的,面对新情况必然退化。

所以系统必须建立数据闭环:现场产生的数据(尤其是人工复核驳回的案例)要定期回流,标注后加入训练集,重新训练模型,再上线。这个循环跑起来,模型才能持续进化。

7.2 闭环的具体流程

我把闭环拆成五步:采集 → 筛选 → 标注 → 训练 → 评估上线。

  • 采集:现场数据自动上传到数据池,按时间、路口、天气等维度打标签。
  • 筛选:用当前模型跑一遍,把低置信度的、人工驳回的、罕见场景的样本挑出来,这些是最有价值的训练数据。
  • 标注:按前面说的标注规范标注,难例单独管理。
  • 训练:新数据 + 旧数据混合训练,注意保持数据分布平衡,别让新数据把旧能力冲掉(可以用回放机制,训练时混入一定比例的旧数据)。
  • 评估上线:新模型在验证集上评估,达标后灰度上线,观察一段时间再全量。

7.3 一个容易被忽略的点:负样本的价值

大家都重视正样本(违规案例),但负样本(正常行为)同样重要。如果训练集里全是违规样本,模型会倾向于把什么都判成违规,误报率飙升。我一般保证负样本和正样本的比例在3:1到5:1之间,让模型充分学习"正常"长什么样。尤其是那些"看起来像违规但其实正常"的边界样本(比如绿灯末尾越线),一定要作为负样本喂给模型。

8. 我在实际项目里踩过的几个坑

最后分享几个具体的坑,都是真金白银换来的经验。

第一个坑:忽视相机标定。行为判定需要把图像坐标映射到世界坐标(比如判断目标是否越过停止线),这依赖相机标定。我早期一个项目没做标定,直接用图像坐标判断,结果相机稍微动一下,判定全错。后来补了标定,并且定期校验,才稳定下来。标定这件事,一定要在项目初期就做,别等出问题再补。

第二个坑:信号灯相位对接想当然。视觉识别信号灯颜色看着简单,实际很难——远距离、逆光、雨雾都会导致识别错误,而且有延迟。我建议能对接信号机就一定对接,拿不到信号机数据再考虑视觉方案,并且视觉方案要做冗余校验(比如连续多帧确认)。

第三个坑:低估数据标注的工作量。一个路口一天的视频,标注起来是巨大的工作量。我建议用主动学习的思路,先用少量数据训一个初始模型,用它筛出难例,只标难例,这样标注效率能提升好几倍。

第四个坑:忽略业务方的使用习惯。系统做得再先进,如果业务方用不顺手,也是白搭。我见过一个系统,证据链做得很全,但复核界面操作繁琐,复核人员用了一周就弃用了。后来我们重做了界面,把常用操作放到一屏内,使用率才上来。技术之外,产品体验同样决定成败。

这套系统说到底,是算法、工程、业务三者的结合。算法决定能不能识别,工程决定能不能稳定跑,业务决定有没有人用。三者缺一,项目都落不了地。如果你正在做类似的项目,我的建议是:先把业务规则和数据规范定清楚,再动手写代码;先跑通最小闭环,再优化精度;先保证稳定,再追求先进。这个顺序反了,返工的成本会非常高。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询