自动驾驶系统进阶与项目实战(十)基于PointPillars的点云三维目标检测和TensorRT实战(1)

link

自动驾驶系统进阶与项目实战(十)基于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因为都采用了三维卷积,在推理上的实时性比较差。

  1. 使用Pillar这种方式描述点云数据,并且使用编码器网络学习Pillar特征表示;
  2. 整个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
posted @ 2022-08-19 22:45  luoganttcc  阅读(809)  评论(1编辑  收藏  举报