计算机视觉常用数据集Foggy Cityscapes的介绍、下载、转为YOLO格式进行训练
我在寻找Foggy Cityscapes数据集的时候花了一番功夫,因为官网下载需要用公司或学校邮箱邮箱注册账号,等待审核通过后才能进行下载数据集。并且一开始我也并不了解Foggy Cityscapes的格式和内容是什么样的,现在我弄明白后写下这篇文章,用于记录和分享。后续我还会在这个专栏发布如何使用YOLOv5\v9\v10\v11系列进行自己数据集的训练,可以订阅一波专栏。
1、Foggy Cityscapes介绍
大雾城市景观Foggy Cityscapes (F):Foggy Cityscapes是由 Cityscapes 生成的合成数据集,它旨在模拟和研究自动驾驶车辆在雾天条件下的性能,有三个级别的大雾天气(0.005,0.01,0.02),从轻微的雾到浓厚的雾,分别对应于600,300和150米的能见度范围。并且Foggy Cityscapes 保留了 Cityscapes 数据集的详细标注信息;同样的,数据集中的图像分辨率为1024x2048,涵盖了30多个类别,包括车辆、行人、建筑物、道路等城市街景中常见的物体和场景;但常用8个类别:
classes = ['car', 'person', 'rider', 'truck', 'bus', 'train', 'motorcycle', 'bicycle']。
Cityscapes 的一张原图对应到foggy_cityscapes中有3张图,β=[0.005,0.01,0.02],分别进行转换可以得到3个foggy_cityscapes数据集。
由于雾天条件下的能见度降低,图像中的许多目标会变得模糊不清,这对计算机视觉检测来说是一个挑战。Foggy Cityscapes 为研究人员提供了一个测试和改进他们算法的机会,以提高在恶劣条件下算法的鲁棒性和准确性。
2、下载
官网下载地址:Cityscapes Dataset – Semantic Understanding of Urban Street Scenes
从官网下载这个压缩包文件:leftImg8bit_trainvaltest_foggy.zip
Foggy Cityscapes数据集只有图像,没有标注信息,因为和Cityscapes的标注是一模一样的。
由于在官网下载数据集需要公司或者学校邮箱申请注册,等待审核通过后才可以下载,所以我在结尾提供了网盘数据下载方式,已经全部处理好了,可以直接用于YOLO格式的目标检测。
3、划分数据集用于YOLO目标检测
经过我的处理,将三种可见度的图片beta=(0.005,0.01,0.02)分为了三个文件夹:
以最常用的beta=0.02为例子,打开后长这样:
4、图像标签命名统一化
和Cityscapes数据集一样,图像和标签的名称是不一样的,在使用YOLO检测的时候,如果两者名称不一样,那么读取图片后就找不到对应的labels。下载数据后,重命名并将路径改为如下格式:
由于原数据集三个可见度的图片都是在一个文件夹中,比如在路径为
'D:/Deep_Learning_DataSet/Object_Detection_DataSet/Foggy_Cityscapes/leftImg8bit_trainvaltest_foggy/test'
的test文件夹下,berlin_000000_000019_leftImg8bit_foggy_beta_0.02.png、berlin_000000_000019_leftImg8bit_foggy_beta_0.01.png、berlin_000000_000019_leftImg8bit_foggy_beta_0.005.png都在一起,那么在读取数据的时候不太方便,所以将这三种不同可见度的图片分别转移到三个对应的文件夹下。
使用以下这段代码将数据集划分为三个可见度的文件夹下,记得修改自己的数据集路径,然后依次修改train、val、test就可以将原数据集中的图片转移到新文件夹下。
import os
import shutil
# 定义源目录和目标目录
src_dir = 'D:/Deep_Learning_DataSet/Object_Detection_DataSet/Foggy_Cityscapes/leftImg8bit_trainvaltest_foggy/test'
dest_dir_01 = 'D:/Deep_Learning_DataSet/Object_Detection_DataSet/Foggy_Cityscapes/leftImg8bit_trainvaltest_foggy/images_beta_0.01/test'
dest_dir_02 = 'D:/Deep_Learning_DataSet/Object_Detection_DataSet/Foggy_Cityscapes/leftImg8bit_trainvaltest_foggy/images_beta_0.02/test'
dest_dir_005 = 'D:/Deep_Learning_DataSet/Object_Detection_DataSet/Foggy_Cityscapes/leftImg8bit_trainvaltest_foggy/images_beta_0.005/test'
# 确保目标目录存在
os.makedirs(dest_dir_01, exist_ok=True)
os.makedirs(dest_dir_02, exist_ok=True)
os.makedirs(dest_dir_005, exist_ok=True)
# 遍历源目录中的所有文件
for filename in os.listdir(src_dir):
# 检查文件名是否包含beta值
if 'beta_0.01' in filename:
shutil.move(os.path.join(src_dir, filename), os.path.join(dest_dir_01, filename))
elif 'beta_0.02' in filename:
shutil.move(os.path.join(src_dir, filename), os.path.join(dest_dir_02, filename))
elif 'beta_0.005' in filename:
shutil.move(os.path.join(src_dir, filename), os.path.join(dest_dir_005, filename))
print("Files have been moved successfully.")
然后将文件夹images_beta_0.01、images_beta_0.02、images_beta_0.005都重命名为
beta_0.01、beta_0.02、beta_0.005,这三个文件夹分别放的是图像和标签,如下图所示:
5、YOLO数据配置文件
如图,记得修改自己的数据集路径,数据路径不能有中文,否则就会报以下错误。
Dataset not found , missing paths ['D:\\\\\\\\YOLO\\images\\val'] Traceback (most recent call last): File "E:\pythonCode\ObjectDetection\yolov9-main\train_dual.py", line 644, in <module> main(opt) File "E:\pythonCode\ObjectDetection\yolov9-main\train_dual.py", line 538, in main train(opt.hyp, opt, device, callbacks) File "E:\pythonCode\ObjectDetection\yolov9-main\train_dual.py", line 97, in train data_dict = data_dict or check_dataset(data) # check if None File "E:\pythonCode\ObjectDetection\yolov9-main\utils\general.py", line 537, in check_dataset raise Exception('Dataset not found ❌') Exception: Dataset not found ❌
path: D:/Deep_Learning_DataSet/Object_Detection_DataSet/Foggy_Cityscapes/beta_0.02
train: D:/Deep_Learning_DataSet/Object_Detection_DataSet/Foggy_Cityscapes/beta_0.02/images/train
val: D:/Deep_Learning_DataSet/Object_Detection_DataSet/Foggy_Cityscapes/beta_0.02/images/val
#test: test-dev2017.txt
# Classes
names:
0: car
1: person
2: rider
3: truck
4: bus
5: train
6: motorcycle
7: bicycle
6、结果可视化
运行以下代码,将图片与对应的标注信息结合,得到带有目标边界框的图像,不要忘记修改地址
import cv2
import os
# 图片路径
image_path = '../beta_0.02/images/train/aachen_000010_000019_leftImg8bit_foggy_beta_0.02.png'
# YOLO注释文件路径
annotation_path = '../beta_0.02/labels/train/aachen_000010_000019_leftImg8bit_foggy_beta_0.02.txt'
# 读取YOLO注释文件
with open(annotation_path, 'r') as file:
lines = file.readlines()
# 读取图片
image = cv2.imread(image_path)
# 禁用窗口缩放
cv2.namedWindow('Image with Bounding Boxes', cv2.WINDOW_NORMAL)
# 类别名称列表
# class_names = ['car', 'person', 'rider', 'truck', 'bus', 'train', 'motorcycle', 'bicycle']
# 类别名称与ID的映射字典
class_dict = {0: 'car', 1: 'person', 2: 'rider', 3: 'truck', 4: 'bus', 5: 'train', 6: 'motorcycle', 7: 'bicycle'}
# 绘制边界框和类别标签
for line in lines:
parts = line.strip().split()
class_id = int(parts[0])
print(f"class_id:{class_id}")
x_center = float(parts[1])
y_center = float(parts[2])
width = float(parts[3])
height = float(parts[4])
# 将归一化的坐标转换为像素坐标
x_min = int((x_center - width / 2) * image.shape[1])
y_min = int((y_center - height / 2) * image.shape[0])
x_max = int((x_center + width / 2) * image.shape[1])
y_max = int((y_center + height / 2) * image.shape[0])
# 获取类别名称
class_name = class_dict[class_id]
# 绘制边界框
cv2.rectangle(image, (x_min, y_min), (x_max, y_max), (0, 255, 0), 2)
# 绘制类别标签
cv2.putText(image, class_name, (x_min, y_min - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)
print(image.shape)
# 显示图片
cv2.imshow('Image with Bounding Boxes', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
效果如下所示:
7、使用YOLOv9-m进行训练
我的GPU是4060Laptop,8GB显存,使用YOLOv9-m,batchsize=4,刚好可以训练,再多就爆显存了。2975训练集、500验证集。
8、个人下载方式
通过百度网盘分享的文件:Foggy_Cityscapes
链接:https://pan.baidu.com/s/1NgOw9MjW3pMwEO7WAowP8Q?pwd=4ekd
提取码:4ekd
如果链接失效了,评论区告诉我一声哈。