PyTorch实战车牌识别 小张的停车场项目逆袭之旅
停车场的"逆光困境" 35%误识率如何破局
2025年3月的一个正午,阳光直射下的城南停车场道闸前,一辆白色SUV缓缓驶入。摄像头捕捉到的车牌因强光过曝变成一片惨白,系统显示屏上跳出的识别结果从"皖A·8X3K2"跳转为"皖A·B2H70"——这已是当天第12次识别错误。负责技术升级的工程师小张盯着后台日志,眉头紧锁:逆光场景下35%的误识率,意味着每3辆车就有1辆需要人工干预,道闸前排队的车辆已经排到了主干道。
这个始建于2018年的停车场,摄像头仍在使用传统的"模板匹配+字符分割"算法。小张放大监控截图:逆光导致车牌区域对比度骤降,字符边缘模糊成一团;新能源车牌的绿色底色与阴影叠加,让算法把"D"误判成"0";倾斜45度停放的车辆,更是让字符分割模块直接失效。"必须彻底重构算法!"他在项目文档上写下这句话,旁边画了一个大大的问号:如何用PyTorch构建一套能抗逆光、耐倾斜的实时车牌识别系统?
30万张车牌的数据攻坚战 CCPD数据集预处理全流程
要解决识别难题,数据是基础。小张首先将目光投向中科大开源的CCPD数据集——这个包含30万张真实停车场图像的宝库,涵盖了逆光、倾斜、模糊等8种复杂场景,甚至专门标注了水平倾斜20-50度的极端样本。但当他解压文件时,却发现一个棘手问题:所有标注信息都藏在文件名里。
"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"——这样的文件名需要拆解成区域、角度、边界框、字符标签等7个部分。小张用Python写了个解析脚本,提取出车牌的四个顶点坐标和字符序列,再通过透视变换将倾斜车牌校正为正矩形:
python
def parse_ccpd_filename(filename): parts = filename.split('-') # 提取四个顶点坐标 (x1,y1,x2,y2,x3,y3,x4,y4) coords = list(map(int, parts[3].split('_'))) pts = np.array([[coords[0], coords[1]], [coords[2], coords[3]], [coords[4], coords[5]], [coords[6], coords[7]]], dtype=np.float32) # 透视变换校正倾斜车牌 dst = np.array([[0, 0], [94, 0], [94, 24], [0, 24]], dtype=np.float32) # 标准车牌尺寸94x24 M = cv2.getPerspectiveTransform