378 lines
28 KiB
Plaintext
378 lines
28 KiB
Plaintext
================================================================================
|
||
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混合精度训练
|
||
|
||
================================================================================
|
||
|