news 2026/4/22 13:09:31

Pytorch学习笔记:Pytorch实现车牌识别

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Pytorch学习笔记:Pytorch实现车牌识别
  • 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
  • 🍖 原作者:K同学啊

一、前期准备

importtorchimporttorch.nnasnnimporttorch.nn.functionalasFimporttorch.optimasoptimfromtorchvisionimportdatasets,transformsfromtorch.utils.dataimportDataset,DataLoaderimportosimportglobfromPILimportImageimportnumpyasnpimportmatplotlib.pyplotaspltimportwarnings warnings.filterwarnings("ignore")device=torch.device("cuda"iftorch.cuda.is_available()else"cpu")

二、字典定义

CHARS=['京','沪','津','渝','冀','晋','蒙','辽','吉','黑','苏','浙','皖','闽','赣','鲁','豫','鄂','湘','粤','桂','琼','川','贵','云','藏','陕','甘','青','宁','新','0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','J','K','L','M','N','P','Q','R','S','T','U','V','W','X','Y','Z']char2code={c:ifori,cinenumerate(CHARS)}CLASS_NUM=len(CHARS)

三、自定义数据集

classMyDataset(Dataset):def__init__(self,img_paths,transform=None):self.img_paths=img_paths self.transform=transformdef__len__(self):returnlen(self.img_paths)def__getitem__(self,idx):path=self.img_paths[idx]try:image=Image.open(path).convert('RGB')except:returntorch.zeros(3,224,224),torch.zeros(7,dtype=torch.long)ifself.transform:image=self.transform(image)# 解析标签filename=os.path.basename(path).split('.')[0]label=[]forcharinfilename:ifcharinchar2code:label.append(char2code[char])# 强制确保标签是 7 位,防止报错label=label[:7]iflen(label)<7:label=label+[0]*(7-len(label))returnimage,torch.tensor(label,dtype=torch.long)# 准备数据路径data_dir='./015_licence_plate'all_paths=glob.glob(os.path.join(data_dir,'*.jpg'))+glob.glob(os.path.join(data_dir,'*.png'))train_transforms=transforms.Compose([transforms.Resize((224,224)),transforms.ToTensor(),transforms.Normalize([0.485,0.456,0.406],[0.229,0.224,0.225])])total_data=MyDataset(all_paths,transform=train_transforms)train_size=int(0.8*len(total_data))test_size=len(total_data)-train_size train_ds,test_ds=torch.utils.data.random_split(total_data,[train_size,test_size])train_loader=DataLoader(train_ds,batch_size=32,shuffle=True)test_loader=DataLoader(test_ds,batch_size=32,shuffle=False)

四、搭建模型

classNet(nn.Module):def__init__(self):super(Net,self).__init__()self.conv1=nn.Conv2d(3,16,3,1,1);self.pool=nn.MaxPool2d(2,2)self.conv2=nn.Conv2d(16,32,3,1,1)self.conv3=nn.Conv2d(32,64,3,1,1)self.fc1=nn.Linear(64*28*28,128)self.dropout=nn.Dropout(0.5)# 输出 7 * 65self.fc2=nn.Linear(128,7*CLASS_NUM)defforward(self,x):x=self.pool(F.relu(self.conv1(x)))x=self.pool(F.relu(self.conv2(x)))x=self.pool(F.relu(self.conv3(x)))x=x.view(-1,64*28*28)x=F.relu(self.fc1(x))x=self.dropout(x)x=self.fc2(x)# 调整形状为 [Batch, 7, 65]x=x.view(-1,7,CLASS_NUM)returnx model=Net().to(device)criterion=nn.CrossEntropyLoss()optimizer=optim.Adam(model.parameters(),lr=0.001)

五、训练与测试

deftrain(model,device,train_loader,optimizer,epoch):model.train()total_loss=0fordata,targetintrain_loader:data,target=data.to(device),target.to(device)optimizer.zero_grad()output=model(data)# 计算Loss需转置loss=criterion(output.transpose(1,2),target)loss.backward()optimizer.step()total_loss+=loss.item()returntotal_loss/len(train_loader)deftest(model,device,test_loader):model.eval()correct=0total=0withtorch.no_grad():fordata,targetintest_loader:data,target=data.to(device),target.to(device)output=model(data)# ACC统计更新部分# 1. 获取预测结果: [batch, 7, 65] -> [batch, 7]predicted_indices=output.argmax(dim=2)# 2. 计算准确率# 只有当一张图片的 7 个字符全部预测正确,才算这张图片对了 (.all(dim=1))# match_matrix = (predicted_indices == target)# correct_plates = match_matrix.all(dim=1)correct+=(predicted_indices==target).all(dim=1).sum().item()total+=target.size(0)acc=correct/totalprint(f"Test Accuracy:{acc:.2%}")returnacc

六、结果可视化

