自动驾驶系统进阶与项目实战(十)基于PointPillars的点云三维目标检测和TensorRT实战(1)
自动驾驶系统进阶与项目实战(十)基于PointPillars的点云三维目标检测和TensorRT实战(1)
自动驾驶系统进阶与项目实战(十)基于PointPillars的点云三维目标检测和TensorRT实战(1)
发表于CVPR2019的PointPillars是目前比较受业内认可的激光雷达三维检测算法,其推理速度和性能俱佳,百度Apollo和Autoware两个开源自动驾驶项目的感知系统均包含了基于PointPillars目标检测模块。本文首先从理论层面解析PointPillars方法,接着使用PyTorch和Kitti数据集从零开始训练一个神经网络,我们将使用kitti的测试数据推理并可视化检测结果。在下一篇文章中,我们将模型导出为ONNX,并且进一步导出为TensorRT的engine模型,最后在C++项目中推理TensorRT模型。完成本文,你将能复现以下结果:
和2D图像的深度学习目标检测很不相同,点云数据具有两个显著特征:(1)相对2D图像来说,点云数据非常稀疏;(2)点云数据是三维的。为了将图像领域卷积神经网络做模式识别的经验引入三维点云中,一些深度学习方法采用了三维卷积方法或者是将点云投射为2维深度图,还有一类方法是使用鸟瞰视角(Bird’s Eye View)来组织点云数据的输入,相比于2维深度图,鸟瞰图不存在遮挡问题,但是数据分布更加稀疏,造成网络特征学习效率低下。为了解决特征稀疏问题,一种做法是对鸟瞰视角下的平面做网格划分,然后提取网格内的某些统计学特征(百度CNN-SEG即是采用此方法做特征输入),显然人为设计的统计学特征在模型泛化上可能存在缺陷,行业的新方法往往趋向于end-to-end learning,即使用神经网络去学习鸟瞰网格内的特征表示,VoxelNet是第一个这么做的(可以参考我18年的介绍VoxelNet的文章:https://blog.csdn.net/AdamShan/article/details/84837211?spm=1001.2014.3001.5501 )。但是VoxelNet及其继任者SECOND因为都采用了三维卷积,在推理上的实时性比较差。
- 使用Pillar这种方式描述点云数据,并且使用编码器网络学习Pillar特征表示;
- 整个PointPillars方法仅采用2D 卷积层。
这两个特点带来的好处包括:自学习的特征表示会有更好的泛化能力,仅采用2D卷积层在计算上显著提升了速度,此外,Pillar的数据表示不需要工程师对具体的激光雷达(线数不同,垂直角度分布不同)做配置和适配。
如果你不想使用kitti数据集从头训练一个PointPillars网络(考虑到很多读者没有训练用的GPU条件或者没有办法下载完整的Kitti 3D检测数据集),那么你还可以直接下载AdamShan训练好的模型以及一帧Kitti样例测试数据进行PointPillars网络的推理验证:
link: https://pan.baidu.com/s/1cDq5Nwi_EfZflQHHiOOZWA password: 32nn
- checkpoint_epoch_80.pth: 笔者基于Kitti训练的Single head的pointpillars模型checkpoint文件
- txt, png, bin:分别为Kitti测试集中的一帧数据的标定文件、左相机图片、激光雷达点云
将下载好的checkpoint文件(checkpoint_epoch_80.pth
)拷贝到output/kitti_models/pointpillar/default/ckpt/
目录下,将下载好的样例数据000099.bin
拷贝到data/kitti/testing/velodyne/
目录下,将000099.txt
拷贝到data/kitti/testing/calib/
目录下,将000099.png
拷贝到data/kitti/testing/image_2/
目录下。
运行demo.py可视化模型在测试集上的推理效果:
# inside your conda env
cd tools
python demo.py --cfg_file cfgs/kitti_models/pointpillar.yaml --data_path ../data/kitti/testing/velodyne/000099.bin --ckpt ../output/kitti_models/pointpillar/default/ckpt/checkpoint_epoch_80.pth
其中--cfg_file
跟模型配置文件, --data_path
跟要可视化的点云数据(测试集),--ckpt
跟训练的模型的路径。可以看到单帧数据可视化的效果:
再使用以下脚本将检测结果可视化到图像中:
cd visual_tools
python draw_3d_onimg.py
-
结合Open3D的可视化效果,最终得到以下推理结果:
- PointPillars原文:https://arxiv.org/pdf/1812.05784.pdf
- OpenPCDet官方仓库: https://github.com/open-mmlab/OpenPCDet
- 本文项目仓库:https://github.com/AbangLZU/EasyPointPillars
- Adam预训练的模型文件和kitti样例数据下载链接: https://pan.baidu.com/s/1cDq5Nwi_EfZflQHHiOOZWA 密码: 32nn