1. 项目背景与核心价值
去年参与某水利监测系统升级时,发现传统水位计存在安装复杂、维护成本高的问题。当时尝试用摄像头+AI方案替代物理传感器,最终选用YOLOv9m模型实现了±1cm精度的水位识别。这套方案不仅降低了90%的硬件成本,还能通过视频流同时监测多个水位计刻度。
2. 技术方案选型解析
2.1 为什么选择YOLOv9m
相比前代模型,YOLOv9m在保持较高推理速度(Tesla T4上可达85FPS)的同时,对小目标检测的AP50指标提升23%。我们实测发现其对水位计刻度的识别效果:
- 在3米距离拍摄时,能稳定检测5mm宽度的刻度线
- 水面反光场景下的误检率比YOLOv8低40%
- 模型体积仅25MB,适合边缘设备部署
2.2 硬件配置方案
推荐两种部署方式:
-
边缘计算盒方案:
- Jetson Xavier NX + 200万像素工业相机
- 功耗15W,支持4路视频同时分析
- 单价约6000元
-
云端方案:
- 普通IPC摄像头 + 阿里云函数计算
- 按调用次数计费,月均成本<100元(10分钟/次检测频率)
3. 核心实现步骤
3.1 数据采集与标注
使用LabelImg标注时要注意:
python复制# 标注规范示例
<object>
<name>scale_10cm</name> # 按实际刻度值命名
<bndbox>
<xmin>256</xmin>
<ymin>380</ymin>
<xmax>262</xmax> # 宽度保持6px左右
<ymax>412</ymax> # 高度根据刻度线长度调整
</bndbox>
</object>
建议采集不同环境下的2000+张样本,包含:
- 晴天/雨天/夜间场景
- 水面波动/反光情况
- 不同角度拍摄画面
3.2 模型训练关键参数
yaml复制# yolov9m-custom.yaml
train: ../datasets/water_gauge/images/train
val: ../datasets/water_gauge/images/val
# 关键修改项
anchors:
- [4,5, 8,10, 13,16] # 调整锚点适应细长刻度线
fl_gamma: 1.5 # 聚焦困难样本
hsv_h: 0.015 # 增强色相扰动应对反光
训练命令建议:
bash复制python train.py --img 640 --batch 32 --epochs 150 \
--data ./data/water_gauge.yaml --cfg ./models/yolov9m-custom.yaml \
--weights '' --name yolov9m_watergauge
4. 水位计算算法
4.1 刻度线检测后处理
python复制def calculate_water_level(detections):
# 过滤非刻度线检测结果
scale_lines = [d for d in detections if d[6] == 'scale']
# 按y坐标排序(图像坐标系原点在左上角)
sorted_lines = sorted(scale_lines, key=lambda x: x[3])
# 获取水面位置(最后一个被遮挡的刻度线)
water_line = None
for i in range(len(sorted_lines)-1):
if sorted_lines[i+1][3] - sorted_lines[i][3] > 20: # 突变阈值
water_line = sorted_lines[i]
break
# 根据预标定的像素-厘米转换系数计算实际水位
if water_line:
return (water_line[3] - base_y) * pixel2cm
return None
4.2 精度提升技巧
- 动态ROI设置:根据水位计位置自动调整检测区域
- 多帧投票:取连续5帧检测结果的中位数
- 温度补偿:当环境温度变化>5℃时触发模型重校准
5. 部署优化经验
5.1 边缘设备优化
在Jetson设备上推荐:
bash复制# 转换TensorRT引擎
python export.py --weights runs/train/yolov9m_watergauge/weights/best.pt \
--include engine --device 0 --half
实测性能对比:
| 优化方式 | 推理耗时(ms) | 内存占用(MB) |
|---|---|---|
| 原始模型 | 42.3 | 780 |
| FP16量化 | 28.7 | 510 |
| TensorRT | 16.2 | 370 |
5.2 常见问题排查
-
误检高频出现:
- 检查训练数据是否包含足够多的反光样本
- 调整conf-thres参数(建议0.6-0.8)
-
刻度线漏检:
- 验证anchor设置是否匹配刻度线宽高比
- 增加train_scale参数增强小目标检测
-
水位跳变:
- 检查摄像头是否松动导致画面抖动
- 启用多帧平滑滤波
6. 方案扩展应用
本方案稍作调整即可用于:
- 油位计自动读数
- 压力表指针识别
- 温度计刻度检测
最近在尝试结合OCR技术,直接识别水位计上的数字标识。测试发现当数字区域>32×32像素时,CRNN模型能达到98%的识别准确率。