================================================================================ BEVFusion 项目调用关系流程图 ================================================================================ ┌─────────────────────────────────────────────────────────────────────────┐ │ 训练流程 (tools/train.py) │ └─────────────────────────────────────────────────────────────────────────┘ │ ┌────────────────────┼────────────────────┐ │ │ │ ▼ ▼ ▼ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │ 加载配置文件 │ │ 初始化分布式 │ │ 设置随机种子 │ │ (YAML) │ │ (torchpack) │ │ (seed) │ └───────────────┘ └───────────────┘ └───────────────┘ │ ▼ ┌───────────────────────────────────────┐ │ build_dataset() → NuScenesDataset │ │ ├── LoadMultiViewImageFromFiles │ │ ├── LoadPointsFromFile/FromMultiSweeps│ │ ├── LoadAnnotations3D │ │ ├── ObjectSample (数据增强) │ │ ├── RandomFlip3D │ │ ├── GlobalRotScaleTrans │ │ └── Normalize, Pad, FormatBundle │ └───────────────────────────────────────┘ │ ▼ ┌───────────────────────────────────────┐ │ build_model() → BEVFusion Model │ │ (见下方模型结构详图) │ └───────────────────────────────────────┘ │ ▼ ┌───────────────────────────────────────┐ │ train_model() │ │ ├── EpochBasedRunner │ │ ├── Optimizer (AdamW) │ │ ├── LrScheduler (OneCycle) │ │ ├── Checkpoint Hook │ │ ├── Evaluation Hook │ │ └── Logger Hook │ └───────────────────────────────────────┘ ================================================================================ ┌─────────────────────────────────────────────────────────────────────────┐ │ BEVFusion 模型结构详图 │ └─────────────────────────────────────────────────────────────────────────┘ 输入数据: ┌──────────────────────┐ ┌──────────────────────┐ ┌──────────────────┐ │ 多视角图像 (6个) │ │ LiDAR点云 │ │ Radar点云(可选) │ │ (B,6,3,H,W) │ │ List[Points(N,C)] │ │ List[Points] │ └──────────────────────┘ └──────────────────────┘ └──────────────────┘ │ │ │ │ │ │ ▼ ▼ ▼ ┌─────────────────────────────────────────────────────────────────────────┐ │ ENCODERS (编码器) │ ├─────────────────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────────────────┐ ┌──────────────────┐ ┌─────────────────┐│ │ │ Camera Encoder │ │ LiDAR Encoder │ │ Radar Encoder ││ │ ├─────────────────────────┤ ├──────────────────┤ ├─────────────────┤│ │ │ │ │ │ │ ││ │ │ ┌─────────────────┐ │ │ ┌──────────────┐ │ │ ┌─────────────┐││ │ │ │ Backbone │ │ │ │ Voxelize │ │ │ │ Voxelize │││ │ │ │ - ResNet50 │ │ │ │ - Hard/ │ │ │ │ - Dynamic │││ │ │ │ - ResNet101 │ │ │ │ Dynamic │ │ │ │ Scatter │││ │ │ │ - SwinTransformer│ │ │ └──────┬───────┘ │ │ └──────┬──────┘││ │ │ │ - VoVNet │ │ │ │ │ │ │ ││ │ │ └────────┬──────────┘ │ │ ▼ │ │ ▼ ││ │ │ │ │ │ ┌──────────────┐ │ │ ┌─────────────┐││ │ │ ▼ │ │ │ Backbone │ │ │ │ Backbone │││ │ │ ┌─────────────────┐ │ │ │ Sparse │ │ │ │ Radar │││ │ │ │ Neck (FPN) │ │ │ │ Encoder │ │ │ │ Encoder │││ │ │ │ - Generalized │ │ │ │ - VoxelRes │ │ │ │ │││ │ │ │ LSSFPN │ │ │ │ BackBone │ │ │ │ │││ │ │ │ - FPN │ │ │ │ 8x │ │ │ │ │││ │ │ └────────┬──────────┘ │ │ └──────┬───────┘ │ │ └──────┬──────┘││ │ │ │ │ │ │ │ │ │ ││ │ │ ▼ │ │ │ │ │ │ ││ │ │ ┌─────────────────┐ │ │ │ │ │ │ ││ │ │ │ VTransform │ │ │ │ │ │ │ ││ │ │ │ - LSS │ │ │ │ │ │ │ ││ │ │ │ - DepthLSS │ │ │ │ │ │ │ ││ │ │ │ - BEVDepth │ │ │ │ │ │ │ ││ │ │ │ - AwareBEVDepth │ │ │ │ │ │ │ ││ │ │ │ │ │ │ │ │ │ │ ││ │ │ │ 步骤: │ │ │ │ │ │ │ ││ │ │ │ 1.预测深度分布 │ │ │ │ │ │ │ ││ │ │ │ 2.Frustum构建 │ │ │ │ │ │ │ ││ │ │ │ 3.BEV Pooling★ │ │ │ │ │ │ │ ││ │ │ └────────┬──────────┘ │ │ │ │ │ │ ││ │ │ │ │ │ │ │ │ │ ││ │ └──────────┼────────────────┘ └────────┼─────────┘ └────────┼───────┘│ │ │ │ │ │ │ ▼ ▼ ▼ │ │ ┌────────────────┐ ┌────────────────┐ ┌───────────────┐│ │ │ Camera BEV │ │ LiDAR BEV │ │ Radar BEV ││ │ │ (B,C1,H,W) │ │ (B,C2,H,W) │ │ (B,C3,H,W) ││ │ └────────────────┘ └────────────────┘ └───────────────┘│ └─────────────────────────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────┼────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────────────┐ │ FUSER (融合器) │ ├─────────────────────────────────────────────────────────────────────────┤ │ │ │ ConvFuser AddFuser │ │ ┌─────────────────┐ ┌──────────────────┐ │ │ │ Conv → Concat │ │ Element-wise Add │ │ │ │ ↓ │ └──────────────────┘ │ │ │ Conv → ReLU │ │ │ │ ↓ │ │ │ │ Output │ │ │ └─────────────────┘ │ │ │ │ 输出: Unified BEV Features (B, C_out, H, W) │ └─────────────────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────────────┐ │ DECODER (解码器) │ ├─────────────────────────────────────────────────────────────────────────┤ │ │ │ ┌──────────────────────────────────────────┐ │ │ │ Backbone (SECOND / ResNet) │ │ │ │ ├── Conv Block 1 (stride=1) │ │ │ │ ├── Conv Block 2 (stride=2) │ │ │ │ ├── Conv Block 3 (stride=2) │ │ │ │ └── Conv Block 4 (stride=2) │ │ │ └────────────────┬─────────────────────────┘ │ │ │ │ │ ▼ │ │ ┌──────────────────────────────────────────┐ │ │ │ Neck (SECONDFPN) │ │ │ │ ├── Deconv + Concat (上采样) │ │ │ │ ├── Multi-scale Feature Fusion │ │ │ │ └── Output: [P3, P4, P5] │ │ │ └────────────────┬─────────────────────────┘ │ │ │ │ └───────────────────┼─────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────────────┐ │ HEADS (任务头) │ ├─────────────────────────────────────────────────────────────────────────┤ │ │ │ ┌────────────────────────────┐ ┌─────────────────────────────┐ │ │ │ Object Detection Head │ │ Map Segmentation Head │ │ │ │ (TransFusion/CenterPoint) │ │ (VanillaSegHead) │ │ │ ├────────────────────────────┤ ├─────────────────────────────┤ │ │ │ │ │ │ │ │ │ ┌────────────────────┐ │ │ ┌─────────────────────┐ │ │ │ │ │ Heatmap分支 │ │ │ │ Conv Layers │ │ │ │ │ │ - Conv │ │ │ │ - Conv 3x3 │ │ │ │ │ │ - Sigmoid │ │ │ │ - BatchNorm │ │ │ │ │ │ → 类别热图 │ │ │ │ - ReLU │ │ │ │ │ └────────────────────┘ │ │ │ - Upsample │ │ │ │ │ │ │ │ - Conv 1x1 │ │ │ │ │ ┌────────────────────┐ │ │ │ → 分割logits │ │ │ │ │ │ Bbox回归分支 │ │ │ └─────────────────────┘ │ │ │ │ │ - Center offset │ │ │ │ │ │ │ │ - Size (w,h,l) │ │ │ 训练: CrossEntropyLoss │ │ │ │ │ - Rotation (yaw) │ │ │ 推理: Argmax → Mask │ │ │ │ │ - Velocity (vx,vy)│ │ │ │ │ │ │ └────────────────────┘ │ │ 输出: (B, H, W) │ │ │ │ │ │ 语义分割结果 │ │ │ │ ┌────────────────────┐ │ └─────────────────────────────┘ │ │ │ │ Transformer │ │ │ │ │ │ Decoder (可选) │ │ │ │ │ │ - Query-based │ │ │ │ │ │ - Cross Attention │ │ │ │ │ └────────────────────┘ │ │ │ │ │ │ │ │ 训练模式: │ │ │ │ └→ loss计算 │ │ │ │ ├── FocalLoss │ │ │ │ ├── L1Loss │ │ │ │ └── IoULoss │ │ │ │ │ │ │ │ 推理模式: │ │ │ │ └→ get_bboxes() │ │ │ │ ├── 提取峰值 │ │ │ │ ├── 解码参数 │ │ │ │ ├── NMS │ │ │ │ └→ Boxes3D │ │ │ │ │ │ │ │ 输出: (boxes, scores, │ │ │ │ labels, velocity) │ │ │ └────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────────┘ │ │ ▼ ▼ ┌──────────────┐ ┌──────────────┐ │ 3D Detection │ │ BEV Segment │ │ Results │ │ Results │ └──────────────┘ └──────────────┘ ================================================================================ ┌─────────────────────────────────────────────────────────────────────────┐ │ 关键模块调用关系 │ └─────────────────────────────────────────────────────────────────────────┘ 1. 模型构建 (builder.py): ─────────────────────────────────────────────────────── build_model() │ ├→ build_backbone() → BACKBONES.build() ├→ build_neck() → NECKS.build() ├→ build_vtransform()→ VTRANSFORMS.build() ├→ build_fuser() → FUSERS.build() └→ build_head() → HEADS.build() 2. 数据加载 (datasets/nuscenes_dataset.py): ─────────────────────────────────────────────────────── NuScenesDataset │ ├→ __getitem__() │ └→ pipeline(data_info) │ ├→ LoadMultiViewImageFromFiles │ ├→ LoadPointsFromFile │ ├→ LoadAnnotations3D │ ├→ ObjectSample │ ├→ GlobalRotScaleTrans │ ├→ RandomFlip3D │ └→ FormatBundle3D │ └→ evaluate() ├→ format_results() └→ NuScenesEval() 3. 训练循环 (apis/train.py): ─────────────────────────────────────────────────────── train_model() │ ├→ build_optimizer() ├→ build_runner() → EpochBasedRunner │ │ │ └→ run() │ └→ for epoch in epochs: │ ├→ train_epoch() │ │ └→ for batch in dataloader: │ │ ├→ model.forward() → losses │ │ ├→ optimizer.zero_grad() │ │ ├→ losses.backward() │ │ └→ optimizer.step() │ │ │ └→ validate_epoch() │ └→ model.eval() │ └→ single_gpu_test() │ └→ Hooks ├→ CheckpointHook (保存模型) ├→ EvalHook (验证) ├→ LoggerHook (日志) └→ LrSchedulerHook (学习率) 4. 推理流程 (apis/test.py): ─────────────────────────────────────────────────────── single_gpu_test() / multi_gpu_test() │ └→ for batch in dataloader: ├→ model.forward() → predictions ├→ post_process() └→ collect_results() → evaluate() └→ compute_metrics() 5. 配置加载 (utils/config.py): ─────────────────────────────────────────────────────── configs.load(yaml_file, recursive=True) │ └→ 递归加载继承的配置文件 └→ merge configurations └→ Config(dict) 6. CUDA算子调用: ─────────────────────────────────────────────────────── ops/bev_pool/bev_pool.py └→ bev_pool_v2() → CUDA kernel ops/spconv/conv.py └→ SparseConv3d() → CUDA sparse conv ops/voxel/voxelize.py └→ Voxelization() → CUDA voxelize ================================================================================ ┌─────────────────────────────────────────────────────────────────────────┐ │ 文件组织结构映射 │ └─────────────────────────────────────────────────────────────────────────┘ 配置层: configs/*.yaml → 定义模型结构和训练参数 入口层: tools/train.py → 训练入口 tools/test.py → 测试入口 数据层: mmdet3d/datasets/ ├── nuscenes_dataset.py → 数据集定义 ├── pipelines/ → 数据处理管道 │ ├── loading.py → 数据加载 │ ├── transforms_3d.py → 3D变换 │ └── formating.py → 格式化 └── builder.py → 数据集构建器 模型层: mmdet3d/models/ ├── fusion_models/ │ └── bevfusion.py → 主模型 ├── backbones/ → 特征提取 │ ├── resnet.py │ ├── sparse_encoder.py │ └── ... ├── necks/ → 特征金字塔 │ ├── generalized_lss.py │ └── second.py ├── vtransforms/ → 视图转换 │ ├── lss.py │ └── depth_lss.py ├── fusers/ → 模态融合 │ ├── conv.py │ └── add.py ├── heads/ → 任务头 │ ├── bbox/transfusion.py │ └── segm/vanilla.py └── builder.py → 模型构建器 算子层: mmdet3d/ops/ ├── bev_pool/ → BEV pooling (CUDA) ├── spconv/ → 稀疏卷积 (CUDA) ├── voxel/ → 体素化 (CUDA) └── ... API层: mmdet3d/apis/ └── train.py → 训练API 工具层: mmdet3d/utils/ ├── config.py → 配置处理 └── logger.py → 日志 核心层: mmdet3d/core/ ├── bbox/ → 3D框处理 ├── points/ → 点云处理 └── voxel/ → 体素处理 ================================================================================ ★ 标记说明: - BEV Pooling: 核心优化算子,速度提升40x - 所有模块均支持分布式训练 - 配置系统支持继承和覆盖 - 支持FP16混合精度训练 ================================================================================