本文最后更新于:2024年9月12日 下午

FastBEV 在纯视觉方案中性价比较高,本文记录代码复现过程。

背景

实践步骤

  1. 环境准备
  2. 数据准备
  3. 模型训练

环境准备

环境需求

  • CUDA>=9.2
  • GCC>=5.4
  • Python>=3.6
  • Pytorch>=1.8.1
  • Torchvision>=0.9.1
  • MMCV-full==1.4.0
  • MMDetection==2.14.0
  • MMSegmentation==0.14.1

上述环境为官方代码仓库所记录的需求

实际环境

这里记录我的环境配置

  • Ubuntu 22.04
  • CUDA 11.3
  • gcc / g++ 9.5.0
  • python 3.8.19
  • pytorch 1.10.0+cu113
  • torchvision 0.11.0+cu113
  • mmcv-full 1.4.0
  • mmdetection 2.14.0
  • mmsegmentation 0.14.1
  • mmdet3d 0.16.0

环境配置

说明: 这里说明一下,为之后的同学填坑

  1. mmcv-full 1.4.0 比较久远了其实,因此所需环境也比较古老,mmlab 提供的 whl 并未包含该版本,因此安装需要自己编译,但是编译过程中需要引入 pytorch 的 THC/THC.h 头文件,而 pytorch 在 1.10 以后的版本(1.11+)将该文件删除了,因此最高 pytorch 版本为 1.10

  2. mmcv-full 和 pytorch 版本既然锁死,到 Pytorch 的安装界面中可以看到,1.10 版本的 torch 支持最高版本的 CUDA 为 11.3, 因此 CUDA 版本我定在了 11.3

  3. cuda 11.3 的官方文档中,记录了所需的 gcc 版本

    可以看到 gcc 版本为 9.x,因此我在当前使用了 9.5 的 gcc 版本

  4. 其他环境正常安装就好了

CUDA 11.3

下载地址:https://developer.nvidia.com/cuda-11.3.0-download-archive

pytorch
1
2
pip install torch==1.10.0+cu113 -f https://download.pytorch.org/whl/torch_stable.html
pip install torchvision==0.11.0+cu113 -f https://download.pytorch.org/whl/torch_stable.html
gcc 版本

gcc 版本选择

python packages

mmcv whl 包链接:https://download.openmmlab.com/mmcv/dist/cu113/torch1.10.0/index.html

1
2
3
4
5
6
7
8
# 安装mmcv-full
pip install mmcv-full==1.4.0

# 安装mmdet
pip install mmdet==2.14.0

# 安装mmdet
pip install mmsegmentation==0.14.1

下载 fastBev 源码

仓库地址:https://github.com/Sense-GVT/Fast-BEV

将 fast-bev 安装到 python 环境

1
pip install -v -e . 

准备数据集

数据下载

nuscenes数据集,nuscenes下载地址

这里只测试 nuscense 提供 mini 版本, 下载 map 跟 mini:

  • 下载后得到2个压缩的文件

    • nuScenes-map-expansion-v1.3.zip
    • v1.0-mini.tgz
  • 解压到当前目录
    解压得到nuScenes-map-expansion-v1.3与v1.0-mini两个目录, 把nuScenes-map-expansion-v1.3中的三个文件复制到v1.0-mini/map目录下。最终得到新v1.0-mini目录,就行训练所需的数据集。

  • 数据集转换为FastBEV支持格式

    进入Fast-BEV工程目标, 创建data目录,然后将上面的v1.0-mini文件夹复制到./Fast-BEV/data下, 并将v1.0-mini重命名为nuscenes, 目录结构如下图所示:

    因为使用的mini数据集, 转换时候加上参数--version 该数据未提供v1.0-test文件

    如果使用全部的nuscenes数据可以不加--version

数据生成

  1. 运行create_data.py
1
python tools/create_data.py nuscenes --root-path ./data/nuscenes --out-dir ./data/nuscenes --extra-tag nuscenes --workers 10 --version v1.0-mini

执行后,产生下面红框中的文件

  1. 运行nuscenes_seq_converter.py

由于使用的mini数据集无test文件,需要修改nuscenes_seq_converter.py文件,找到代码15行和20行,修改如下:

