1. 项目背景与目标
作为一名计算机视觉方向的研究生,我最近在完成一个车牌识别系统的课程作业。这个项目最初只是老师布置的基础练习,但随着深入研究和实践,我逐渐将其发展成一个完整的车牌识别系统开发流程。整个系统可以分为三个核心模块:车牌定位(车框识别)、字符分割与识别、嵌入式端部署。本文主要聚焦第一个模块——基于旋转框(OBB)的车牌定位技术。
在实际道路场景中,车牌往往存在各种角度的倾斜。传统水平框(HBB)检测方法虽然简单高效,但难以准确框选倾斜车牌,这会给后续的字符识别带来困难。因此,我选择采用旋转框检测技术来解决这个问题。
2. 技术选型与方案设计
2.1 检测方法对比
在目标检测领域,针对旋转目标的检测主要有三种主流方法:
-
水平边界框(HBB):
- 优点:计算量小,实现简单
- 缺点:只能检测水平方向的物体,对倾斜车牌效果差
- 适用场景:证件照等规范场景
-
旋转边界框(OBB):
- 优点:可以准确框选任意角度的矩形目标
- 缺点:计算量略大于HBB
- 适用场景:车牌、文字等规则形状的旋转目标
-
实例分割(SEG):
- 优点:可以检测任意形状的目标
- 缺点:计算复杂度高,标注成本大
- 适用场景:不规则形状物体的精细检测
考虑到车牌始终是矩形这一特性,OBB是最合适的选择。它既能准确框选倾斜车牌,又不会像分割方法那样引入不必要的计算开销。
2.2 模型架构选择
在确定了使用OBB方法后,我对比了几种主流的目标检测框架:
| 模型 | 精度 | 速度 | 部署难度 | 适用场景 |
|---|---|---|---|---|
| Faster R-CNN | 最高 | 最慢 | 最难 | 高精度静态图像分析 |
| MobileNet+SSD | 较低 | 最快 | 最简单 | 低算力实时检测 |
| YOLOv8 | 较高 | 较快 | 中等 | 实时视频流分析 |
综合考量后,我选择了YOLOv8-OBB方案,主要基于以下几点考虑:
- 精度与速度平衡:YOLO系列在保持较高精度的同时,推理速度能满足实时性要求
- 嵌入式适配性:计划最终部署到树莓派等嵌入式设备,YOLO的轻量化版本更合适
- 生态支持:Ultralytics官方提供了完善的OBB支持,开发效率高
- 模型迭代:YOLOv8是目前较新的版本,后续可以方便地升级到v26等嵌入式专用版本
3. 数据集准备与处理
3.1 数据集选择
我使用了三个公开的车牌数据集:
-
CCPD2019:
- 包含多种场景的蓝色车牌
- 数据量大,覆盖各种光照和天气条件
- 子集包括:基础、模糊、倾斜、旋转、天气等场景
-
CCPD_GREEN:
- 新能源车绿色车牌
- 用于增强模型对绿色车牌的识别能力
-
CRPD:
- 包含黄色车牌(大型车辆)
- 用于解决普通模型对黄色车牌识别率低的问题
3.2 数据预处理
数据集需要转换为YOLO-OBB格式。以CCPD数据集为例,其文件名包含了丰富的标注信息:
示例文件名:025-95_113-154&383_386&473-386&473_177&454_154&383_363&402-0_0_22_27_27_33_16-37-15.jpg
各字段含义:
| 字段 | 示例值 | 说明 |
|---|---|---|
| 1 | 025 | 车牌区域与整图的面积比 |
| 2 | 95_113 | 水平和垂直倾斜度 |
| 3 | 154&383_386&473 | 车牌矩形框坐标 |
| 4 | 386&473_... | 车牌四个角点坐标(右下开始顺时针) |
| 5 | 0_0_22... | 车牌字符信息 |
| 6 | 37 | 亮度值 |
| 7 | 15 | 模糊度 |
处理脚本的核心逻辑:
- 解析文件名获取四个角点坐标
- 归一化坐标到[0,1]范围
- 按照YOLO-OBB格式保存标注:
code复制class_id x1 y1 x2 y2 x3 y3 x4 y4
3.3 数据增强策略
为了提高模型鲁棒性,我采用了多种数据增强技术:
-
色彩增强:
- 调节HSV通道(色相、饱和度、明度)
- 解决过曝、逆光等极端光照问题
-
几何增强:
- 随机缩放(0.6-1.4倍)
- 水平翻转(概率0.5)
- 马赛克增强(训练前期开启)
-
高级增强:
- MixUp:图像混合增强
- 最后10个epoch关闭增强进行微调
4. 模型训练与优化
4.1 基础训练
使用YOLOv8n-OBB预训练模型,关键训练参数:
python复制model.train(
data='ccpd_obb.yaml',
epochs=100,
patience=50, # 早停轮数
imgsz=640, # 输入尺寸
batch=16, # 批量大小
device='0', # GPU设备
workers=8, # 数据加载线程
close_mosaic=10, # 最后10轮关闭马赛克增强
cos_lr=True, # 余弦学习率衰减
optimizer='AdamW', # 优化器选择
amp=True # 自动混合精度
)
训练过程中的关键观察指标:
-
损失函数:
- 训练损失和验证损失都应持续下降
- 如果验证损失上升可能出现过拟合
-
精度指标:
- mAP50:基础检测精度
- mAP50-95:综合检测精度
- Precision:误检率
- Recall:漏检率
4.2 模型微调
基础模型在测试时发现以下问题:
- 对绿色/黄色车牌识别率低
- 强光照射下的蓝色车牌误识别
- 远距离小车牌漏检
针对这些问题,我进行了两轮专项微调:
第一轮微调(绿色车牌):
- 使用CCPD_GREEN数据集
- 增强色彩调整参数(hsv_h=0.06, hsv_s=0.5, hsv_v=0.4)
- 加入负样本过采样(误检区域)
第二轮微调(黄色车牌):
- 使用CRPD数据集
- 调整增强参数(hsv_h=0.03, hsv_s=0.6, hsv_v=0.7)
- 增加MixUp比例(0.15)
微调后的关键改进:
- 绿色车牌识别率提升42%
- 黄色车牌识别率提升35%
- 强光场景误检率降低60%
5. 模型评估与结果分析
5.1 定量评估
在5006张测试图像上的表现:
| 指标 | 基础模型 | 微调后 |
|---|---|---|
| 准确率 | 92.1% | 98.12% |
| 召回率 | 90.5% | 97.8% |
| mAP50 | 0.923 | 0.976 |
| mAP50-95 | 0.756 | 0.892 |
5.2 典型成功案例
模型能够很好地处理以下复杂场景:
- 45度倾斜车牌
- 强光照射下的车牌
- 雨雪天气的模糊车牌
- 远距离小尺寸车牌
5.3 现存问题
-
极端低分辨率:
- 当车牌区域小于30×100像素时识别率下降
- 解决方案:尝试超分辨率预处理
-
重度遮挡:
- 车牌被遮挡超过50%时容易漏检
- 解决方案:加入更多遮挡样本训练
-
特殊字体:
- 某些特殊字体车牌识别率较低
- 解决方案:收集更多字体变体数据
6. 关键代码实现
6.1 数据预处理核心代码
python复制def convert_to_obb(src_path, output_dir, img_type):
filename = os.path.basename(src_path)
points = filename.split('-')
if len(points) >= 4:
# 解析四个角点坐标
points = points[3].split('_')
coords = []
for p in points:
x, y = map(int, p.split('&'))
coords.extend([x, y])
# 归一化处理
img = cv2.imread(src_path)
h, w = img.shape[:2]
obb = [c/w if i%2==0 else c/h for i,c in enumerate(coords)]
# 保存OBB标注
label_line = f"0 {' '.join(f'{x:.6f}' for x in obb)}\n"
txt_path = os.path.join(output_dir, f'labels/{img_type}', filename.replace('.jpg','.txt'))
with open(txt_path, 'w') as f:
f.write(label_line)
# 复制图像
shutil.copy(src_path, os.path.join(output_dir, f'images/{img_type}', filename))
6.2 训练配置示例
python复制# 微调配置(黄色车牌专项)
model.train(
data='cprd_patch.yaml',
epochs=40,
imgsz=640,
batch=8,
device='0',
lr0=0.001,
hsv_h=0.03, # 色相调整
hsv_s=0.6, # 饱和度增强
hsv_v=0.7, # 亮度调整
mixup=0.15, # MixUp比例
optimizer='AdamW',
amp=True
)
7. 部署优化建议
为了在树莓派等嵌入式设备上高效运行,可以考虑以下优化:
-
模型量化:
- 使用FP16或INT8量化减小模型体积
- 测试表明INT8量化可使推理速度提升2倍
-
裁剪优化:
- 去除检测头冗余层
- 可减少15-20%的计算量
-
硬件加速:
- 使用OpenVINO或TensorRT加速
- 配合Intel神经计算棒可达到实时性能
-
多阶段检测:
- 先用轻量模型做区域提议
- 再对小区域进行精细识别
8. 项目心得与改进方向
通过这个项目,我总结了以下几点经验:
-
数据质量决定上限:
- 收集多样化的真实场景数据比调参更有效
- 建议至少准备1万张以上的标注数据
-
渐进式优化策略:
- 先解决主要问题(如基础蓝色车牌)
- 再通过微调解决特定场景问题
-
评估指标的选择:
- 不能只看mAP,要结合实际业务需求
- 车牌识别更关注召回率(减少漏检)
未来的改进方向:
- 集成超分辨率模块处理小目标
- 加入注意力机制提升抗干扰能力
- 开发自动数据增强策略
- 探索Transformer-based检测器
这个项目从课程作业发展成了一个完整的车牌识别解决方案,让我深刻体会到计算机视觉技术在现实场景中的应用挑战。后续我计划继续优化模型,并完成字符识别和嵌入式部署模块的开发。
