赛题介绍
随着世界各国汽车数量的增加,城市交通状况日益受到人们重视,如何高效地进行交通管理,成为各国政府和有关部门关注的焦点,开发智能交通系统是大势所趋。车牌识别技术是智能交通的重要环节,其中较为典型的应用场景为卡口系统。
卡口系统已被广泛应用于国道、省道、高速公路等应用场景,车牌识别技术结合电子不停车收费系统(ETC)识别车辆,过往车辆通过道口时无须停车,即能够实现车辆身份自动识别、自动收费。车牌号码识别是否准确和高效直接影响了卡口系统的整体性能及其在更多场景的应用泛化。
![](https://oss-emcsprod-public.modb.pro/wechatSpider/modb_20220920_ed6d1f12-389c-11ed-b80e-fa163eb4f6be.png)
赛事任务
本次赛题需要选手对车牌字符进行识别,具体的案例如下:
![](https://oss-emcsprod-public.modb.pro/wechatSpider/modb_20220920_eda01822-389c-11ed-b80e-fa163eb4f6be.png)
正确识别结果:皖AUZ779
评审规则
数据说明
训练集和测试集图片放在不同的文件夹,训练集文件名为训练图片标签。
评估指标
本次竞赛的评价标准采用准确率指标,最高分为1。计算方法参考:https://scikit-learn.org/stable/modules/generated/sklearn.metrics.accuracy_score.html
解题思路
由于赛题是一个典型图像多标签任务任务,因此我们可以直接使用CNN完成多分类的操作。具体的步骤如下:
步骤1:读取数据,转换标签
对于一张图片包含了多个字符,我们需要将字符转换为数值表示,这里需要自定义dataset来完成。
class QRDataset(Dataset):
def __init__(self, img_paths, lbl_dict, transform=None, label=True):
self.img_paths = img_paths
self.lbl_dict = lbl_dict
self.label = label
if transform is not None:
self.transform = transform
else:
self.transform = None
def __getitem__(self, index):
start_time = time.time()
img = cv2.imread(self.img_paths[index])
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
if self.transform:
augmented = self.transform(image=img)
img = augmented['image']
img_label = self.img_paths[index].split('/')[-1][:-4]
if self.label:
label0 = np.array(self.char2idx(img_label[0]))
label1 = np.array(self.char2idx(img_label[1]))
label2 = np.array(self.char2idx(img_label[2]))
label3 = np.array(self.char2idx(img_label[3]))
label4 = np.array(self.char2idx(img_label[4]))
label5 = np.array(self.char2idx(img_label[5]))
label6 = np.array(self.char2idx(img_label[6]))
return img, torch.from_numpy(label0), torch.from_numpy(label1), \
torch.from_numpy(label2), torch.from_numpy(label3), torch.from_numpy(label4),\
torch.from_numpy(label5), torch.from_numpy(label6)
else:
return img
def __len__(self):
return len(self.img_paths)
def char2idx(self, ch):
return self.lbl_dict.find(ch)
步骤2:定义多输出模型
加载预训练模型,通过多个全链接网络完成多次分类,这里需要分类7次。
class RMB_Net(nn.Module):
def __init__(self):
super(RMB_Net, self).__init__()
feat_size = 512
self.fc0 = nn.Linear(feat_size, 62)
self.fc1 = nn.Linear(feat_size, 62)
self.fc2 = nn.Linear(feat_size, 62)
self.fc3 = nn.Linear(feat_size, 62)
self.fc4 = nn.Linear(feat_size, 62)
self.fc5 = nn.Linear(feat_size, 62)
self.fc6 = nn.Linear(feat_size, 62)
model = models.resnet18(True)
model = torch.nn.Sequential(*(list(model.children())[:-1]))
self.resnet = model
self.resnet = model
def forward(self, img):
feat = self.resnet(img)
feat = feat.reshape(feat.size(0), -1)
out0 = self.fc0(feat)
out1 = self.fc1(feat)
out2 = self.fc2(feat)
out3 = self.fc3(feat)
out4 = self.fc4(feat)
out5 = self.fc5(feat)
out6 = self.fc6(feat)
return out0, out1, out2, out3, out4, out5, out6
步骤3:模型训练与验证
定义好训练函数和验证函数后,通过模型训练,模型则可以正确识别所有的车牌。
for _ in range(5):
train_loss = train(train_loader, model, criterion, optimizer)
val_acc, val_loss = validate(val_loader, model, criterion)
print('{:2f} {:2f} {:2f}'.format(train_loss, val_acc, val_loss))
训练完成后可以在测试集上进行预测,然后提交得到Top10的分数,你也来试试吧。
完整代码:https://github.com/datawhalechina/competition-baseline/tree/master/competition/%E7%A7%91%E5%A4%A7%E8%AE%AF%E9%A3%9EAI%E5%BC%80%E5%8F%91%E8%80%85%E5%A4%A7%E8%B5%9B2022
# 竞赛交流群 邀请函 #
![](https://oss-emcsprod-public.modb.pro/wechatSpider/modb_20220920_ede5e6ea-389c-11ed-b80e-fa163eb4f6be.png)
每天Kaggle算法竞赛、干货资讯汇总
与 22000+来自竞赛爱好者一起交流~