【智慧交通项目实战】 《 OCR车牌检测与识别》(二):基于YOLO的车牌检测

作者简介: CSDN、阿里云人工智能范畴博客专家,新星计划核算机视觉导师,百度飞桨PPDE,专注大数据与AI知识共享。

公众号:GoAI的学习小屋 ,免费共享书籍、简历、导图等,更有沟通群共享宝藏材料,关注公众号回复“加群”或➡️点击链接 加群。

专栏推荐: 点击拜访➡️ 《核算机视觉》 总结方针检测、图画分类、分割OCR、等方向材料。 点击拜访➡️ 《深入浅出OCR》: 对标全网最全OCR教程,含理论与实战总结,欢迎订阅。


【才智交通项目实战】 OCR车牌检测与辨认项目实战(二):车牌检测

导读:本项目为新系列【才智交通项目实战】《OCR车牌检测和辨认》(二)–根据YOLO的车牌检测,该系列将分为多篇文章展开分别对项目流程、数据集、检测、辨认算法、可视化进行具体介绍。本篇为该系列第二篇,将着重介绍车牌检测流程,对环境装置、练习流程、装备进行具体解读,后续该系列文章将连续更新。

![在这里刺进图片描绘](img-blog.csdnimg.cn/3f102ab37e5… =400×380)

【智慧交通项目实战】 《 OCR车牌检测与识别》(二):基于YOLO的车牌检测

本系列项目目录,后续将更新对应文章:

1.才智交通预测体系(PaddleOCR版别)

参阅:blog.csdn.net/qq_36816848…

2.OCR车牌检测+辨认

本篇项目, 代码暂未公开,需求代码和指导可加群联络。

【智慧交通项目实战】 《 OCR车牌检测与识别》(二):基于YOLO的车牌检测

3.车辆检测

后续更新

【智慧交通项目实战】 《 OCR车牌检测与识别》(二):基于YOLO的车牌检测


一、项目布景:

车牌辨认技术是智能交通的重要环节,目前已广泛应用于例如停车场、收费站等等交通设施中,提供高效快捷的车辆认证的服务,其中较为典型的应用场景为卡口体系。车牌辨认即辨认车牌上的文字信息,属于光学字符辨认(OCR)的一项子使命。 ![请增加图片描绘](img-blog.csdnimg.cn/c00c0fd0a41… =500×350)

【智慧交通项目实战】 《 OCR车牌检测与识别》(二):基于YOLO的车牌检测

二、项目流程:

1.根据YOLOv5的车牌检测 (后续会更新Yolov7版别)

YOLOv5练习代码和测验代码(Pytorch)

  1. 整套YOLOv5项目工程,含练习代码train.py和测验代码demo.py
  2. 支撑高精度版别yolov5s练习和测验
  3. 支撑轻量化版别yolov5练习和测验
  4. 根据本篇博文阐明,简略装备即可开端练习:train.py
  5. 源码包含了练习好的yolov5及其他模型,装备好环境,可直接运行demo.py
  6. 测验代码demo.py支撑图片,视频和摄像头测验

2.根据CRNN和LPRNet的车牌辨认

支撑如下:

  • 1.单行蓝牌
  • 2.单行黄牌
  • 3.新能源车牌
  • 4.白色警用车牌
  • 5.教练车牌
  • 6.武警车牌
  • 7.双层黄牌
  • 8.双层白牌
  • 9.使馆车牌
  • 10.港澳粤Z牌
  • 11.双层绿牌
  • 12.民航车牌

三、项目文件目录

#注:代码过长只截取部分代码文件
----plate\
    |----ccpd_process.py
    |----data\
    |    |----argoverse_hd.yaml
    |    |----coco.yaml
    |    |----coco128.yaml
    |    |----hyp.finetune.yaml
    |    |----hyp.scratch.yaml
    |    |----plateAndCar.yaml
    |    |----retinaface2yolo.py
    |    |----train2yolo.py
    |    |----val2yolo.py
    |    |----val2yolo_for_test.py
    |    |----voc.yaml
    |    |----widerface.yaml
    |----demo.sh
    |----detect_demo.py
    |----detect_plate.py
    |----export.py
    |----fonts\
    |    |----platech.ttf
    |----hubconf.py
    |----image\
    |    |----README\
    |    |    |----test_1.jpg
    |    |    |----weixian.png
    |----json2yolo.py
    |----LICENSE
    |----models\
    |    |----blazeface.yaml
    |    |----blazeface_fpn.yaml
    |    |----common.py
    |    |----experimental.py
    |    |----yolo.py
    |    |----yolov5l.yaml
    |    |----yolov5l6.yaml
    |    |----yolov5m.yaml
    |    |----yolov5m6.yaml
    |    |----yolov5n-0.5.yaml
    |    |----yolov5n.yaml
    |    |----yolov5n6.yaml
    |    |----yolov5s.yaml
    |    |----yolov5s6.yaml

