全志开发板车牌识别数据集制作与优化指南
1. 项目背景与核心需求
在嵌入式AI领域,车牌识别(LPR)系统的轻量化部署一直是个热门课题。全志系列开发板凭借其出色的性价比和丰富的接口资源,成为众多边缘计算项目的首选硬件平台。而LPRNet作为专为车牌识别优化的轻量级神经网络,其模型大小仅约1.4MB,非常适合在全志Tina Linux等资源受限的环境中运行。
但要让模型在实际场景中表现良好,数据集的质量直接决定了模型的上限。不同于常规的CV任务,车牌识别数据集制作需要特别注意以下特性:
- 字符区域必须完整包含省市简称、字母和数字的组合
- 需要覆盖不同光照条件(强光/逆光/夜间)
- 应包含多种拍摄角度(俯拍/侧拍)
- 需考虑特殊车牌类型(新能源/军警/使馆车辆)
2. 数据集采集方案设计
2.1 硬件配置建议
对于准备自制数据集的开发者,推荐以下配置方案:
- 主摄像头:200万像素以上的工业相机(如海康威视MV-CE200-10GM)
- 辅助设备:可调亮度LED补光灯(建议色温5500K)
- 支架系统:带角度调节的云台支架
- 开发板:全志T507-H开发板(内置NPU加速)
实测中发现,使用自动曝光的消费级摄像头会导致车牌区域过曝,建议手动设置曝光参数(快门1/500s,ISO400)
2.2 拍摄场景规划
建议按以下比例配置采集环境:
| 场景类型 | 占比 | 说明 |
|---|---|---|
| 晴天正午 | 20% | 测试强光下的识别 |
| 阴天/雨天 | 30% | 模拟低对比度环境 |
| 夜间补光 | 25% | 测试LED补光效果 |
| 倾斜角度(>30°) | 25% | 验证透视变换鲁棒性 |
3. 数据标注规范详解
3.1 标注工具选型
经过对比测试,推荐以下工具链组合:
- LabelImg:用于车牌区域标注(生成XML格式)
- OpenCV脚本:自动提取ROI区域
- 自定义工具:处理特殊字符(如新能源车牌"·"分隔符)
# 示例:车牌字符分割脚本 def split_chars(plate_img): gray = cv2.cvtColor(plate_img, cv2.COLOR_BGR2GRAY) thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU)[1] contours = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) chars = [x for x in sorted(contours, key=lambda c: cv2.boundingRect(c)[0])] return [cv2.boundingRect(c) for c in chars]3.2 标注注意事项
- 省市简称与后续字符间保留2像素间隙
- 新能源车牌需单独标注中间圆点
- 对模糊样本建议进行超分处理(推荐使用Real-ESRGAN)
- 军警车牌需注意"·"分隔符的位置标注
4. 数据增强策略
4.1 基础增强方案
建议在以下维度进行增强:
- 几何变换:
- 随机旋转(-15°~+15°)
- 透视变换(最大20%形变)
- 色彩扰动:
- HSV空间随机偏移(H±10,S±30,V±20)
- 添加高斯噪声(σ=0.01)
4.2 特殊场景模拟
针对实际部署环境,建议增加:
- 运动模糊(模拟车辆移动)
- 雨滴效果(使用RainRender库)
- 镜头污渍(随机位置半透明遮挡)
# 运动模糊效果实现 def motion_blur(img, size=15): kernel = np.zeros((size, size)) kernel[int((size-1)/2), :] = np.ones(size) kernel /= size return cv2.filter2D(img, -1, kernel)5. 数据集格式转换
5.1 全志NPU适配要求
全志系列NPU需要特定格式的输入:
- 图像尺寸:94x24像素(LPRNet标准输入)
- 存储格式:二进制img格式
- 均值文件:需要生成对应的mean_value.txt
转换脚本示例:
python3 convert_dataset.py \ --input_dir ./raw_images \ --output_dir ./train_data \ --width 94 \ --height 24 \ --mean_values 104,117,1235.2 数据集目录结构
最终数据集应组织为:
dataset/ ├── train/ │ ├── images/ # 存放训练图像 │ └── labels.txt # 格式:文件名 标签 └── val/ ├── images/ # 验证集图像 └── labels.txt6. 实际部署验证
6.1 模型训练建议
在全志开发板上训练时需注意:
- 批量大小不宜超过8(DDR限制)
- 使用混合精度训练(FP16+FP32)
- 学习率设置为桌面级的1/5
6.2 性能优化技巧
实测有效的优化手段:
- 内存优化:
- 使用tensorrt优化模型
- 启用CMA内存分配器
- 计算加速:
- 开启NPU的INT8量化
- 使用多线程数据预取
在T507开发板上,经过优化的LPRNet推理时间可从120ms降至28ms
7. 常见问题排查
7.1 字符识别错误分析
当出现特定字符识别错误时:
- 检查该字符在数据集的样本量
- 验证标注是否包含边缘像素
- 测试不同字体渲染的差异
7.2 部署异常处理
典型问题解决方案:
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| NPU初始化失败 | 内核驱动版本不匹配 | 更新Tina Linux到最新版本 |
| 内存分配错误 | CMA配置过小 | 修改/boot/config.txt参数 |
| 推理结果全零 | 输入数据未归一化 | 检查mean_value.txt是否正确 |
在实际项目中,我们发现新能源车牌的识别准确率往往比普通车牌低15-20%,这通常是由于训练数据中新能源样本不足导致。建议单独收集至少500张新能源车牌样本进行增量训练。
