BDD100K数据集图像分割实战:从数据预处理到模型训练的全流程指南

1次阅读
没有评论

共计 1875 个字符,预计需要花费 5 分钟才能阅读完成。

image.webp

背景介绍

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

BDD100K 数据集图像分割实战:从数据预处理到模型训练的全流程指南

数据预处理

目录结构解析

下载解压后主要目录如下:

  • 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|}$$

避坑指南

  1. 内存不足
  2. 使用 torch.utils.data.DataLoaderpin_memorynum_workers 参数加速加载
  3. 采用梯度累积技术(每 4 个 batch 更新一次权重)

  4. 类别不平衡

  5. 在损失函数中为稀有类别设置更高权重
  6. 采用过采样策略增强小类别数据

  7. mIoU 计算

  8. 注意忽略 void 类别(通常标记为 255)
  9. 验证时使用 torch.no_grad() 减少内存占用

部署优化

  • 模型量化 :使用torch.quantization 将 FP32 转为 INT8,体积缩小 4 倍
  • ONNX 导出:实现跨平台部署
    torch.onnx.export(
        model, 
        dummy_input, 
        "model.onnx", 
        opset_version=11
    )

延伸思考

  1. 如何设计针对雨天场景的特化数据增强策略?
  2. 当标注存在噪声时(如边缘模糊),怎样改进损失函数?
  3. 对于实时性要求高的车载设备,有哪些模型压缩技巧?

实战中发现,合理调整学习率衰减策略(如 Cosine 退火)能使模型收敛更稳定。建议初始尝试 0.001 的学习率,每 20 个 epoch 衰减为原来的 1 /10。

正文完
 0
评论(没有评论)