四、车牌检测实战

(1) 环境装置

1.Pytorch环境装置:

参阅我的Pytorch专栏:PyTorch学习笔记(一):PyTorch环境装置

2.YOLOv5装置:

参阅:YOLOv5: GitHub – ultralytics/yolov5: YOLOv5 in PyTorch > ONNX > CoreML > TFLite , 原始官方代码练习需求转化为YOLO的格局,不支撑VOC的数据格局。

【智慧交通项目实战】 《 OCR车牌检测与识别》(二):基于YOLO的车牌检测

3.依靠装置

本项目Python依靠环境requirements装备文件如下:

asttokens
backcall
charset-normalizer
cycler
dataclasses
debugpy
decorator
executing
fonttools
idna
ipykernel
ipython
jedi
jupyter-client
jupyter-core
kiwisolver
matplotlib
matplotlib-inline
nest-asyncio
numpy
opencv-python
packaging
pandas
parso
pickleshare
Pillow
prompt-toolkit
psutil
pure-eval
Pygments
pyparsing
python-dateutil
pytz
PyYAML
pyzmq
requests
scipy
seaborn
six
stack-data
thop
tornado
tqdm
traitlets
typing-extensions
urllib3
wcwidth

项目参阅硬件环境:

内容 型号
CPU I7-8750 2.20GHz
GPU GTX 2080ti
Python 3.7.8
Pytorch 1.13.0
Opencv 4.3.0
CUDA 11.1
编码环境 Pycharm
操作体系 Ubuntu 20.04

(2)下载数据集及预备:

车牌检测下载链接:CCPD车牌检测数据集 提取码:pi6c 。

注:上述数据由CCPD和CRPD数据集选取并转化,关于CCPD车牌数据集具体介绍见本系列上一篇【才智交通项目实战】《OCR车牌检测与辨认》(一)。

在运用YOLO算法进行车牌检测练习时首先需求将预备的标注完结的数据集转化为YOLO格局,具体格局为:

label x y w h  pt1x pt1y pt2x pt2y pt3x pt3y pt4x pt4y

注:坐标次序为左上,右上,右下,左下 ,且是经过归一化,其中x,y是中心点除以图片宽高,w,h是框的宽高除以图片宽高,ptx,pty是要害点坐标除以宽高。Label代表车牌类型,label为0表示该车牌为单层车牌,label为1表示该车牌为双层车牌。

部分格局转化代码如下:

def xywh2yolo(rect,landmarks_sort,img):
    h,w,c =img.shape
    rect[0] = max(0, rect[0])
    rect[1] = max(0, rect[1])
    rect[2] = min(w - 1, rect[2]-rect[0])
    rect[3] = min(h - 1, rect[3]-rect[1])
    annotation = np.zeros((1, 12))
    annotation[0, 0] = (rect[0] + rect[2] / 2) / w  # cx
    annotation[0, 1] = (rect[1] + rect[3] / 2) / h  # cy
    annotation[0, 2] = rect[2] / w  # w
    annotation[0, 3] = rect[3] / h  # h
    annotation[0, 4] = landmarks_sort[0][0] / w  # l0_x
    annotation[0, 5] = landmarks_sort[0][1] / h  # l0_y
    annotation[0, 6] = landmarks_sort[1][0] / w  # l1_x
    annotation[0, 7] = landmarks_sort[1][1] / h  # l1_y
    annotation[0, 8] = landmarks_sort[2][0] / w  # l2_x
    annotation[0, 9] = landmarks_sort[2][1] / h # l2_y
    annotation[0, 10] = landmarks_sort[3][0] / w  # l3_x
    annotation[0, 11] = landmarks_sort[3][1] / h  # l3_y
    # annotation[0, 12] = (landmarks_sort[0][0]+landmarks_sort[1][0])/2 / w  # l4_x
    # annotation[0, 13] = (landmarks_sort[0][1]+landmarks_sort[1][1])/2 / h  # l4_y
    return annotation   

