1. LPRNet数据集制作概述
在嵌入式设备上部署车牌识别(LPR)模型时,数据集的质量直接影响最终模型的识别效果。对于全志开发板这类资源受限的硬件平台,我们需要特别关注数据集的规模、多样性和标注准确性。本文将详细介绍如何为LPRNet模型准备一个精简但有效的数据集。
提示:虽然示例中只使用了10张图片,但在实际项目中建议至少准备200-300张不同场景的车牌图片,以覆盖更多实际应用场景。
2. 数据集准备流程详解
2.1 样本图片选择标准
从LPRNet_Pytorch官方仓库的测试集中挑选样本时,应考虑以下因素:
- 车牌类型多样性:应包含蓝牌、黄牌、新能源车牌等不同类型
- 拍摄角度变化:正视角、侧视角、俯视角等不同角度样本
- 光照条件:晴天、阴天、夜间等不同光照条件下的样本
- 车牌清晰度:清晰、模糊、部分遮挡等各种情况
- 背景复杂度:简单背景和复杂背景的样本都应包含
实际操作中,可以使用以下Python代码快速浏览和选择样本图片:
python复制import cv2
import os
from matplotlib import pyplot as plt
def preview_images(folder_path, num_cols=4):
image_files = [f for f in os.listdir(folder_path) if f.lower().endswith(('.png', '.jpg', '.jpeg'))]
num_images = len(image_files)
num_rows = (num_images + num_cols - 1) // num_cols
plt.figure(figsize=(20, 5*num_rows))
for i, img_file in enumerate(image_files[:10]): # 限制预览10张
img_path = os.path.join(folder_path, img_file)
img = cv2.imread(img_path)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.subplot(num_rows, num_cols, i+1)
plt.imshow(img)
plt.title(img_file)
plt.axis('off')
plt.tight_layout()
plt.show()
# 使用示例
preview_images("path_to_test_images")
2.2 数据集文件结构设计
合理的文件结构能大大提高后续模型训练和部署的效率。建议采用以下目录结构:
code复制awnpu_model_zoo/
└── examples/
└── dataset/
└── LICENSE_PLATE/
├── images/
│ ├── plate_001.jpg
│ ├── plate_002.jpg
│ └── ...
├── annotations/
│ └── labels.txt
└── dataset.txt
这种结构将图片和标注文件分开存放,便于管理和扩展。dataset.txt文件应包含所有图片的相对路径,例如:
code复制examples/dataset/LICENSE_PLATE/images/plate_001.jpg
examples/dataset/LICENSE_PLATE/images/plate_002.jpg
...
2.3 数据集标注规范
虽然示例中没有提到标注文件,但在实际车牌识别项目中,通常需要为每张车牌图片提供以下标注信息:
- 车牌位置:使用边界框(xmin, ymin, xmax, ymax)标注车牌在图片中的位置
- 车牌号码:准确记录车牌上的字符内容
- 车牌类型:标注车牌的类型(蓝牌、黄牌等)
标注文件可以采用以下格式(以JSON为例):
json复制{
"plate_001.jpg": {
"bbox": [120, 80, 320, 150],
"plate_number": "京A12345",
"plate_type": "blue"
},
...
}
3. 全志开发板部署注意事项
3.1 数据集量化处理
在全志开发板上部署模型时,通常需要对模型进行量化以提升推理速度。数据集在量化过程中起到关键作用,因此需要注意:
- 图片尺寸:统一调整为模型输入尺寸(如94×24)
- 色彩空间:转换为模型预期的色彩空间(通常是RGB)
- 数值范围:像素值归一化到[0,1]或标准化处理
可以使用以下代码进行预处理:
python复制import cv2
import numpy as np
def preprocess_image(image_path, target_size=(94, 24)):
# 读取图片
img = cv2.imread(image_path)
# 转换色彩空间
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# 调整尺寸
img = cv2.resize(img, target_size)
# 归一化
img = img.astype(np.float32) / 255.0
# 添加batch维度
img = np.expand_dims(img, axis=0)
return img
3.2 配置文件调整
config_model.yml文件中需要正确指定数据集路径和其他参数:
yaml复制dataset:
train:
list_path: "examples/dataset/LICENSE_PLATE/dataset.txt"
batch_size: 8
test:
list_path: "examples/dataset/LICENSE_PLATE/dataset.txt"
batch_size: 1
model:
input_size: [94, 24]
num_classes: 68 # 根据实际字符类别数调整
4. 常见问题与解决方案
4.1 图片路径问题
问题描述:模型无法找到数据集图片
解决方案:
- 检查
dataset.txt中的路径是否与实际路径一致 - 确保使用相对路径时,工作目录设置正确
- 路径中避免使用中文或特殊字符
4.2 图片格式问题
问题描述:某些图片无法正常加载
解决方案:
- 统一转换为JPG或PNG格式
- 检查图片是否损坏
- 确保所有图片具有相同的色彩通道数
4.3 标注不一致问题
问题描述:标注格式不统一导致训练错误
解决方案:
- 制定统一的标注规范
- 编写脚本检查标注一致性
- 对标注人员进行培训
5. 性能优化建议
- 数据增强:对小型数据集,可以使用旋转、平移、加噪声等方式增加数据多样性
- 难例挖掘:重点关注模型容易识别错误的样本,加强这些样本的训练
- 模型剪枝:针对嵌入式设备,可以移除模型中冗余的参数和层
- 量化精度:测试不同量化精度(8bit/16bit)对识别准确率的影响
我在实际项目中发现,车牌识别模型的性能很大程度上依赖于数据质量而非数量。精心挑选的200张高质量样本,其效果可能优于随意收集的2000张样本。特别是在嵌入式设备上,高质量的小型数据集配合适当的量化策略,往往能达到最佳的性能平衡。