智能驾驶 车牌检测和识别(二)《YOLOv5实现车牌检测(含车牌检测数据集和训练代码)》

您所在的位置:网站首页 yolov5车辆检测 智能驾驶 车牌检测和识别(二)《YOLOv5实现车牌检测(含车牌检测数据集和训练代码)》

智能驾驶 车牌检测和识别(二)《YOLOv5实现车牌检测(含车牌检测数据集和训练代码)》

2024-01-29 01:35| 来源: 网络整理| 查看: 265

智能驾驶 车牌检测和识别(二)《YOLOv5实现车牌检测(含车牌检测数据集和训练代码)》

目录

智能驾驶 车牌检测和识别(二)《YOLOv5实现车牌检测(含车牌检测数据集和训练代码)》

1. 前言

2. 车牌检测数据集说明

(1)车牌检测数据集

(2)自定义数据集

3. 基于YOLOv5的车牌检测模型训练

(1)YOLOv5安装

(2)准备Train和Test数据

(3)配置数据文件

(4)配置模型文件

(5)重新聚类Anchor(可选)

(6)开始训练

(7)可视化训练过程

(8)常见的错误

4. Python版本车牌检测效果

5. Android版本车牌检测和识别效果

6.项目源码下载

1. 前言

 这是项目《智能驾驶 车牌检测和识别》系列之《YOLOv5实现车牌检测(含车牌检测数据集和训练代码)》;项目基于开源YOLOv5项目,实现一个高精度的车牌检测算法( License Plates Detection);目前,基于YOLOv5s的车牌检测精度平均值mAP_0.5=0.99972,mAP_0.5:0.95=0.75261。为了能部署在手机Android平台上,本人对YOLOv5s进行了简单的模型轻量化,并开发了一个轻量级的版本yolov5s05_416和yolov5s05_320模型;轻量化模型在普通Android手机上可以达到实时的检测效果,CPU(4线程)约30ms左右,GPU约25ms左右 ,基本满足业务的性能需求。下表格给出轻量化模型的计算量和参数量以及其检测精度

模型input-sizeparams(M)GFLOPsmAP_0.5:0.95yolov5s640×6407.216.50.75261yolov5s05416×4161.71.80.74593yolov5s05320×3201.71.10.74341

先展示一下车牌检测效果:

如果你需要车牌号识别,请参考《CRNN和LPRNet实现车牌识别(含车牌识别数据集和训练代码)》

【 整套项目下载地址】:智能驾驶 车牌检测和识别(二)《YOLOv5实现车牌检测(含车牌检测数据集和训练代码)》

【尊重原创,转载请注明出处】https://blog.csdn.net/guyuealian/article/details/128704068

 更多项目《智能驾驶 车牌检测和识别》系列文章请参考:

智能驾驶 车牌检测和识别(一)《CCPD车牌数据集》:https://blog.csdn.net/guyuealian/article/details/128704181智能驾驶 车牌检测和识别(二)《YOLOv5实现车牌检测(含车牌检测数据集和训练代码)》:https://blog.csdn.net/guyuealian/article/details/128704068智能驾驶 车牌检测和识别(三)《CRNN和LPRNet实现车牌识别(含车牌识别数据集和训练代码)》:https://blog.csdn.net/guyuealian/article/details/128704209智能驾驶 车牌检测和识别(四)《Android实现车牌检测和识别(可实时车牌识别)》:https://blog.csdn.net/guyuealian/article/details/128704242智能驾驶 车牌检测和识别(五)《C++实现车牌检测和识别(可实时车牌识别)》:https://blog.csdn.net/guyuealian/article/details/128704276智能驾驶 红绿灯检测(一)《红绿灯(交通信号灯)数据集》:https://blog.csdn.net/guyuealian/article/details/128222850智能驾驶 红绿灯检测(二)《YOLOv5实现红绿灯检测(含红绿灯数据集+训练代码)》:https://blog.csdn.net/guyuealian/article/details/128240198智能驾驶 红绿灯检测(三)《Android实现红绿灯检测(含Android源码 可实时运行)》:https://blog.csdn.net/guyuealian/article/details/128240334

