BevFormer复现
服务器:Autodl
环境:ubuntu20.04,python-3.8, torch-1.10.0, cuda-11.3, cudnn-8.6
环境安装
1 拉取源码
git clone https://github.com/fundamentalvision/BEVFormer.git
2 创建虚拟环境
conda create -n bev python=3.8 -y
3 激活虚拟环境
conda activate bev
4 安装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
5 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/
6 gcc版本
conda install -c omgarcia gcc-6
7 mmopenlib系列 mmcv-full会装很久,只要电脑没卡住都是正常现象
pip install mmcv-full==1.4.0 mmdet==2.14.0 mmsegmentation==0.14.1
8 源码安装mmdet3d-v0.17.1版本
8.1 进入BEVFormer目录
cd BEVFormer
8.2 下载mmdetection3d
git clone https://github.com/open-mmlab/mmdetection3d.git
8.3 进入mmdetection3d目录
cd mmdetection3d
8.4 切换v0.17.1
git checkout v0.17.1
8.5 安装mmdet3d-v0.17.1版本
python setup.py install
9 安装 Detectron2 and Timm
9.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
9.2 安装 Detectron2
python -m pip install 'git+https://github.com/facebookresearch/detectron2.git'
10 下载预训练模型
10.1 进入BEVFormer目录
cd BEVFormer
10.2 创建并进入ckpts文件夹
mkdir ckpts && cd ckpts
10.3 下载预训练权重r101_dcn_fcos3d_pretrain.pth
wget https://github.com/zhiqi-li/storage/releases/download/v1.0/r101_dcn_fcos3d_pretrain.pth
数据集
- 数据集下载
下载地址 提取码:v3cv
下载后数据放入
data
目录结构如下# data文件夹展开,can_bus内容太多,这就不展开 data ├── can_bus ├──... └── nuscenes ├── maps ├── samples ├── sweeps └── v1.0-mini
- 生成训练需要的数据集格式
# 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/
目录下生成2
个pkl
和2
个json
文件如下: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
训练
- 修改配置文件
训练前,修改配置文件
./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,8张写8
./tools/dist_train.sh ./projects/configs/bevformer/bevformer_base.py 1
训练6个周期,每2个周期保存一次权重,完成后生成
val
和work_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
- 使用fp16精度训练模型
./tools/fp16/dist_train.sh ./projects/configs/bevformer_fp16/bevformer_tiny_fp16.py 1
由于租借服务器显存不够,下一步使用已经训练好的模型进行
测试
已训练模型下载 提取码:n998
- 测试评估
./tools/dist_test.sh ./projects/configs/bevformer/bevformer_base.py train/bevformer_r101_dcn_24ep.pth 1
生成
test
目录结构如下:
results_nusc.json
就是检测结果test └── bevformer_base └── Wed_Dec_11_16_23_05_2024 └── pts_bbox ├── metrics_details.json ├── metrics_summary.json ├── plots └── results_nusc.json
可视化
- 修改
tools/analysis_tools/visual.py
可视化代码
# 修改1 替换主函数 if __name__ == '__main__': # 数据集路径,使用mini就用v1.0-mini, 使用full就用v1.0-trainval nusc = NuScenes(version='v1.0-mini', dataroot='../autodl-tmp/data/nuscenes', verbose=False) # results_nusc.json路径 bevformer_results = mmcv.load('test/bevformer_base/Wed_Dec_11_16_23_05_2024/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()
- 运行
python tools/analysis_tools/visual.py
结果图像保存到
result
目录下, 可视化如下:
运行报错
报错信息:
ModuleNotFoundError: No module named 'tools.data_converter'
解决办法:在BEVFormer/tools/目录下添加一个空的
__init__.py
文件即可解决。