近两年传统视觉方式开始往3d点云上面进行学习,以此来达到现实三维空间中的目标检测。上一篇文章second.pytorch环境配置记录简单写了一下second.pytorch算法的环境配置。当然,second.pytorch代码已经集成了pointpillars算法,不过经过一些修改。我对算法原始作者代码nutonomy/second.pytorch的代码进行一定程度的修改,以此能够有效的将模型导出成为onnx中间件(分为pfe.onnx与rpn.onnx两个onnx模型),最后通过TensorRT来载入加速模型推理速度。注:将pointpillars算法pytorch模型转换成为中间件IR:onnx,我参考了网上的k0suke-murakami/train_point_pillars,并且对其里面的代码进行修改,because 这部分代码不再进行维护了,所以我修改其中网络小功能以及一些bugs. 当然,很感谢k0suke-murakami做出的工作,对我很受启发。
Step 1 : 首先当然是下载代码与对应的docker环境
我在nutonomy/second.pytorch修改的代码地址如下:
git clone https://github.com/SmallMunich/nutonomy_pointpillars.git
pointpillars算法所对应的docker环境:
docker pull smallmunich/suke_pointpillars:v0
docker将镜像pull下来之后,进入容器后激活pointpillars运行虚拟环境:
conda activate pointpillars
Step 2: 训练与导出ONNX模型操作:
训练与数据准备步骤与原作者官网相同,做过训练的可以跳过此步骤:
生成预训练数据:
└── KITTI_DATASET_ROOT
├── training <-- 7481 train data
| ├── image_2 <-- for visualization
| ├── calib
| ├── label_2
| ├── velodyne
| └── velodyne_reduced <-- empty directory
└── testing <-- 7580 test data
├── image_2 <-- for visualization
├── calib
├── velodyne
└── velodyne_reduced <-- empty directory
数据格式如上,数据路径是你的存储kitti路径:
KITTI_DATASET_ROOT=/data/sets/kitti_second/
Create-kitti-infos
python create_data.py create_kitti_info_file --data_path=KITTI_DATASET_ROOT
Create-reduced-pointcloud
python create_data.py create_reduced_point_cloud --data_path=KITTI_DATASET_ROOT
Create-groundtruth-database-infos
python create_data.py create_groundtruth_database --data_path=KITTI_DATASET_ROOT
Modify-config-file
train_input_reader: {
...
database_sampler {
database_info_path: "/path/to/kitti_dbinfos_train.pkl"
...
}
kitti_info_path: "/path/to/kitti_infos_train.pkl"
kitti_root_path: "KITTI_DATASET_ROOT"
}
...
eval_input_reader: {
...
kitti_info_path: "/path/to/kitti_infos_val.pkl"
kitti_root_path: "KITTI_DATASET_ROOT"
}
训练步骤:
cd ~/second.pytorch/second
python ./pytorch/train.py train --config_path=./configs/pointpillars/car/xyres_16.proto --model_dir=/path/to/model_dir
进行评估模型:
cd ~/second.pytorch/second/
python pytorch/train.py evaluate --config_path= configs/pointpillars/car/xyres_16.proto --model_dir=/path/to/model_dir
如果模型评估结束,无错误,接下来可以进入模型中间件转换的步骤啦.
算法pytorch模型ONNX导出为pfe.onnx与rpn.onnx
在运行pytorch模型导出为onnx模型之前,你需要将工程nutonomy_pointpillars下面second/pytorch/models/voxelnet.py 文件中的rows: 686 这行代码取消注释,让其返回voxel_features的特征;取消注释之后,下面运行如下命令:
cd ~/second.pytorch/second/
python pytorch/train.py onnx_model_generate --config_path= configs/pointpillars/car/xyres_16.proto --model_dir=/path/to/model_dir
然后,你会在nutonomy_pointpillars/second文件夹下面看见两个onnx文件分别是:pfe.onnx与rpn.onnx模型。后续章节会继续分析pointpillars相关代码与TensorRT引擎下的速度性能分析,敬请关注。
开始尝试做3d点云目标检测算法有一段时间了,pointpillars算法从算力与精度上来看是目前比较优秀的3d-object-detection算法。pointpillars算法最突出的是提出一种柱形的编码功能,点云依然采取常用的体素组织起来。对比VoxelNet 直接采用体素3D卷积,SECOND的稀疏卷积,pointpillars采用pillar方式转换成为2D卷积来加深网络,以此来提高效率与精度。至于后面接SSD还是RPN等网络,只是相对于2d卷积下的网络根据应用场景与需求来进行选取。
https://arxiv.org/abs/1812.05784
https://github.com/nutonomy/second.pytorch
https://zhuanlan.zhihu.com/p/67314405
https://github.com/k0suke-murakami/train_point_pillars