Skip to content

Latest commit

 

History

History

pointpillars

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 

PointPillars: Fast Encoders for Object Detection from Point Clouds

目录

引用

Lang, Alex H., Sourabh, Vora, Holger, Caesar, Lubing, Zhou, Jiong, Yang, and Oscar, Beijbom. "PointPillars: Fast Encoders for Object Detection From Point Clouds." . In 2019 IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR) (pp. 12689-12697).2019.

简介

PointPillars是目前工业界应用广泛的点云检测模型,其最主要的特点是检测速度和精度的平衡。PointPillars 在 VoxelNetSECOND 的基础上针对性能进行了优化,将点云转化为柱体(Pillars)表示,从而使得编码后的点云特征可以使用2D卷积神经网络进行检测任务。

模型库

  • PointPillars在KITTI Val set数据集上Car类别的表现
模型 Car
Easy Mod. Hard
V100 TensorRT FP32(FPS) V100 TensorRT FP16(FPS) 模型下载 配置文件
PointPillars 86.90 75.21 71.57 37.3 40.5 model config
  • PointPillars在KITTI Val set数据集上Cyclist及Pedestrian类别的表现
模型 Cyclist
Easy Mod. Hard
Pedestrian
Easy Mod. Hard
V100 TensorRT FP32(FPS) V100 TensorRT FP16(FPS) 模型下载 配置文件
PointPillars 84.36 64.66 60.53 66.13 60.36 54.40 30.0 30.2 model config

训练配置

我们提供了在开源数据集上的训练配置与结果,详见PointPillars 训练配置

使用教程

数据准备

  • 目前Paddle3D中提供的PointPillars模型支持在KITTI数据集上训练,因此需要先准备KITTI数据集,请在官网进行下载:
  1. Download Velodyne point clouds, if you want to use laser information (29 GB)

  2. training labels of object data set (5 MB)

  3. 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

训练

位于Paddle3D/目录下,执行:

python -m paddle.distributed.launch --gpus 0 \
    tools/train.py \
    --config configs/pointpillars/pointpillars_xyres16_kitti_car.yml \
    --save_interval 1856 \
    --keep_checkpoint_max 100 \
    --save_dir outputs/pointpillars \
    --do_eval \
    --num_workers 8

训练脚本支持设置如下参数:

参数名 用途 是否必选项 默认值
gpus 使用的GPU编号 -
config 配置文件 -
save_dir 模型和visualdl日志文件的保存根路径 output
num_workers 用于异步读取数据的进程数量, 大于等于1时开启子进程读取数据 2
save_interval 模型保存的间隔步数 1000
do_eval 是否在保存模型时进行评估
log_interval 打印日志的间隔步数 10
keep_checkpoint_max 最新模型保存个数 5
resume 是否从断点恢复训练
batch_size mini-batch大小(每张GPU) 在配置文件中指定
iters 训练轮数 在配置文件中指定
learning_rate 学习率 在配置文件中指定
seed Paddle的全局随机种子值 None

评估

位于Paddle3D/目录下,执行:

python tools/evaluate.py \
    --config configs/pointpillars/pointpillars_xyres16_kitti_car.yml \
    --model /path/to/model.pdparams \
    --num_workers 8

评估脚本支持设置如下参数:

参数名 用途 是否必选项 默认值
config 配置文件 -
model 待评估模型路径 -
num_workers 用于异步读取数据的进程数量, 大于等于1时开启子进程读取数据 2
batch_size mini-batch大小 在配置文件中指定

模型导出

运行以下命令,将训练时保存的动态图模型文件导出成推理引擎能够加载的静态图模型文件。

python tools/export.py \
    --config configs/pointpillars/pointpillars_xyres16_kitti_car.yml \
    --model /path/to/model.pdparams \
    --save_dir /path/to/output

模型导出脚本支持设置如下参数:

