甲方一拍脑门,让我去实现车牌识别,还是远距离监控视角的,真开心。

数据?呵~ 不会有人期待甲方提供数据吧??
先逛逛某宝,一万张车辆图片,0.4元/张。
甲方:阿巴阿巴…
嗯,那没事了。

再逛逛全球同性交友网站,感谢CCPD数据集~ 数量挺多的,补充了新能源绿色车牌,标注也很详细,除了车牌矩形框坐标,居然还有车牌4个角点坐标。我看了一下,矩形框标的有点随意了,于是我把角点坐标的最小包络矩形作为新的标注框,随手一个YOLOv5,这车牌检测的任务不就完成了嘛~ 四舍五入,车牌识别项目收工!

由于数据搜集的地域原因,其中一大半车牌的开头都是皖A,这…不得训练出来个人工智障,见个车牌就说是皖A?哎,只能含泪筛选出1W张用作车牌识别训练。

这数据量肯定不够呀,只能造假了…参考车牌生成代码,调调参数,解决个别字符的小bug,最终效果这样婶儿滴:

生成10+W张假车牌,再去全网捡捡零碎数据,东拼西凑了20+W张。凑合过吧,要啥自行车。

接下来进入正题,车牌切出来了,咋识别?

用传统方法,字符分割再识别单个字符?emmm,算了叭,传统是不可能传统的(我也不会!!)。

最典型的字符识别模型是CRNN+CTC,CTC Loss是为了解决字符对齐问题。因为车牌字符数目是固定的,这就大大简化了问题,其实没必要使用CTC Loss,直接用CNN、RNN和全连接,根据心情搭配一下都能训练。

之前我学习的时候,也玩过一个Seq2Seq的车牌识别模型(在这里!),但如果不加注意力机制,效果不咋样,我试了一下,直接暴力增大LSTM隐藏层的size,也能训练出来,只是模型有100+M。

咳…你才捞呢!

还是决定自己搭个网络玩儿,参考了CRNN的原网络和GitHub上的一些实现,先整一套尝尝,噔噔蹬蹬~

