源码调试-带你了解下车牌识别的深度学习模型-LPRNet
视频演示
大家好,这里是Coding茶水间。本期我们来调试运行一个经典的深度学习网络——LPRNet,它专门用于车牌识别任务。
LPRNet是由Intel团队开发的端到端深度学习模型,专为车牌识别优化,具有轻量级的特性。
下面我们一步步来探索它的源码、环境搭建和实际运行。
1. LPRNet简介
LPRNet支持识别蓝牌和绿牌(新能源车牌)。它基于PyTorch框架,结合OpenCV进行图像处理,适用于Python 3.0以上版本。

在GitHub上,作者提供了模型的识别效果展示,包括模糊、污损或倾斜的车牌图片。
2. 获取源码
打开LPRNet的GitHub页面(网址可在视频简介中获取)。点击“Code”按钮下载ZIP压缩包,或使用Git命令克隆仓库:
git clone https://github.com/sirius-ai/LPRNet_Pytorch.git

下载后解压,使用VS Code或其他IDE打开项目。
3. 源码结构分析
项目结构如下:
- data:数据集文件夹,包含测试用的车牌图片。这些图片包括模糊、污损或倾斜的样本。
- load_data.py:用于加载数据集的脚本。
- model:核心文件夹,包含LPRNet网络结构代码。
- weights:预训练权重文件(Final_LPRNet_model.pth)。
- train_LPRNet.py 和 test_LPRNet.py:训练和测试脚本。

4. 环境要求
- Python 3.0+
- PyTorch
- OpenCV
- NumPy 等基础库
确保安装这些依赖后,即可运行。
5. 测试模型性能
使用作者提供的test_LPRNet.py对测试图片进行批量验证,检查模型性能。
6. 单张图片识别
在实际应用中,我们常需要对单张车牌图像进行识别。下面是针对单张图片的自定义代码(基于LPRNet)。代码使用OpenCV读取图片,进行预处理,并输出识别结果。
代码实现
# -*- coding: utf-8 -*-
# /usr/bin/env/python3
'''
单图片验证LPRNet模型
'''
from data.load_data import CHARS, CHARS_DICT
from PIL import Image, ImageDraw, ImageFont
from model.LPRNet import build_lprnet
from torch.autograd import Variable
import torch.nn.functional as F
import torch.nn as nn
import numpy as np
import argparse
import torch
import time
import cv2
import os
def cv2ImgAddText(img, text, pos, textColor=(255, 0, 0), textSize=12):
if (isinstance(img, np.ndarray)):
img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
draw = ImageDraw.Draw(img)
fontText = ImageFont.truetype("data/NotoSansCJK-Regular.ttc", textSize, encoding="utf-8")
draw.text(pos, text, textColor, font=fontText)
return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)
def predict_single_image(image_path):
# 硬编码参数
img_size = [94, 24] # 图像尺寸
lpr_max_len = 8 # 车牌最大长度
dropout_rate = 0 # dropout率
use_cuda = False # 是否使用CUDA
pretrained_model = './weights/Final_LPRNet_model.pth' # 预训练模型路径
# 检查模型文件是否存在
if not os.path.exists(pretrained_model):
print(f"[Error] 预训练模型未找到: {pretrained_model}")
return
# 构建模型
lprnet = build_lprnet(lpr_max_len=lpr_max_len, phase=False,
class_num=len(CHARS), dropout_rate=dropout_rate)
device = torch.device("cuda:0" if use_cuda else "cpu")
lprnet.to(device)
# 加载预训练模型
lprnet.load_state_dict(torch.load(pretrained_model, map_location=device))
lprnet.eval()
# 读取并预处理图像
if not os.path.exists(image_path):
print(f"[Error] 图像未找到: {image_path}")
return
# 使用OpenCV读取图像
img_orig = cv2.imread(image_path)
if img_orig is None:
print(f"[Error] 无法读取图像: {image_path}")
return
# 调整图像大小并归一化
img = cv2.resize(img_orig, (img_size[0], img_size[1]))
img = img.astype('float32')
img -= 127.5
img *= 0.0078125
img = np.transpose(img, (2, 0, 1)) # HWC -> CHW
# 转换为torch tensor并添加batch维度
img = torch.from_numpy(img).unsqueeze(0)
if use_cuda:
img = img.cuda()
# 预测
with torch.no_grad():
prebs = lprnet(img)
# 解码预测结果
prebs = prebs.cpu().numpy()[0] # 去掉batch维度
preb_label = []
for j in range(prebs.shape[1]):
preb_label.append(np.argmax(prebs[:, j], axis=0))
# 去除重复和空白标签
no_repeat_blank_label = []
pre_c = preb_label[0]
if pre_c != len(CHARS) - 1: # 忽略空白标签
no_repeat_blank_label.append(pre_c)
for c in preb_label:
if (pre_c == c) or (c == len(CHARS) - 1):
if c == len(CHARS) - 1:
pre_c = c
continue
no_repeat_blank_label.append(c)
pre_c = c
# 将数字标签转换为字符
plate_number = ''.join([CHARS[i] for i in no_repeat_blank_label])
# 显示结果
result_img = cv2ImgAddText(img_orig, plate_number, (10, 30), textColor=(0, 255, 0), textSize=30)
cv2.imshow('License Plate Recognition', result_img)
print(f"识别结果: {plate_number}")
cv2.waitKey(0)
cv2.destroyAllWindows()
if __name__ == "__main__":
# 直接在这里指定要测试的图像路径
test_image_path = "3.png" # 替换为您的测试图像路径
predict_single_image(test_image_path)

