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混合精度训练
|
|||
|
|
|
|||
|
|
================================================================================
|
|||
|
|
|