【YOLOv5项目】基于CCPD2020数据集的车牌检测 您所在的位置:网站首页 n字的车牌 【YOLOv5项目】基于CCPD2020数据集的车牌检测

【YOLOv5项目】基于CCPD2020数据集的车牌检测

2024-07-16 09:02| 来源: 网络整理| 查看: 265

文章目录 CCPD数据集介绍CCPD数据集标注说明(1)官网原文描述翻译(2)图解说明 下载CCPD2020数据集(1)谷歌云盘(2)百度云盘 CCPD2020数据格式转换为YOLO格式(1)使用以下代码将CCPD2020数据格式转换为YOLO格式(2)使用以下代码验证生成的YOLO格式的标签是否正确 修改yolov5-6.0源码(1)在根目录下新建一个dataset文件夹(2)在data文件夹中新建一个yaml文件(3)修改 loss.py 文件(4)修改 plots.py 文件(5)修改datasets.py和general.py文件(6)修改模型配置文件(7)Arial.ttf字体下载(8)下载预训练权重(9)添加预训练权重文件(10)修改train.py文件 环境配置(1)使用Anaconda创建虚拟环境 运行测试(1)本机运行测试(2)Kaggle上运行测试 下载Kaggle输出文件模型效果检验(1)修改detect.py文件(2)执行detect.py文件 透视变换

CCPD数据集介绍

CCPD(Chinese City Parking Dataset)数据集是一个专为车牌识别任务设计的开源数据集,它包含了大量在中国城市停车场中采集的车牌图像。这些图像涵盖了多种复杂环境,例如在不同天气条件下(如雨、雪等)、不同光照条件以及车牌的各种倾斜角度等。

CCPD数据集主要由两部分组成:CCPD2019和CCPD2020。CCPD2019主要包含普通车牌(蓝色车牌)的图像,而CCPD2020则专注于新能源车牌(绿色车牌)。

在使用CCPD数据集时,需要注意其标注方式的独特性。不同于传统数据集,CCPD并没有专门的标注文件,而是直接将标注信息嵌入到图像的文件名中。这意味着每张图像的文件名不仅包含了车牌的位置信息(如四个顶点的坐标)、倾斜角度以及车牌号码等,还包含了车牌的亮度以及模糊度等信息。

CCPD数据集标注说明 (1)官网原文描述翻译

官网原文描述 【数据集标注】 标注被嵌入在文件名中。 一个示例图像的名称为 “025-95_113-154&383_386&473-386&473_177&454_154&383_363&402-0_0_22_27_27_33_16-37-15.jpg”。每个名称可以被分割成七个字段。这些字段的解释如下:

区域(Area):车牌区域占整个图片面积的比率。倾斜度(Tilt degree):水平倾斜度和垂直倾斜度。边界框坐标(Bounding box coordinates):左上角和右下角顶点的坐标。四个顶点位置(Four vertices locations):车牌四个顶点在整张图片中的精确(x,y)坐标。这些坐标从右下角顶点开始顺时针排序(右下 - 左下 - 左上 - 右上)。车牌号码(License plate number):CCPD中的每张图片只有一个车牌。每个车牌号码由一个汉字、一个字母和五个字母或数字组成。有效的中国车牌由七个字符组成:省份(1个字符)、字母(1个字符)、字母+数字(5个字符)。“0_0_22_27_27_33_16”是每个字符的索引。这三个数组定义如下。每个数组的最后一个字符是字母O而不是数字0。我们使用O作为“无字符”的标志,因为中国车牌字符中没有O。

省份数组(provinces)包括了中国所有省份的简称和一些特殊用途的车牌代码。 字母数组(alphabets)包括了所有可能出现在车牌第二个位置的英文字母。 字母和数字数组(ads)包括了所有可能出现在车牌后五位位置的英文字母和数字。

