bev-project/修复_neck输出列表问题.md

2.1 KiB
Raw Blame History

修复 - decoder.neck返回列表问题


🎯 问题

AttributeError: 'list' object has no attribute 'size'

位置: bevfusion.py line 417
  task_bev = self.task_gca[type](x)

🔍 根本原因

SECONDFPN (decoder.neck) 返回的是列表而不是单个tensor

x = self.decoder["neck"](x)
# x 现在是 list: [tensor1, tensor2]  ← 多尺度特征
# 而不是单个 tensor: (B, 512, 360, 360)

GCA模块期望输入是tensor所以报错。


解决方案

在应用GCA之前检查并拼接多尺度特征

x = self.decoder["neck"](x)

# ✅ 处理neck可能返回的列表多尺度特征
if isinstance(x, (list, tuple)):
    # SECONDFPN返回列表需要拼接
    x = torch.cat(x, dim=1)  # 拼接多尺度特征

# 现在 x 是 tensor: (B, 512, 360, 360)

# 然后应用GCA
if type in self.task_gca:
    task_bev = self.task_gca[type](x)  # ✅ 现在可以正常工作

📊 修复位置

文件: mmdet3d/models/fusion_models/bevfusion.py
行数: 第408-411行
修改: 添加列表处理逻辑

修复后的行为

decoder.neck返回单个tensor

x = decoder.neck(x)  # → tensor(B, 512, H, W)
if isinstance(x, (list, tuple)):  # False
    ...
# 直接使用 x

decoder.neck返回列表

x = decoder.neck(x)  # → [tensor(B, 256, H, W), tensor(B, 256, H, W)]
if isinstance(x, (list, tuple)):  # True
    x = torch.cat(x, dim=1)  # → tensor(B, 512, H, W)
# 拼接后使用 x

🚀 现在可以正常启动了!

docker exec -it bevfusion bash
cd /workspace/bevfusion
bash START_PHASE4A_TASK_GCA.sh

启动后应该看到

[BEVFusion] ⚪ Skipping camera backbone init_weights
[BEVFusion] ✨✨ Task-specific GCA mode enabled ✨✨
  [object] GCA: params: 131,072
  [map] GCA: params: 131,072

load checkpoint from .../epoch_5.pth

Epoch [1][50/xxx]
  lr: 2.00e-05
  loss/object/loss_heatmap: 0.XXX
  loss/map/divider/dice: 0.XXX
  grad_norm: XX.X

🎉 decoder.neck列表输出问题已修复可以正常训练了