if__name__=='__main__':epochs=5#train_loss_list=[]test_acc_list=[]forepochinrange(1,epochs+1):print(f"Epoch{epoch}Running...")loss=train(model,device,train_loader,optimizer,epoch)acc=test(model,device,test_loader)train_loss_list.append(loss)test_acc_list.append(acc)# 画图plt.plot(train_loss_list,label='Train Loss')plt.plot(test_acc_list,label='Test Accuracy')plt.legend()plt.show()

七、总结

7.1 任务本质:多标签分类 (Multi-label Classification)

与之前的天气识别(单标签多分类)不同,车牌识别是一个典型的多标签分类任务。

  • 输入:一张车牌图片。
  • 输出:7 个独立的字符(省份+字母+5位数字/字母)。
  • 维度变化:模型的输出不再是[Batch, Class_Num],而是变成了[Batch, 7, Class_Num]。这意味着我们要对 7 个位置分别进行 65 种字符的预测。

7.2 核心难点:准确率 (Accuracy) 的统计逻辑

这是本周任务的重难点。在多标签任务中,准确率的定义非常严格:

  • 逻辑:必须是一张车牌上的7 个字符全部预测正确,该样本才算正确。只要错一个字(比如把 ‘8’ 认成 ‘B’),整张车牌就算识别失败。
  • 代码实现:
    # 1. 获取最大概率索引 [batch, 7, 65] -> [batch, 7]predicted_indices=output.argmax(dim=2)# 2. 维度比对 (.all(dim=1) 是关键)# 只有当一行的 7 个 bool 值全为 True,结果才为 Truecorrect+=(predicted_indices==target).all(dim=1).sum().item()

7.3 实战踩坑:数据清洗的重要性

在训练过程中,我遇到了RuntimeError: Expected target size [32, 7], got [32, 17]的报错。

  • 原因:数据集中存在文件名异常的图片(文件名长度不符合标准的 7 位车牌格式),导致标签长度不一致,无法组成 Batch。
  • 解决:__getitem__数据读取阶段增加了长度校验与截断逻辑,强制保证输出标签长度为 7。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/21 0:56:15

Keil使用教程:C51与MDK版本差异及选择建议

Keil实战指南&#xff1a;C51与MDK到底怎么选&#xff1f;嵌入式工程师避坑全解析你有没有遇到过这种情况&#xff1a;项目刚启动&#xff0c;团队信心满满地用Keil搭环境&#xff0c;结果发现编译器不支持芯片、调试接口冲突、代码跑飞了查半天——最后才发现&#xff0c;压根…

作者头像 李华
网站建设 2026/4/20 14:38:24

Qwen3-VL调用HuggingFace模型:跨平台模型资源共享方案

Qwen3-VL调用HuggingFace模型&#xff1a;跨平台模型资源共享方案 在当前多模态大模型快速演进的背景下&#xff0c;开发者面临的不再是“有没有模型可用”&#xff0c;而是“如何高效地使用和切换不同模型”。尤其是在资源受限的本地环境中&#xff0c;动辄数十GB的模型权重文…

作者头像 李华
网站建设 2026/4/20 23:01:27

WE Learn智能助手完整使用指南:免费快速入门技巧

WE Learn智能助手完整使用指南&#xff1a;免费快速入门技巧 【免费下载链接】WELearnHelper 显示WE Learn随行课堂题目答案&#xff1b;支持班级测试&#xff1b;自动答题&#xff1b;刷时长&#xff1b;基于生成式AI(ChatGPT)的答案生成 项目地址: https://gitcode.com/gh_…

作者头像 李华
网站建设 2026/4/21 17:10:03

如何快速解密QQ音乐文件:qmcdump完整操作指南

如何快速解密QQ音乐文件&#xff1a;qmcdump完整操作指南 【免费下载链接】qmcdump 一个简单的QQ音乐解码&#xff08;qmcflac/qmc0/qmc3 转 flac/mp3&#xff09;&#xff0c;仅为个人学习参考用。 项目地址: https://gitcode.com/gh_mirrors/qm/qmcdump 你是否遇到过Q…

作者头像 李华
网站建设 2026/4/20 21:48:06

Qwen3-VL金融报告解析:财报截图提取关键财务指标与趋势分析

Qwen3-VL金融报告解析&#xff1a;财报截图提取关键财务指标与趋势分析 在金融研究一线&#xff0c;分析师每天面对成百上千页的PDF年报、扫描件和图表。打开文件、翻找利润表、手动录入数据——这套流程重复了二十年&#xff0c;效率却始终停留在“人肉爬虫”阶段。直到现在&a…

作者头像 李华
网站建设 2026/4/19 3:03:48

PCL2社区版启动器:新手玩家的终极入门指南

PCL2社区版启动器&#xff1a;新手玩家的终极入门指南 【免费下载链接】PCL2-CE PCL2 社区版&#xff0c;可体验上游暂未合并的功能 项目地址: https://gitcode.com/gh_mirrors/pc/PCL2-CE 还在为复杂的Minecraft启动器设置而头疼吗&#xff1f;PCL2社区版启动器就是为你…

作者头像 李华