7. 运行效果演示
选取一张车牌图片(例如从网上下载的分割好的图像),甚至可以对最后一位字符进行裁切测试。运行代码后,结果会直接叠加在图片上显示。
例如:
- 测试一张蓝牌:识别准确。
- 测试一张绿牌(新能源):也支持识别。


8. 代码分析
预训练模型加载
设置预训练模型路径(如./weights/Final_LPRNet_model.pth),检查文件存在性。然后使用build_lprnet构建模型,选择设备(CPU或CUDA)。
图像读取与预处理
使用OpenCV读取图片:
- Resize到94x24分辨率。
- 转换为float32类型。
- 减去127.5,使像素值范围变为-127.5到127.5(以0为中心,便于模型收敛)。
- 乘以0.0078125,使范围接近-1到1(像素归一化)。
- 转置维度:从HWC (Height, Width, Channels) 转为CHW。
- 添加batch维度,成为4维张量(batch_size, channels, height, width)。
预测与解码
如果使用CUDA,将图像移到GPU。关闭梯度计算(with torch.no_grad())以加速预测。得到输出后,解码为字符序列,去除重复和空白标签,最终转换为车牌号字符串。
显示结果
使用PIL在原图上添加文本,显示识别结果。
9. 注意事项
- Mac用户默认使用CPU;NVIDIA显卡用户可启用CUDA加速。
- 如果想获取单张图片处理代码,欢迎三连+关注,并留言邮箱。
- 模型适用于已分割的车牌图像;实际应用中可结合检测模型(如YOLO)进行完整识别。
如果想深入了解车牌识别更多内容,欢迎关注Coding茶水间,我会持续输出相关教程!
源码调试-带你了解下车牌识别的深度学习模型-LPRNet的更多相关文章
- linux下使用gdb对php源码调试
title: linux下使用gdb对php源码调试 date: 2018-02-11 17:59:08 tags: --- linux下使用gdb进行php调试 调试了一些php的漏洞,记录一下大概 ...
- Android FrameWork 学习之Android 系统源码调试
这是很久以前访问掘金的时候 无意间看到的一个关于Android的文章,作者更细心,分阶段的将学习步骤记录在自己博客中,我觉得很有用,想作为分享同时也是留下自己知识的一些欠缺收藏起来,今后做项目的时候会 ...
- 如何搭建自己的SpringBoot源码调试环境?--SpringBoot源码(一)
1 前言 这是SpringBoot2.1源码分析专题的第一篇文章,主要讲如何来搭建我们的源码阅读调试环境.如果有经验的小伙伴们可以略过此篇文章. 2 环境安装要求 IntelliJ IDEA JDK1 ...
- [源码分析] 带你梳理 Flink SQL / Table API内部执行流程
[源码分析] 带你梳理 Flink SQL / Table API内部执行流程 目录 [源码分析] 带你梳理 Flink SQL / Table API内部执行流程 0x00 摘要 0x01 Apac ...
- Android FrameWork学习(二)Android系统源码调试
通过上一篇 Android FrameWork学习(一)Android 7.0系统源码下载\编译 我们了解了如何进行系统源码的下载和编译工作. 为了更进一步地学习跟研究 Android 系统源码,今天 ...
- 开启Tomcat 源码调试
开启Tomcat 源码调试 因为工作的原因,需要了解Tomcat整个架构是如何设计的,正如要使用Spring MVC进行Web开发,需要了解Spring是如何设计的一样,有哪些主要的类,分别是用于干什 ...
- 在Eclipse中进行HotSpot的源码调试--转
原文地址:http://www.linuxidc.com/Linux/2015-05/117250.htm 在阅读OpenJDK源码的过程中,经常需要运行.调试程序来帮助理解.我们现在已经可以编译出一 ...
- EventBus (三) 源码解析 带你深入理解EventBus
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40920453,本文出自:[张鸿洋的博客] 上一篇带大家初步了解了EventBus ...
- Android EventBus源码解析 带你深入理解EventBus
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40920453,本文出自:[张鸿洋的博客] 上一篇带大家初步了解了EventBus ...
- [原创]在Windows和Linux中搭建PostgreSQL源码调试环境
张文升http://ode.cnblogs.comEmail:wensheng.zhang#foxmail.com 配图太多,完整pdf下载请点这里 本文使用Xming.Putty和VMWare几款工 ...
随机推荐
- Blazor学习之旅(12) JavaScript与Blazor的互操作
大家好,我是Edison. 在上一篇我们学习了Blazor+SignalR开发简单的实时应用程序,这一篇我们了解下Blazor和JavaScript的互操作性. 有了Blazor还需要JavaScri ...
- Excel双向柱状图的绘制
Excel双向柱状图在绘制增减比较的时候经常用到,叫法繁多,双向柱状图.上下柱状图.增减柱状图都有. 这里主要介绍一下Excel的基础绘制方法和复杂一点的双向柱状图的绘制 基础双向柱状图的绘制 首先升 ...
- vue中的一个组件就是一个vue实例吗?
所有的 Vue 组件都是 Vue 实例,并且接受相同的选项对象 先说结论 这句话,这是官方文档说的 不过严谨来说,应该是 一个单页应用就是一个 vue 的实例 每个自定义组件就是一个 vueCompo ...
- 使用ETL进行数据接入的方式
数据接入 数据接入,作为现代信息技术架构中的一个关键环节,指的是将来自不同源头的数据整合到统一的数据平台或系统中.这一过程不仅是技术上的挑战,也涉及到组织结构.业务流程等多个层面的协调与优化.通过有效 ...
- API低代码开发平台的实际应用及好处
API低代码开发平台是一种快速开发工具,可以帮助企业快速构建和部署应用程序,并提供易于使用的API集成. 实际应用 API低代码开发平台的应用范围非常广泛,包括但不限于以下几个方面: 企业级应用程序开 ...
- pandas速成笔记(2)-excel增删改查基本操作
接上篇继续,本篇演示对excel的基本增删改查操作. 一.读取excel 1.1 常规读取 假设有以下excel文件: 002.xlsx 用pandas可以这样读取: import pandas a ...
- 圆刚C725B金星标清采集卡
C725标清采集卡是一张支持AV端子.S端子以及立体声输入的PCIe卡,可将PAL.NTSC和SECAM等模拟格式影像数字化.采集并另存为无压缩的AVI格式档案.C725标清采集卡随附的软件开发工具包 ...
- 进阶篇:3.1.1.5)DFM塑胶-注射模具和设备
本章目的:了解塑胶件的注射模具典型结构. 1.前言 本章只是了解章节,介绍了塑胶件注射模具典型的机构.浇口.顶出,目的是为了设计出更好的塑胶零件. 但并非是需要结构设计工程师一定能设计出模具,人的精力 ...
- CVE-2024-28752 Apache CXF Aegis databinding SSRF漏洞 (复现)
CVE-2024-28752目录终端下执行docker compose up -d开启容器 访问ip:8080 验证该容器是否完全启动成功/查看服务期望的参数类型 访问 http://192.168. ...
- BAT批处理运行项目
BAT批处理运行项目 1. 批处理简介 顾名思义,批处理文件是将一系列命令按一定的顺序集合为一个可执行的文本文件,其扩展名为BAT或者CMD.这些命令统称批处理命令. 2. 编写启动zookeeper ...