news 2026/6/25 8:23:17

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/6/9 18:37:22

Qwen3-VL视频动态理解实测:秒级索引+完整回忆长达数小时视频

Qwen3-VL视频动态理解实测&#xff1a;秒级索引完整回忆长达数小时视频 在智能监控中心&#xff0c;值班人员突然接到报警电话&#xff1a;“请回看昨晚23:17分摄像头A3的画面&#xff0c;确认是否有人翻墙进入。”传统系统需要先调取录像、手动拖动进度条、逐帧查找异常行为—…

作者头像 李华
网站建设 2026/6/14 4:35:43

原神帧率优化终极指南:突破60FPS限制的完整解决方案

原神帧率优化终极指南&#xff1a;突破60FPS限制的完整解决方案 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock 在当今高刷新率显示器日益普及的时代&#xff0c;游戏画面的流畅度已成为…

作者头像 李华
网站建设 2026/6/16 1:29:22

WE Learn智能学习助手技术白皮书

WE Learn智能学习助手技术白皮书 【免费下载链接】WELearnHelper 显示WE Learn随行课堂题目答案&#xff1b;支持班级测试&#xff1b;自动答题&#xff1b;刷时长&#xff1b;基于生成式AI(ChatGPT)的答案生成 项目地址: https://gitcode.com/gh_mirrors/we/WELearnHelper …

作者头像 李华
网站建设 2026/6/21 8:38:58

Qwen3-VL访问GitHub镜像源?解决开源资源获取慢问题

Qwen3-VL访问GitHub镜像源&#xff1f;解决开源资源获取慢问题 在智能设备和AI模型日益普及的今天&#xff0c;开发者们常常面临一个“熟悉又恼人”的问题&#xff1a;明明已经找到了理想的开源项目&#xff0c;比如通义千问最新推出的视觉语言大模型Qwen3-VL&#xff0c;却因…

作者头像 李华
网站建设 2026/6/20 12:23:43

DLSS Swapper终极指南:快速掌握DLL文件管理器的完整使用技巧

DLSS Swapper终极指南&#xff1a;快速掌握DLL文件管理器的完整使用技巧 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 在游戏优化工具领域&#xff0c;DLL文件管理器正成为玩家提升游戏体验的必备神器。DLSS Swapper…

作者头像 李华
网站建设 2026/6/21 1:30:36

Multisim示波器使用项目应用:PWM信号解析

用Multisim示波器精准解析PWM信号&#xff1a;从原理到实战调试你有没有遇到过这样的情况——电路设计看起来天衣无缝&#xff0c;但一上电&#xff0c;输出就是不对劲&#xff1f;电机转速不稳、电源电压偏低、LED忽明忽暗……问题出在哪&#xff1f;很多时候&#xff0c;答案…

作者头像 李华