CenterFusion 项目超详细环境搭建步骤及可视化操作

目录

  • 一、环境配置
  • 二、数据集准备
    • 2.1 引言
    • 2.2 数据集下载
    • 2.3 源码修改
    • 2.4 DEBUG 可视化
  • 三、预训练模型下载
  • 四、训练
    • 3.1 bug 修改
    • 3.2 开始训练
    • 3.3 训练过程可视化
  • 五、验证
    • 5.1 bug 修改
    • 5.2 开始验证
  • 六、参考资料

说明:本文引用 CenterFusion: Center-based Radar and Camera Fusion for 3D Object Detection,复现此论文中的代码,互相学习。

省钱小妙招:如果租的服务器可以选择临时用或者不用 GPU,建议先不用 GPU,后面需要 GPU 的时候再打开就行了,其中构建可变性卷积库模型训练验证的时候才需要用 GPU

CenterFusion 项目超详细环境搭建步骤及可视化操作_第1张图片如果想了解 CenterFusion 项目中的具体网络架构,可以参考博客:CenterFusion 项目网络架构详细论述

一、环境配置

  • 先把源码下载下来
  • CenterFusion 源码地址:https://github.com/mrnabati/CenterFusion
  • 按照 ConterFusion 中的 README.md 文件中的步骤进行配置

第1步:新建虚拟环境

  • 根据 README.md 文件中的信息可知,需要 python3.7 的版本
    CenterFusion 项目超详细环境搭建步骤及可视化操作_第2张图片
  • 所以新建一个 python3.7 的虚拟环境
conda create -n env1 python=3.7
  • 更新bashrc中的环境变量
conda init bash && source /root/.bashrc
  • 切换到创建的虚拟环境:env1
conda activate env1

第2步:安装 Pytorch

  • 从官网上查看安装 Pytorch 的命令:https://pytorch.org/get-started/previous-versions/
  • 选择 Pytorch 1.7.1 版本,根据自己系统的 cuda 版本选择,由于我的云服务器系统中的 cuda 是 11.1 版本,所以选择下图红框的命令
    CenterFusion 项目超详细环境搭建步骤及可视化操作_第3张图片
  • 命令如下:
pip install torch==1.7.1+cu110 torchvision==0.8.2+cu110 torchaudio==0.7.2 -f https://download.pytorch.org/whl/torch_stable.html

第3步:安装 COCOAPI

  • 命令如下:
pip install cython
pip install -U 'git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI'
  • 如果安装失败,多试几次就行了

第4步:克隆 CenterFusion 存储库

  • 其实就是使用 git 下载 CenterFusion 源码并放进 CF_ROOT 这个路径中
  • 这里,我手动将源码上传到云服务器中并解压缩了
  • 解压缩后的文件夹为 CenterFusion-master,使用如下命令可以重命名文件夹:
mv + 重命名前 + 重命名后
如: mv CenterFusion-master CenterFusion
  • 根据自己的 CenterFusion 路径建立快捷方式:
CF_ROOT=/root/autodl-tmp/CenterFusion

第5步:安装环境所需要的包

  • 命令如下:
cd $CF_ROOT
pip install -r requirements.txt

第6步:构建可变形卷积库

  • 源码中是没有 DCNv2 这个文件夹的,所以需要下载
  • 这里去这个网址:https://github.com/lbin/DCNv2/tree/pytorch_1.7 下载 DCNv2==1.7 版本的,然后再上传到服务器中
  • unzip 解压缩命令(防止自己忘记):
unzip -d 路径 .zip压缩包
  • 这里需要解压缩到 $CF_ROOT/src/lib/model/networks 文件夹下
unzip -d $CF_ROOT/src/lib/model/networks DCNv2-pytorch_1.7.zip
  • 然后重命名 DCNv2-pytorch_1.7 为 DCNv2
  • 进入 DCNv2 中执行 make.sh 文件
cd DCNv2
./make.sh
  • 执行过程中,会出现警告
warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
  • 不是代码的问题,最后出现 Finished processing dependencies for DCNv2==0.1 即可

二、数据集准备

  • NuScenes 数据集官网:https://www.nuscenes.org/download

