U-NetCNN车牌识别开源项目实战96%准确率模型本地部署与测试指南车牌识别技术作为计算机视觉领域的重要应用已经广泛应用于智能交通、停车场管理、安防监控等场景。本文将带领读者从零开始在本地Ubuntu 20.04环境中部署一个基于U-Net和CNN的开源车牌识别项目并测试其在实际场景中的表现。1. 环境准备与依赖安装在开始项目部署前我们需要确保系统环境满足基本要求。本项目推荐使用Ubuntu 20.04 LTS系统Python版本为3.8.x。1.1 系统环境检查首先确认系统基本信息lsb_release -a # 查看系统版本 python3 --version # 查看Python版本 nvidia-smi # 检查GPU驱动如有NVIDIA显卡1.2 安装必要依赖执行以下命令安装基础依赖sudo apt update sudo apt install -y git python3-pip python3-venv build-essential cmake libopencv-dev创建并激活Python虚拟环境python3 -m venv plate-recog source plate-recog/bin/activate1.3 安装Python依赖包以下是项目所需的核心Python包及其版本要求包名称版本作用tensorflow2.6.0深度学习框架opencv-python4.5.3图像处理库numpy1.19.5数值计算pillow8.4.0图像处理matplotlib3.4.3可视化安装命令pip install tensorflow2.6.0 opencv-python4.5.3 numpy1.19.5 pillow8.4.0 matplotlib3.4.3提示如果使用GPU加速建议安装tensorflow-gpu版本以获得更好的性能。2. 项目获取与配置2.1 克隆GitHub仓库从GitHub获取开源项目代码git clone https://github.com/leo187/End-to-end-for-chinese-plate-recognition.git cd End-to-end-for-chinese-plate-recognition2.2 项目结构解析项目主要目录结构如下├── models/ # 预训练模型 │ ├── unet.h5 # U-Net定位模型 │ └── cnn.h5 # CNN识别模型 ├── configs/ # 配置文件 ├── utils/ # 工具函数 ├── plate_detect.py # 车牌检测脚本 ├── plate_recog.py # 车牌识别脚本 └── requirements.txt # 依赖文件2.3 配置文件修改编辑configs/config.yaml文件根据本地环境调整参数model_params: unet_model_path: ./models/unet.h5 cnn_model_path: ./models/cnn.h5 image_params: input_size: [240, 80] # 输入图像尺寸 char_classes: 68 # 字符类别数3. 模型加载与测试3.1 加载预训练模型项目提供了两个预训练模型U-Net模型用于车牌定位CNN模型用于字符识别加载模型的Python代码示例import tensorflow as tf from utils.model_loader import load_unet, load_cnn unet_model load_unet(config[model_params][unet_model_path]) cnn_model load_cnn(config[model_params][cnn_model_path])3.2 测试预训练模型项目提供了简单的测试脚本可以快速验证模型是否加载成功python test_models.py正常输出应显示模型结构和参数数量信息U-Net Model Summary: _________________________________________________________________ Layer (type) Output Shape Param # input_1 (InputLayer) [(None, 256, 256, 3)] 0 ... Total params: 31,031,811 Trainable params: 31,031,8114. 车牌识别全流程实战4.1 车牌检测流程车牌检测主要分为以下步骤图像预处理调整大小、归一化使用U-Net模型进行车牌定位后处理二值化、轮廓检测、车牌矫正关键代码片段def detect_plate(image_path): # 读取图像 img cv2.imread(image_path) # 预处理 img preprocess_image(img) # U-Net预测 mask unet_model.predict(np.expand_dims(img, axis0))[0] # 后处理 plate_roi postprocess_mask(mask) return plate_roi4.2 字符识别流程获取车牌区域后进行字符识别字符分割基于投影法分割单个字符CNN识别对每个字符进行分类结果后处理去除低置信度结果组合最终车牌号实现代码def recognize_chars(plate_roi): # 字符分割 char_images segment_chars(plate_roi) # CNN识别 results [] for char_img in char_images: pred cnn_model.predict(np.expand_dims(char_img, axis0)) char decode_prediction(pred) results.append(char) # 组合结果 plate_number .join(results) return plate_number4.3 完整流程测试使用示例图像测试完整流程python demo.py --image test_images/example.jpg输出结果示例检测到车牌位置: [(125, 80), (390, 80), (390, 160), (125, 160)] 识别结果: 京A12345 置信度: 0.965. 性能优化与实用技巧5.1 模型推理加速为提高实时性可以采用以下优化方法TensorRT加速将模型转换为TensorRT格式量化压缩使用FP16或INT8量化减小模型大小多线程处理分离IO和计算任务TensorRT转换示例from tensorflow.python.compiler.tensorrt import trt_convert as trt converter trt.TrtGraphConverterV2( input_saved_model_dirsaved_model) converter.convert() converter.save(trt_model)5.2 常见问题解决在实际部署中可能遇到的问题及解决方案问题现象可能原因解决方案检测不到车牌图像质量差增加图像预处理去噪、增强字符识别错误车牌倾斜添加仿射变换矫正置信度低光照条件差使用直方图均衡化5.3 自定义数据集训练如果需要针对特定场景优化模型可以按照以下步骤训练准备车牌数据集至少1000张标注图像数据增强旋转、缩放、改变亮度等微调模型unet_model.compile(optimizeradam, lossbinary_crossentropy) unet_model.fit(train_gen, epochs50, validation_dataval_gen)注意训练CNN识别模型需要字符级别的标注数据制作成本较高。6. 实际应用案例6.1 停车场管理系统集成将车牌识别集成到停车场系统的Python示例import requests from plate_recognition import PlateRecognizer recognizer PlateRecognizer() def process_car_entry(camera_url): # 获取摄像头图像 img get_image_from_camera(camera_url) # 识别车牌 plate_number recognizer.recognize(img) # 查询数据库 car_info query_database(plate_number) # 控制闸机 if car_info[valid]: open_gate() log_entry(plate_number)6.2 批量处理工具开发对于需要处理大量图像的场景可以开发批量处理工具python batch_process.py --input-dir ./images --output-file results.csvresults.csv输出格式示例filename,plate_number,confidence,time car1.jpg,京A12345,0.96,2023-05-01 12:00:00 car2.jpg,沪B67890,0.94,2023-05-01 12:00:017. 项目扩展与进阶7.1 支持新能源车牌新能源车牌识别需要特别注意绿色背景与字符的对比度处理8位字符的特殊排列方式汉字与字母数字的混合识别代码调整建议def is_new_energy_plate(plate_roi): # 检查主色调是否为绿色 hsv cv2.cvtColor(plate_roi, cv2.COLOR_BGR2HSV) green_mask cv2.inRange(hsv, (60, 100, 100), (80, 255, 255)) return np.sum(green_mask) plate_roi.size * 0.37.2 多车牌检测扩展支持图像中多车牌的检测修改U-Net输出处理逻辑添加NMS非极大值抑制处理批量识别多个车牌区域实现代码片段def detect_multiple_plates(image): # U-Net预测 mask unet_model.predict(image) # 寻找连通域 contours, _ cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 过滤小区域 plates [c for c in contours if cv2.contourArea(c) MIN_AREA] # NMS处理 plates non_max_suppression(plates) return plates7.3 视频流实时处理对于摄像头视频流的实时处理方案import cv2 from queue import Queue from threading import Thread class VideoProcessor: def __init__(self, camera_url): self.cap cv2.VideoCapture(camera_url) self.queue Queue(maxsize10) self.thread Thread(targetself._capture_loop) def _capture_loop(self): while True: ret, frame self.cap.read() if not ret: break if not self.queue.full(): self.queue.put(frame) def process_frame(self): if not self.queue.empty(): frame self.queue.get() plate_number recognizer.recognize(frame) draw_result(frame, plate_number) return frame return None