自动驾驶路面分类数据集,按照不同的天气条件,即干燥、湿润、水上、新雪、融化的雪和冰。不同的道路材料属性包括沥青、混凝土、泥浆和碎石。不同的道路平整性分为光滑、轻微不平和严重不平。共27类,37万张图像,13GB数据
自动驾驶路面分类数据集
类别:图像分类
用途:用于训练和评估基于深度学习的路面分类模型,特别适用于自动驾驶系统中的路面条件识别。该数据集涵盖了多种天气条件、道路材料属性和道路平整性,旨在提高自动驾驶车辆在不同环境下的感知能力。
数据集内容
- 总图像数量:370,000张
- 数据大小:13GB
- 类别数量:27类
- 标注格式:每张图像对应一个标签,表示其所属的路面类型。
图像来源
该数据集由高分辨率的道路图像组成,这些图像是从不同的地理区域和季节采集的,以确保模型能够适应各种实际应用场景。图像覆盖了多种天气条件、道路材料属性和道路平整性。
类别定义
根据不同的天气条件、道路材料属性和道路平整性,数据集被划分为以下27个类别:
-
天气条件:
- 干燥 (Dry)
- 湿润 (Wet)
- 水上 (Water)
- 新雪 (Fresh Snow)
- 融化的雪 (Melting Snow)
- 冰 (Ice)
-
道路材料属性:
- 沥青 (Asphalt)
- 混凝土 (Concrete)
- 泥浆 (Mud)
- 碎石 (Gravel)
-
道路平整性:
- 光滑 (Smooth)
- 轻微不平 (Slightly Uneven)
- 严重不平 (Severely Uneven)
通过组合上述三个维度,可以生成27个不同的路面类别。例如:
- 干燥沥青光滑 (Dry Asphalt Smooth)
- 湿润混凝土轻微不平 (Wet Concrete Slightly Uneven)
- 水上泥浆严重不平 (Water Mud Severely Uneven)
数据集特点
-
多样性:
- 天气条件:涵盖干燥、湿润、水上、新雪、融化的雪和冰等多种天气条件。
- 道路材料属性:包括沥青、混凝土、泥浆和碎石等不同材料。
- 道路平整性:分为光滑、轻微不平和严重不平三种情况。
- 地理分布:图像来自不同的地理区域,确保模型具有广泛的适用性。
-
标注质量:
- 所有图像均由专业人员手动标注,确保高精度。
- 每个图像都有一个明确的标签,标识其所属的路面类型。
-
应用场景:
- 自动驾驶:支持自动驾驶车辆在不同路面条件下进行精确的感知和决策。
- 路况监测:辅助交通管理部门实时监测和维护道路状况。
- 智能交通系统:帮助智能交通系统优化路线规划和交通管理。
数据集结构
road_surface_dataset/
├── images/
│ ├── train/
│ │ ├── 000001.jpg
│ │ ├── 000002.jpg
│ │ └── ...
│ ├── val/
│ │ ├── 000001.jpg
│ │ ├── 000002.jpg
│ │ └── ...
├── labels/
│ ├── train/
│ │ ├── 000001.txt
│ │ ├── 000002.txt
│ │ └── ...
│ ├── val/
│ │ ├── 000001.txt
│ │ ├── 000002.txt
│ │ └── ...
└── data.yaml
- images/:存放所有图像文件。
- labels/:存放对应的标签文件,每张图像都有一个对应的
.txt
文件,其中包含图像的标签信息。 - data.yaml:提供数据集的详细说明,包括使用方法、引用要求等。
标签文件格式
每个标签文件(例如000001.txt
)中,仅包含一行文本,表示图像的类别索引。例如:
12
- 类别索引:根据
data.yaml
中的类别顺序,从0开始编号。
data.yaml
文件示例
# data.yaml
train: road_surface_dataset/images/train
val: road_surface_dataset/images/val
nc: 27 # number of classes
names: [
'Dry Asphalt Smooth',
'Dry Asphalt Slightly Uneven',
'Dry Asphalt Severely Uneven',
'Dry Concrete Smooth',
'Dry Concrete Slightly Uneven',
'Dry Concrete Severely Uneven',
'Dry Mud Smooth',
'Dry Mud Slightly Uneven',
'Dry Mud Severely Uneven',
'Dry Gravel Smooth',
'Dry Gravel Slightly Uneven',
'Dry Gravel Severely Uneven',
'Wet Asphalt Smooth',
'Wet Asphalt Slightly Uneven',
'Wet Asphalt Severely Uneven',
'Wet Concrete Smooth',
'Wet Concrete Slightly Uneven',
'Wet Concrete Severely Uneven',
'Wet Mud Smooth',
'Wet Mud Slightly Uneven',
'Wet Mud Severely Uneven',
'Wet Gravel Smooth',
'Wet Gravel Slightly Uneven',
'Wet Gravel Severely Uneven',
'Water Asphalt Smooth',
'Water Asphalt Slightly Uneven',
'Water Asphalt Severely Uneven'
]
训练代码
我们将使用PyTorch和常见的图像分类模型(如ResNet50)来训练这个数据集。首先,确保您已经安装了必要的库:
pip install torch torchvision numpy opencv-python matplotlib
接下来,创建一个Python脚本(例如train_road_surface.py
),并在其中编写以下代码来训练模型:
import os
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, Dataset
from torchvision import transforms, models
from PIL import Image
import numpy as np
# 定义数据集类
class RoadSurfaceDataset(Dataset):
def __init__(self, image_dir, label_dir, transform=None):
self.image_dir = image_dir
self.label_dir = label_dir
self.transform = transform
self.image_names = [f for f in os.listdir(image_dir) if f.endswith('.jpg')]
def __len__(self):
return len(self.image_names)
def __getitem__(self, idx):
img_name = self.image_names[idx]
img_path = os.path.join(self.image_dir, img_name)
label_path = os.path.join(self.label_dir, img_name.replace('.jpg', '.txt'))
# 读取图像
image = Image.open(img_path).convert('RGB')
# 读取标签
with open(label_path, 'r') as f:
label = int(f.read().strip())
if self.transform:
image = self.transform(image)
return image, label
# 数据预处理
transform = transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
# 创建数据加载器
train_dataset = RoadSurfaceDataset(
image_dir='road_surface_dataset/images/train',
label_dir='road_surface_dataset/labels/train',
transform=transform
)
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True, num_workers=4)
val_dataset = RoadSurfaceDataset(
image_dir='road_surface_dataset/images/val',
label_dir='road_surface_dataset/labels/val',
transform=transform
)
val_loader = DataLoader(val_dataset, batch_size=32, shuffle=False, num_workers=4)
# 定义模型
model = models.resnet50(pretrained=True)
num_features = model.fc.in_features
model.fc = nn.Linear(num_features, 27) # 27个类别
model = model.cuda()
# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
# 训练函数
def train_model(model, dataloaders, criterion, optimizer, num_epochs=25):
best_acc = 0.0
for epoch in range(num_epochs):
print(f'Epoch {epoch}/{num_epochs - 1}')
print('-' * 10)
for phase in ['train', 'val']:
if phase == 'train':
model.train()
else:
model.eval()
running_loss = 0.0
running_corrects = 0
for inputs, labels in dataloaders[phase]:
inputs = inputs.cuda()
labels = labels.cuda()
optimizer.zero_grad()
with torch.set_grad_enabled(phase == 'train'):
outputs = model(inputs)
_, preds = torch.max(outputs, 1)
loss = criterion(outputs, labels)
if phase == 'train':
loss.backward()
optimizer.step()
running_loss += loss.item() * inputs.size(0)
running_corrects += torch.sum(preds == labels.data)
epoch_loss = running_loss / len(dataloaders[phase].dataset)
epoch_acc = running_corrects.double() / len(dataloaders[phase].dataset)
print(f'{phase} Loss: {epoch_loss:.4f} Acc: {epoch_acc:.4f}')
if phase == 'val' and epoch_acc > best_acc:
best_acc = epoch_acc
best_model_wts = model.state_dict()
print(f'Best val Acc: {best_acc:.4f}')
model.load_state_dict(best_model_wts)
return model
# 训练模型
dataloaders = {'train': train_loader, 'val': val_loader}
model = train_model(model, dataloaders, criterion, optimizer, num_epochs=25)
# 保存模型
torch.save(model.state_dict(), 'best_road_surface_model.pth')
运行训练
在终端中运行以下命令来启动训练:
python train_road_surface.py
训练过程中的注意事项
- 硬件要求:训练大型数据集需要较强的计算能力,建议使用GPU。如果您的机器没有GPU,可以考虑使用云服务。
- 超参数调整:根据您的数据集特点和硬件条件,可能需要调整
batch_size
、learning_rate
和num_epochs
等超参数。 - 预训练权重:我们使用了预训练的ResNet50模型,这有助于加快收敛速度并提高性能。
- 日志和可视化:您可以添加更多的日志记录和可视化工具(如TensorBoard)来监控训练进度。
训练时间
训练时间取决于多个因素,包括:
- 硬件配置:GPU的型号和数量。
- 批量大小:较大的批量大小通常会加快训练速度,但需要更多的内存。
- 图像尺寸:较大的图像尺寸会增加训练时间。
- 训练轮数:更多的训练轮数会增加训练时间。
在典型的设置下(例如,使用NVIDIA RTX 3090 GPU,批量大小为32,图像尺寸为224x224,训练25轮),训练可能需要几个小时到一天不等。具体的训练时间可以通过查看训练日志来估计。
通过以上步骤,您可以开始训练自动驾驶路面分类模型。希望这能帮助您顺利完成训练任务!
标签:Dry,Uneven,image,路面,train,不平,Wet,model,数据 From: https://blog.csdn.net/2401_86889530/article/details/143032166