114 lines
2.1 KiB
Markdown
114 lines
2.1 KiB
Markdown
|
|
# ✅ 修复 - decoder.neck返回列表问题
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎯 问题
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
AttributeError: 'list' object has no attribute 'size'
|
|||
|
|
|
|||
|
|
位置: bevfusion.py line 417
|
|||
|
|
task_bev = self.task_gca[type](x)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔍 根本原因
|
|||
|
|
|
|||
|
|
`SECONDFPN` (decoder.neck) 返回的是**列表**而不是单个tensor:
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
x = self.decoder["neck"](x)
|
|||
|
|
# x 现在是 list: [tensor1, tensor2] ← 多尺度特征
|
|||
|
|
# 而不是单个 tensor: (B, 512, 360, 360)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
GCA模块期望输入是tensor,所以报错。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## ✅ 解决方案
|
|||
|
|
|
|||
|
|
在应用GCA之前,检查并拼接多尺度特征:
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
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
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
x = decoder.neck(x) # → tensor(B, 512, H, W)
|
|||
|
|
if isinstance(x, (list, tuple)): # False
|
|||
|
|
...
|
|||
|
|
# 直接使用 x
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### decoder.neck返回列表
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
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
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🚀 现在可以正常启动了!
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
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列表输出问题已修复!可以正常训练了!**
|
|||
|
|
|