我用AI回怼美女汽车销售系列[yolo车牌识别](二)

前期回顾:

在上一期介绍了事情的起因,为什么要做yolo车牌识别,以及最终的网络结构。(链接在这里:(141条消息) 我用AI回怼美女汽车销售系列[yolo车牌识别](一)_cjnewstar111的专栏-CSDN博客icon-default.png?t=M1L8https://blog.csdn.net/cjnewstar111/article/details/123160063)但是为了验证和编码的方便,我们基于下图的网络结构开发。即将yolo检测网络和识别网络分开,验证通过了,再将识别功能集成到yolo上面,这样可以大大降低风险。回顾一下流程,首先图片经过检测网络YoloX,识别出蓝牌或者绿牌。然后根据矩形框坐标从原图中剪裁出牌照图片,将裁剪出的蓝牌图片送入到蓝牌分类网络进行牌照的识别;绿牌则送入到绿牌分类网络进行识别。本期将要根据开源数据集CCPD,对三个网络(YoloX车牌检测网络),蓝牌识别网络和绿牌识别网络进行训练。

检测网络训练

检测网络使用普通的目标检测网络即可,这里我选择YoloX。这是一个AnchorFree的Yolo系列,速度和精度都还不错。由于YoloX目标检测需要使用coco格式的数据集。因此需要将CCPD的格式进行转换。在上一期已经介绍过CCPD通过文件名来标注车牌信息。我们可以编写一个python脚本,将CCPD转换成COCO格式。

转换好之后,就可以使用YoloX进行训练。可以直接使用YoloX官方的代码进行训练,也可以使用我之前开源的YoloX EasyTrain进行训练。我这里使用YoloX EasyTrain进行训练,因为只需要点点鼠标,并且所有配置信息可以在界面中编辑,而且训练过程中还有实时的曲线信息,非常的方便。在YoloX EasyTrain中新建一个工程:CCPD,然后选择基于YoloX Nano(小模型训练快),然后配置一下CCPD的路径(注意是转换成coco格式的CCPD),点击训练。出去喝一杯咖啡,再回来看看效果吧。

训练了5个epoch之后,map0.5以及map0.75已经达到了0.99,精度是非常的高,那就直接停止训练,使用第5个epoch的结果来测试一下推理,看看从百度上随意下载的图片,能否准确的检测出车牌。效果非常理想!!!

蓝牌网络训练

首先对CCPD数据集进行一个转换。由于蓝牌网络输入的是车牌图片,而不是整张图片。因此需要对CCPD进行裁剪,裁剪出车牌图片,然后进行保存。可以写一个python脚本,进行自动的裁剪。裁剪后的图片与原始图片对比:

有了图片就可以训练了,我这里使用shufflenetv2进行车牌的分类和识别。大家对分类任务应该非常熟悉,需要输入多少个类别,就让shufflenetv2最终输出多少维度的向量。由于蓝牌识别需要对7个位置进行分类,且每个位置有非常多的可能。例如省份有31中可能,而普通的字符位置有34种可能,那么我们就定义蓝牌网络最终的输入是7*34维的向量。对于第一位的省份来说,34位是冗余的,因为省份只有31位,不过这没有关系,最后几位不用关注即可。训练过程也非常简单,使用常见的sgd优化器,训练60epoch,step学习率下降。最后top1测试精度达到了95%。非常nice!

绿牌网络训练

最后训练绿牌网络,和蓝牌网络几乎一样。不同的是需要使用CCPD中的新能源车的图片进行裁剪和训练。然后网络的输出是8*34维度,而不是蓝牌的7*34维度。因为绿牌比蓝牌多了一位。

ONNX转换

由于训练好的模型是pytorch的,不利于部署,因此我们将yolox模型和分类模型直接通过pytorch的接口导出为onnx模型,然后利用onnxruntime进行推理。使用如下代码进行导出:

torch.onnx._export(model,

dummy_input,

"yolox.onnx",

verbose=True,

opset_version=11,

input_names=['input'], output_names=['output'])

对于yolox来说,直接导出会报如下错误:

Exporting the operator silu to ONNX opset version 11 is not supported

意思是onnx不支持yolox中的silu激活函数。最简单的方式是修改一下pytorch的源代码,将silu的实现修改为如下图所示,然后在调用上面的接口可以顺利导出。

DEMO开发

有了上面训练完的三个onnx网络之后,为了测试的方便,我们用PyQt编写一个简单的demo。支持从图片,视频,以及摄像头获取图片,然后将图片输入给检测网络进行车牌检测,根据检测出的车牌矩形框,从原始图片中裁剪出车牌图片。然后根据车牌的类型(蓝牌还是绿牌)再送入到对应的网络中进行分类识别。如下图所示:

正当我觉得效果流逼,可以马上上路检测的时候,却发现在视频中同一个车牌被检测出来不同的车牌号。导致一辆车会被识别成很多辆车。按照之前的逻辑,就会被识别出不同的车辆。这对于统计道路上的新能源车占比来说,是无法容忍的。因此需要解决该问题。

冷静分析,通过上面的测试视频来看,车牌的检测倒是非常准确(红框基本没有问题),但是车牌识别的不够准确。那么如何解决该问题,从而实现准确的车牌检测呢?留在下期去解决吧。(说实话:我自己还没有想好!)

总结

感谢各位观众老爷又看到了最后。这期主要是数据集的准备和网络的调通。原以为可以马上上路测试了,却遇到了在视频中识别不准的问题,严重影响实验的精度。用这种精度统计出来的新能源车占比,我自己都不信,更不要说让销售相信了。下一期还是先解决识别精度的问题,尽情期待哦!

猜你喜欢

转载自blog.csdn.net/cjnewstar111/article/details/123328019