BEVFormer代码复现实践
BEVFormer-github地址-YYDS
^_^
Q
裙-472648720
# 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 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没钞能力还是不要玩
运行出现报错请参考上面的报错汇总
下载数据参考MapTR代码复现实践的第2节数据集下载, 下载后数据放入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
./tools/fp16/dist_train.sh ./projects/configs/bevformer_fp16/bevformer_tiny_fp16.py 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
# 修改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()
python tools/analysis_tools/visual.py
结果图像保存到result
目录下, 可视化如下:
由于只用mini数据集训练了6个周期,效果比较差。
^_^
Q
裙-472648720
,大家一起学习bev
相关知识1+1>2