背景
论文地址:
[2203.09780] Sparse Fuse Dense: Towards High Quality 3D Detection with Depth Completion (arxiv.org)
项目地址:SFD/pcdet/datasets/processor/data_processor.py at main · LittlePey/SFD (github.com)
项目安装过程出现了许多问题,作者的代码是基于spconv1.2.1的,而现在的spconv已经更新到2.3.6了,因此多数问题都是关于spconv版本的不兼容,当然中间还有一层OpenPCDet,好像也存在一些问题?(不太记得了)。过程中感谢几位大神的bug解决分享:
环境安装
SFD基于VoxelRCNN,使用OpenPCDet安装的VoxelRCNN的环境,因此需要先配OpenPCDet,而OpenPCDet需要用到spconv,所以还需要安装spconv。在此之前安装过spconv2.3.6与spconv1.2.1,都出了各种各样的不好解决的问题,最后是spconv2.1能跑通。
创建环境
conda create -n sfd python=3.9.13
安装torch
pip install torch==1.8.1+cu111 torchvision==0.9.1+cu111 torchaudio==0.8.1 -f https://download.pytorch.org/whl/torch_stable.html
安装spconv2.1
pip install spconv-cu111
安装openpcdet,知乎的那条链接说是"需要按照OpenPCDet的版本更新,让SFDNet兼容,直接copy就好",于是我下载了openpcdet0.4.0版本的代码安装的。解压项目文件后,运行
python setup.py develop
安装sfd
安装之前一定会要把SFD/setup.py的41行'spconv'注释掉,避免重复安装spconv
git clone https://github.com/LittlePey/SFD.git
cd SFD
python setup.py develop
cd pcdet/ops/iou3d/cuda_op
python setup.py develop
cd ../../../..
遇到一些关键问题
openpcdet和sfd的项目都有pcdet,因为openpcdet安装在sfd之前,所以在系统路径里会先查找openpcdet下的pcdet,这会导致需要用到sfd的代码时,会报一些找不到模块/文件的错误。比如下面的报错
Traceback (most recent call last):
File "/home/project/SFD/tools/test.py", line 206, in <module>
main()
File "/home/project/SFD/tools/test.py", line 141, in main
args, cfg = parse_config()
File "/home/project/SFD/tools/test.py", line 49, in parse_config
cfg_from_yaml_file(args.cfg_file, cfg)
File "/home/project/openpcdet0.4.0/pcdet/config.py", line 72, in cfg_from_yaml_file
with open(cfg_file, 'r') as f:
FileNotFoundError: [Errno 2] No such file or directory: 'cfgs/kitti_models/sfd.yaml'
解决方式:把/openpcdet/pcdet/__init__.py文件删除。
TypeError: Caught TypeError in DataLoader worker process 0.
解决方式:在/pcdet/pcdet/datasets/__init__.py:存着build_dataloader,里面有DataLoader函数——数据加载器,64行,将num_workers=works中的works直接改为0。
KeyError: 'points_pseudo' when try the demo to eval and visualize the result.
这个错误是运行demo.py时出现的,issue里的大佬回答的意思大概是openpcdet的demo不支持pseudo points数据。
跟data_processor.py文件有关的错误
知乎链接提到的修改代码,涉及到data_processor.py,需要注意的是,sfd里的data_processor.py实际上是在openpcdet里的data_processor.py基础上增加了一些关于sfd的函数,比如mask_points_and_boxes_outside_range_sfd()。作者新增的transform_points_to_voxels_valid()实际上跟transform_points_to_voxels()一模一样,因此对transform_points_to_voxels的修改可以完全复制transform_points_to_voxels_valid()的修改。
总结
因为运行demo出现的keyerror问题,暂时不是很重要,于是就通过运行test.py来验证模型能否跑通。test的结果,AP相当可观
2023-12-11 08:52:51,966 INFO Car AP@0.70, 0.70, 0.70:
bbox AP:97.8738, 95.9219, 89.9571
bev AP:98.4781, 89.4051, 88.8067
3d AP:90.0503, 87.7093, 85.3828
aos AP:97.84, 95.71, 89.75
Car AP_R40@0.70, 0.70, 0.70:
bbox AP:99.2894, 97.4796, 95.3375
bev AP:98.9791, 92.4196, 91.8746
3d AP:95.9899, 89.0095, 86.1861
aos AP:99.25, 97.28, 95.05
Car AP@0.70, 0.50, 0.50:
bbox AP:97.8738, 95.9219, 89.9571
bev AP:97.9877, 95.8388, 89.9214
3d AP:99.1273, 95.7727, 89.9020
aos AP:97.84, 95.71, 89.75
Car AP_R40@0.70, 0.50, 0.50:
bbox AP:99.2894, 97.4796, 95.3375
bev AP:99.3080, 97.7041, 95.3708
3d AP:99.6213, 97.6251, 95.3010
aos AP:99.25, 97.28, 95.05
2023-12-11 08:52:51,973 INFO Result is save to /home/project/SFD/output/kitti_models/sfd/default/eval/epoch_34/val/default
2023-12-11 08:52:51,973 INFO ****************Evaluation done.*****************
更新:训练跑通
当时跑测试用的作者提供的权重checkpoint_epoch_34,但是后来自己跑训练时也出了不少问题,不过好在这些问题都在知乎里有提到。
首先,训练刚启动就报的或者是训练几个epoch会出现的报错:
raise NotImplementedError
NotImplementedError
maxoverlaps:(min=nan, max=nan)
ERROR: FG=0, BG=0
参考他的解决方案,我是单卡训练的,所以调低学习率lr=0.001,增加归一化的代码,但是还是会出现以上的错误。在这条知乎链接的评论区有个哥们提到把giou改成diou,改了之后便可以正常训练了。
其次,训练完成伴随的eval会失败,报错内容是:
KeyError: 'valid_noise'
我试过:
# 在约491行的循环前加入
data_dict = data_dict.pop('valid_noise')
但还是行不通,挺玄学的,这行代码在我使用test脚本测试时就加入的,train结束带的测试就跑不通。
还是参考了评论区的意见,将这行代码改为就正常了。
try:
data_dict.pop('valid_noise')
except KeyError:
pass
另外,我用batch_size=4训练时,精度跟原文的差别不大,用batch_size=8训练时,精度只有原文的一半(不知道什么原因)。
# epoch40 eval
INFO Car AP@0.70, 0.70, 0.70:
bbox AP:97.9855, 90.2431, 89.8273
bev AP:90.4933, 89.3074, 88.7005
3d AP:89.8045, 85.6390, 85.3166
aos AP:97.95, 90.17, 89.69
Car AP_R40@0.70, 0.70, 0.70:
bbox AP:99.3250, 95.6683, 95.3106
bev AP:96.4717, 92.3358, 91.8340
3d AP:95.2998, 88.0025, 85.8323
aos AP:99.29, 95.56, 95.12
Car AP@0.70, 0.50, 0.50:
bbox AP:97.9855, 90.2431, 89.8273
bev AP:98.0498, 95.9974, 89.7821
3d AP:98.5390, 95.9506, 89.7693
aos AP:97.95, 90.17, 89.69
Car AP_R40@0.70, 0.50, 0.50:
bbox AP:99.3250, 95.6683, 95.3106
bev AP:99.3210, 97.6254, 95.2947
3d AP:99.4555, 97.5557, 95.2606
aos AP:99.29, 95.56, 95.12