BEVFormer代码复现实践

BEVFormer代码复现实践

1 环境配置

  • 感谢大佬们的开源工作,BEVFormer-github地址-YYDS
  • BEV各算法环境部署实战汇总
  • 如果本文对您有帮助,请一键三连支持一波,^_^
  • 部署有问题的小伙伴欢迎留言和加Q裙-472648720

1.1 环境安装

# 1 拉取源码   github加速代理https://ghproxy.com/
git clone https://github.com/fundamentalvision/BEVFormer.git

# 2 创建虚拟环境
conda create -n bev python=3.8 -y

# 3 激活虚拟环境
conda activate bev

# 4.1 安装torch,torchvision,torchaudio
pip install torch==1.10.0+cu113 torchvision==0.11.0+cu113 torchaudio==0.10.0 -f https://download.pytorch.org/whl/torch_stable.html

# -i https://pypi.tuna.tsinghua.edu.cn/simple/

# 4.2 conda安装
conda install pytorch==1.10.0 torchvision==0.11.0 torchaudio==0.10.0 cudatoolkit=11.3 -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/linux-64/

# 5 gcc版本 可选
conda install -c omgarcia gcc-6 # gcc-6.2

# 6 mmopenlib系列 mmcv-full会装很久,只要电脑没卡住都是正常现象
pip install mmcv-full==1.4.0 mmdet==2.14.0 mmsegmentation==0.14.1

# 7 源码安装mmdet3d-v0.17.1版本
# 7.1 进入bevformer目录
cd bevformer
# 7.2 下载mmdetection3d   github加速代理https://ghproxy.com/
git clone https://github.com/open-mmlab/mmdetection3d.git
# 7.3 进入mmdetection3d目录
cd mmdetection3d
# 7.4 切换v0.17.1
git checkout v0.17.1
# 7.5 安装mmdet3d-v0.17.1版本
python setup.py install

# 8 安装 Detectron2 and Timm
# 8.1 安装基本python依赖包
pip install einops fvcore seaborn iopath==0.1.9 timm==0.6.13  typing-extensions==4.5.0 pylint ipython==8.12  numpy==1.19.5 matplotlib==3.5.2 numba==0.48.0 pandas==1.4.4 scikit-image==0.19.3 setuptools==59.5.0 yapf==0.40.1
# 8.2 安装 Detectron2
python -m pip install 'git+https://github.com/facebookresearch/detectron2.git'

# 9 下载预训练模型
# 9.1 进入bevformer目录
cd bevformer
# 9.2 创建并进入ckpts文件夹
mkdir ckpts && cd ckpts
# 9.3 下载预训练权重r101_dcn_fcos3d_pretrain.pth,github加速代理https://ghproxy.com/
wget https://github.com/zhiqi-li/storage/releases/download/v1.0/r101_dcn_fcos3d_pretrain.pth

1.2 运行报错汇总

# 报错1 ImportError: libGL.so.1: cannot open shared object file: No such file or directory
# 修改:安装libsm6 libxext6 libgl1-mesa-glx
apt-get install libsm6 libxext6 libgl1-mesa-glx

 
# 报错2 ImportError: libgthread-2.0.so.0: cannot open shared object file: No such file or directory
# 修改:安装libglib2.0-dev
apt-get install libglib2.0-dev

# 报错3 ModuleNotFoundError: No module named 'tools'
# 修改:添加python环境变量
export PYTHONPATH="./"

# 报错4
# from data_converter import indoor_converter as indoor
# File "/home/lin/Documents/BEVFormer/tools/data_converter/indoor_converter.py", line 6, in 
# from tools.data_converter.s3dis_data_utils import S3DISData, S3DISSegData
# ModuleNotFoundError: No module named 'tools.data_converter'

修改:./tools/data_converter/indoor_converter.py的6-8行位置左右
将from tools.data_converter.s3dis_data_utils import S3DISData, S3DISSegData改成由from data_converter.s3dis_data_utils import ...
也就是tools.data_converter换成data_converter


# 错误5 TypeError: FormatCode() got an unexpected keyword argument 'verify'
# 修改:更新yapf版本为0.40.1
pip install yapf==0.40.1

# 错误6 显存爆炸
# 修改:samples_per_gpu=1, 48G显存设2显存就炸了, bev没钞能力还是不要玩 

运行出现报错请参考上面的报错汇总


2 准备数据集

  1. 数据集下载

下载数据参考MapTR代码复现实践的第2节数据集下载, 下载后数据放入data目录结构如下