2.1 引言

  • 废话几句,但是有用!!!!

  • 数据集越大,那么模型训练的精度就越高,如果嫌弃训练的时间长,那么完全可以只下载 Mini 这部分,如果追求模型的精度,那么可以下载 Trainval 这个部分,Test 部分看自己吧,如果想用 Test 来做文章第五部分的验证,可以下载

  • 由于我之前只下载了 mini 数据集,这个数据集太小了,导致模型训练精度不够,效果不理想,所以我将三个数据集全部下载下来了

  • Mini——3.88 GB
    Trainval——200 GB
    Test——31 GB

  • 根据自己的选择下载数据集后,需要更改一点点代码,后面会提到

2.2 数据集下载

  • 下面说明一下 Mini、Trainval、Test 每个部分应该下载哪些(没让你三个部分都下载下来,选择性下载,如果你想追求模型精度,都下载下来也行)
  • 官网需要注册,在下载中找到完整的 NuScenes 数据集
    CenterFusion 项目超详细环境搭建步骤及可视化操作_第4张图片
  • Mini 部分:
    在这里插入图片描述
  • Trainval 部分:只需要下载 Metadata,然后每个 part 只需要下载 Keyframe(关键帧数据)、Radar(毫米波雷达数据)、Camera(相机数据)这三个,Lidar(激光雷达数据)就不用下载,共 10 个 part。
    CenterFusion 项目超详细环境搭建步骤及可视化操作_第5张图片
  • Test 部分:下载 Metadata,再下载 Radar、Camera 即可
    CenterFusion 项目超详细环境搭建步骤及可视化操作_第6张图片
  • 最后将下载下来的数据集压缩包 .tgz 上传到服务器中
  • 先在 CenterFusion/data 路径下新建一个 【nuscenes】文件夹,然后将 tgz 压缩包解压到 nuscenes 文件夹中
  • 解压缩命令,解压缩完了后可以使用命令 rm 删除压缩包
tar -zxvf .tgz压缩包 -C 路径
  • 解压完后 nuscenes 中的格式如下,它位于 ~/CenterFusion/data 路径下
CenterFusion
`-- data
    `-- nuscenes
        |-- maps
        |-- samples
        |   |-- CAM_BACK
        |   |   | -- xxx.jpg
        |   |   ` -- ...
        |   |-- CAM_BACK_LEFT
        |   |-- CAM_BACK_RIGHT
        |   |-- CAM_FRONT
        |   |-- CAM_FRONT_LEFT
        |   |-- CAM_FRONT_RIGHT
        |   |-- RADAR_BACK_LEFT
        |   |   | -- xxx.pcd
        |   |   ` -- ...
        |   |-- RADAR_BACK_RIGHT
        |   |-- RADAR_FRON
        |   |-- RADAR_FRONT_LEFT
        |   `-- RADAR_FRONT_RIGHT
        |-- sweeps
        |-- v1.0-mini
        |-- v1.0-test
        `-- v1.0-trainval

2.3 源码修改

  • 如果没下载 Trainval 和 Test 部分,当然是没 v1.0-trainval 和 v1.0-test 文件夹
  • 最后将数据集,转换为 COCO 格式,不过在转换之前,需要修改一点代码,在CenterFusion/src/tools/convert_nuScenes.py 文件中
    (1)选择性修改:第 27 行,如果没下载 Trainval、Test 部分,将 SPLITS 值改成如下:
    CenterFusion 项目超详细环境搭建步骤及可视化操作_第7张图片
    (2)必须修改:第 56 行将 NUM_SWEEPS 的值改为 3,否则后面出现找不到数据集路径的错误
    CenterFusion 项目超详细环境搭建步骤及可视化操作_第8张图片
  • 然后开始转换
cd $CF_ROOT/src/tools
python convert_nuScenes.py
  • 如果转换的过程中,突然被 killed 掉,那是因为内存不够了,需要换个更大内存的服务器
  • 最后会生成路径 CenterFusion/data/nuscenes/annotations_3sweeps,该文件夹下存放着 COCO 格式的数据集
CenterFusion
`-- data
    `-- nuscenes
        |-- annotations_3sweeps
        |   |-- train.json
        |   |-- val.json
        |   |-- mini_train.json
        |   |-- mini_val.json
        |   |-- test.json
        |-- maps
        |-- samples
        |-- sweeps
        |-- v1.0-mini
        |-- v1.0-test
        `-- v1.0-trainval
  • 如果想要更加深入了解 nuscenes 转 coco 格式的 python 代码的执行过程,也就是 convert_nuScenes.py 文件,但又看不太懂,参考博客:NuScenes 数据集转 COCO 格式 convert_nuScenes.py 文件详解

2.4 DEBUG 可视化

  • convert_nuScenes.py 中有可视化的部分,但其实这个 debug 可视化非必要,如果是用云服务器跑这个项目的话,就建议不可视化了
  • 因为需要弹窗显示图片,但是如果能够解决云服务器弹窗显示图片的话,可以试试
  • 而我是则是改动比较多的源码,只读取一张图片并关联雷达点云,这样就只可视化一张图片,使用 Notebook 运行 python 代码
  • 像这个链接:对Nuscenes数据集一无所知,手把手带你玩转Nusences数据集
  • 其中有可视化,但是,他的可视化只是利用 nuScenes 原始数据集及 nuscenes-devkit 库来可视化
  • 而这里的 convert_nuScenes.py可视化是将一张图片所对应的完整雷达点云关联后的可视化
  • 如果熟悉这个 convert_nuScenes.py 文件的人,可能已经猜到了,没错,就是这个全局变量 DEBUG
    CenterFusion 项目超详细环境搭建步骤及可视化操作_第9张图片
  • 将其设置为 True 即可,与此同时,还需要更改如下图所示的地方:
    CenterFusion 项目超详细环境搭建步骤及可视化操作_第10张图片
  • pc_3d 改为 radar_pc,因为 image_info 没有属性 pc_3d,而是 radar_pc
  • 执行代码之后,会在同目录下生成 3 张图片,一个是点云图,一个是 3D Box 框,还有一个是 nuscenes-devkit 库生成的可视化图片
  • 点云图:
  • 3D Box 图:
  • nuscenes-devkit 库生成的图:
  • 对比三张图片,很明显可以看出第二张图是 3D Box 的中心点计算错误,主要就是下图红框中的三个函数中出现了一点点小问题,才导致画歪了,我就懒得改了,小问题,不影响大局,有空再说吧
    CenterFusion 项目超详细环境搭建步骤及可视化操作_第11张图片

三、预训练模型下载

  • 下载两个模型:
    ①centerfusion_e60:https://drive.google.com/uc?export=download&id=1XaYx7JJJmQ6TBjCJJster-Z7ERyqu4Ig
    ②centernet_baseline_e170:https://drive.google.com/uc?export=download&id=1iFF7a5oueFfB5GnUoHFDnntFdTst-bVI
  • 然后将其解压缩到 /CenterFusion/models 文件夹中即可

四、训练

  • 使用 CenterFusion/experiments/train.sh 脚本可以用来训练网络

参数修改:

  • 不过在训练之前需要修改 train.sh 中的参数
    (1)设置训练集 train_split 的值,可选 train、mini_train 这两个数据集
    (2)设置测试集 val_split 的值,可选 val、mini_val、test 这三个数据集
    (2)我训练时报错,发现 24GB 的显存不够用,把 batch_size 改为了 16 ,大于 24 GB 的显卡可以不用改
    (3)由于包里钱钱不太多,只配置了一个 gpu,所以参数由 gpu 0,1 改为 gpu 0 ,用了两个 GPU 的话可以不用改
    CenterFusion 项目超详细环境搭建步骤及可视化操作_第12张图片

3.1 bug 修改

  • 在训练过程中,都会遇到如下问题,先解决后,再一次性训练成功

错误1:

Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).
Traceback (most recent call last):
  File "test.py", line 215, in <module>
    prefetch_test(opt)
  File "test.py", line 73, in prefetch_test
    Logger(opt)
  File "/root/autodl-tmp/CenterFusion/src/lib/logger.py", line 34, in __init__
    subprocess.check_output(["git", "describe", "--always"])))
  File "/root/miniconda3/envs/env1/lib/python3.7/subprocess.py", line 411, in check_output
    **kwargs).stdout
  File "/root/miniconda3/envs/env1/lib/python3.7/subprocess.py", line 512, in run
    output=stdout, stderr=stderr)
subprocess.CalledProcessError: Command '['git', 'describe', '--always']' returned non-zero exit status 128.
  • 看倒数第二个 File 路径,打开 /root/miniconda3/envs/env1/lib/python3.7/subprocess.py文件,修改第 411-1=410 行,将 check=True 改为 check=False 即可
    CenterFusion 项目超详细环境搭建步骤及可视化操作_第13张图片
  • 如果是其它服务器,或者没有使用虚拟环境,去找 …/lib/python3.7/subprocess.py 这样的路径,实在找不到的话可以先训练一下子,等它报错,然后看倒数第二个路径就可以很容易找到了。

错误2:

python: can't open file 'tools/nuscenes-devkit/python-sdk/nuscenes/eval/detection/evaluate.py': [Errno 2] No such file or directory
Traceback (most recent call last):
  File "main.py", line 140, in <module>
    main(opt)
  File "main.py", line 106, in main
    with open('{}/metrics_summary.json'.format(out_dir), 'r') as f:
FileNotFoundError: [Errno 2] No such file or directory: '/root/autodl-tmp/CenterFusion/src/lib/../../exp/ddd/centerfusion/nuscenes_eval_det_output_mini_val//metrics_summary.json'
  • 这是由于 ~/CenterFusion/src/tools/nuscenes-devkit 这个文件夹居然是空的,还要自己手动去下载
  • 命令如下:
#在 ~/CenterFusion/src/tools 文件夹下,先删除原来的空文件夹
rm -rf nuscenes-devkit
#再下载 nuscenes-devkit
git clone https://github.com/nutonomy/nuscenes-devkit.git
  • 下载失败没事,再试几次就好了
    CenterFusion 项目超详细环境搭建步骤及可视化操作_第14张图片

错误3:

RuntimeError: cuDNN error: CUDNN_STATUS_EXECUTION_FAILED
  • 如果严格按照我的这个步骤配置,应该是不会出错的。
  • 但是如果出现这个错误,那么就是你的 cuda、cudnn、pytorch 这几个版本不匹配导致的。
  • 怎么解决呢?首先查看系统的 cuda、cudnn 版本,具体的命令就自己查吧,然后根据系统的 cuda、cudnn 版本,选择对应的 pytorch 版本,如果还没解决,私我吧。

错误4:

  • 其实这也不算是个错误,算是原作者的粗心吧,训练模型之后,在 CenterFusion 下生成 exp/ddd/centerfusion/logs_20xx-xx-xx-xx-xx/log.txt 文件,打开文件后,会发现这是空的!!!这是因为在 CenterFusion/src/lib/logger.py 文件中第 52 行
self.log = open(log_dir + '/log.txt', 'w')
  • 这是是以写的方式打开,每次写的时候都会覆盖原来文件中的内容,应该以追加的方式打开,应该将参数 'w' 改为 'a' 即可

3.2 开始训练

  • 排除了这几个错误后,开始训练:
cd $CF_ROOT
bash experiments/train.sh
  • 如果想了解 CenterFusion 项目训练执行过程,可以参考博客:CenterFusion/src/main.py 项目训练执行文件详解
  • 而模型的一个具体训练过程是在 CenterFusion/src/lib/trainer.py 文件中,就是训练产生一些损失,比如热图损失、旋转损失等等
  • 在训练的过程中发现,每训练一个 epoch,就会使用测试集 mini_val 进行测试,并将测试出的结果打印到终端中
    在这里插入图片描述
    在这里插入图片描述
    CenterFusion 项目超详细环境搭建步骤及可视化操作_第15张图片
  • 训练完成之后会生成如下的目录:
CenterFusion
`-- exp
    `-- ddd
        `--centerfusion
            |-- debug 空文件夹
            |-- logs_2022-05-12-17-53		# 训练模型后产生的文件夹
            |   |-- events.out.tfevents.1651908949.container-58c811af3c-223e0ddf		# 标量数据,用于可视化
            |   |-- log.txt		# 训练过程 log 记录
            |   |-- opt.txt		# 配置 opt 文件
            |-- nuscenes_eval_det_output_mini_val		# 训练模型时对模型测试的结果文件夹
            |   |-- plots 空文件夹
            |   |-- metrics_details.json		# 详细的指标
            |   |-- metrics_summary.json		# 概括的指标
            |-- model_20.pth		# 训练第 20 epoch 保存的模型
            |-- model_40.pth		# 训练第 40 epoch 保存的模型
            |-- model_50.pth		# 训练第 50 epoch 保存的模型
            |-- model_last.pth		# 训练结束保存的模型
            |-- opt.txt		# 配置信息
            |-- results_nuscenes_det_mini_val.json		#训练过程测试结果

3.3 训练过程可视化

  • 在 pytorch 中,可以使用 TensorBoard 来可视化训练过程,看到上面的 logs_2022-05-12-17-53 文件夹,这是我在 2022年5月12日17点53分 训练产生的日志文件,文件中的 events.out.tfevents.1651908949.container-58c811af3c-223e0ddf 就是标量数据,可以用来可视化
  • 首先在终端中输入命令(后面接 logs 的路径):
tensorboard --logdir=/root/autodl-tmp/CenterFusion/exp/ddd/centerfusion/logs_2022-05-12-17-53
  • 然后会出现如下图所示,注意红框内容,接入这个默认端口就可以看到可视化内容
    CenterFusion 项目超详细环境搭建步骤及可视化操作_第16张图片
  • 如果默认端口被占用,也可以执行其它端口:
tensorboard --logdir=路径 --port=6007
  • 网页打开端口,如下图所示(训练效果不理想,这是 mini 数据集训练出的结果):
    CenterFusion 项目超详细环境搭建步骤及可视化操作_第17张图片
  • 这里包含了训练过程中的各种指标和测试过程中的各种指标
    CenterFusion 项目超详细环境搭建步骤及可视化操作_第18张图片
  1. AP:平均精度(平均检测正确率)
  2. LR:学习率
  3. Scores:
    • NDS:mAP和错误度量的加权和
    • attr_err:平均属性误差
    • orient_err:平均方向误差
    • scale_err:平均尺度误差
    • trans_err:平均平移误差
    • vel_err:平均速度误差
  4. 后面的则是训练、测试中的各种损失
  • 最后历时 9 天终于把 trainval 数据集训练完成!!!
  • 对比上面那张 mini_train 训练的结果,整体上的 AP 提高了不少,且总体曲线呈上升趋势
    CenterFusion 项目超详细环境搭建步骤及可视化操作_第19张图片

