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。