CCPD数据集+yolov5+智能驾驶车牌检测
- 代码准备
- ccpd数据集准备
- ccpd转yolov5目标格式
- 训练
- 测试
- 检测
在此使用MobaXterm_Personal_21.2
CCCPD数据集
CCPD2019数据集:
CCPD2019数据集主要采集于合肥市停车场,采集时间为上午7:30到晚上10:00,停车场采集人员手持Android POS机对停车场的车辆拍照进行数据采集。所拍摄的车牌照片涉及多种复杂环境,包括模糊、倾斜、雨天、雪天等。CCPD2019数据集包含了25万多幅中国城市车牌图像和车牌检测与识别信息的标注。主要介绍如下:
类别 描述 图片数
CCPD-Base 通用车牌图片 200k
CCPD-FN 车牌离摄像头拍摄位置相对较近或较远 20k
CCPD-DB 车牌区域亮度较亮、较暗或者不均匀 20k
CCPD-Rotate 车牌水平倾斜20到50度,竖直倾斜-10到10度 10k
CCPD-Tilt 车牌水平倾斜15到45度,竖直倾斜15到45度 10k
CCPD-Weather 车牌在雨雪雾天气拍摄得到 10k
CCPD-Challenge 在车牌检测识别任务中较有挑战性的图片 10k
CCPD-Blur 由于摄像机镜头抖动导致的模糊车牌图片 5k
CCPD-NP 没有安装车牌的新车图片 5k
CCPD2019/CCPD-Base中的图像被拆分为train/val数据集。使用CCPD2019中的子数据集(CCPD-DB、CCPD-Blur、CCPD-FN、CCPD-Rotate、CCPD-Tilt、CCPD-Challenge)进行测试。
CCPD2019数据集(数据大小12.26G)下载地址:
链接:https://pan.baidu.com/s/1Jh55ufXZZpusg7Vhn4ZYdQ
提取码:f6mo
Ccpd数据集是12G左右的存储,将打包好的数据集上传至MobaXterm_Personal_21.2服务器上
例如: "/data/aimonitor/data/datasets/car_license/1002/license_use/CCPD.7z"
在此我使用的是7z工具打包的,可以在/data/aimonitor/data/datasets/car_license/1002/license_use/目录下使用Linux命令:7za x CCPD.7z解压包
在数据集目录下建立两个文件夹test/car_data
在car_data目录下创建两个文件夹images/labels:
两文件夹下分别创建两个文件夹train,val:
Ccpd转yolov5目标格式
- 将数据集图片8:2分为训练与测试
# coding=UTF8
import shutil
import os
import random
from shutil import copy2
trainfiles = os.listdir(r"D:\CCPD2019.tar\CCPD2019\ccpd_base")
#(图片文件夹)
num_train = len(trainfiles)
print( "num_train: " + str(num_train) )
index_list = list(range(num_train))
print(index_list)
random.shuffle(index_list)
num = 0
trainDir = r"D:\CCPD2019.tar\ccpd_train\images\train"
#(将图片文件夹中的6份放在这个文件夹下)
validDir = r"D:\CCPD2019.tar\ccpd_train\images\val"
#(将图片文件夹中的2份放在这个文件夹下)
detectDir = r"D:\CCPD2019.tar\test_datasets\images"
#(将图片文件夹中的2份放在这个文件夹下)
for i in index_list:
fileName = os.path.join(r"D:\CCPD2019.tar\CCPD2019\ccpd_base", trainfiles[i])
if num < num_train*0.6:
print(str(fileName))
copy2(fileName, trainDir)
elif num < num_train*0.8:
print(str(fileName))
copy2(fileName, detectDir)
else:
copy2(fileName, validDir)
num += 1
2.将文件夹下图片命名信息提取切割,存储为txt文档,并存储到文件夹中
import shutil
import cv2
import os
def txt_file(img_path):
x = img_path.split("/", 12)
if x[11] == "train":
y = '/'.join(x[0:10]) + '/labels/' + 'train/'
else:
y = '/'.join(x[0:10]) + '/labels/' + 'val/'
return y
def txt_translate(path, txt_path):
for filename in os.listdir(path):
print(filename)
list1 = filename.split("-", 3) # 第一次分割,以减号'-'做分割
subname = list1[2]
list2 = filename.split(".", 1)
subname1 = list2[1]
if subname1 == 'txt':
continue
lt, rb = subname.split("_", 1) # 第二次分割,以下划线'_'做分割
lx, ly = lt.split("&", 1)
rx, ry = rb.split("&", 1)
width = int(rx) - int(lx)
height = int(ry) - int(ly) # bounding box的宽和高
cx = float(lx) + width / 2
cy = float(ly) + height / 2 # bounding box中心点
img = cv2.imread(path + filename)
if img is None: # 自动删除失效图片(下载过程有的图片会存在无法读取的情况)
os.remove(os.path.join(path, filename))
continue
width = width / img.shape[1]
height = height / img.shape[0]
cx = cx / img.shape[1]
cy = cy / img.shape[0]
txtname = filename.split(".", 1)
txtfile = txt_path + txtname[0] + ".txt"
# 绿牌是第0类,蓝牌是第1类
with open(txtfile, "w") as f:
f.write(str(0) + " " + str(cx) + " " + str(cy) + " " + str(width) + " " + str(height))
if __name__ == '__main__':
# 修改此处地址
trainDir = "/data/aimonitor/data/datasets/car_license/1002/license_new/CCPD/ccpd_train/images/train/"
validDir = "/data/aimonitor/data/datasets/car_license/1002/license_new/CCPD/ccpd_train/images/val/"
# 该处修改为图片存储地址
txt_path1 = txt_file(trainDir)
txt_path2 = txt_file(validDir)
txt_translate(trainDir, txt_path1)
txt_translate(validDir, txt_path2)
打开yolov5文件夹下的data文件夹,将任意选择一个数据集的yaml文件复制,并且将yaml文件内容修改
# YOLOv5 🚀 by Ultralytics, GPL-3.0 license
# COCO128 dataset https://www.kaggle.com/ultralytics/coco128 (first 128 images from COCO train2017)
# Example usage: python train.py --data coco128.yaml
# parent
# ├── yolov5
# └── datasets
# └── coco128 �downloads here
# 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: /data/aimonitor/data/datasets/car_license/1002/license_new/CCPD/ccpd_train/ # dataset root dir
train: images/train # train images (relative to 'path') 128 images
val: images/train # val images (relative to 'path') 128 images
test: # test images (optional)
# Classes
nc: 1
names: ['lense']
# Download script/URL (optional)
# download: https://github.com/ultralytics/yolov5/releases/download/v1.0/coco128.zip
修改path和nc,以及names
Path是数据集路径,nc是classes标注标签个数,names是标签名称
开始训练,使用命令:
python3 train.py --data ./data/myData.yaml --cfg ./models/yolov5s.yaml --epochs 30 --weights ''
无基础模型,可选基础模型
--data 数据路径
--epochs 训练次数
模型训练开始:
训练结束:
测试数据:
python3 detect.py --weight /data/aimonitor/data/datasets/vehicle/1006/car_2.0/model300_6_nobase/best.pt --source /data/aimonitor/data/datasets/vehicle/1006/car_2.0/test_color/ --project /data/aimonitor/data/datasets/vehicle/1006/car_2.0/test_color/ --save-crop
用来测试车牌检测模型,需要模型和测试数据集
至于—save-crop是用来将被检测到的车牌切割出来,以方便我们后续的车牌识别模型研发数据准备
测试数据:
测试切车牌图片: