20251117最新CenterFusion项目复现(win11 OS+Docker+VSCode)
花了很久时间,踩了很多坑复现出了CenterFusion的代码,现研究出的方法只需要少量环境配置即可跑通,过程如下
环境准备
到目前为止,尝试了win11 OS、WSL2 Ubuntu OS、服务器Ubuntu22.04,以及现在的docker,只有使用docker可以很轻松地实现环境配置。
下面的讲解适用于开发环境为win11 OS+Docker+VSCode的同学们
Docker
开启Hyper-V、虚拟机平台和WSL2


安装Docker Desktop
更新WSL
# win+r -> cmd 打开命令提示符
wsl --set-default-version 2
wsl --update --web-download
wsl更新显示403,后面发现因为我开了梯子:)

Docker配置、换源
-
更改Docker地址:

-
Docker关联WSL:

VSCode下载
- 官网下载VSCode:https://code.visualstudio.com/
拉取Docker Hub->CenterFusion镜像
在复现一个项目之前,可以在Docker Hub上浏览一下有没有相关的镜像,拉取别人做好的镜像构建环境,可以大大减少配置环境的时间
在Docker Hub上,我找到了好心人上传的CenterFusion的环境:https://hub.docker.com/r/3846chs/centerfusion

点击三个竖着的点出现这串代码 docker pull 3846chs/centerfusion:v1.0,点击复制,在本机打开cmd运行。由于我已经下载过这个镜像了,因此出现如下提示。

为镜像生成容器并运行
运行容器前请注意下面的问题,因为容器运行起来更改参数的操作很不方便!
但我刚才发现一个功能,似乎可以更改运行环境中的container设置

注意两个问题:1. 设置gpu参数 2. 设置shm大小(必要时,例如需要运行jupyter,记得设置端口映射-p 8888:8889,8888为主机端口,8889为docker端口)
# -it 表示进入容器内
# -d 表示后台运行
# --name 自定义容器名字
# --gpus all 设置使用所有gpu
# --shm-size=8g 设置shm大小为8g(神经网络建议>4g)
docker run -it -d --name <container name> --gpus all --shm-size=8g <image ID>
# 例如运行下面代码,可以看到容器已经运行起来了(下次运行就不用输入命令行,可以直接在Docker Desktop中运行)
docker run -it -d --name centerfusion --gpus all --shm-size=8g 6a5e27211297

vscode连接docker
在插件商城中找到Dev Containers下载,重启vscode后点击左下角容器蓝色按钮,在下拉框中点击附加到正在运行的容器,选择刚创建的centerfusion容器



vscode下载python插件
点击在容器内安装

至此,vscode连接docker环境的操作成功实现!!!
请站起身休息半分钟,喝口水走走路,身体永远是第一位的
下面我们正式开始搂CenterFusion项目:
复现
我们接下来的操作默认在/root文件夹下进行:
换源
首先换源,增加下载速度,参考文章 换源大集合(apt pip docker)
查看conda环境
键入conda env list可以看到当前环境下有CenterFusion虚拟环境,conda activate CenterFusion切换为该环境
下载CenterFusion项目
下面我们将该项目下载到/root文件夹下
cd ~
git clone https://github.com/mrnabati/CenterFusion.git
PS:若git下载缓慢,可以尝试使用魔法加速:)

下载并构建DCNv2
# 安装ninja加速构建过程
pip install ninja
cd ~/CenterFusion/src/lib/model/networks
rm -rf DCNv2
git clone https://github.com/lbin/DCNv2.git
cd DCNv2
bash make.sh
这步操作非常完美,没有任何报错,因此不贴图了:)
下载nuscenes-devkit包
cd ~/CenterFusion/src/tools
rm -rf nuscenes-devkit/
git clone https://github.com/nutonomy/nuscenes-devkit.git
PS:原本环境中使用pip已经安装了nuscenes-devkit包,这一步似乎可以选择不做,不过我怕出错还是做了:(
下载nuscenes-mini数据集
现在先选择数据量较少的mini数据集,以后能跑通了(并且有好机子)再用full版本
nuScenes数据集官网:选择Asia-新加坡数据集

建议先下载到windows本地,再用命令扔进项目data文件夹,而不要直接用鼠标拖进去或者复制进去,亲测会出现文件缺失。命令操作如下:
# 进入windows数据集目录下
docker cp <data file/name> <container ID/container name>:<project data dir>
docker cp nuscenes centerfusion:/root/CenterFusion/data
下面是使用docker cp命令的例子:


下载后的项目目录如下图:

将数据集转化为COCO格式
cd ~/CenterFusion/src/tools
# 修改文件中的参数
vi convert_nuScenes.py
# 1. 27行的几个我们没下载的数据集注释掉
# 2. 56行NUM_SWEEP设置为3
# 然后就可以运行该文件进行格式转化
python convert_nuScenes.py


下载预训练模型
centerfusion_e60
centernet_baseline_e170
将这两个文件放到/CenterFusion/models文件夹中

下面我们就可以开始模型的训练和测试了
训练
下面是训练的脚本文件,对齐进行修改如下,之后可在/CenterFusion目录下运行脚本bash experiments/train.sh
export CUDA_DEVICE_ORDER=PCI_BUS_ID
export CUDA_VISIBLE_DEVICES=0 # 若只有一个GPU,设置为0
cd src
# train
python main.py \
ddd \
--exp_id centerfusion \
--shuffle_train \
--train_split mini_train \ # 由于用的是mini数据集,修改为mini_train
--val_split mini_val \ # 修改为mini_val
--val_intervals 1 \
--run_dataset_eval \
--nuscenes_att \
--velocity \
--batch_size 4 \ # 由于本人GPU性能较差,batch_size的值需要设置得非常小
--lr 2.5e-4 \
--num_epochs 60 \
--lr_step 50 \
--save_point 20,40,50 \
--gpus 0 \ # 同上,修改为0
--not_rand_crop \
--flip 0.5 \
--shift 0.1 \
--pointcloud \
--radar_sweeps 3 \
--pc_z_offset 0.0 \
--pillar_dims 1.0,0.2,0.2 \
--max_pc_dist 60.0 \
--load_model ../models/centernet_baseline_e170.pth \
# --freeze_backbone \
# --resume \
cd ..
PS:这时出现报错,nuScenes-devkit中函数不存在,解决方法见本文最下 遇到的问题
运行结果:

测试
下面测试的脚本文件,对齐修改如下,之后可在/CenterFusion目录下运行脚本bash experiments/test.sh
export CUDA_VISIBLE_DEVICES=0 # 若只有一个GPU,设置为0
cd src
## Perform detection and evaluation
python test.py ddd \
--exp_id centerfusion \
--dataset nuscenes \
--val_split mini_val \ # 由于使用的是mini数据集,设置为mini_val
--run_dataset_eval \
--num_workers 4 \
--nuscenes_att \
--velocity \
--gpus 0 \
--pointcloud \
--radar_sweeps 3 \ # 取决于设置COCO数据集时设置的数据,含义为将3帧的雷达点融合
--max_pc_dist 60.0 \
--pc_z_offset -0.0 \
--load_model ../models/centerfusion_e60.pth \
--flip_test \
--debug 4 \
# --resume \
PS:这时出现报错,nuScenes-devkit中函数不存在,解决方法见本文最下 遇到的问题
运行结果:

遇到的问题
TypeError: only integer tensors of a single element can be converted to an index
参考:https://blog.csdn.net/qq_43391414/article/details/120471616
解决方案:将tensor转列表时加.items()
nuScenes-devkit文件不全(可能是版本问题)
解决方案:去他的github仓库(例如splits.py: https://github.com/nutonomy/nuscenes-devkit/blob/master/python-sdk/nuscenes/utils/splits.py)复制函数到本地
增加–debug 4后报错
解决方案:修改 CenterFusion/src/lib/utils/debugger.py 第 424 行,如下,对四个 rect 值进行强转
cv2.line(bird_view, (int(rect[e[0]][0]), int(rect[e[0]][1])),
(int(rect[e[1]][0]), int(rect[e[1]][1])), lc, t,
lineType=cv2.LINE_AA)


浙公网安备 33010602011771号