Shi, Shaoshuai, et al. "Pv-rcnn: Point-voxel feature set abstraction for 3d object detection." Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2020.
PV-RCNN是Voxel-Based和Point-based相结合的Anchor-Based二阶段点云三维物体检测方法。在精度提优方面,PV-RCNN在Voxel-Branch中使用3D Sparse Conv学习有序体素特征,在Point-Branch中基于PointNet++提取无序点云的特征,将两种表示方法的优点充分结合,有效提升模型的精度。在性能提速方面,针对提取每个ROI内所有点云导致耗时太长的问题,PV-RCNN仅提取ROI内数量有限且能代表周围点云的关键点的特征,有效提升模型的性能。
- PV-RCNN在KITTI Val set数据集上的表现:
模型 | Car [email protected] AP_R11 / AP_R40 | Pedestrian [email protected] AP_R11 / AP_R40 | Cyclist [email protected] AP_R11 / AP_R40 | V100 TensorRT FP32(FPS) | V100 TensorRT FP16(FPS) | 模型下载 | 配置文件 | 日志 |
---|---|---|---|---|---|---|---|---|
PV-RCNN | 83.78 / 84.72 | 58.91 / 58.30 | 73.29 / 73.27 | 10.14 | 10.74 | model | config | log | vdl |
注意: KITTI benchmark使用8张V100 GPU训练得出。
- 目前Paddle3D中提供的PV-RCNN模型支持在KITTI数据集上训练,因此需要先准备KITTI数据集,请在官网进行下载:
-
Download Velodyne point clouds, if you want to use laser information (29 GB)
-
training labels of object data set (5 MB)
-
camera calibration matrices of object data set (16 MB)
并下载数据集的划分文件列表:
wget https://bj.bcebos.com/paddle3d/datasets/KITTI/ImageSets.tar.gz
将数据解压后按照下方的目录结构进行组织:
kitti_dataset_root
|—— training
| |—— label_2
| | |—— 000001.txt
| | |—— ...
| |—— calib
| | |—— 000001.txt
| | |—— ...
| |—— velodyne
| | |—— 000001.bin
| | |—— ...
|—— ImageSets
│ |—— test.txt
│ |—— train.txt
│ |—— trainval.txt
│ |—— val.txt
在Paddle3D的目录下创建软链接 datasets/KITTI
,指向到上面的数据集目录:
mkdir datasets
ln -s /path/to/kitti_dataset_root ./datasets
mv ./datasets/kitti_dataset_root ./datasets/KITTI
- 生成训练时数据增强所需的真值库:
python tools/create_det_gt_database.py --dataset_name kitti --dataset_root ./datasets/KITTI --save_dir ./datasets/KITTI
--dataset_root
指定KITTI数据集所在路径,--save_dir
指定用于保存所生成的真值库的路径。该命令执行后,save_dir
生成的目录如下:
kitti_train_gt_database
|—— anno_info_train.pkl
|—— Car
| |—— 4371_Car_7.bin
| |—— ...
|—— Cyclist
KITTI数据集上的训练使用8张GPU:
python -m paddle.distributed.launch --gpus 0,1,2,3,4,5,6,7 tools/train.py --config configs/pv_rcnn/pv_rcnn.yml --save_dir ./output_pv_rcnn --num_workers 4 --save_interval 1
训练启动参数介绍可参考文档全流程速览。
python tools/evaluate.py --config configs/pv_rcnn/pv_rcnn.yml --model ./output_pv_rcnn/epoch_80/model.pdparams --batch_size 1 --num_workers 4
注意:PV-RCNN的评估目前只支持batch_size为1。
评估启动参数介绍可参考文档全流程速览。
运行以下命令,将训练时保存的动态图模型文件导出成推理引擎能够加载的静态图模型文件。
python tools/export.py --config configs/pv_rcnn/pv_rcnn.yml --model /path/to/model.pdparams --save_dir /path/to/output
参数 | 说明 |
---|---|
config | [必填] 训练配置文件所在路径 |
model | [必填] 训练时保存的模型文件model.pdparams 所在路径 |
save_dir | [必填] 保存导出模型的路径,save_dir 下将会生成三个文件:pv_rcnn.pdiparams 、pv_rcnn.pdiparams.info 和pv_rcnn.pdmodel |
- GCC >= 5.4.0
- Cmake >= 3.5.1
- Ubuntu 16.04/18.04
说明:本文档的部署环节在以下环境中进行过测试并通过:
测试环境:
- GCC==8.2.0
- Cmake==3.16.0
- Ubuntu 18.04
- CUDA 11.2
- cuDNN==8.1.1
- Paddle Inferece==2.3.1
- TensorRT-8.2.5.1.Linux.x86_64-gnu.cuda-11.4.cudnn8.2
注意:目前PV-RCNN的仅支持使用GPU进行推理。
- step 1: 进入部署代码所在路径
cd deploy/pv_rcnn/cpp
- step 2: 下载Paddle Inference C++预编译库
Paddle Inference针对是否使用GPU、是否支持TensorRT、以及不同的CUDA/cuDNN/GCC版本均提供已经编译好的库文件,请至Paddle Inference C++预编译库下载列表选择符合的版本。
- step 3: 修改
compile.sh
中的编译参数
主要修改编译脚本compile.sh
中的以下参数:
参数 | 说明 |
---|---|
WITH_GPU | 是否使用gpu。ON或OFF, OFF表示使用CPU,默认ON |
USE_TENSORRT | 是否使用TensorRT加速。ON或OFF,默认OFF |
LIB_DIR | Paddle Inference C++预编译包所在路径,该路径下的内容应有:CMakeCache.txt 、paddle 、third_party 和version.txt |
CUDNN_LIB | cuDNNlibcudnn.so 所在路径 |
CUDA_LIB | CUDAlibcudart.so 所在路径 |
TENSORRT_ROOT | TensorRT所在路径。非必须,如果USE_TENSORRT 设置为ON 时,需要填写该路径,该路径下的内容应有bin 、lib 和include 等 |
- step 4: 开始编译
sh compile.sh
注意:目前PV-RCNN的仅支持使用GPU进行推理。
执行命令参数说明
参数 | 说明 |
---|---|
model_file | 导出模型的结构文件pv_rcnn.pdmodel 所在路径 |
params_file | 导出模型的参数文件pv_rcnn.pdiparams 所在路径 |
lidar_file | 待预测的点云文件所在路径 |
num_point_dim | 点云文件中每个点的维度大小。例如,若每个点的信息是x, y, z, intensity ,则num_point_dim 填写为4 |
point_cloud_range | 输入模型的点云所处的空间范围,超出此范围内的点将被滤除。格式为"X_min Y_min Z_min X_max Y_Max Z_max" |
./build/main --model_file /path/to/pv_rcnn.pdmodel --params_file /path/to/pv_rcnn.pdiparams --lidar_file /path/to/lidar.pcd.bin --num_point_dim 4 --point_cloud_range "0 -40 -3 70.4 40 1"
注意: 请预先确认实际待测试点云文件的维度是否是4,如果不是4,--num_point_dim
请修改为实际值。
注意:请根据编译步骤的step 3,修改compile.sh
中TensorRT相关的编译参数,并重新编译。
运行命令参数说明如下:
参数 | 说明 |
---|---|
model_file | 导出模型的结构文件pv_rcnn.pdmodel 所在路径 |
params_file | 导出模型的参数文件pv_rcnn.pdiparams 所在路径 |
lidar_file | 待预测的点云文件所在路径 |
num_point_dim | 点云文件中每个点的维度大小。例如,若每个点的信息是x, y, z, intensity ,则num_point_dim 填写为4 |
point_cloud_range | 输入模型的点云所处的空间范围,超出此范围内的点将被滤除。格式为"X_min Y_min Z_min X_max Y_Max Z_max" |
use_trt | 是否使用TensorRT进行加速,默认0 |
trt_precision | 当use_trt设置为1时,模型精度可设置0或1,0表示fp32, 1表示fp16。默认0 |
trt_use_static | 当trt_use_static设置为1时,在首次运行程序的时候会将TensorRT的优化信息进行序列化到磁盘上,下次运行时直接加载优化的序列化信息而不需要重新生成。默认0 |
trt_static_dir | 当trt_use_static设置为1时,保存优化信息的路径 |
collect_shape_info | 是否收集模型动态shape信息。默认0。只需首次运行,下次运行时直接加载生成的shape信息文件即可进行TensorRT加速推理 |
dynamic_shape_file | 保存模型动态shape信息的文件路径。 |
-
首次运行TensorRT,收集模型动态shape信息,并保存至
--dynamic_shape_file
指定的文件中./build/main --model_file /path/to/pv_rcnn.pdmodel --params_file /path/to/pv_rcnn.pdiparams --lidar_file /path/to/lidar.pcd.bin --num_point_dim 4 --point_cloud_range "0 -40 -3 70.4 40 1" --use_trt 1 --collect_shape_info 1 --dynamic_shape_file /path/to/shape_info.txt
-
加载
--dynamic_shape_file
指定的模型动态shape信息,使用FP32精度进行预测./build/main --model_file /path/to/pv_rcnn.pdmodel --params_file /path/to/pv_rcnn.pdiparams --lidar_file /path/to/lidar.pcd.bin --num_point_dim 4 --point_cloud_range "0 -40 -3 70.4 40 1" --use_trt 1 --dynamic_shape_file /path/to/shape_info.txt
-
加载
--dynamic_shape_file
指定的模型动态shape信息,使用FP16精度进行预测./build/main --model_file /path/to/pv_rcnn.pdmodel --params_file /path/to/pv_rcnn.pdiparams --lidar_file /path/to/lidar.pcd.bin --num_point_dim 4 --point_cloud_range "0 -40 -3 70.4 40 1" --use_trt 1 --dynamic_shape_file /path/to/shape_info.txt --trt_precision 1
-
如果觉得每次运行时模型加载的时间过长,可以设置
trt_use_static
和trt_static_dir
,首次运行时将TensorRT的优化信息保存在硬盘中,后续直接反序列化优化信息即可
./build/main --model_file /path/to/pv_rcnn.pdmodel --params_file /path/to/pv_rcnn.pdiparams --lidar_file /path/to/lidar.pcd.bin --num_point_dim 4 --point_cloud_range "0 -40 -3 70.4 40 1" --use_trt 1 --dynamic_shape_file /path/to/shape_info.txt --trt_precision 1 --trt_use_static 1 --trt_static_dir /path/to/OptimCacheDir
注意:目前PV-RCNN的仅支持使用GPU进行推理。
命令参数说明如下:
参数 | 说明 |
---|---|
model_file | 导出模型的结构文件pv_rcnn.pdmodel 所在路径 |
params_file | 导出模型的参数文件pv_rcnn.pdiparams 所在路径 |
lidar_file | 待预测的点云文件所在路径 |
num_point_dim | 点云文件中每个点的维度大小。例如,若每个点的信息是x, y, z, intensity ,则num_point_dim 填写为4 |
point_cloud_range | 输入模型的点云所处的空间范围,超出此范围内的点将被滤除。格式为X_min Y_min Z_min X_max Y_Max Z_max |
use_trt | 是否使用TensorRT进行加速,默认0 |
trt_precision | 当use_trt设置为1时,模型精度可设置0或1,0表示fp32, 1表示fp16。默认0 |
trt_use_static | 当trt_use_static设置为1时,在首次运行程序的时候会将TensorRT的优化信息进行序列化到磁盘上,下次运行时直接加载优化的序列化信息而不需要重新生成。默认0 |
trt_static_dir | 当trt_use_static设置为1时,保存优化信息的路径 |
collect_shape_info | 是否收集模型动态shape信息。默认0。只需首次运行,后续直接加载生成的shape信息文件即可进行TensorRT加速推理 |
dynamic_shape_file | 保存模型动态shape信息的文件路径。 |
运行以下命令,执行预测:
python infer.py --model_file /path/to/pv_rcnn.pdmodel --params_file /path/to/pv_rcnn.pdiparams --lidar_file /path/to/lidar.pcd.bin --num_point_dim 4 --point_cloud_range 0 -40 -3 70.4 40 1
请参考文档自定义数据集格式说明准备自定义数据集。