1. 先说清楚:摄像头监测交通,AI到底在替人做什么
我做智慧交通项目有些年头了,从最早的卡口抓拍、电子警察,到后来接触各种视频AI分析平台,最大的感受是:很多人一听到“摄像头监测交通”,第一反应就是抓拍违章、罚款扣分。但实际上,真正的智慧交通视频AI分析系统,干的远不止这些。
这套东西的核心价值在于,把道路上的视频流变成结构化数据,再让数据替人做判断。举个例子,一条城市主干道上有十几个摄像头,过去需要两三个交警盯着大屏看,遇到事故、拥堵、违停才能发现。现在视频AI做的是实时分析每一路视频流——车流量是多少、平均速度多少、有没有车逆行、有没有行人闯入高架、某个路口是不是开始拥堵了、有没有车辆违法变道。这些事情,人看不过来,机器可以7乘24小时不间断地看。
我理解中的智慧交通视频AI分析系统,本质上是一个“视频+算法+业务”三层结构。视频层负责把不同厂家、不同协议、不同清晰度的摄像头统一接入;算法层负责把视频里出现的车、人、物、事件识别出来;业务层则是把识别结果对接到交警指挥中心、信号灯控制、诱导屏发布、保险理赔这些真实业务场景。
这也就是为什么近两年大家都在谈“视觉中枢”“全息路口”这类概念。摄像头是眼睛,AI算法是大脑,业务系统是手脚。眼睛负责采集,大脑负责理解,手脚负责执行。缺了任何一环,都只能叫“监控系统”,够不上“智慧交通”。
这篇文章想聊的,不是我做的某一个具体项目,而是把这套系统的核心环节拆开讲一讲。从摄像头怎么选、怎么接入,到算法怎么设计、遇到什么坑,再到部署调优阶段那些文档里不会写的东西。希望给正在做或者准备做类似项目的朋友一些参考,尤其是那些刚接触视频AI,被各种名词绕晕的人。
2. 摄像头选型与接入:RTSP、GB28181和那些杂牌设备的坑
2.1 供电与网络:POE不是唯一解,但推荐优先考虑
做交通视频AI,第一步永远是摄像头本身。很多人上来就问“用海康还是大华”,其实选型逻辑没那么简单。你要先想清楚一个问题:这个摄像头是装在什么环境里的。
如果是新建设的点位,我强烈建议直接用POE供电的摄像头。一根网线同时搞定供电和数据传输,施工成本低,维护也方便。海康、大华、宇视这些一线品牌,几乎全线支持POE。但要注意,POE供电有功率上限,普通的IEEE 802.3af标准最大只有15.4瓦,带不带加热、带不带云台、带不带补光灯,这些都会影响功耗。我之前遇到过一个问题:冬天北方室外温度低,摄像头启动了加热功能,POE供电功率不够,设备反复重启。后来换了802.3at(POE+)的交换机才解决。
如果是在已有模拟摄像头的存量项目上改造,情况就复杂了。模拟摄像头要用NVR或DVR做接入,老项目里经常遇到“模拟摄像头到底接NVR还是DVR”的困惑。简单说,DVR本质上是把模拟信号做本地编码存储,NVR则是直接接入网络摄像机(IPC),两者编码方式、存储逻辑都不一样。存量模拟摄像头改造为AI系统,最省事的办法是通过NVR/DVR的ONVIF或RTSP能力做二次取流,但画质和延迟往往不太理想。有条件的话,还是建议逐步替换成IPC。
无线方案也是一个选项,比如4G摄像头,适合临时布控、移动执法这类场景。4G摄像头要注意心跳机制和流量成本,尤其是GB28181接入时,心跳周期设得太短会频繁重连,设得太长又可能掉线后无法及时发现。我一般建议把心跳周期设在30到60秒之间,具体看网络状况。
2.2 RTSP取流:主码流和子码流的取舍
接入网络摄像头,RTSP协议是最常用、最通用的方式。几乎每个IPC都支持RTSP取流,但不同品牌、不同型号的RTSP地址格式差异很大,这也是很多人第一次接触时会卡住的地方。
以海康威视为例,RTSP地址一般是这样的格式:
rtsp://用户名:密码@IP地址:554/Streaming/Channels/101这里末尾的“101”表示通道1的主码流,换成“102”就是通道1的子码流。大华的格式是类似但路径不同:
rtsp://用户名:密码@IP地址:554/cam/realmonitor?channel=1&subtype=0subtype=0是主码流,subtype=1是子码流。
为什么要区分主码流和子码流?因为视频AI分析和人眼观看,对画质的诉求完全不一样。人看画面,要清晰、流畅,最好上4K;但AI分析,尤其是做车辆检测、车牌识别,分辨率和帧率要合适,过大的码流反而会让后端处理吃力。我的经验是:
- 主码流用于AI分析和存储,一般设置1080P、15到25帧、码率4到8Mbps;
- 子码流用于预览和移动端查看,一般设置720P或更低的D1分辨率,码率控制在1Mbps左右。
这样设计的好处是,后端算法服务器不用承受全量主码流的压力,日常预览也可以靠子码流跑。如果所有的摄像头都拉主码流,很快你就会发现GPU没爆,网络先爆了。
2.3 GB28181:国标接入才是政府项目的主流
如果你只做小范围的单点测试,RTSP就够了。但一旦进入交警、高速公路这类正规项目,GB28181几乎是必选项。
GB28181是国内的视频监控联网标准,定义了设备如何注册到SIP服务器、如何上报目录、如何推流。它存在的意义是解决“不同厂商设备互联互通”的问题。海康的摄像头、大华的NVR、宇视的平台,只要都支持GB28181,就能在一个平台上统一管理。
对接GB28181时,几个细节容易踩坑:
- 设备编码(国标ID)不唯一:每一个摄像头都有一个20位国标ID,包含中心编码、行业编码、类型编码等信息。很多杂牌摄像头出厂默认的国标ID都一样,接入平台后会出现设备冲突,必须手动修改。
- SIP服务器地址和端口:这个必须和平台端严格一致,包括传输协议是UDP还是TCP。大华默认用UDP,海康默认用TCP,两边不一致就注册不上。
- 心跳周期和注册有效期:设备注册成功后,会按周期发送心跳。如果平台端设置的超时时间太短,网络一抖动就判定设备离线,然后反复上下线,非常折磨人。
说实话,GB28181的调试比RTSP繁琐得多,但它解决了一个核心问题:整个系统里可能有几十个不同厂商的摄像头,你不能让每个摄像头都走不同协议去对接。用GB28181统一接入,平台侧只需要实现一个标准协议栈。
2.4 杂牌摄像头的坑:IP搜索和协议兼容
提到杂牌摄像头,很多人不以为然,觉得能出画面就行。做视频AI分析时,杂牌摄像头的坑可能会让你怀疑人生。
首先是IP搜索。海康有自己的SADP工具,大华有ConfigTool,宇视有IPTool。但杂牌摄像头往往随机附赠一个不知名的搜索工具,甚至不提供。有一次我在现场遇到一台杂牌IPC,说明书上只写了“默认IP:192.168.1.200”,结果局域网里怎么都ping不通。后来用网卡抓包才发现,这台设备出厂时是DHCP模式,自动获取了一个冲突的IP。类问题其实很常见,建议在工地上常备一个全网段IP扫描工具,或者直接用厂商的搜索软件逐个排查。
其次是协议兼容性。很多杂牌摄像头对外宣称支持ONVIF,但实现往往不完整。ONVIF的Profile S只定义了基本的视频流和PTZ控制,但设备发现、事件上报这些扩展功能各家实现都不一样。我遇到过一台杂牌摄像头,ONVIF能取到RTSP地址,但取流数一多就断流,最后只能放弃ONVIF,直接用RTSP地址。
更头疼的是某些杂牌设备会在RTSP地址里加入非标准参数,导致主流播放器和FFmpeg都拉不到流。这种情况下,先用VLC或FFmpeg做一下连通性测试是最稳妥的,确认没问题再接入到AI系统里。FFmpeg的测试命令很简单:
ffmpeg -i "rtsp://user:pass@ip:554/stream" -t 10 -c:v copy test.mp43. 视频AI分析的核心模块:检测、识别、事件判断
3.1 车辆检测与跟踪:一切分析的基础
视频AI分析要处理的第一步,是从视频帧中找出“车在哪里”。这一步通常目标检测算法完成,目前主流方案是YOLO系列及其变体。
我在项目里试过YOLOv5、YOLOv7、YOLOv8,也试过一些专门针对车辆检测的模型。说实话,如果没有特殊约束,直接用YOLOv8再配合几个小优化就够用了。车辆检测的难点不在模型结构,而在数据处理:
- 车是运动目标,但摄像头是固定的,所以可以用背景建模辅助检测,减少误检;
- 车辆遮挡严重,尤其是高峰期,前后车重叠,模型可能把两辆车识别成一辆。这时候需要结合跟踪算法,比如DeepSORT、ByteTrack,利用时间连续性来补全遮挡帧的检测结果;
- 每个摄像头安装角度、视野不一样,同一个模型在不同场景下的表现差异很大。一个高点俯视的摄像头,和一个低角度平视的摄像头,检测效果可能差好几个百分点。
做车辆跟踪时,我用得比较多的是ByteTrack,它逻辑简单、速度也快。ByteTrack的核心思想是“高置信度框和低置信度框都参与匹配”,这样在车辆遮挡、检测分数波动时还能保持ID稳定。ID稳定性非常重要,因为车流量统计、逆行判断、轨迹回放都要依赖跟踪ID。如果一辆车在画面里被反复换ID,那统计出来的车流量都是错的。
3.2 车牌识别:白天还行,晚上和雨天才是考验
车牌识别是交通场景里需求最明确、也是最难啃的模块。很多人以为车牌识别就是“OCR”,其实不然。一个完整的车牌识别系统,需要先定位车牌区域,再做字符分割或端到端识别,还要处理各种非理想条件。
白天顺光环境下,现有算法的识别率能做到98%以上,基本够用。但一到夜间、逆光、雨雾天气,识别率可能直线下滑到80%以下。为什么?因为车牌反光、环境光线不足、雨滴遮挡车牌、泥浆糊住字符,这些都是现实世界里的常态。
针对这些问题,我总结了几条实战经验:
- 曝光策略要专门调:很多摄像头默认的自动曝光模式在夜间会“过曝”。建议把抓拍车道的曝光模式调成“快门优先”,快门速度保持在1/100秒以上,避免动态模糊。
- 补光灯不是越亮越好:白光补光灯能提升照度,但过强的补光会让车牌反光变成一片白。可以考虑用红外补光,配合红外滤光片切换(ICR),夜间效果反而更干净。
- 算法层面可以做多帧融合:对连续几帧的车牌识别结果做投票或加权,比单帧识别的稳定性高不少。付出的代价是要多算几帧,但对GPU来说不算大负担。
另外,国内车牌种类多、样式杂,新能源绿牌、货车黄牌、军警白牌、使馆黑牌、临时牌,不同省份的字体也存在细微差异。训练数据里如果某个类别的样本太少,识别结果就会偏向高频类别。做数据清洗时,一定要统计各类别的样本分布,别让模型“偏科”。
3.3 交通事件检测:违停、逆行、拥堵、抛洒物
交通事件检测是视频AI分析里最能体现“智慧”的部分,也是交警、高速管理方最愿意买单的功能。它不再回答“有什么”,而是回答“发生了什么”。
举几个我实际做过的事件检测类型:
- 违停检测:设定一个禁止停车区域,当车辆在该区域停留超过设定时长(比如60秒),就触发告警。难点在于区分“等红灯”“临时下人”和“长时间违停”,需要跟踪ID结合停留时间判断。
- 逆行检测:利用车辆跟踪轨迹,判断车辆运动方向和指定方向是否一致。逆行的关键是方向计算要稳,不能因为车辆在画面里的像素位置变化小就误判。一般在车道线或行驶方向上设定参考向量,通过轨迹向量的夹角来判断。
- 拥堵检测:通过路段的平均速度、车流量、密度三个指标综合判断。最简单的方式是计算一段时间内通过某个断面车辆的平均速度,低于阈值就判定为拥堵。更精细一点,可以把路段划分成多个区域,分别计算各区域占有率,这样能判断拥堵是从哪个位置开始蔓延的。
- 抛洒物检测:路面出现遗撒物体、纸箱、轮胎碎片等。这个功能误报率通常比较高,因为阴影、积水、路面的色差都可能被当成物体。我一般会加一个“多帧确认”逻辑,只有连续N帧都检测到同一位置的物体才触发告警。
事件检测最大的挑战不在算法,而在告警阈值怎么定。阈值太敏感,一天告警几百条,管理方反而把系统关了;阈值太迟钝,漏报又会让人失去信任。按我的经验,告警要分级,比如违停可以先提醒、再告警、后取证,给管理人员留出处置时间。系统不是用来替代人的,是用来辅助人的。
4. 系统架构与数据流:从摄像头像素点到告警推送
4.1 端-边-云三层结构怎么分
一个真实的智慧交通视频AI分析系统,不会只有摄像头和服务器两个环节。我习惯把它拆成端、边、云三层。
端侧就是摄像头本身,负责采集视频。边侧是靠近摄像头一端的计算设备,可以是NVR、AI盒子,也可以是边缘计算服务器。云侧是中心机房或云平台,负责汇聚、存储、训练、业务应用。
为什么要把计算放在边缘?核心原因是带宽和延迟。一个1080P、25帧、4Mbps码流的摄像头,一小时产生的数据量大概是1.8GB。如果50路摄像头同时把主码流传到中心,一小时就是90GB,一般的专线根本扛不住,更别提实时分析的时延。所以通常的做法是:边缘端做视频解码和初步的AI分析,把结构化结果(车辆数、事件类型、车牌号)传回中心,视频只做按需上传。
我做一个典型的项目时,计算资源的分布大致是这样:
| 功能模块 | 部署位置 | 硬件形态 | 说明 |
|---|---|---|---|
| 视频接入与解码 | 边缘 | AI盒子/NVR | 解决带宽和并发取流问题 |
| 车辆检测/跟踪 | 边缘 | GPU或NPU | 实时性要求高,推理时延要低 |
| 车牌识别 | 边缘/中心 | GPU | 夜间等复杂场景可在中心用大模型兜底 |
| 事件分析/告警 | 边缘 | 边缘服务器 | 依赖跟踪结果,做时序逻辑判断 |
| 数据汇聚/存储 | 中心 | 云服务器 | 结构化数据、告警记录、视频片段 |
| 模型训练 | 中心 | GPU集群 | 用历史数据迭代模型版本 |
4.2 视频流接入层:并发取流和断线重连
接入层在系统里看起来不起眼,但它是稳定性的基石。视频AI系统最容易出的问题就是“看不到监控画面”——不是摄像头坏了,而是接入层没有处理好。
并发取流是第一个瓶颈。每一路视频流在接入层都要经过RTSP/GB28181拉流、解码、帧缓冲等流程。如果接入层是纯软件实现(比如FFmpeg + OpenCV),单台服务器能稳定处理的并发路数非常有限。一般来说,用NVIDIA的硬解码(NVDEC)能大幅提升并发能力。以一张T4显卡为例,用NVDEC可以同时硬解二十几路1080P流,而纯CPU解码可能三四路就卡了。
断线重连也经常被忽略。摄像头网络抖动、设备重启、NVR重启,都会导致取流中断。接入层必须要有自动重连机制,而且要带指数退避策略——刚断线时每2秒重试一次,连续失败后把间隔逐渐拉长到30秒,避免设备刚起来就被大量重连请求打垮。
此外,视频流的时间戳同步也是一个坑。一个系统里同时接入多个品牌的摄像头,每一路视频流的起始时间基准不同,即使所有设备都有NTP同步,解码后的时间戳依然可能偏差。做跨摄像头轨迹分析时(比如一辆车连续经过三个摄像头),时间不同步会导致轨迹拼接错乱。我的做法是在接入层统一为每一帧生成统一时间戳,并周期性校准。
4.3 告警链路:分析结果怎么变成可执行的信号
AI分析产生的结果,最终要变成有意义的信息推给用户。我喜欢把告警链路设计成“事件-规则-通知”三层。
事件代表“发现了什么”,比如检测到一辆车停在禁停区超过60秒,产生了一个“违停事件”。事件本身是客观事实,但要不要通知人,需要规则来判断。同样是违停事件,在严格禁停路段可以直接告警,在普通路段可能只做记录;在凌晨时分可能触发高优先级,在白天高峰时段可能自动降级。规则层把业务经验翻译成了程序可执行的逻辑。
通知层负责把告警通过短信、APP推送、语音播报等方式发出去。我始终认为,通知不是越多越好,而是越准越好。在项目验收时,客户最在意的往往不是算法识别准不准,而是“告警有没有打扰到我”。
一个实用的做法是设置“告警聚合”:同一路摄像头在5分钟内连续触发的同一类型事件,折叠成一条告警,附上事件起止时间和关键视频片段。这样管理人员一次看到的是结论,不是几十条重复消息。
5. 落地过程中的性能调优和稳定性问题
5.1 GPU推理性能:你也可能遇到“显卡占用率只有30%”的怪事
视频AI系统跑起来之后,大家都会关心GPU的性能。但很多人只盯着“显存”“算力”,忽略了一个重要环节:数据搬运。
我遇到过不少项目,算法服务器的GPU占用率只有30%、40%,CPU却跑到100%。排查下来发现,瓶颈根本不在算力,而在解码和预处理。视频帧从解码模块拷贝到GPU显存、做缩放和归一化,这一整条链路的效率决定了吞吐量。如果用OpenCV的imread、resize这类CPU函数,再通过cudaMemcpy拷贝到显存,每一帧都有大量的CPU-GPU数据搬运,GPU大部分时间都在等数据。
优化方案是让整条数据链路都走GPU。用NVDEC硬解码后直接把数据放在显存里,GPU显存内做缩放和归一化,再交给推理引擎(TensorRT、ONNX Runtime等)。这样改动之后,吞吐量往往能提升两三倍。必要的时候还可以用CUDA Stream实现多路视频流的并行流水线,让解码、预处理、推理重叠执行。
5.2 夜间、逆光、雨雾:算法能做的和要做的事
前面聊车牌识别时提过夜间和雨天的影响,这里再展开讲讲。算法跑在真实道路上,环境变化带来的挑战远比想象中的多。
逆光是白天最常见的难题。太阳低角度照射,镜头正对阳光方向时,画面里车辆轮廓是黑的,车牌更是白茫茫一片。解决逆光,算法层面可以靠图像增强,比如自适应直方图均衡化(CLAHE)提高暗部细节,但副作用是会放大噪声。更可靠的方案还是摄像头端的宽动态(WDR)功能。我在选型时基本会要求摄像头支持WDR,夜间优先开启。如果摄像头本身不支持WDR,后续AI再怎么调优都有限。
雨雾天气也会影响画面质量。有些人会想到加除雾算法,但实时视频做除雾的代价很大,可能吃掉一半的算力。我的做法是分场景处理:平时不启用,当能见度检测算法判断画面雾度超过阈值时,才动态开启轻量去雾。这种“按需计算”的方式,可以把算力花在刀刃上。
夜间还有一个隐藏问题:红外补光会让彩色画面变成黑白,而车牌识别的模型大多是基于彩色图片训练的。如果场景里有车牌识别需求,要么用白光补光保留彩色画面,要么单独训练一套红外模式下的车牌识别模型。我一般建议在关键车道用双补光方案,白光+红外,兼顾彩色画面和人眼监控需求。
5.3 存储与回查:告警视频怎么存才不爆盘
视频AI系统必然会涉及视频存储。全量视频按7天、30天的周期保存,再加上告警片段,存储量算下来非常可观。
视频存储的方案选择上,我比较少用“把所有视频都存成MP4”这种简单粗暴的方案。更常见的是切片段存储,比如每5分钟一个文件,按摄像头和时间建立索引。这样回查告警对应视频时,不需要去大文件里拖拽定位,直接按索引取片段即可。使用FFmpeg推流时也可以利用分段参数:
ffmpeg -i "rtsp://..." -c:v copy -map 0 -f segment -segment_time 300 -reset_timestamps 1 ./record/%Y%m%d_%H%M%S.mp4告警相关的视频片段要单独存储,并且不能覆盖。我一般会设置一个独立目录,按事件ID命名,同时把结构化信息(车牌号、事件类型、时间范围)写进数据库。这样管理人员在平台上点开一条告警,能直接看到“哪路摄像头、什么时间、发生了什么、证据视频在哪儿”。
还有一件事容易被忽略:视频文件的时钟校准。摄像头本身的系统时间如果不准,存储视频的文件名时间会和真实时间偏差,回查时非常麻烦。在建项目时,我会把NTP时间同步纳入摄像头的初始化配置流程,挨个检查一遍,好过事后返工。
6. 几个值得记住的实操经验
6.1 先跑通小闭环,再谈大平台
这是我做项目一直坚持的原则。刚开始做视频AI分析,不要一上来就规划几十路摄像头、全部功能并行开发。先拿三五个摄像头,跑通一个最核心的功能闭环,比如“车辆检测-跟踪-车流量统计-数据大屏展示”,把链路里所有的坑都踩一遍。这个小闭环跑通了,后续加摄像头、加功能模块都只是量的扩展,不会伤筋动骨。我见过太多项目,一上来就铺开做,结果卡在某个杂牌摄像头的取流问题上,整个团队一筹莫展。
6.2 摄像头质量决定了AI的上限
算法再强,也无法把720P、严重过曝的画面恢复到令人满意的程度。AI系统的上限,有一半是摄像头决定的。预算允许的话,优先选择一线品牌,海康、大华、宇视、天地伟业在稳定性和协议兼容性上确实更可靠。选择机型时,重点关注传感器尺寸、最低照度、宽动态能力、补光方式这几个参数,而不是单纯看像素高低。
6.3 条件允许就做模型迭代闭环
视频AI系统从交付那一刻起,其实才刚起步。初始模型再准,也挡不住场景里的意外事物、季节变化、灯光改造带来的影响。我的建议是,系统上线后至少运行一个月,积累真实场景的训练数据,然后做一次模型微调。很多团队只把系统当成一个“安装部署”项目,算法模型从未更新,上线半年后准确率明显下降,用户自然不满意。我见过做得好的项目,会定期拉取那些“识别失败”的图片,主动标注、持续训练,让模型越用越准。
6.4 接线板都不能放过的交付清单
最后说一个很土但很重要的经验。交付一套视频AI系统时,我会让实施人员拿着一份“物理巡检清单”,逐项检查:
- 摄像头是否牢固安装,角度是否对准车道;
- 网线水晶头是否压紧,POE供电是否正常;
- 防水盒、电源适配器是否做了防水处理;
- 补光灯照射角度是否避开车牌反光;
- NVR硬盘空间是否充足;
- 摄像头系统时间是否已同步。
这些听起来不起眼的事项,才是真正决定系统上线后省不省心的关键。软件算法再厉害,一个松动的水晶头就能让整个系统少看一路画面。智慧交通项目本质上是系统工程,硬件、网络、算法、平台,每一环都不能掉链子。这也是我在多年实操中体会最深的一点:先做好基础,再谈智能。