2.1 KiB
2.1 KiB
✅ 修复 - 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列表输出问题已修复!可以正常训练了!