provinces = ["皖", "沪", "津", "渝", "冀", "晋", "蒙", "辽", "吉", "黑", "苏", "浙", "京", "闽", "赣", "鲁", "豫", "鄂", "湘", "粤", "桂", "琼", "川", "贵", "云", "藏", "陕", "甘", "青", "宁", "新", "警", "学", "O"] alphabets = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'O'] ads = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'O'] 亮度(Brightness):车牌区域的亮度。模糊度(Blurriness):车牌区域的模糊度。 (2)图解说明

在这里插入图片描述

下载CCPD2020数据集 (1)谷歌云盘

Google Drive: CCPD2020.zip

(2)百度云盘

BaiduYun Drive(code: ol3j): CCPD2020.zip

CCPD2020数据格式转换为YOLO格式 (1)使用以下代码将CCPD2020数据格式转换为YOLO格式

将CCPD(Chinese City Parking Dataset)数据集中的图片和标注信息转换成YOLO(You Only Look Once)模型训练所需的格式。

# ConvertYOLOFormat.py import os import os.path import re import shutil import cv2 from tqdm import tqdm def listPathAllfiles(dirname): """ 遍历指定目录下的所有文件并返回一个包含这些文件路径的列表。 """ result = [] for maindir, subdir, file_name_list in os.walk(dirname): for filename in file_name_list: apath = os.path.join(maindir, filename) result.append(apath) return result if __name__ == '__main__': # 原始数据集的路径 data_path = "D:\\Users\\mks\\Desktop\\DeepLearningProjects\\YOLOv5-CCPD2020\\TempData\\LittleTrain" # 转换后数据的保存路径 save_path = "D:\\Users\\mks\\Desktop\\DeepLearningProjects\\YOLOv5-CCPD2020\\TempData\\LittleData" # 图片和标签文件的保存路径 images_save_path = os.path.join(save_path, "images") labels_save_path = os.path.join(save_path, "labels") # 如果不存在则创建图片和标签的保存文件夹 if not os.path.exists(images_save_path): os.makedirs(images_save_path) if not os.path.exists(labels_save_path): os.makedirs(labels_save_path) # 获取数据集中所有的图片文件路径 images_files = listPathAllfiles(data_path) # 初始化计数器用于生成新的文件名 cnt = 1 # 使用tqdm显示进度条 for name in tqdm(images_files): # 只处理图片文件 if name.endswith(".jpg") or name.endswith(".png"): # 读取图片 img = cv2.imread(name) # 获取图片的高度和宽度 height, width = img.shape[0], img.shape[1] # 使用正则表达式从文件名中提取坐标信息 str1 = re.findall('-\d+\&\d+_\d+\&\d+-', name)[0][1:-1] str2 = re.split('\&|_', str1) # 提取边界框坐标 x0 = int(str2[0]) y0 = int(str2[1]) x1 = int(str2[2]) y1 = int(str2[3]) # 计算边界框的中心点坐标以及宽度和高度,并进行归一化 x = round((x0 + x1) / 2 / width, 6) y = round((y0 + y1) / 2 / height, 6) w = round((x1 - x0) / width, 6) h = round((y1 - y0) / height, 6) # 构建标签文件名和路径 txtfile = os.path.join(labels_save_path, "green_plate_" + str(cnt).zfill(6) + ".txt") # 构建图片文件名和路径 imgfile = os.path.join(images_save_path, "green_plate_" + str(cnt).zfill(6) + "." + os.path.basename(name).split(".")[-1]) # 写入标签文件 open(txtfile, "w").write(" ".join(["0", str(x), str(y), str(w), str(h)])) # 移动图片到新位置 shutil.move(name, imgfile) # 更新计数器 cnt += 1 (2)使用以下代码验证生成的YOLO格式的标签是否正确

它通过读取图像文件和相应的标签文件来绘制边界框,并在窗口中显示带有边界框的图像。 如果边界框的位置和大小与预期相符,那么可以认为YOLO格式的标签是正确的。