import torch.nn as nnclass Crnn(nn.Module):def __init__(self):super(Crnn, self).__init__()self.cnn = nn.Sequential(  # (N,3,32,100)nn.Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=1),     # (N,64,32,100)nn.ReLU(),nn.MaxPool2d((2, 2), 2),  # (N,3,16,50)nn.Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=1),   # (N,128,16,50)nn.ReLU(),nn.MaxPool2d((2, 2), 2),  # (N,128,8,25)nn.Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=1),  # (N,256,8,25)nn.ReLU(),nn.Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=1),  # (N,256,8,25)nn.ReLU(),nn.MaxPool2d((2, 1), stride=(2, 1)),  # (N,256,4,25)nn.Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=1),  # (N,512,4,25)nn.BatchNorm2d(512),nn.ReLU(),nn.Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=1),  # (N,512,4,25)nn.BatchNorm2d(512),nn.ReLU(),nn.AdaptiveMaxPool2d([1, 25]))self.lstm = nn.LSTM(input_size=512,hidden_size=140,batch_first=True,bidirectional=True,num_layers=2)def forward(self, x):cnn_out = self.cnn(x).reshape(-1, 512, 25).transpose(2, 1)  # (N,25,512)lstm_out, (h_n, c_n) = self.lstm(cnn_out, None)lstm_out = lstm_out[:, -1, :]  # (N, 140)out = lstm_out.reshape(-1, 8, 35)return out

32个中文字符和34个数字字母(不含I和O)由列表定义:

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

拆成两个列表是节约输出的维度,减少参数量。

输入车牌尺寸是100∗32100*32100∗32,因为CNN最后我用了个自适应平均池化,所以图片尺寸不对也不会报错。网络输出shape为(N,8,35)(N, 8,35)(N,8,35),普通车牌是7位的,新能源绿色车牌是8位的,所以需要增加一个空字符串,如果是7位车牌,最后一个字符就为空。

将标签做one-hot,损失函数直接用MSELoss。看起来有点捞,训练效果却出奇的好,10轮验证精度就到99%。模型大小26M,推理速度还行。拿实际的监控视频测试了一下,效果也还能看。

但用MSELoss做分类问题,多少有点别扭,而且输出的值无法表示概率。思考了一下怎么改用CrossEntropyLoss,直接把标签的one-hot去掉是会报错的,因为我们的输出是(N,8,35)(N, 8,35)(N,8,35),相当于是8个字符的分类结果,CrossEntropyLoss算的是一个分类结果,于是我把输出(N,8,35)(N, 8,35)(N,8,35)reshape成(N∗8,35)(N*8,35)(N∗8,35),把标签(N,8)(N, 8)(N,8)拉平成(N∗8)(N*8)(N∗8),这样就可以计算辣~

蓝鹅,效果很不好,精度到60+%就上不去了…
经过一番深思(才不是瞎猜的 哼!),我觉得循环网络的输出直接跟交叉熵损失不合适,一般的分类问题最后一层都是全连接输出的,于是把lstm层改成了全连接:

self.fc = nn.Linear(512, 280)

这样就可以训练辣,模型还更小了点,24M~

最后尝试将LSTM替换成GRU,再次减少参数。以及将pytorch自带的交叉熵损失改成Focal Loss,以增加对困难样本(主要是第一个中文字符)的训练力度。

之前领导为了跟甲方展示(吹niubility),按量买了百度的车牌识别。

卖的死贵,效果就这?就这??


咱的效果:


哼哼哼~ 走咯~ 卖算法去咯~

我不是在黑百度,对不起!!

百度的技术是很厉害的,只是人家针对的是近距离的车牌。实际上,现在车牌识别使用最多的应该是停车场的道闸系统,都是近距离的,这种监控视角的,确实有难度,精度还达不到要求,我这个模型只是最简单的一种实现。

不足:

  1. 货车的黄色车牌数据量太少,容易检测不到。(百度也是)
  2. 汉字字符的识别精度不高。(百度也是)
  3. 新能源绿色车牌的字符识别精度不高。(百度也是…)

在实际使用中,如果每一帧都识别的话,不仅费时,而且显示上会闪烁,就很鬼畜。所以我结合DeepSort跟踪算法,跟踪每一个车牌目标,设计规则,如在连续数帧都识别为同一车牌号后,就稳定显示,不再识别。

数据集还在筛选和补充,模型也还在改进,就不上传辣~
真有需要的同学私撩

车牌识别 远距离监控视角 自创简化模型 Pytorch相关推荐

  1. 车牌识别EasyPR--开发详解

    非常详细的讲解车牌识别 转载自:http://www.cnblogs.com/subconscious/p/3979988.html http://www.cnblogs.com/asks/p/437 ...

  2. (转载)车牌识别EasyPR--开发详解

    更新:基于keras-tensorflow的车牌识别,HyperLPR是一个基于Python的使用深度学习针对对中文车牌识别的实现,与开源的EasyPR相比,它的检测速度和鲁棒性和多场景的适应性都要好 ...

  3. EasyPR--中文车牌识别系统 开发详解(开源)

    人工智能AI与大数据技术实战  公众号: weic2c 一个开源的中文车牌识别系统, Git地址为:https://github.com/liuruoze/EasyPR. 我给它取的名字为EasyPR ...

  4. 【深度学习实践】基于深度学习的车牌识别(python,车牌检测+车牌识别)

    车牌识别具有广泛的应用前景,基于传统方法的车牌识别效果一般比较差,随着计算机视觉技术的快速发展,深度学习的方法能够更好的完成车牌识别任务. 本文提供了车牌识别方案的部署链接,您可以在网页上体验该模型的 ...

  5. 毕设题目:Matlab车牌识别

    1 车牌识别系统设计与实现 车牌识别系统主要分为三部分:车牌图像预处理.特征提取以及基于BP神经网络对特征进行训练和分类,流程图如图1所示. 图1 车牌识别系统组成示意图 2 车牌图像预处理 车牌图像 ...

  6. 智能驾驶 车牌检测和识别(三)《CRNN和LPRNet实现车牌识别(含车牌识别数据集和训练代码)》

    智能驾驶 车牌检测和识别(三)<CRNN和LPRNet实现车牌识别(含车牌识别数据集和训练代码)> 目录 智能驾驶 车牌检测和识别(三)<CRNN和LPRNet实现车牌识别(含车牌识 ...

  7. 车牌识别LPRNet

    ★★★ 本文源自AlStudio社区精品项目,[点击此处]查看更多精品内容 >>> 和车牌检测项目搭配:https://aistudio.baidu.com/aistudio/pro ...

  8. python百度aip移动目标监控系统_python利用百度云接口实现车牌识别

    一个小需求---实现车牌识别. 目前有两个想法 调云在线的接口或者使用SDK做开发(配置环境和编译第三方库很麻烦,当然使用python可以避免这些问题) 自己实现车牌识别算法(复杂) ! 一开始准备使 ...

  9. 【opencv机器学习】基于SVM和神经网络的车牌识别

    基于SVM和神经网络的车牌识别 深入理解OpenCV:实用计算机视觉项目解析 本文用来学习的项目来自书籍<实用计算机视觉项目解析>第5章Number Plate Recognition 提 ...

最新文章

  1. VS2017中使用码云上传项目以及问题汇总
  2. 获取事件相对于文档的位置
  3. 根据rtk参数在arcgis中进行可视化
  4. 黄聪:【强烈推荐】搜索引擎排名决定一切吗!
  5. SQL Reverse函数
  6. TortoiseSVN中的“文件和文件夹过滤”在VS项目中的使用
  7. 文字转换为音频mp3的方法
  8. 关于谷歌不兼容showModalDialog的解决方案
  9. 开发一个App大概要多少钱?
  10. Flex ANE介绍
  11. 如何优雅地使用 Sublime Text
  12. 世界最流行鸡尾酒25款
  13. Python之Email邮箱账号抓取
  14. 鞍部在哪里_等高线地形图中鞍部的高度怎么看
  15. (学习笔记)手把手教你学51单片机:C语言基础以及流水灯的实现
  16. window环境下mysql导入sql文件时报错:ERROR: ASCII '\0' appeared in the statement
  17. [SSD固态硬盘技术 4] 主控详解
  18. 笔记本外接显示器掉帧排bug过程
  19. CentOS7系统编码
  20. 强化学习论文阅读笔记(一)——强化学习研究综述_高阳

热门文章

  1. “忠诚僚机”不应该“忠诚”
  2. DTOJ#5076. 恋人·米路缇欧
  3. 闲聊linux中的input设备(1)Linux中的设备大家族
  4. Prometheus个性化语法
  5. 管理学重要著作和人物
  6. CB Insights:分析101个创业失败案例,我们总结了20大失败原因
  7. pt-osc工具原理与实践
  8. 使用加速寿命试验来模拟产品在极端压力水平下的性能
  9. Android要ios王者,王者荣耀苹果账号怎么转安卓要多久 王者营地教程
  10. python 中使用 shutil 实现文件或目录的复制、删除、移动