智能驾驶 车辆检测(一)《UA-DETRAC BITVehicle车辆检测数据集》:https://blog.csdn.net/guyuealian/article/details/127907325

智能驾驶 车辆检测(二)《YOLOv5实现车辆检测(含车辆检测数据集+训练代码)》:https://blog.csdn.net/guyuealian/article/details/128099672

智能驾驶 车辆检测(三)《Android实现车辆检测(含Android源码 可实时运行)》:https://blog.csdn.net/guyuealian/article/details/128190532

2. 车牌检测数据集说明 (1)车牌检测数据集

 目前收集了约30W+的车牌检测数据集(含蓝牌和绿牌),主要使用开源的CCPD车牌数据集,关于CCPD车牌数据集说明,请参考智能驾驶 车牌检测和识别(一)《CCPD车牌数据集》:https://blog.csdn.net/guyuealian/article/details/128704181

(2)自定义数据集

如果需要增/删类别数据进行训练,或者需要自定数据集进行训练,可参考如下步骤:

采集图片,建议不少于200张图片使用Labelme等标注工具,对目标进行拉框标注:labelme工具:GitHub - wkentaro/labelme: Image Polygonal Annotation with Python (polygon, rectangle, circle, line, point and image-level flag annotation).将标注格式转换为VOC数据格式,参考工具:labelme/labelme2voc.py at main · wkentaro/labelme · GitHub生成训练集train.txt和验证集val.txt文件列表修改engine/configs/voc_local.yaml的train和val的数据路径重新开始训练

​​

3. 基于YOLOv5的车牌检测模型训练 (1)YOLOv5安装

训练Pipeline采用YOLOv5: GitHub - ultralytics/yolov5: YOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLite , 原始官方代码训练需要转换为YOLO的格式,不支持VOC的数据格式。为了适配VOC数据,本人新增了LoadVOCImagesAndLabels用于解析VOC数据集,以便正常训练。另外,为了方便测试,还增加demo.py文件,可支持对图片,视频和摄像头的测试。

Python依赖环境,使用pip安装即可,项目代码都在Ubuntu系统和Windows系统验证正常运行,请放心使用;若出现异常,大概率是相关依赖包版本没有完全对应

matplotlib>=3.2.2 numpy>=1.18.5 opencv-python>=4.1.2 Pillow PyYAML>=5.3.1 scipy>=1.4.1 torch>=1.7.0 torchvision>=0.8.1 tqdm>=4.41.0 tensorboard>=2.4.1 seaborn>=0.11.0 pandas thop # FLOPs computation pybaseutils==0.7.0

  项目安装教程请参考(初学者入门,麻烦先看完下面教程,配置好开发环境):

项目开发使用教程和常见问题和解决方法视频教程:1 手把手教你安装CUDA和cuDNN(1)视频教程:2 手把手教你安装CUDA和cuDNN(2)视频教程:3 如何用Anaconda创建pycharm环境视频教程:4 如何在pycharm中使用Anaconda创建的python环境 (2)准备Train和Test数据

下载CCPD车牌检测数据集, 关于CCPD车牌数据集说明,请参考智能驾驶 车牌检测和识别(一)《CCPD车牌数据集》:https://blog.csdn.net/guyuealian/article/details/128704181