# CheckYOLOLabels.py import os import cv2 import matplotlib.pyplot as plt import numpy as np def listPathAllfiles(dirname): """ 遍历指定目录下的所有文件并返回一个包含这些文件路径的列表。 """ result = [] for maindir, subdir, file_name_list in os.walk(dirname): for filename in file_name_list: apath = os.path.join(maindir, filename) result.append(apath) return result if __name__ == '__main__': # YOLO标签文件的保存路径 labelspath = "D:\\Users\\mks\\Desktop\\DeepLearningProjects\\YOLOv5-CCPD2020\\TempData\\LittleData\\labels" # YOLO图片文件的保存路径 imagespath = "D:\\Users\\mks\\Desktop\\DeepLearningProjects\\YOLOv5-CCPD2020\\TempData\\LittleData\\images" # 获取所有标签文件的路径 labelsFiles = listPathAllfiles(labelspath) # 逆序遍历标签文件,因为通常最新的文件在最后 for lbf in labelsFiles[::-1]: # 读取标签文件的每一行,并将其分割成一个列表 labels = open(lbf, "r").readlines() labels = list(map(lambda x: x.strip().split(" "), labels)) # 构造对应的图片文件名 imgfileName = os.path.join(imagespath, os.path.basename(lbf)[:-4] + ".jpg") # 从文件中读取图片,cv2.imdecode函数可以将字节流解码为图像 img = cv2.imdecode(np.fromfile(imgfileName, dtype=np.uint8), 1) # 遍历每个标签 for lbs in labels: # 将标签字符串转换为浮点数,并去掉类别索引 lb = list(map(float, lbs))[1:] # 根据标签计算边界框的左上角和右下角坐标 x1 = int((lb[0] - lb[2] / 2) * img.shape[1]) y1 = int((lb[1] - lb[3] / 2) * img.shape[0]) x2 = int((lb[0] + lb[2] / 2) * img.shape[1]) y2 = int((lb[1] + lb[3] / 2) * img.shape[0]) # 在图像上绘制边界框 cv2.rectangle(img, (x1, y1), (x2, y2), (0, 0, 255), 5) # 调整图像大小,使其最大边长为600像素 ratio = 600 / min(img.shape[0:2]) img = cv2.resize(img, dsize=(int(img.shape[1] * ratio), int(img.shape[0] * ratio))) # 显示带有边界框的图像 cv2.imshow("1", img) # 等待用户按键,按任意键继续 cv2.waitKey() # 关闭所有OpenCV创建的窗口 cv2.destroyAllWindows() 修改yolov5-6.0源码 (1)在根目录下新建一个dataset文件夹

将处理后的CCPD2020数据集存放到该文件夹下,文件夹结构为: 在这里插入图片描述

(2)在data文件夹中新建一个yaml文件

在data文件夹中新建一个yaml文件(文件名可自取,例如我的是:MyData.yaml),向MyData.yaml文件中复制以下内容:

path: D:/Users/mks/Desktop/DeepLearningProjects/YOLOv5-CCPD2020/dataset # dataset root dir # path: /kaggle/input/yolov5-plate/YOLOv5-CCPD2020/dataset # kaggle dataset root dir train: train/images val: val/images test: test/images # Classes nc: 1 # number of classes names: ["green_plate"] # class names (3)修改 loss.py 文件

在 utils 文件夹中找到 loss.py 文件,把第173行代码进行修改。

gain = torch.ones(7, device=targets.device).long()

在这里插入图片描述

(4)修改 plots.py 文件

在 utils 文件夹中找到 plots.py 文件,如下图所示进行修改。 在这里插入图片描述

import PIL def check_version(target_version): """ Check if the current PIL version is greater than or equal to the target version. Args: target_version (str): The target version string to compare against (e.g., '9.2.0'). Returns: bool: True if the current PIL version is greater than or equal to the target version, False otherwise. """ current_version = PIL.__version__ current_version_parts = [int(part) for part in current_version.split('.')] target_version_parts = [int(part) for part in target_version.split('.')] # Compare version parts for cur, tgt in zip(current_version_parts, target_version_parts): if cur > tgt: return True elif cur


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有