修改后,运行:

1
python tools/data_converter/nuscenes_seq_converter.py

生成 nuscenes_infos_train_4d_interval3_max60.pklnuscenes_infos_val_4d_interval3_max60.pkl 两个文件,
这两个文件就是训练需要的数据集,如下图所示:

  1. 修改 dataset 文件 nuscenes_monocular_dataset_map_2.py

    修改第 27 行

训练

预训练模型

模型 下载链接 ,提供了r18,r34,r50三种残差网络模型。这里下载 cascade_mask_rcnn_r18_fpn_coco-mstrain_3x_20e_nuim_bbox_mAP_0.5110_segm_mAP_0.4070.pth

下载后,新建一个pretrained_models目录放入其中。

修改配置文件

configs/fastbev/exp/paper/fastbev_m0_r18_s256x704_v200x200x4_c192_d2_f4.py,文件为例:

  • 将该配置文件中的将SyncBN改成BN,将AdamW2换成Adam;
  • 该配置文件中146行代码去掉注释; 147-150代码加上注释, 如下所示
1
2
3
4
5
file_client_args = dict(backend='disk')
# file_client_args = dict(
# backend='petrel',
# path_mapping=dict({
# data_root: 'public-1424:s3://openmmlab/datasets/detection3d/nuscenes/'}))

安装setuptools-58.0.4版本

1
pip install setuptools==58.0.4

配置文件中预训练模型地址修改, 代码331行,load_from参数指向第1步下载的预训练模型地址,如果不知道相对路径,可以直接给绝对路径,我这里是相对路径

1
load_from = 'pretrained_models/cascade_mask_rcnn_r18_fpn_coco-mstrain_3x_20e_nuim_bbox_mAP_0.5110_segm_mAP_0.4070.pth'

训练

1
python tools/train.py configs/fastbev/exp/paper/fastbev_m0_r18_s256x704_v200x200x4_c192_d2_f4.py --work-dir work_dir --gpu-ids 0

参数说明

1
2
3
--gpu-ids  0代表gpu使用第1块。本机只有一块gpu
--work-dir 输出文件目录,包含日志等文件
其他参数详情建train.py中parse_args()函数

测试

训练时每完成一个 epoch 会在 work_dir 保存 epoch_x.pth 文件,我们用这个文件来进行推断。

测试推理

1
python tools/test.py configs/fastbev/exp/paper/fastbev_m0_r18_s256x704_v200x200x4_c192_d2_f4.py work_dir/epoch_1.pth --out output/result.pkl
  • out 必须跟.pkl后缀。用来保存检测结果
1
2
--out 必须跟.pkl后缀。用来保存检测结果
--show 不要加,加上会报错,可能原作者未优化好

可视化

tools/misc/visualize_results.py 把上一步的 result.pkl 生成视频流展示。

  1. 直接运行代码会报错 assert len(_list) == len(sort)

解决办法:Fast -BEV/mmdet3d/datasets/nuscenes monocular_dataset.py, 找到192行修改成193行样子:

  1. 写下 mp4 时报错,TypeError: write() got an unexpected keyword argument 'fps'

解决方案:

1
pip install imageio-ffmpeg
  1. 运行可视化代码:
1
python tools/misc/visualize_results.py configs/fastbev/exp/paper/fastbev_m0_r18_s256x704_v200x200x4_c192_d2_f4.py --result output/result.pkl --show-dir show_dir

生成的文件如下图所示:

发现m0-r18模型效果不是很好,很多只检测了个寂寞,可以尝试用 m5-r50epoch_20pth下载链接

  1. 运行效果

    下载的模型运行了 m4-r50 的结果:

参考资料



文章链接:
https://www.zywvvd.com/notes/study/deep-learning/bev/fastbev/fastbev-practice/


“觉得不错的话,给点打赏吧 ୧(๑•̀⌄•́๑)૭”

微信二维码

微信支付

支付宝二维码

支付宝支付

Fast-BEV 代码实践
https://www.zywvvd.com/notes/study/deep-learning/bev/fastbev/fastbev-practice/
作者
Yiwei Zhang
发布于
2024年9月6日
许可协议