代码以及视频讲解
本文所涉及所有资源均在传知代码平台可获取
YOLO V8实现多种车牌检测+识别!
一、概述
使用yolov8进行车牌检测(训练+测试+演示+部署)
二、支持类型
我们的车牌识别检测系统支持多种类型的车牌
具体支持类型如下:
1.单行蓝牌
2.单行黄牌
3.新能源车牌
4.白色警用车牌
5.教练车牌
6.武警车牌
7.双层黄牌
8.双层白牌
9.使馆车牌
10.港澳粤Z牌
11.双层绿牌
12.民航车牌
三、车牌检测训练
- 下载CCPD数据集,本文附件已经进行了标签,生成train.txt和test.txt标签文件;
- 修改ultralytics/datasets/yolov8-plate.yaml train和val路径,换成你的数据路径:
train: /mnt/mydisk/xiaolei/plate_detect/new_train_data # train images (relative to 'path') 4 images
val: /mnt/mydisk/xiaolei/plate_detect/new_val_data # val images (relative to 'path') 4 images
- 训练
yolo task=detect mode=train model=yolov8s.yaml data=./ultralytics/cfg/datasets/plate.yaml epochs=120 batch=32 imgsz=640 pretrained=False optimizer=SGD
四、YOLO V8介绍
YOLO V8一种用于实时检测飞行物体的通用模型,可用于迁移学习和进一步研究,以及一种改进的模型,可实现飞行物体检测的最新结果。我作者通过在包含40个不同类别飞行物体的数据集上训练我们的第一个(广义)模型来实现这一点,迫使模型提取抽象的特征表示。然后使用这些学习到的参数对更能代表“真实的世界”环境的数据集(即更高频率的遮挡、非常小的空间尺寸、旋转等)进行迁移学习。同时,生成精细模型飞行物体的目标检测仍然是具有挑战性的,以及大物体的变化空间大小/纵横比,速度,遮挡,和集群的背景。为了解决一些挑战,同时最大限度地提高性能,作者提出了当前最先进的单次检测器YOLOv 8,试图找到推理速度和平均精度(mAP)之间的最佳权衡。
- 损失函数和更新规则
广义损失函数和权重更新过程可以定义如下:
L ( θ ) = λ box N pos L box ( θ ) + λ cls N pos L cls ( θ ) + λ dfl N pos L dfl ( θ ) + ϕ ∥ θ ∥ 2 2 ( 1 ) L(\theta) = \frac{\lambda_{\text{box}}}{N_{\text{pos}}}L_{\text{box}}(\theta) + \frac{\lambda_{\text{cls}}}{N_{\text{pos}}}L_{\text{cls}}(\theta) + \frac{\lambda_{\text{dfl}}}{N_{\text{pos}}}L_{\text{dfl}}(\theta) + \phi\frac{\|\theta\|^2}{2} \ \ (1) L(θ)=NposλboxLbox(θ)+NposλclsLcls(θ)+NposλdflLdfl(θ)+ϕ2∥θ∥2 (1)
V t = β V t − 1 + ∇ θ L ( θ t − 1 ) ( 2 ) V_t = \beta V_{t-1} + \nabla_{\theta}L(\theta_{t-1})\ \ (2) Vt=βVt−1+∇θL(θt−1) (2)
θ
t
=
θ
t
−
1
−
η
V
t
(
3
)
\theta_t = \theta_{t-1} - \eta V_t \ \ (3)
θt=θt−1−ηVt (3)
(1)是包含个体损失权重和具有权重衰减的正则化项的广义损失函数,(2)是具有动量β的速度项,以及(3)是具有η作为学习率的权重更新规则
具体的YOLOv8损失函数可以定义为:
L = λ box N pos ∑ x , y ( 1 c x , y ∗ ( 1 − q x , y + ) ∥ b x , y − b ^ x , y ∥ 2 2 ρ 2 + α x , y ν x , y ) L = \frac{\lambda_{\text{box}}}{N_{\text{pos}}} \sum_{x,y} \left( 1_{c^*_{x,y}} \left(1-q_{x,y}^+\right) \frac{\|b_{x,y} - \hat{b}_{x,y}\|^2}{2\rho^2} + \alpha_{x,y} \nu_{x,y} \right) L=Nposλboxx,y∑(1cx,y∗(1−qx,y+)2ρ2∥bx,y−b^x,y∥2+αx,yνx,y)
$$
- \frac{\lambda_{\text{cls}}}{N_{\text{pos}}} \sum_{x,y} \sum_{c \in \text{classes}} \left( y_c \log(\hat{y}_c) + (1 - y_c) \log(1 - \hat{y}_c) \right)
$$
$$
- \frac{\lambda_{\text{dfl}}}{N_{\text{pos}}} \sum_{x,y} \left( 1_{c^*{x,y}} \left[ - (q{(x,y)+1} - q_{x,y}) \log(\hat{q}{x,y}) + (q{x,y} - q_{(x,y)-1}) \log(\hat{q}_{(x,y)+1}) \right] \right)
$$
具体解释如下:
-
IoU:
q x , y = IoU x , y = β x , y ∩ β ^ x , y β x , y ∪ β ^ x , y q_{x,y} = \text{IoU}_{x,y} = \frac{\beta_{x,y} \cap \hat{\beta}_{x,y}}{\beta_{x,y} \cup \hat{\beta}_{x,y}} qx,y=IoUx,y=βx,y∪β^x,yβx,y∩β^x,y
q x , y q_{x,y} qx,y 表示在位置 ( x , y ) (x,y) (x,y) 处的交并比 I o U IoU IoU,即预测边界框 β ^ x , y \hat{\beta}_{x,y} β^x,y 与真实边界框 β x , y \beta_{x,y} βx,y 之间的交集和并集之比。 -
纵横比损失:
ν x , y = 4 π 2 ( arctan ( w x , y h x , y ) − arctan ( w ^ x , y h ^ x , y ) ) 2 \nu_{x,y} = \frac{4}{\pi^2} \left( \arctan\left(\frac{w_{x,y}}{h_{x,y}}\right) - \arctan\left(\frac{\hat{w}_{x,y}}{\hat{h}_{x,y}}\right)\right)^2 νx,y=π24(arctan(hx,ywx,y)−arctan(h^x,yw^x,y))2
这个公式计算预测框和真实框的纵横比差异,并将其作为损失的一部分。 -
权重因子:
α x , y = ν x , y 1 − q x , y \alpha_{x,y} = \frac{\nu_{x,y}}{1 - q_{x,y}} αx,y=1−qx,yνx,y
这个权重因子用于对损失函数中的各个部分进行加权,结合 IoU 和纵横比信息。 -
预测的类别概率:
y ^ c = σ ( ⋅ ) \hat{y}_c = \sigma(\cdot) y^c=σ(⋅)
这里的 y ^ c \hat{y}_c y^c 是通过 sigmoid 函数 σ ( ⋅ ) \sigma(\cdot) σ(⋅) 计算得到的预测类别概率。 -
预测的 IoU 分数:
q ^ x , y = softmax ( ⋅ ) \hat{q}_{x,y} = \text{softmax}(\cdot) q^x,y=softmax(⋅)
这个公式表示使用 softmax 函数来计算预测的 IoU 分数。
符号说明:
- N pos N_{\text{pos}} Npos 表示包含目标的网格单元的总数。
- 1 c x , y ∗ 1_{c^*_{x,y}} 1cx,y∗ 是指示函数,用于标识包含目标的网格单元。
- β x , y \beta_{x,y} βx,y 是表示真实边界框的元组,包括 (x 坐标, y 坐标, 宽度, 高度)。
- β ^ x , y \hat{\beta}_{x,y} β^x,y 是相应网格单元的预测框。
- b x , y b_{x,y} bx,y 是表示真实边界框中心点的元组。
- y c y_c yc 是类别 c 的真实标签(不是网格单元 c),适用于输入中的每个网格单元 (x,y),无论是否存在目标。
- q ( x , y ) + / − 1 q(x,y)+/-1 q(x,y)+/−1 是最近的预测框 IoU(左和右)在 c x , y ∗ c^*_{x,y} cx,y∗ 中。
- w x , y w_{x,y} wx,y 和 h x , y h_{x,y} hx,y 分别是边界框的宽度和高度。
- ρ \rho ρ 是覆盖预测框和真实框的最小包围框的对角线长度。
每个网格单元然后确定其最合适的候选者来预测目标的边界框。这个损失函数包括由 Zheng 等人提出的完整 IoU(CIoU)损失作为框损失,标准的二元交叉熵作为分类损失(允许每个单元预测多个类别),以及 Li 等人提出的分布焦点损失作为第三项。
五、车牌识别
-
环境配置
WIN 10 or Ubuntu 16.04
PyTorch > 1.2.0 (may fix ctc loss)?
yaml
easydict
tensorboardX -
下载数据集车牌识别数据集CCPD+CRPD,本文已经帮大家打好标签并在附件中/datasets目录下提供标签文件;
-
将train.txt val.txt路径写入lib/config/360CC_config.yaml 中
DATASET:
DATASET: 360CC
ROOT: ""
CHAR_FILE: 'lib/dataset/txt/plate2.txt'
JSON_FILE: {'train': 'datasets/train.txt', 'val': 'datasets/val.txt'}
- 训练
python train.py --cfg lib/config/360CC_config.yaml
六、测试效果
python demo.py --model_path saved_model/best.pth --image_path images/test.jpg
or your/model/path
七、demo结果展示
附件说明
附件内容包括已训练好的模型(.pt)文件,用于测试demo效果,以及重新标注的数据,分为3类(train.txt, test.txt, val.txt),推理代码onnx/yolov8_plate_onnx_infer.py
源码下载