1. BEV与Occupancy联合训练环境搭建

任务目标

搭建一个支持BEV与Occupancy联合训练的最小可复现开发环境,覆盖GPU驱动与CUDA配置、核心依赖安装,并通过加载一个合成Occupancy数据批次验证数据管线可用。本案例不涉及具体模型训练,只保证环境与数据加载闭环成立。

环境需求

  • Ubuntu 20.04/22.04,NVIDIA GPU(驱动版本≥470)
  • CUDA 11.3+,PyTorch 1.10+(需与CUDA匹配)
  • Python 3.8+,建议使用conda创建独立虚拟环境

安装步骤

# 1. 创建虚拟环境
conda create -n bev_occ python=3.8 -y
conda activate bev_occ

# 2. 安装PyTorch(以CUDA 11.3为例,请按实际驱动版本调整)
pip install torch==1.12.1+cu113 torchvision==0.13.1+cu113 -f https://download.pytorch.org/whl/torch_stable.html

# 3. 安装BEV与Occupancy训练所需核心库
pip install numpy==1.23.5 scipy opencv-python-headless pyyaml tensorboard
pip install nuscenes-devkit==1.1.10  # 用于处理nuScenes格式数据(若使用自定义数据可跳过)

# 4. 验证CUDA可用性
python -c "import torch; print('CUDA available:', torch.cuda.is_available()); print('Device:', torch.cuda.get_device_name(0))"

若输出CUDA available: True且能识别GPU型号,说明GPU与CUDA配置成功。若为False,请检查驱动版本与PyTorch的CUDA版本是否匹配。

数据加载验证代码

以下代码构造一个模拟的Occupancy标注批次(尺寸与真实nuScenes Occupancy任务一致),并验证数据张量格式与设备迁移是否正确。该代码不依赖外部数据集,可直接运行。

import torch
import numpy as np

def create_synthetic_occupancy_batch(batch_size=2, grid_size=(200, 200, 16), num_classes=11):
    """
    生成模拟的Occupancy标签与对应的BEV特征。
    实际训练中,BEV特征来自图像/激光雷达编码器,此处用随机张量代替。
    """
    # BEV特征: [B, C, H, W],C为特征通道数
    bev_features = torch.randn(batch_size, 64, grid_size[0], grid_size[1])
    
    # Occupancy标签: [B, H, W, Z],每个体素为类别ID(0=空,1-10为语义类别)
    occ_labels = np.random.randint(0, num_classes, size=(batch_size, *grid_size))
    occ_labels = torch.from_numpy(occ_labels).long()
    
    return bev_features, occ_labels

def verify_data_pipeline():
    """验证数据批次能否正确加载并迁移到GPU"""
    device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
    print(f'Using device: {device}')
    
    # 生成模拟批次
    bev_feats, occ_labels = create_synthetic_occupancy_batch()
    print(f'BEV features shape: {bev_feats.shape}')
    print(f'Occupancy labels shape: {occ_labels.shape}')
    
    # 迁移到计算设备
    bev_feats = bev_feats.to(device)
    occ_labels = occ_labels.to(device)
    
    # 验证数据完整性
    assert bev_feats.shape[0] == occ_labels.shape[0], "Batch size mismatch"
    assert occ_labels.dtype == torch.long, "Labels must be integer type"
    
    # 检查类别分布(仅用于验证数据有效性)
    unique_classes = torch.unique(occ_labels.cpu())
    print(f'Occupancy classes present: {unique_classes.tolist()}')
    
    # 模拟一次前向传播的输入准备(此处仅验证维度匹配)
    dummy_output = torch.randn(occ_labels.shape[0], 11, *grid_size).to(device)
    loss = torch.nn.functional.cross_entropy(dummy_output, occ_labels)
    print(f'Cross-entropy loss (dummy): {loss.item():.4f}')
    
    print('Data pipeline verification PASSED')

if __name__ == '__main__':
    grid_size = (200, 200, 16)  # 与函数默认值一致
    verify_data_pipeline()

运行与验证

python verify_data_pipeline.py

通过条件:程序无异常退出,输出包含以下关键信息:

  • BEV features shape: torch.Size([2, 64, 200, 200])
  • Occupancy labels shape: torch.Size([2, 200, 200, 16])
  • Cross-entropy loss (dummy): 2.39xx(数值因随机初始化略有不同)
  • 最后一行输出Data pipeline verification PASSED

若出现CUDA out of memory,可减小batch_size或grid_size;若出现AssertionError,请检查PyTorch与numpy版本兼容性。

常见问题

  • CUDA不可用:运行nvidia-smi确认驱动正常,再检查torch.version.cuda是否与驱动支持的CUDA版本匹配。
  • nuscenes-devkit安装失败:若仅使用合成数据验证,可跳过该依赖;实际训练时再安装。
  • 内存不足:Occupancy标签为int64类型,200³体素约需64MB/样本,请确保GPU显存≥8GB。