汽车道路分割检测数据集 道路分割 9000张 voc yolo coco 道路语义分割数据集 道路分割数据集 道路语义分割数据集 语义分割检测数据集 26类9000张
道路分割检测数据集
类别:计算机视觉、语义分割、物体检测、智能交通系统
用途:该数据集专为训练和评估用于道路场景中各种对象的语义分割和物体检测的机器学习模型而设计。通过这些数据,可以开发出高效且准确的道路分割和物体检测系统,帮助交通管理部门进行实时监控、优化交通流以及提高道路使用效率。
项目特点
- 真实场景:图像采集自实际的道路环境,确保了数据集的实用性和代表性。
- 详细标注:每张图像都附有详细的边界框标注(Bounding Box)和像素级语义分割标注。
- 多样性:数据集中包含了不同光照条件、天气状况、时间点下的道路图像,有助于提高模型的泛化能力。
- 多类别支持:涵盖26种不同的道路场景中的对象类型,适用于多种应用场景。
- 实用性:专注于智能交通系统的实际问题,具有较高的应用价值。
项目结构
road_segmentation_dataset/
├── images/ # 图像文件夹
│ ├── pic_0001.jpg # 道路图像
│ ├── pic_0002.jpg
│ └── ...
├── annotations/ # 标注文件夹
│ ├── pic_0001.txt # 对应图像的YOLO格式边界框标注
│ ├── pic_0002.txt
│ └── ...
├── masks/ # 语义分割掩码文件夹
│ ├── pic_0001_mask.png # 对应图像的语义分割掩码
│ ├── pic_0002_mask.png
│ └── ...
└── README.md # 项目说明文档
- images/:存放所有的道路图像。
- annotations/:存放每个图像对应的YOLO格式边界框标注。
- masks/:存放每个图像对应的像素级语义分割掩码。
- README.md:项目说明文档,包含数据集的详细介绍、使用方法和注意事项。
数据集内容
- 图像数量:9000张
- 图像格式:JPEG
- 标注格式:
- 边界框:YOLO格式(文本文件)
- 语义分割:PNG格式掩码
- 目标类别:
person
:行人auto_rickshaw
:三轮车three_wheeler
:三轮车motorbike
:摩托车road
:道路road_divider
:道路分隔线pole
:杆bicycle
:自行车car
:汽车truck
:卡车bus
:公交车construction_vehicle
:施工车辆priority_vehicle
:优先车辆cart_vehicle
:手推车building
:建筑物vegetation
:植被road_sign
:路标wall
:墙sky
:天空over_bridge
:高架桥sidewalk
:人行道garbage_bin
:垃圾桶animal
:动物billboard
:广告牌traffic_light
:交通信号灯wheelchair
:轮椅
标注信息
-
边界框:每个目标在图像中的位置,用中心点坐标(x, y)以及宽度w和高度h表示。
-
类别ID:每个类别的唯一标识符,通常在YOLO格式中标注为整数。
-
标注格式示例:
class_id x_center y_center width height
其中,
x_center
,y_center
,width
,height
都是相对于图像尺寸的归一化值,范围在0到1之间。 -
语义分割掩码:每个像素对应一个类别ID,形成一个与原图大小相同的掩码图像。
使用场景
- 交通监控:自动检测和分类道路上的各种对象,辅助交通管理部门进行实时监控。
- 交通优化:帮助交通工程师分析交通流量,优化信号灯控制和路线规划。
- 智能交通系统:集成到智能交通系统中,实现自动化交通管理。
- 科学研究:用于计算机视觉和物体检测领域的研究,分析道路场景检测技术的性能。
数据集统计
类别名称 | 图像数量 (pic_num) | 边界框数量 (box_num) |
---|---|---|
person | 6377 | 20428 |
auto_rickshaw | 5975 | 11714 |
three_wheeler | 4142 | 8334 |
motorbike | 2005 | 3089 |
road | 8565 | 10545 |
road_divider | 2866 | 5030 |
pole | 3798 | 9382 |
bicycle | 675 | 744 |
car | 2243 | 3393 |
truck | 1327 | 1724 |
bus | 1042 | 1463 |
construction_vehicle | 20 | 20 |
priority_vehicle | 158 | 171 |
cart_vehicle | 199 | 230 |
building | 8 | 25 |
vegetation | 10 | 45 |
road_sign | 842 | 1621 |
wall | 4 | 19 |
sky | 3499 | 7058 |
over_bridge | 185 | 239 |
sidewalk | 782 | 993 |
garbage_bin | 4 | 4 |
animal | 27 | 31 |
billboard | 105 | 162 |
traffic_light | 7 | 7 |
wheelchair | 3 | 3 |
总计 | 9055 | 86474 |
如何使用数据集
1. 数据加载
使用Python中的os
模块遍历图像、标注文件和语义分割掩码,并读取相关信息。
import os
import cv2
import numpy as np
def load_data(data_dir):
image_dir = os.path.join(data_dir, 'images')
annotation_dir = os.path.join(data_dir, 'annotations')
mask_dir = os.path.join(data_dir, 'masks')
images = []
labels = []
masks = []
for img_file in os.listdir(image_dir):
if img_file.endswith('.jpg'):
img_path = os.path.join(image_dir, img_file)
ann_path = os.path.join(annotation_dir, img_file.replace('.jpg', '.txt'))
mask_path = os.path.join(mask_dir, img_file.replace('.jpg', '_mask.png'))
# 读取图像
image = cv2.imread(img_path)
images.append(image)
# 读取标注
with open(ann_path, 'r') as f:
lines = f.readlines()
boxes = [list(map(float, line.strip().split())) for line in lines]
labels.append(boxes)
# 读取语义分割掩码
mask = cv2.imread(mask_path, cv2.IMREAD_GRAYSCALE)
masks.append(mask)
return images, labels, masks
# 示例调用
data_dir = 'road_segmentation_dataset'
images, labels, masks = load_data(data_dir)
# 显示示例图像、标注和掩码
for i in range(5): # 显示前5张图像
image = images[i]
h, w, _ = image.shape
boxes = labels[i]
mask = masks[i]
for box in boxes:
class_id, x_center, y_center, box_width, box_height = box
x1 = int((x_center - box_width / 2) * w)
y1 = int((y_center - box_height / 2) * h)
x2 = int((x_center + box_width / 2) * w)
y2 = int((y_center + box_height / 2) * h)
# 绘制边界框
cv2.rectangle(image, (x1, y1), (x2, y2), (0, 255, 0), 2)
# 显示语义分割掩码
mask_color = cv2.applyColorMap(mask, cv2.COLORMAP_JET)
combined = cv2.addWeighted(image, 0.7, mask_color, 0.3, 0)
cv2.imshow('Image with Bounding Boxes and Mask', combined)
cv2.waitKey(0)
cv2.destroyAllWindows()
2. 数据预处理
- 图像缩放:将图像和标注边界框缩放到统一尺寸。
- 数据增强:进行随机裁剪、旋转、翻转等操作以增加模型的鲁棒性。
- 归一化:对图像进行归一化处理,使其适合输入到深度学习模型中。
from torchvision import transforms
import torch
import numpy as np
# 定义数据预处理变换
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Resize((416, 416)), # YOLO常用的输入尺寸
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
# 应用预处理变换
def preprocess_data(images, labels, masks):
preprocessed_images = [transform(cv2.cvtColor(image, cv2.COLOR_BGR2RGB)) for image in images]
preprocessed_labels = []
preprocessed_masks = [transforms.ToTensor()(mask) for mask in masks]
for label in labels:
new_boxes = []
for box in label:
class_id, x_center, y_center, box_width, box_height = box
new_boxes.append([class_id, x_center, y_center, box_width, box_height])
preprocessed_labels.append(new_boxes)
return preprocessed_images, preprocessed_labels, preprocessed_masks
# 示例调用
preprocessed_images, preprocessed_labels, preprocessed_masks = preprocess_data(images, labels, masks)
3. 模型训练
选择合适的物体检测模型(如YOLOv5)和语义分割模型(如U-Net、DeepLabV3+),并使用深度学习框架(如PyTorch)进行训练。
示例:使用PyTorch和YOLOv5进行物体检测训练
首先,安装必要的库:
pip install torch torchvision
pip install -U git+https://github.com/ultralytics/yolov5
然后,编写训练代码:
import torch
from yolov5.models.yolo import Model
from yolov5.utils.datasets import LoadImagesAndLabels
from yolov5.utils.general import non_max_suppression, scale_coords
from yolov5.utils.torch_utils import select_device
# 加载预训练模型
model = Model('yolov5s.yaml').cuda() # 假设使用CUDA设备
weights = 'yolov5s.pt' # 下载YOLOv5预训练权重
model.load_state_dict(torch.load(weights, map_location=device)['model'].state_dict())
# 修改输出层以适应26类检测
model.model[-1].nc = 26 # 设置类别数为26
model.model[-1].anchors = model.model[-1].anchors[:26] # 只保留26个anchor
# 设备
device = select_device('')
model.to(device).train()
# 优化器
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
# 训练数据加载
dataset = LoadImagesAndLabels(path='road_segmentation_dataset/images', label_dir='road_segmentation_dataset/annotations', img_size=416, batch_size=4, augment=True)
dataloader = torch.utils.data.DataLoader(dataset, batch_size=4, num_workers=4, pin_memory=True, collate_fn=LoadImagesAndLabels.collate_fn)
# 损失函数
criterion = model.loss
# 训练循环
num_epochs = 10
for epoch in range(num_epochs):
running_loss = 0.0
for i, (imgs, targets, paths, _) in enumerate(dataloader):
imgs = imgs.to(device).float() / 255.0 # 归一化
targets = targets.to(device)
optimizer.zero_grad()
outputs = model(imgs)
loss, loss_items = criterion(outputs, targets)
loss.backward()
optimizer.step()
running_loss += loss.item()
print(f"Epoch {epoch+1}/{num_epochs}, Loss: {running_loss / len(dataloader)}")
print("Training complete.")
示例:使用PyTorch和U-Net进行语义分割训练
首先,安装必要的库:
pip install torch torchvision
pip install segmentation-models-pytorch
然后,编写训练代码:
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader
from torchvision import transforms
from segmentation_models_pytorch import Unet
from segmentation_models_pytorch.utils import set_trainable
from segmentation_models_pytorch.utils.metrics import IoU
# 定义数据集类
class RoadSegmentationDataset(torch.utils.data.Dataset):
def __init__(self, images, masks, transform=None):
self.images = images
self.masks = masks
self.transform = transform
def __len__(self):
return len(self.images)
def __getitem__(self, idx):
image = self.images[idx]
mask = self.masks[idx]
if self.transform:
image = self.transform(image)
mask = self.transform(mask)
return image, mask
# 数据集转换
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Resize((256, 256))
])
dataset = RoadSegmentationDataset(preprocessed_images, preprocessed_masks, transform=transform)
dataloader = DataLoader(dataset, batch_size=4, shuffle=True, num_workers=4)
# 加载U-Net模型
model = Unet(encoder_name='resnet34', encoder_weights='imagenet', classes=26, activation=None)
model = model.cuda()
# 优化器
optimizer = optim.Adam(model.parameters(), lr=0.001)
criterion = nn.CrossEntropyLoss()
# 训练循环
num_epochs = 10
iou_metric = IoU(threshold=0.5)
for epoch in range(num_epochs):
model.train()
running_loss = 0.0
for i, (inputs, targets) in enumerate(dataloader):
inputs = inputs.to(device)
targets = targets.squeeze(1).long().to(device)
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, targets)
loss.backward()
optimizer.step()
running_loss += loss.item()
print(f"Epoch {epoch+1}/{num_epochs}, Loss: {running_loss / len(dataloader)}")
print("Training complete.")
4. 模型评估
- 在验证集上评估模型的性能。
- 计算mAP(平均精度均值)、IoU(交并比)等指标。
- 可视化检测结果和分割结果以直观地检查模型的表现。
# 评估函数
def evaluate_model(model, dataloader, device):
model.eval()
all_detections = []
all_ground_truths = []
with torch.no_grad():
for imgs, targets, _, _ in dataloader:
imgs = imgs.to(device).float() / 255.0
targets = targets.to(device)
outputs = model(imgs)
predictions = non_max_suppression(outputs, conf_thres=0.4, iou_thres=0.5)
for pred, target in zip(predictions, targets):
if pred is not None and len(pred) > 0:
all_detections.append(pred.cpu().numpy())
else:
all_detections.append([])
all_ground_truths.append(target.cpu().numpy())
# 计算mAP和其他指标
# 这里需要根据实际情况实现计算逻辑
# 例如使用COCO API或Pascal VOC评价工具
# 示例调用
evaluate_model(model, dataloader, device)
5. 部署与应用
- 将训练好的模型部署到实际应用中。
- 通过实时处理道路图像,提供即时的物体检测和语义分割结果。
注意事项
- 数据平衡:确保数据集中各类别的样本分布相对均衡。
- 数据增强:考虑使用数据增强技术来增加模型的鲁棒性。
- 超参数调整:根据实际情况调整学习率、批次大小等超参数以获得最佳性能。
- 模型选择:根据硬件资源和实际需求选择合适的模型架构。
项目总结
这个道路分割检测数据集提供了丰富的资源,支持各种检测任务。通过高质量的图像和详细的边界框标注及语义分割掩码,研究人员可以开发出高效且准确的目标检测和语义分割模型,应用于多个领域。希望这个数据集能促进更多创新性的研究和技术进步。
标签:分割,mask,语义,masks,道路,images,import,model From: https://blog.csdn.net/ALiLiLiYa/article/details/143087809