(3)配置数据文件 修改训练和测试数据的路径:engine/configs/voc_local.yaml注意数据路径分隔符使用【/】,不是【\】项目不要出现含有中文字符的目录文件或路径,否则会出现很多异常!!!!!!!! # Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..] # 数据路径 path: "" # dataset root dir # 数据路径不要含有中文字符,否则有很多异常,分隔符使用【/】 train: - 'D:/dataset/CCPD2020-voc/train/train.txt' - 'D:/dataset/CCPD2020-voc/val/val.txt' - 'D:/dataset/CCPD2019-voc/ccpd_base/train.txt' - 'D:/dataset/CCPD2019-voc/ccpd_blur/train.txt' - 'D:/dataset/CCPD2019-voc/ccpd_challenge/train.txt' - 'D:/dataset/CCPD2019-voc/ccpd_db/train.txt' - 'D:/dataset/CCPD2019-voc/ccpd_fn/train.txt' - 'D:/dataset/CCPD2019-voc/ccpd_rotate/train.txt' - 'D:/dataset/CCPD2019-voc/ccpd_tilt/train.txt' - 'D:/dataset/CCPD2019-voc/ccpd_weather/train.txt' val: - 'D:/dataset/CCPD2020-voc/test/test.txt' - 'D:/dataset/CCPD2019-voc/ccpd_base/val.txt' test: # test images (optional) data_type: voc # 1.设置类别个数,和要训练的类别名称,ID号从0开始递增 nc: 1 # number of classes names: { 'plate': 0 } # 2.如果你想合并所有类别为一个大类,进行训练: unique表示合并所有类为单独一个类别 #nc: 1 # number of classes #names: { "unique": 0 } (4)配置模型文件

官方YOLOv5给出了YOLOv5l,YOLOv5m,YOLOv5s等模型。考虑到手机端CPU/GPU性能比较弱鸡,直接部署yolov5s运行速度十分慢。所以本人在yolov5s基础上进行模型轻量化处理,即将yolov5s的模型的channels通道数全部都减少一半,并且模型输入由原来的640×640降低到416×416或者320×320,该轻量化的模型我称之为yolov5s05。从性能来看,yolov5s05比yolov5s快5多倍,而mAP下降了1%(0.75261→0.74341),对于手机端,这精度完全可以接受。

下面是yolov5s05和yolov5s的参数量和计算量对比:

模型input-sizeparams(M)GFLOPsyolov5s640×6407.216.5yolov5s05416×4161.71.8yolov5s05320×3201.71.1

(5)重新聚类Anchor(可选)

官方yolov5s的Anchor是基于COCO数据集进行聚类获得(详见models/yolov5s.yaml文件)

 ​​ 

考虑到车牌检测数据集,目标相对较小,并且目标框几乎都是竖状的矩形框;直接复用原始COCO的Anchor效果可能不太好;因此,这里对车牌数据集CCPD的标注框进行重新聚类获得新的Anchor;下表给出yolov5s,yolov5s05_416和yolov5s05_320重新聚类的Anchor结果:

yolov5s.yamlyolov5s05_416.yamlyolov5s05_320.yaml​

一点建议:

官方yolov5s的Anchor是基于COCO数据集进行聚类获得,不同数据集需要做适当的调整,其最优Anchor建议重新进行聚类 。当然你要是觉得麻烦就跳过,不需要重新聚类Anchor,这个影响不是特别大。如果你需要重新聚类,请参考engine/kmeans_anchor/demo.py文件 (6)开始训练

整套训练代码非常简单操作,用户只需要填写好对应的数据路径,即可开始训练了。

