官方解释:BEVFusion 是一种基于 鸟瞰图(Bird's Eye View, BEV) 的多模态感知框架,主要用于自动驾驶和3D场景理解。它通过融合来自不同传感器(如摄像头、激光雷达)的数据,生成统一的BEV表示,从而提升环境感知的准确性和鲁棒性。
我的理解:不知道大家有没有做过目标检测、分割、分类等这样的任务。用过YOLO的都知道,有一个框架,叫ultralytics,一般情况下,YOLO应用于2D图像的场景。而BEVFusion也可以理解为一个框架,类似于YOLO,只不过这里应用到3D图像的场景。
实验部分
环境配置
# 创建虚拟环境和安装pytorch框架
conda create -n pytorch-bev python=3.8
conda activate pytorch-bev
conda install pytorch==1.10.1 torchvision==0.11.2 torchaudio==0.10.1 cudatoolkit=11.3 -c pytorch
# 安装其它包
pip install Pillow==8.4.0
pip install tqdm
pip install torchpack
pip install mmcv==1.4.0 mmcv-full==1.4.0 mmdet==2.20.0
pip install nuscenes-devkit
conda install mpi4py==3.0.3
pip install numba==0.48.0
pip uninstall numpy
pip install numpy==1.23.0
pip uninstall setuptools
conda install setuptools==58.0.4
pip install yapf==0.40.1
pip install openmpi
# 说明:有博文说openmpi无法通过pip指令下载,需要从官网下载压缩包,并解压,见下面代码:
wget https://download.open-mpi.org/release/open-mpi/v4.1/openmpi-4.1.4.tar.gz
tar zxf openmpi-4.1.4.tar.gz
cd openmpi-4.1.4
./configure --prefix=/usr/local/openmpi
make -j8
sudo make install
# 环境配置
vim ~/.bashrc # 使用vim打开文件.bashrc,按i进入编辑状态
export OPENMPI_PATH=/home/user/software/openmpi-4.0.4
export PATH=$OPENMPI_PATH/bin:$PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$OPENMPI_PATH/lib:$LD_LIBRARY_PATH
export LIBRARY_PATH=$OPENMPI_PATH/lib:$LIBRARY_PATH
export INCLUDE=$OPENMPI_PATH/include:$INCLUDE
export MANPATH=$OPENMPI_PATH/share/man:$MANPATH
source ~/.bashrc # 保存环境变量
mpiexec -V # 验证openmpi是否安装成功
# 说明:在服务器上请求访问下载链接,出现连接失败的情况——无法正确连接SSH。
下面,安装BEVFusion:
地址:https://github.com/mit-han-lab/bevfusion.git
修改 mmdet3d/ops/spconv/src/indice_cuda.cu 文件
把 mmdet3d/ops/spconv/src/indice_cuda.cu 文件里面所有的4096改为256
编译:cd bevfusion
python setup.py develop
# 说明:如果使用服务器,需要上传到虚拟环境,并执行。
下载Nuscenes数据集:https://www.nuscenes.org/download
查看一下其组织结构:
bevfusion
├── assets
├── configs
├── mmdet3d
├── tools
├── data
│ ├── nuscenes
│ │ ├── maps
│ │ │ ├── basemap
│ │ │ ├── expansion
│ │ │ ├── prediction
│ │ ├── samples
│ │ ├── sweeps
│ │ ├── v1.0-test
│ │ ├── v1.0-trainval
# samples:包含了点云和图像采集的10+映射所采集的图像
# sweeps:对samples的清理
# 补充:linux命令——df hl
df:disk free。磁盘空闲状态。
h:human。以人类可读的方式查询。
l:list。列出或显示的意思。
现在,我们要按顺序做下面的事情:
在web文件系统(我使用的堡垒机)中创建一个文件夹,用于存放BEV模型、openmpi加速器和数据集。通常以压缩包的形式给出。
切换到/export/目录下。
创建一个文件夹,名为BEVDetection
将openmpi压缩包上传到该文件夹下。【这里要学习一些新的工具:从本地上传文件到linux】
这里作为测试。scp openmpi-4.1.4.tar.gz root@10.103.60.179:/root/export/BEVDetectionn
经过测试发现,本地机器无法通过SSH连接到目标服务器(10.103.60.179
),导致scp
命令失败,但是,网页端有上传按钮,这里传输一个tar(16MB)大约30s。
解压:tar zxf openmpi-4.1.4.tar.gz
下面,进行配置路径环境、编译,安装、配置环境变量
配置路径环境:指定安装目录。
进入源码目录:cd /export/BEVDetection/openmpi-4.1.4
配置安装路径:./configure --prefix=/export/BEVDetection/openmpi
编译:make -j8(手动指定线程数(如8))
安装:sudo make install(需root权限)
安装后目录结构:
├── bin/ # mpirun, mpicc等命令
├── include/ # MPI头文件
├── lib/ # 库文件
└── share/ # 文档和示例
配置环境变量:vim ~/.bashrc
在最后新增下面路径:
——换成自己的路径
MPI_HOME=/export/BEVDetection/openmpi
OMPI_MCA_opal_cuda_support=true
export PATH=${MPI_HOME}/bin:$PATH
export LD_LIBRARY_PATH=${MPI_HOME}/lib:$LD_LIBRARY_PATH
export MANPATH=${MPI_HOME}/share/man:$MANPATH
:wq 保存即可
测试一下:
cd /export/BEVDetection/openmpi-4.1.4/examples
make
mpirun -np 4 hello_c
# make:编译
这里是在编译的时候出错,故而找不到编译文件
下面,安装一些所需要的功能包。
pip install mmcv-full==1.4.0
pip install mmdet==2.20.0
conda install openmpi # openmpi是一个包,用于BEVFusion模型,可实现数据和模型的并行处理,类似于Cuda。
conda install mpi4py
pip install Pillow==8.4.0
pip install tqdm
pip install torchpack
pip install nuscenes-devkit
pip install ninja
pip install numpy==1.19
pip install numba==0.48.0
pip install shapely==1.8.0
下面,上传bevfusion。然后,在当前目录下进行编译
切换到当前目录:cd /export/BEVDetection/bevfusion-main
在当前目录下编译:python setup.py develop
接着,我们收集2个压缩包,地址:https://www.nuscenes.org/download
包1:v1.0-mini。
包2:nuScenes-map-expansion-v1.3。
紧随其后,需要对这2个压缩包解压,在解压前,先查看解压后的目录结构:
bevfusion
├── tools
├── configs
├── data
│ ├── nuscenes
│ │ ├── maps
│ │ ├── samples
│ │ ├── sweeps
│ │ ├── v1.0-mini
说明:这里根据目录结构,缺少哪个文件夹,新建文件夹即可。比如:在bevfusion下新建data/nuscenes,将v1.0-mini解压到nuscences中。接着,将nuScenes-map-expansion-v1.3.zip解压到map中。
好!
首先,对v1.0-mini.tgz解压。将压缩包解压到./data/nuscences中。
命令:tar -xzvf v1.0-mini.tgz -C /tmp/Dataprocessing/BEVDetection/bevfusion-main/data/nuscenes
// 这里主包换服务器了,上面是我的解压路径。
其次,对nuScenes-map-expansion-v1.3.zip解压。将压缩包解压到./data/nuscenes/maps中。
命令:unzip nuScenes-map-expansion-v1.3.zip -d /tmp/Dataprocessing/BEVDetection/bevfusion-main/data/nuscenes/maps
好了!我们来到下一关:对数据进行预处理。
友情提示:如果有虚拟环境,记得激活下虚拟环境!
处理完以后,进入下面这个目录,查看结构:/tmp/Dataprocessing/BEVDetection/bevfusion-main/data/nuscenes/maps
这一关结束!我们开始对预处理的数据进行处理~
Step1:下载预训练权重。
下载完成后,得到一个压缩包。现在,我在bevfusion-main目录下新建一个目录,叫pretrained,直接使用命令:mkdir pretrained,并将压缩包中的预训练权重文件加压到此。
Step2:训练。
在训练前,我们需要设定下面这些参数:
①训练轮数
修改bevfusion-main/configs/default.yaml文件中的max_epochs: 5
修改bevfusion-main/configs/nuscenes/det/transfusion/secfpn/camera+lidar/default.yaml, max_epoch:5
②批大小
修改bevfusion-main/configs/nuscenes/default.yaml - > samples_per_gpu:2
③线程数量
修改bevfusion-main/configs/nuscenes/default.yaml - > workers_per_gpu:2
修改
②来到这个目录下:/tmp/Dataprocessing/BEVDetection/bevfusion-main
训练:
torchpack dist-run -np 1 python tools/train.py configs/nuscenes/det/transfusion/secfpn/camera+lidar/swint_v0p075/convfuser.yaml --model.encoders.camera.backbone.init_cfg.checkpoint pretrained/swint-nuimages-pretrained.pth --load_from pretrained/lidar-only-det.pth