# data文件夹展开,can_bus内容太多,这就不展开
data
├── can_bus   
    ├──...
└── nuscenes
    ├── maps
    ├── samples
    ├── sweeps
    └── v1.0-mini
  1. 生成训练需要的数据集格式
# 1 mini数据集 
python tools/create_data.py nuscenes --root-path ./data/nuscenes --out-dir ./data/nuscenes --extra-tag nuscenes --version v1.0-mini --canbus ./data

# 2 full数据集 可以将v1.0-mini复制一份命名v1.0-trainval
python tools/create_data.py nuscenes --root-path ./data/nuscenes --out-dir ./data/nuscenes --extra-tag nuscenes --version v1.0 --canbus ./data

运行上面代码后会在data/nuscenes/目录下生成2pkl2json 文件如下:

data
├── can_bus   
    ├──...
└── nuscenes
    ├── maps
    ├── nuscenes_infos_temporal_train.pkl
    ├── nuscenes_infos_temporal_train_mono3d.coco.json
    ├── nuscenes_infos_temporal_val.pkl
    ├── nuscenes_infos_temporal_val_mono3d.coco.json
    ├── samples
    ├── sweeps
    └── v1.0-mini

3 训练与测试

  1. 修改配置文件

训练前,修改配置文件./projects/configs/bevformer/bevformer_base.py参数, 主要下面4个参数:

前期测试环境是否正确, 建议设置max_epochs=2,samples_per_gpu=1,workers_per_gpu=0

load_from  # 预训练权重路径
max_epochs # 训练周期
samples_per_gpu=1, # bitch_size
workers_per_gpu=0, 
  1. 训练

最后一个参数是显卡个数, 只有一张显卡写1,8张写8

./tools/dist_train.sh ./projects/configs/bevformer/bevformer_base.py 1

训练6个周期,每2个周期保存一次权重,完成后生成valwork_dirs目录结构如下:

val
└── work_dirs
    └── bevformer_base
        └── Wed_Sep_27_21_04_49_2023
            └── pts_bbox

work_dirs
└──
    └── bevformer_base
        ├── 20230927_210445.log
        ├── 20230927_210445.log.json
        ├── bevformer_base.py
        ├── epoch_2.pth
        ├── epoch_4.pth
        ├── epoch_6.pth
        ├── latest.pth -> epoch_6.pth
        └── tf_logs
  1. 使用fp16精度训练模型
./tools/fp16/dist_train.sh ./projects/configs/bevformer_fp16/bevformer_tiny_fp16.py 1
  1. 测试评估
# 使用自己训练的权重预测
./tools/dist_test.sh ./projects/configs/bevformer/bevformer_base.py work_dirs/bevformer_base/latest.pth 1

生成test目录结构如下:

results_nusc.json就是检测结果

test
└── bevformer_base
    └── Thu_Sep_28_09_35_31_2023
        └── pts_bbox
            ├── metrics_details.json
            ├── metrics_summary.json
            ├── plots
            └── results_nusc.json

4 可视化

  1. 修改tools/analysis_tools/visual.py可视化代码
# 修改1 替换主函数
if __name__ == '__main__':
    # 数据集路径,使用mini就用v1.0-mini, 使用full就用v1.0-trainval
    nusc = NuScenes(version='v1.0-mini', dataroot='./data/nuscenes', verbose=False)
    # results_nusc.json路径
    bevformer_results = mmcv.load('test/bevformer_base/Thu_Sep_28_09_35_31_2023/pts_bbox/results_nusc.json')
    # 添加result目录
    save_dir = "result"
    if not os.path.exists(save_dir):
        os.mkdir(save_dir)

    sample_token_list = list(bevformer_results['results'].keys())
    
    for id in range(0, 10):
        render_sample_data(sample_token_list[id], pred_data=bevformer_results, out_path=os.path.join(save_dir, sample_token_list[id]))

# 修改2:将visual.py中的下面2句注释掉,就不用每次关闭当前显示窗口生成下一张图
# if verbose:
#     plt.show()
  1. 运行
python tools/analysis_tools/visual.py

结果图像保存到result目录下, 可视化如下:


由于只用mini数据集训练了6个周期,效果比较差。


  • BEV各算法环境部署实战汇总
  • 如果本文对您有帮助,一键三连一波^_^
  • 欢迎加入Q-472648720,大家一起学习bev相关知识1+1>2

你可能感兴趣的:(BEV环视感知,自动驾驶,目标检测,计算机视觉,深度学习,python)