修改训练超参文件(: data/hyps/hyp.scratch-v1.yaml (可以修改训练学习率,数据增强等方式,使用默认即可,可不修改)Linux系统终端运行训练yolov5s或轻量化版本yolov5s05_416或者yolov5s05_320 (选择其中一个训练即可) #!/usr/bin/env bash #--------------训练yolov5s-------------- # 输出项目名称路径 project="runs/yolov5s_640" # 训练和测试数据的路径 data="engine/configs/voc_local.yaml" # YOLOv5模型配置文件 cfg="models/yolov5s.yaml" # 训练超参数文件 hyp="data/hyps/hyp.scratch-v1.yaml" # 预训练文件 weights="engine/pretrained/yolov5s.pt" python train.py --data $data --cfg $cfg --hyp $hyp --weights $weights --batch-size 16 --imgsz 640 --workers 4 --project $project #--------------训练轻量化版本yolov5s05_416-------------- # 输出项目名称路径 project="runs/yolov5s05_416" # 训练和测试数据的路径 data="engine/configs/voc_local.yaml" # YOLOv5模型配置文件 cfg="models/yolov5s05_416.yaml" # 训练超参数文件 hyp="data/hyps/hyp.scratch-v1.yaml" # 预训练文件 weights="engine/pretrained/yolov5s.pt" python train.py --data $data --cfg $cfg --hyp $hyp --weights $weights --batch-size 16 --imgsz 416 --workers 4 --project $project #--------------训练轻量化版本yolov5s05_320-------------- # 输出项目名称路径 project="runs/yolov5s05_320" # 训练和测试数据的路径 data="engine/configs/voc_local.yaml" # YOLOv5模型配置文件 cfg="models/yolov5s05_320.yaml" # 训练超参数文件 hyp="data/hyps/hyp.scratch-v1.yaml" # 预训练文件 weights="engine/pretrained/yolov5s.pt" python train.py --data $data --cfg $cfg --hyp $hyp --weights $weights --batch-size 16 --imgsz 320 --workers 4 --project $project  Windows系统终端运行训练yolov5s或轻量化版本yolov5s05_416或者yolov5s05_320 (选择其中一个训练即可) #!/usr/bin/env bash #--------------训练yolov5s-------------- python train.py --data engine/configs/voc_local.yaml --cfg models/yolov5s.yaml --hyp data/hyps/hyp.scratch-v1.yaml --weights engine/pretrained/yolov5s.pt --batch-size 16 --imgsz 640 --workers 4 --project runs/yolov5s_640 #--------------训练轻量化版本yolov5s05_416-------------- python train.py --data engine/configs/voc_local.yaml --cfg models/yolov5s05_416.yaml --hyp data/hyps/hyp.scratch-v1.yaml --weights engine/pretrained/yolov5s.pt --batch-size 16 --imgsz 416 --workers 4 --project runs/yolov5s05_416 #--------------训练轻量化版本yolov5s05_320-------------- python train.py --data engine/configs/voc_local.yaml --cfg models/yolov5s05_320.yaml --hyp data/hyps/hyp.scratch-v1.yaml --weights engine/pretrained/yolov5s.pt --batch-size 16 --imgsz 320 --workers 4 --project runs/yolov5s05_320 开始训练:

​​

训练数据量比较大,训练时间比较长,请耐心等待哈训练完成后,在模型输出目录中有个results.csv文件,记录每个epoch测试的结果,如loss,mAP等信息

训练模型收敛后,yolov5s车牌检测的mAP指标大约mAP_0.5=0.75261;而,yolov5s05_416 mAP_0.5=0.74593左右;yolov5s05_320 mAP_0.5=0.74341左右;相比而言,yolov5s05比yolov5s mAP减小1%,从效果看,对yolov5进行模型压缩,损失的精度不大。

模型input-sizeparams(M)GFLOPsmAP_0.5:0.95yolov5s640×6407.216.50.75261yolov5s05416×4161.71.80.74593yolov5s05320×3201.71.10.74341 (7)可视化训练过程

训练过程可视化工具是使用Tensorboard,使用方法:

# 基本方法 tensorboard --logdir=path/to/log/ # 例如 tensorboard --logdir ./data/model/yolov5s_640 ​​​​​​​​

 当然,在输出目录,也保存很多性能指标的图片

这是训练epoch的可视化图,可以看到mAP随着Epoch训练,逐渐提高

这是每个类别的F1-Score分数

​​

这是模型的PR曲线

​​

这是混淆矩阵:

​​

(8)常见的错误 YOLOv5 BUG修复记录 项目安装教程请参考:项目开发使用教程和常见问题和解决方法项目不要出现含有中文字符的目录文件或路径,否则会出现很多异常!!!!!!!! 4. Python版本车牌检测效果

demo.py文件用于推理和测试模型的效果,填写好配置文件,模型文件以及测试图片即可运行测试了

测试图片 # 测试图片(Linux系统) image_dir='data/test_image' # 测试图片的目录 weights="data/model/yolov5s_640/weights/best.pt" # 模型文件 out_dir="runs/test-result" # 保存检测结果 python demo.py --image_dir $image_dir --weights $weights --out_dir $out_dir

Windows系统,请将$image_dir, $weights ,$out_dir等变量代替为对应的变量值即可,如

# 测试图片(Windows系统) python demo.py --image_dir data/test_image --weights data/model/yolov5s_640/weights/best.pt --out_dir runs/test-result 测试视频文件 # 测试视频文件(Linux系统) video_file="data/test-video.mp4" # path/to/video.mp4 测试视频文件,如*.mp4,*.avi等 weights="data/model/yolov5s_640/weights/best.pt" # 模型文件 out_dir="runs/test-result" # 保存检测结果 python demo.py --video_file $video_file --weights $weights --out_dir $out_dir # 测试视频文件(Windows系统) python demo.py --video_file data/test-video.mp4 --weights data/model/yolov5s_640/weights/best.pt --out_dir runs/test-result

 测试摄像头 # 测试摄像头(Linux系统) video_file=0 # 测试摄像头ID weights="data/model/yolov5s_640/weights/best.pt" # 模型文件 out_dir="runs/test-result" # 保存检测结果 python demo.py --video_file $video_file --weights $weights --out_dir $out_dir # 测试摄像头(Windows系统) python demo.py --video_file 0 --weights data/model/yolov5s_640/weights/best.pt --out_dir runs/test-result ​

 如果想进一步提高模型的性能,可以尝试:

​增加训练的样本数据: 目前有30W+的数据量,建议根据自己的业务场景,采集相关数据,提高模型泛化能力使用参数量更大的模型: 本教程使用的YOLOv5s,其参数量才7.2M,而YOLOv5x的参数量有86.7M,理论上其精度更高,但推理速度也较慢。车牌目标检测属于小目标检测,可以尝试减小模型下采样次数,增大input-size,来提高小目标检测效果尝试不同数据增强的组合进行训练 5. Android版本车牌检测和识别效果

已经完成Android版本车牌检测和识别算法开发,APP在普通Android手机上可以达到实时的检测和识别效果,CPU(4线程)约30ms左右,GPU约25ms左右 ,基本满足业务的性能需求。详细说明请查看:智能驾驶 车牌检测和识别(四)《Android实现车牌检测和识别(可实时识别车牌)》:https://blog.csdn.net/guyuealian/article/details/128704242

Android Demo体验:https://download.csdn.net/download/guyuealian/87400593

6.项目源码下载

整套项目源码内容包含:车牌检测数据集 + YOLOv5训练代码和测试代码

整套项目下载地址:智能驾驶 车牌检测和识别(二)《YOLOv5实现车牌检测(含车牌检测数据集和训练代码)》

(1)CCPD车牌数据集:

CCPD2019:官方原始数据,主要是蓝牌数据,约34W;

CCPD2020:官方原始数据,主要是新能源绿牌数据,约1万

CCPD2019-voc:将数据集CCPD2019转换为VOC数据格式(数据在Annotations,JPEGImages文件夹),可直接用于目标检测模型训练

CCPD2020-voc:将数据集CCPD2020转换为VOC数据格式(数据在Annotations,JPEGImages文件夹),可直接用于目标检测模型训练

为了方便后续训练车牌识别模型,数据集提供已经裁剪好的车牌图片,并放在plates文件夹

(2)YOLOv5训练代码和测试代码(Pytorch)

整套YOLOv5项目工程,含训练代码train.py和测试代码demo.py支持高精度版本yolov5s训练和测试支持轻量化版本yolov5s05_320和yolov5s05_416训练和测试根据本篇博文说明,简单配置即可开始训练:train.py源码包含了训练好的yolov5s,yolov5s05_416和yolov5s05_320模型,配置好环境,可直接运行demo.py测试代码demo.py支持图片,视频和摄像头测试

 如果你需要车牌号识别,请参考《CRNN和LPRNet实现车牌识别(含车牌识别数据集和训练代码)》



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3