经过上述格局转化完结后,数据集格局如图所示,转化完结后即可开端练习。

【智慧交通项目实战】 《 OCR车牌检测与识别》(二):基于YOLO的车牌检测

(3)装备数据文件

修改 data/widerface.yaml train和val途径,换成你的数据途径

train: /your/train/path #修改成你的途径
val: /your/val/path     #修改成你的途径
# number of classes
nc: 2                 #这里用的是2分类,0 单层车牌 1 双层车牌
# class names
names: [ 'single','double']

(4)要害点定位

Yolo系列是方针检测经典算法,本项目选用修改后的yolov5系列进行练习,车牌检测作用如下:

【智慧交通项目实战】 《 OCR车牌检测与识别》(二):基于YOLO的车牌检测

从上图可以看出,原始模型检测后的图片存在倾斜视点、且存在干扰信息过多,运用该图片进行车牌辨认,容易导致辨认作用不好甚至是误辨认。因而,通过要害点辨认可以很好解决上述问题,假设咱们得到车牌的四个角点坐标、通过透视改换即可得到下图:

【智慧交通项目实战】 《 OCR车牌检测与识别》(二):基于YOLO的车牌检测

上图则十分合适车牌辨认算法的数据集要求。因而,本项目选用在检测的同时,通过透视改变对车牌要害点定位。

透视改换代码:


def four_point_transform(image, pts):
    # obtain a consistent order of the points and unpack them
    # individually
    rect = order_points(pts)
    (tl, tr, br, bl) = rect
    widthA = np.sqrt(((br[0] - bl[0]) ** 2) + ((br[1] - bl[1]) ** 2))
    widthB = np.sqrt(((tr[0] - tl[0]) ** 2) + ((tr[1] - tl[1]) ** 2))
    maxWidth = max(int(widthA), int(widthB))
    heightA = np.sqrt(((tr[0] - br[0]) ** 2) + ((tr[1] - br[1]) ** 2))
    heightB = np.sqrt(((tl[0] - bl[0]) ** 2) + ((tl[1] - bl[1]) ** 2))
    maxHeight = max(int(heightA), int(heightB))
    dst = np.array([
        [0, 0],
        [maxWidth - 1, 0],
        [maxWidth - 1, maxHeight - 1],
        [0, maxHeight - 1]], dtype = "float32")
    # compute the perspective transform matrix and then apply it
    M = cv2.getPerspectiveTransform(rect, dst)
    warped = cv2.warpPerspective(image, M, (maxWidth, maxHeight))
    # return the warped image
    return warped

(5)车牌检测练习

【智慧交通项目实战】 《 OCR车牌检测与识别》(二):基于YOLO的车牌检测

python3 train.py --data data/widerface.yaml --cfg models/yolov5n-0.5.yaml --weights weights/plate_detect.pt --epoch 250

参数阐明:

本项目大部分参数选用官方预设参数,模型练习的超参数如下表所示。在模型挑选方面选用yolov5n,s,m以及改善模型,共迭代250epoch;批量巨细batchsize=96。输入网络图片巨细设置为640×640,优方器方为0.937动量,学习率为0.01的随机梯度下降(SGD)优化器,权重衰减系数为0.0005,练习与测验过程中开启自适应anchor核算,IOU阈值设置为0.2,终究成果存在run文件夹中。

超参数名称 数值
模型 Yolov5-n,s,m
迭代轮数 250
批量巨细 96
输入图片巨细 640
是否持续练习 False
优化器 SGD
学习率 0.01
动量 0.937
优化器权重衰减 0.0005
练习/测验IOU阈值 0.2
是否自适应anchor True

检测模型 onnx export

本项目支撑检测模型导出onnx,前提需求装置onnx-sim onnx-simplifier

- python export.py --weights ./weights/plate_detect.pt --img 640 --batch 1
 - onnxsim weights/plate_detect.onnx weights/plate_detect.onnx

练习好的模型进行检测

加载练习好的车牌模型即可对车牌图片进行检测,执行以下命令即可:

   python detect_demo.py  --detect_model weights/plate_detect.pt

五、项目终究辨认作用:

【智慧交通项目实战】 《 OCR车牌检测与识别》(二):基于YOLO的车牌检测

最近比较忙,剩下项目介绍后续会持续弥补!!

文章参阅 :

aistudio.baidu.com/aistudio/pr…