OpenPCDet 与 nuScenes 的 NumPy 兼容问题

整理 OpenPCDet 和 nuScenes 评估中由 NumPy 版本导致的 np.int、np.float 报错,以及 PillarNet final_box_dicts 报错记录。

这篇文章整理 OpenPCDet 和 nuScenes 测试过程中遇到的 NumPy 兼容问题,主要是 np.intnp.float 等旧别名在新版本 NumPy 中被移除导致的报错。

1. 当前 NumPy 版本

当前记录中,NumPy 的原始正常版本是:

1
2
Name: numpy
Version: 1.26.4

在 NumPy 1.24 之后,np.intnp.floatnp.bool 等旧别名已经被移除。如果旧代码中仍然使用这些写法,就会报错。

2. OpenPCDet 中 np.int 报错

2.1 报错现象

如果报错类似:

1
AttributeError: module 'numpy' has no attribute 'int'

通常说明代码里还有旧写法:

1
np.int

2.2 修改位置

根据报错信息,需要修改的文件是:

1
/home/cx/OpenPCDet/pcdet/models/backbones_2d/base_bev_backbone.py

找到第 299 行或附近代码:

1
stride = np.round(1 / stride).astype(np.int)

修改为:

1
stride = np.round(1 / stride).astype(int)

或者指定具体精度:

1
stride = np.round(1 / stride).astype(np.int64)

2.3 修改建议

如果只是为了兼容原代码,通常直接改成 int 即可。

如果后续涉及严格的 tensor shape、索引或跨平台一致性,也可以考虑明确使用 np.int64np.int32

3. nuScenes 测试时 np.float 报错

3.1 修改位置

直接修改当前 Conda 环境中的文件:

1
/home/cx/anaconda3/envs/Openpcdet-cu117/lib/python3.10/site-packages/nuscenes/eval/detection/algo.py

找到类似代码:

1
tp = np.cumsum(tp).astype(np.float)

修改为:

1
tp = np.cumsum(tp).astype(float)

或者:

1
tp = np.cumsum(tp).astype(np.float64)

4. 同类旧别名统一替换

如果同一个文件里还有下面这些写法:

1
2
3
np.int
np.float
np.bool

可以分别改成:

1
2
3
int
float
bool

或者改成明确的 NumPy 类型:

1
2
3
np.int64
np.float64
np.bool_

5. 临时兼容垫片

如果只是临时跑通,也可以在文件开头加入兼容垫片:

1
2
3
4
5
6
import numpy as np

if not hasattr(np, "float"):
    np.float = float
    np.int = int
    np.bool = bool

不过这种方法不够优雅,容易掩盖旧代码问题。长期来看,更推荐直接修改旧别名。

6. 训练 nuScenes 数据集时的注意事项

笔记中记录:训练 nuScenes 数据集时如果因为 NumPy 版本报错,需要先修改相关代码,训练完成后根据实际情况决定是否改回。

我的建议是:

  • 如果你维护的是自己的实验代码,可以直接替换旧别名;
  • 如果你只是临时运行别人的代码,可以用补丁方式记录修改;
  • 修改第三方库文件时,最好单独记录修改点,避免后续换环境后忘记。

7. PillarNet 测试报错记录

PillarNet 测试时可能遇到:

1
KeyError: 'final_box_dicts'

可以参考:

1
https://github.com/open-mmlab/OpenPCDet/issues/1524

建议排查方向:

  • 当前 model.forward() 返回值是否符合测试脚本预期;
  • 配置文件是否与模型代码版本匹配;
  • 是否混用了不同分支或不同版本的 OpenPCDet 代码;
  • post_processing 是否正常返回预测框结果。

8. 常用测试命令

示例:

1
2
3
4
python test.py \
  --cfg_file ../tools/cfgs/kitti_models/pointpillar.yaml \
  --batch_size 4 \
  --ckpt ../output/kitti_models/pointpillar/default/ckpt/checkpoint_epoch_80.pth

如果需要保存测试提交文件:

1
2
3
4
5
python test.py \
  --cfg_file ../tools/cfgs/kitti_models/pointpillar.yaml \
  --batch_size 4 \
  --ckpt ../output/kitti_models/pointpillar/default/ckpt/checkpoint_epoch_80.pth \
  --save_to_file

总结

OpenPCDet 和 nuScenes 中这类报错本质上多半不是算法问题,而是旧代码和新依赖之间的兼容问题。遇到 np.intnp.floatnp.bool 报错时,优先搜索对应文件并替换旧别名即可。

使用 Hugo 构建
主题 StackJimmy 设计