9.5 KiB
9.5 KiB
Phase 4A Stage 1 模型结构分析
生成时间: 2025-10-31
配置文件: multitask_BEV2X_phase4a_stage1.yaml
📐 整体架构
相机图像 (6视图)
↓
Swin Transformer Backbone
↓
BEV Encoder (LSS)
↓
BEV特征图 (256通道, 540×540)
↓
┌─────┴─────┐
↓ ↓
3D检测头 BEV分割头
(TransFusion) (Enhanced)
↓ ↓
BBox输出 分割掩码
🎯 1. BEV Encoder
视角变换 (View Transformer)
类型: Lift-Splat-Shoot (LSS)
输入: 6个相机图像
空间范围:
- X: [-50m, 50m], 分辨率 0.2m → 500像素
- Y: [-50m, 50m], 分辨率 0.2m → 500像素
- Z: [-10m, 10m], 20个高度bins
BEV特征图:
- 尺寸: 540×540 (稍大于500,包含padding)
- 通道数: 256
- 覆盖范围: 100m × 100m
- 分辨率: ~0.185m/pixel
Backbone
类型: Swin Transformer v2
预训练: nuImages数据集
特点:
- 层次化视觉Transformer
- Shifted Window Attention
- 强大的特征提取能力
🎨 2. BEV分割头 (EnhancedBEVSegmentationHead)
核心架构
输入: BEV特征 (256通道, 540×540)
↓
【ASPP模块】- 多尺度特征提取
├── 1×1卷积分支
├── 3×3膨胀卷积 (rate=6)
├── 3×3膨胀卷积 (rate=12)
├── 3×3膨胀卷积 (rate=18)
└── 全局平均池化分支
→ 融合 → 256通道
↓
【空间注意力】- 特征增强
↓
【深度Decoder】- 4层渐进式上采样
├── Layer 1: 256→256通道
├── Layer 2: 256→256通道
├── Layer 3: 256→128通道
└── Layer 4: 128→128通道
↓
【Grid Transform】- 分辨率调整
输入: 540×540
输出: 600×600 (匹配GT标签)
↓
【分类器】- 每类独立
6个并行分类头:
├── Drivable Area
├── Ped Crossing
├── Walkway
├── Stop Line
├── Carpark Area
└── Divider
↓
输出: 6×600×600 分割掩码
详细配置
ASPP (Atrous Spatial Pyramid Pooling)
输入通道: 256
输出通道: 256
膨胀率: [6, 12, 18]
分支数: 5
- 1×1卷积 (捕获点特征)
- 3×3 dilation=6 (小感受野)
- 3×3 dilation=12 (中感受野)
- 3×3 dilation=18 (大感受野)
- 全局池化 (全局上下文)
归一化: GroupNorm (32组)
空间注意力模块
功能: 强调重要空间位置
实现: 卷积 → Sigmoid
作用: element-wise乘法增强特征
Decoder结构
Layer 1 (256 → 256):
Conv2d(256, 256, 3×3, padding=1)
GroupNorm(32, 256)
ReLU
Dropout(0.1)
Layer 2 (256 → 256):
Conv2d(256, 256, 3×3, padding=1)
GroupNorm(32, 256)
ReLU
Dropout(0.1)
Layer 3 (256 → 128):
Conv2d(256, 128, 3×3, padding=1)
GroupNorm(32, 128)
ReLU
Dropout(0.1)
Layer 4 (128 → 128):
Conv2d(128, 128, 3×3, padding=1)
GroupNorm(32, 128)
ReLU
Dropout(0.1)
特点:
- 使用GroupNorm而非BatchNorm (解决分布式训练死锁)
- 每层都有Dropout防止过拟合
- 逐层降维减少计算量
分类器 (Per-Class)
每个类别独立的分类头:
Conv2d(128, 64, 3×3, padding=1) # 降维
GroupNorm(32, 64)
ReLU
Conv2d(64, 1, 1×1) # 输出1通道
优势:
- 每类独立学习,互不干扰
- 可以针对不同类别调整
- 便于类别权重平衡
Deep Supervision
辅助分类器:
位置: ASPP输出后
结构: Conv2d(256, 6, 1×1)
作用: 在decoder早期监督,加速收敛
训练时:
- 主Loss: 最终输出
- 辅助Loss: ASPP输出
- 总Loss = 主Loss + α * 辅助Loss
📏 3. 分辨率配置
BEV特征图
源分辨率: 540×540
空间范围: [-50m, 50m] × [-50m, 50m]
分辨率: 0.2m/pixel (xbound/ybound)
实际尺寸: ~100m × 100m
GT标签
目标分辨率: 600×600
空间范围: [-50m, 50m] × [-50m, 50m]
分辨率: 0.167m/pixel
实际尺寸: 100m × 100m
配置: LoadBEVSegmentation
xbound: [-50.0, 50.0, 0.167]
ybound: [-50.0, 50.0, 0.167]
Grid Transform
输入: 540×540 (BEV特征)
输出: 600×600 (匹配GT)
方法: 双线性插值
对齐: align_corners=False
🎓 4. 损失函数
主Loss (Per-Class)
Focal Loss
公式: FL = -α(1-p_t)^γ * log(p_t)
参数:
α (alpha): 0.25 (类别平衡)
γ (gamma): 2.0 (难例挖掘)
作用:
- 降低易分类样本权重
- 关注难分类样本
- 解决类别不平衡
Dice Loss
公式: Dice = 1 - 2*|X∩Y| / (|X|+|Y|)
权重: 0.5 (与Focal Loss混合)
作用:
- 直接优化IoU
- 对类别不平衡鲁棒
- 提升分割边界质量
类别权重
loss_weight:
'drivable_area': 1.0 # 大类别,基础权重
'ped_crossing': 3.0 # 小类别,增加权重
'walkway': 1.5 # 中等类别
'stop_line': 4.0 # 最小类别,最高权重 ⭐
'carpark_area': 2.0 # 小类别
'divider': 3.0 # 小类别(线性特征)⭐
总Loss计算
对于每个类别c:
focal_loss_c = FocalLoss(pred_c, gt_c)
dice_loss_c = DiceLoss(pred_c, gt_c)
loss_c = (1-dice_weight) * focal_loss_c + dice_weight * dice_loss_c
weighted_loss_c = loss_weight[c] * loss_c
总Loss = Σ weighted_loss_c
如果使用Deep Supervision:
aux_loss = 同样计算方式,但使用辅助输出
总Loss += aux_loss_weight * aux_loss
🔢 5. 参数量估算
BEV分割头参数
ASPP模块:
- 5个分支卷积: ~1.2M 参数
- 融合层: ~0.3M 参数
小计: ~1.5M
Decoder (4层):
- Layer 1 (256→256): ~0.6M
- Layer 2 (256→256): ~0.6M
- Layer 3 (256→128): ~0.3M
- Layer 4 (128→128): ~0.15M
小计: ~1.65M
分类器 (6个类别):
- 每类: ~50K
- 总计: ~0.3M
辅助分类器:
- ~1.5K参数
总计: ~3.5M 参数 (仅BEV分割头)
完整模型
Swin Transformer Backbone: ~88M
BEV Encoder: ~15M
3D检测头 (TransFusion): ~5M
BEV分割头 (Enhanced): ~3.5M
总参数量: ~110M
💾 6. 显存使用分析
特征图显存 (单样本)
BEV特征 (540×540×256): ~280 MB
ASPP输出 (540×540×256): ~280 MB
Decoder中间 (各层): ~350 MB
最终输出 (600×600×6): ~9 MB
梯度 (反向传播): ~1.2 GB
小计: ~2.1 GB/样本
4-GPU分布式 (Batch=1/GPU)
特征图: 2.1 GB × 4 = 8.4 GB
模型参数: ~440 MB (FP32)
优化器状态: ~880 MB (Adam, 2倍参数)
梯度缓存: ~440 MB
每GPU总显存: ~2.9 GB (训练数据)
+ 模型共享: ~1.8 GB
≈ 4.7 GB 基础
实际观测: ~29 GB/GPU
额外显存: ~24 GB (包括框架开销、临时缓存等)
⚙️ 7. 训练配置
优化器
类型: AdamW
学习率: 2e-4
权重衰减: 0.01
Beta: (0.9, 0.999)
学习率策略
策略: OneCycleLR
周期: 完整训练周期
最大学习率: 2e-4
最小学习率: 1e-6
预热: 500 iterations
训练参数
总Epochs: 10 (Stage 1)
Batch size: 1/GPU
GPUs: 4
有效Batch: 4
Workers: 0 (避免DataLoader问题)
Checkpoint保存: 每个epoch结束
🚀 8. Phase 4A vs Phase 3 对比
| 项目 | Phase 3 (Epoch 23) | Phase 4A Stage 1 | 提升 |
|---|---|---|---|
| BEV分辨率 | 400×400 | 600×600 | +50% |
| GT分辨率 | 400×400 | 600×600 | +50% |
| 空间分辨率 | 0.25m | 0.167m | +33% |
| Decoder层数 | 2层 | 4层 | 2倍 |
| Decoder通道 | [128, 128] | [256, 256, 128, 128] | 扩展 |
| ASPP | 无 | 有 (5分支) | ✅ |
| 注意力 | 有 | 有 | 保留 |
| Deep Supervision | 无 | 有 | ✅ |
| Dice Loss | 无 | 有 (权重0.5) | ✅ |
| GroupNorm | 有 | 有 | 保留 |
| 参数量 | ~2.5M | ~3.5M | +40% |
| 显存使用 | ~18GB | ~29GB | +61% |
| GPU数量 | 8 | 4 | -50% |
🎯 9. 设计亮点
多尺度特征提取 (ASPP)
- 捕获不同尺度的上下文信息
- 对于不同大小的目标(如Stop Line vs Drivable Area)都有效
深度Decoder
- 4层逐步上采样,保留细节
- 每层都有归一化和正则化
Deep Supervision
- 中间层也参与监督
- 加速收敛,提升梯度流动
Mixed Loss (Focal + Dice)
- Focal处理类别不平衡
- Dice直接优化IoU指标
- 互补优势
类别独立分类器
- 每类独立学习
- 避免类间干扰
- 便于调优
GroupNorm
- 解决小batch size下BatchNorm不稳定
- 避免分布式训练死锁
- 每组32个通道
📊 10. 性能目标
基线 (Phase 3 Epoch 23)
mIoU: 0.4130
Stop Line: 0.2657 (26.57%)
Divider: 0.1903 (19.03%)
Stage 1目标 (600×600)
mIoU: 0.48+ (+17%)
Stop Line: 0.35+ (+30%) ⭐
Divider: 0.28+ (+47%) ⭐
改进来源
-
分辨率提升 (0.167m vs 0.25m):
- 细节更清晰
- 小目标更容易检测
-
深度Decoder:
- 更丰富的特征层次
- 更好的语义理解
-
ASPP多尺度:
- 适应不同尺度目标
- Stop Line和Divider受益最大
-
Dice Loss:
- 直接优化IoU
- 改善边界精度
总结
Phase 4A Stage 1 采用了渐进式分辨率提升策略,通过:
- ✅ 适中的分辨率 (600×600): 平衡性能和显存
- ✅ 深度网络 (4层Decoder): 提升表达能力
- ✅ 多尺度特征 (ASPP): 捕获全局和局部
- ✅ 混合损失 (Focal+Dice): 优化多个目标
- ✅ Deep Supervision: 加速训练收敛
预期在Stop Line和Divider两个关键小类别上取得显著提升!