参数名 用途 是否必选项 默认值
config 配置文件 -
model 待导出模型参数model.pdparams路径 -
save_dir 保存导出模型的路径,save_dir下将会生成三个文件:pointpillars.pdiparams pointpillars.pdiparams.infopointpillars.pdmodel deploy

模型部署

C++部署(Linux系统)

环境依赖:

  • 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
  • PaddleInference==2.3.1
  • TensorRT-8.2.5.1.Linux.x86_64-gnu.cuda-11.4.cudnn8.2

编译步骤:

注意:目前PointPillars的仅支持使用GPU进行推理。

  • step 1: 进入部署代码所在路径
cd deploy/pointpillars/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
USE_TENSORRT 是否使用TensorRT加速 ON
LIB_DIR Paddle Inference C++预编译包所在路径,该路径下的内容应有:CMakeCache.txtpaddlethird_partyversion.txt -
CUDNN_LIB cuDNNlibcudnn.so所在路径 /usr/lib/x86_64-linux-gnu
CUDA_LIB CUDAlibcuda.so所在路径 /usr/local/cuda/lib64
TENSORRT_ROOT TensorRT所在路径 如果USE_TENSORRT设置为ON时,需要填写该路径,该路径下的内容应有binlibinclude
  • step 4: 开始编译
sh compile.sh

执行预测:

注意:目前Pointpillars仅支持使用GPU进行推理。

执行命令参数说明

参数名 说明 是否必选项 默认值
model_file 导出模型的结构文件pointpillars.pdmodel所在路径 -
params_file 导出模型的参数文件pointpillars.pdiparams所在路径 -
lidar_file 待预测的点云文件所在路径 -
point_cloud_range 模型中将点云划分为柱体(pillars)时选取的点云范围,格式为"X_min Y_min Z_min X_max Y_Max Z_max" -
voxel_size 模型中将点云划分为柱体(pillars)时每个柱体的尺寸,格式为"X_size Y_size Z_size" -
max_points_in_voxel 模型中将点云划分为柱体(pillars)时每个柱体包含点数量上限 -
max_voxel_num 模型中将点云划分为柱体(pillars)时保留的柱体数量上限 -
num_point_dim 点云文件中每个点的维度大小。例如,若每个点的信息是x, y, z, intensity,则num_point_dim填写为4 4

执行命令:

./build/main \
  --model_file /path/to/pointpillars.pdmodel \
  --params_file /path/to/pointpillars.pdiparams \
  --lidar_file /path/to/lidar.pcd.bin \
  --point_cloud_range "0 -39.68 -3 69.12 39.68 1" \
  --voxel_size ".16 .16 4" \
  --max_points_in_voxel 32 \
  --max_voxel_num 40000

开启TensorRT加速预测【可选】:

注意:请根据编译步骤的step 3,修改compile.sh中TensorRT相关的编译参数,并重新编译。

运行命令参数说明如下:

