1. 项目背景与痛点分析
地铁站人流统计是个看似简单实则暗藏玄机的活。去年接手某一线城市地铁站的智能监控项目时,我们团队最初采用的传统目标检测方案在实际部署中遭遇滑铁卢——早晚高峰时段统计准确率暴跌至72%,平峰期也仅有85%左右。这个数字在演示PPT上很美好,但放到真实场景中意味着每100个乘客就有近30人"凭空消失"或"无中生有"。
经过两周的现场蹲点观察,我发现核心痛点集中在三个维度:
- 透视畸变:摄像头俯拍角度导致靠近画面边缘的行人被严重压缩变形,身高1.8米的成年人在画面边缘可能被识别成0.5米高的"可疑物体"
- 遮挡纠缠:早高峰时段的密集人流会产生大量相互遮挡,传统检测框容易将重叠行人误判为单个目标
- 光影干扰:地铁站内照明条件复杂,忽明忽暗的灯光加上反光地面会产生大量噪声检测
2. 技术方案选型与优化路径
2.1 目标检测框架升级
放弃原先使用的SSD检测器,转向YOLOv5s(small版本)主要基于三点考量:
- 速度与精度平衡:地铁站场景需要实时处理1080P@25fps视频流,YOLOv5s在Tesla T4上实测可达45FPS
- 小目标检测优势:相比v3/v4,v5的Focus结构和PANet特征金字塔对远处行人更友好
- 易于部署:原生支持TensorRT加速,导出ONNX后部署成本低
关键参数配置:
python复制# yolov5s.yaml
anchors:
- [5,6, 8,14, 15,11] # P3/8 小目标层
- [10,13, 16,30, 33,23] # P4/16
- [30,61, 62,45, 59,119] # P5/32
2.2 透视变换矩阵计算
采用四点变换法校正俯视畸变,具体步骤:
- 在地铁站平面图上选取4个物理坐标点(建议选择地砖接缝等明显标记)
- 在视频画面中标注对应的4个像素坐标点
- 使用OpenCV的getPerspectiveTransform计算变换矩阵
实际操作中发现两个细节问题:
- 地面反光会导致标记点漂移 → 改用红外激光笔辅助定位
- 柱子等障碍物会遮挡标记 → 在多个时段采集取平均值
校正效果对比:
| 指标 | 原始画面 | 校正后 |
|---|---|---|
| 边缘行人高度 | 50-80像素 | 120-150像素 |
| 宽高比偏差 | ±40% | ±8% |
2.3 动态ROI与计数策略
为避免计数区域边缘的误判,开发了动态ROI机制:
- 在变换后的画面底部划定虚拟计数线
- 采用方向向量判断:
- 当行人底部中心点从上方穿越计数线时+1
- 设置50像素的防抖区间(防止在界线处反复计数)
python复制def check_crossing(y_pos, prev_y, line_y):
if prev_y > line_y + 25 and y_pos <= line_y + 25:
return True
return False
3. 关键问题解决方案实录
3.1 密集遮挡场景优化
针对"粘框"问题,我们组合使用了三种策略:
- 提高NMS阈值至0.6(默认0.45)
- 添加遮挡敏感度权重:
python复制conf = obj_conf * (1 - 0.3 * overlap_ratio) - 引入短时轨迹追踪,对突然消失的目标进行状态保持
3.2 光照自适应处理
地铁站典型的光照问题包括:
- 列车进站时的强光闪烁
- 广告屏周期性颜色变化
- 早晚自然光入射差异
解决方案:
mermaid复制graph TD
A[原始帧] --> B[直方图均衡化]
B --> C[动态亮度补偿]
C --> D[背景差分]
D --> E[检测器输入]
3.3 虚实线误判治理
初期发现以下误判情况:
- 行李拖影被识别为行人
- 静止保安被重复计数
- 玻璃倒影产生鬼影
应对措施:
- 添加移动速度阈值(0.5m/s ~ 2m/s)
- 设置最小连续出现帧数(≥3帧)
- 对静止目标启动二次验证
4. 部署优化与实测效果
4.1 边缘计算方案选型
对比三种部署方式:
| 方案 | 设备成本 | 处理延迟 | 维护难度 |
|---|---|---|---|
| 云端GPU | 高 | 800-1200ms | 低 |
| 边缘服务器 | 中 | 200-300ms | 中 |
| 嵌入式设备 | 低 | 500-800ms | 高 |
最终选择NVIDIA Jetson AGX Xavier边缘方案,关键配置:
- 启用DLA加速引擎
- 固定频率模式锁定功耗至20W
- 使用TensorRT优化后的引擎
4.2 性能指标对比
连续7天的实测数据:
| 时段 | 原始准确率 | 优化后准确率 | 提升幅度 |
|---|---|---|---|
| 早高峰 | 68.2% | 95.1% | +26.9% |
| 晚高峰 | 71.5% | 94.3% | +22.8% |
| 平峰期 | 85.7% | 97.6% | +11.9% |
4.3 资源占用监控
在Jetson上的实际资源消耗:
- GPU利用率:峰值78% → 平均45%
- CPU负载:从4核满载 → 2核60%
- 内存占用:稳定在2.8GB/8GB
5. 踩坑经验与避坑指南
-
标定陷阱:
- 错误做法:只在空场景下单次标定
- 正确做法:在不同人流密度下多次标定取参数中位数
-
模型量化误区:
- FP16量化会导致小目标检测精度下降约5%
- 最佳实践:对P3/P4层保持FP32,仅对P5层量化
-
计数逻辑黑洞:
- 简单区域进入计数会导致重复统计
- 必须结合运动轨迹方向判断
-
温度陷阱:
- 边缘设备连续运行4小时后检测帧率下降15%
- 解决方案:添加散热风扇+温度监控重启机制
这个项目给我的最大启示是:计算机视觉在工业场景落地时,算法精度只占成功因素的30%,剩下70%是对业务场景的深度理解和工程化适配。比如我们发现早高峰时段乘客背包识别率会显著下降,后来才明白是因为冬天大家穿着厚外套导致外观特征变化——这种细节在任何论文里都不会提到,但恰恰是影响精度的关键因素。