五、验证

修改参数

  • 修改如下参数:
    (1)设置验证集 val_split 的值,可选 val、mini_val、test
    (2)可视化(非必须):添加参数 --debug 4 即可
  • 如下图:
    CenterFusion 项目超详细环境搭建步骤及可视化操作_第20张图片

5.1 bug 修改

  • 验证之前先把一些错误点修改了,然后一次性验证成功

错误1:

  • 如图:
    CenterFusion 项目超详细环境搭建步骤及可视化操作_第21张图片
  • 说没有 CUDA gpu 可以用,这是因为 gpu 的索引号错了,将 test.sh 文件中的 CUDA_VISIBLE_DEVICES 的值改为 0 即可,要对应齐
    CenterFusion 项目超详细环境搭建步骤及可视化操作_第22张图片

错误2:

  • 这是加了参数 --debug 4 后执行 debug 会产生的错误
Traceback (most recent call last):
  File "test.py", line 215, in <module>
    prefetch_test(opt)
  File "test.py", line 125, in prefetch_test
    ret = detector.run(pre_processed_images)
  File "/root/CenterFusion/src/lib/detector.py", line 151, in run
    self.show_results(self.debugger, image, results)
  File "/root/CenterFusion/src/lib/detector.py", line 429, in show_results
    img_id='bird_pred', cnt=self.cnt)
  File "/root/CenterFusion/src/lib/utils/debugger.py", line 426, in add_bird_view
    lineType=cv2.LINE_AA)
cv2.error: OpenCV(4.5.5) :-1: error: (-5:Bad argument) in function 'line'
> Overload resolution failed:
>  - Can't parse 'pt1'. Sequence item with index 0 has a wrong type
>  - Can't parse 'pt1'. Sequence item with index 0 has a wrong type
  • 看错误提示,修改 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)

5.2 开始验证

  • 使用如下命令开始验证
cd $CF_ROOT
bash experiments/test.sh
  • 想了解验证执行过程,可以参考博客:CenterFusion/src/test.py 项目验证执行文件详解
  • 由于相关研究已做完,验证结果未保存,所以就不贴出来了

六、参考资料

[1] CenterFusion代码复现
[2] CenterFusion算法环境配置与demo运行 CenterFusion: Center-based Radar and Camera Fusion for 3D Object Detection
[3] 解决setup.py编译C++代码的-Wstrict-prototypes警告
[4] 运行中的程序突然出现"Killed"原因
[5] 成功解决subprocess.CalledProcessError: Command ‘[‘git‘, ‘describe‘]‘ returned non-zero exit status 128.
[6] pytorch错误:RuntimeError: cuDNN error: CUDNN_STATUS_EXECUTION_FAILED (安装cuda)
[7] pointpillars----nuscene多分类篇
[8] pytorch中tensorboard的add_scalar与add_image
[9] 可视化_TensorBoard可视化
[10] debug mode in test.sh gives error (-5:Bad argument) in function ‘line’

你可能感兴趣的:(深度学习)