参数名 说明 是否必选项 默认值
model_file 导出模型的结构文件pointpillars.pdmodel所在路径 -
params_file 导出模型的参数文件pointpillars.pdiparams所在路径 -
lidar_file 待预测的点云文件所在路径 -
point_cloud_range 模型中将点云划分为柱体(pillars)时选取的点云范围,格式为"X_min Y_min Z_min X_max Y_Max Z_max" -
voxel_size 模型中将点云划分为柱体(pillars)时每个柱体的尺寸,格式为"X_size Y_size Z_size" -
max_points_in_voxel 模型中将点云划分为柱体(pillars)时每个柱体包含点数量上限 -
max_voxel_num 模型中将点云划分为柱体(pillars)时保留的柱体数量上限 -
num_point_dim 点云文件中每个点的维度大小。例如,若每个点的信息是x, y, z, intensity,则num_point_dim填写为4 4
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 use_trt设置为1时,是否收集模型动态shape信息。默认0。只需首次运行,下次运行时直接加载生成的shape信息文件即可进行TensorRT加速推理 0
dynamic_shape_file collect_shape_info设置为1时,保存模型动态shape信息的文件路径 -
  • 首次运行TensorRT,收集模型动态shape信息,并保存至--dynamic_shape_file指定的文件中

    ./build/main \
      --model_file /path/to/pointpillars.pdmodel \
      --params_file /path/to/pointpillars.pdiparams \
      --lidar_file /path/to/lidar.bin \
      --num_point_dim 4 \
      --point_cloud_range "0 -39.68 -3 69.12 39.68 1" \
      --voxel_size ".16 .16 4" \
      --max_points_in_voxel 32 \
      --max_voxel_num 40000 \
      --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/pointpillars.pdmodel \
      --params_file /path/to/pointpillars.pdiparams \
      --lidar_file /path/to/lidar.bin \
      --num_point_dim 4 \
      --point_cloud_range "0 -39.68 -3 69.12 39.68 1" \
      --voxel_size ".16 .16 4" \
      --max_points_in_voxel 32 \
      --max_voxel_num 40000 \
      --use_trt 1 \
      --dynamic_shape_file /path/to/shape_info.txt
  • 加载--dynamic_shape_file指定的模型动态shape信息,使用FP16精度进行预测

    ./build/main \
      --model_file /path/to/pointpillars.pdmodel \
      --params_file /path/to/pointpillars.pdiparams \
      --lidar_file /path/to/lidar.bin \
      --num_point_dim 4 \
      --point_cloud_range "0 -39.68 -3 69.12 39.68 1" \
      --voxel_size ".16 .16 4" \
      --max_points_in_voxel 32 \
      --max_voxel_num 40000 \
      --use_trt 1 \
      --dynamic_shape_file /path/to/shape_info.txt \
      --trt_precision 1
  • 如果觉得每次运行时模型加载的时间过长,可以设置trt_use_statictrt_static_dir,首次运行时将TensorRT的优化信息保存在硬盘中,后续直接反序列化优化信息即可

    ./build/main \
      --model_file /path/to/pointpillars.pdmodel \
      --params_file /path/to/pointpillars.pdiparams \
      --lidar_file /path/to/lidar.bin \
      --num_point_dim 4 \
      --point_cloud_range "0 -39.68 -3 69.12 39.68 1" \
      --voxel_size ".16 .16 4" \
      --max_points_in_voxel 32 \
      --max_voxel_num 40000 \
      --use_trt 1 \
      --dynamic_shape_file /path/to/shape_info.txt \
      --trt_use_static 1 \
      --trt_static_dir /path/to/OptimCacheDir

Python 部署

注意:目前PointPillars的仅支持使用GPU进行推理。

运行命令参数说明如下:

参数名 用途 是否必选项 默认值
mdoel_file 导出模型的结构文件pointpillars.pdmodel所在路径 -
params_file 导出模型的参数文件pointpillars.pdiparams所在路径 -
lidar_file 待预测的点云所在路径 -
point_cloud_range 模型中将点云划分为柱体(pillars)时选取的点云范围,格式为X_min Y_min Z_min X_max Y_Max Z_max -
voxel_size 模型中将点云划分为柱体(pillars)时每个柱体的尺寸,格式为X_size Y_size Z_size -
max_points_in_voxel 模型中将点云划分为柱体(pillars)时每个柱体包含点数量上限 -
max_voxel_num 模型中将点云划分为柱体(pillars)时保留的柱体数量上限 -
num_point_dim 点云文件中每个点的维度大小。例如,若每个点的信息是x, y, z, intensity,则num_point_dim填写为4 4
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加速推理 0
dynamic_shape_file 保存模型动态shape信息的文件路径 -

运行以下命令,执行预测:

python infer.py \
  --model_file /path/to/pointpillars.pdmodel \
  --params_file /path/to/pointpillars.pdiparams \
  --lidar_file /path/to/lidar.bin \
  --point_cloud_range 0 -39.68 -3 69.12 39.68 1 \
  --voxel_size .16 .16 4 \
  --max_points_in_voxel 32 \
  --max_voxel_num 40000