共计 1875 个字符,预计需要花费 5 分钟才能阅读完成。
背景介绍
BDD100K 是伯克利大学发布的自动驾驶场景数据集,包含 10 万张高清道路图像,覆盖不同天气、光照和地理环境。其语义分割标注精细到 30+ 类别(如道路、车辆、行人等),特别适合训练鲁棒的驾驶感知模型。数据集中的复杂场景能有效检验模型在真实世界的泛化能力。

数据预处理
目录结构解析
下载解压后主要目录如下:
images/:包含训练集(7 万)、验证集(1 万)、测试集(2 万)的 JPEG 图像labels/:存储与图像对应的 JSON 标注文件drivable_maps/:可驾驶区域的分割掩码(PNG 格式)
JSON 标注处理
关键代码示例(Python):
import json
import numpy as np
def parse_annotations(json_path):
with open(json_path) as f:
data = json.load(f)
# 初始化全零掩码
h, w = data['image']['height'], data['image']['width']
mask = np.zeros((h, w), dtype=np.uint8)
# 填充标注多边形
for obj in data['annotations']:
if obj['category'] == 'road':
polygon = np.array(obj['poly2d'][0]['vertices']).astype(int)
cv2.fillPoly(mask, [polygon], 1)
return mask
数据增强策略
使用 Torchvision 的 Compose 实现:
from torchvision import transforms
train_transform = transforms.Compose([transforms.RandomHorizontalFlip(p=0.5),
transforms.ColorJitter(brightness=0.3, contrast=0.3),
transforms.RandomAffine(degrees=15, translate=(0.1, 0.1)),
transforms.ToTensor()])
模型训练
架构对比
- UNet:轻量级编码器 - 解码器结构,适合快速原型开发
- DeepLabV3+:使用空洞卷积保持分辨率,对大物体分割更准确
- PSPNet:金字塔池化模块捕获多尺度上下文
PyTorch 训练循环
基础框架代码:
import torch
import torch.nn as nn
model = UNet(in_channels=3, num_classes=30)
optimizer = torch.optim.Adam(model.parameters(), lr=1e-4)
criterion = nn.CrossEntropyLoss(ignore_index=255)
for epoch in range(100):
for images, masks in train_loader:
outputs = model(images.cuda())
loss = criterion(outputs, masks.long().cuda())
optimizer.zero_grad()
loss.backward()
optimizer.step()
损失函数选择
- 交叉熵:对类别均衡数据表现稳定
- Dice Loss:应对类别不平衡时效果显著,计算公式:
$$Dice = \frac{2|X \cap Y|}{|X| + |Y|}$$
避坑指南
- 内存不足:
- 使用
torch.utils.data.DataLoader的pin_memory和num_workers参数加速加载 -
采用梯度累积技术(每 4 个 batch 更新一次权重)
-
类别不平衡:
- 在损失函数中为稀有类别设置更高权重
-
采用过采样策略增强小类别数据
-
mIoU 计算:
- 注意忽略
void类别(通常标记为 255) - 验证时使用
torch.no_grad()减少内存占用
部署优化
- 模型量化 :使用
torch.quantization将 FP32 转为 INT8,体积缩小 4 倍 - ONNX 导出:实现跨平台部署
torch.onnx.export( model, dummy_input, "model.onnx", opset_version=11 )
延伸思考
- 如何设计针对雨天场景的特化数据增强策略?
- 当标注存在噪声时(如边缘模糊),怎样改进损失函数?
- 对于实时性要求高的车载设备,有哪些模型压缩技巧?
实战中发现,合理调整学习率衰减策略(如 Cosine 退火)能使模型收敛更稳定。建议初始尝试 0.001 的学习率,每 20 个 epoch 衰减为原来的 1 /10。
正文完
