0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何在LiDAR点云上进行3D对象检测

科技观察员 来源:Xinyu Chen 作者:Xinyu Chen 2022-04-26 17:41 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

该项目将借助KV260上的PYNQ-DPU覆盖,从而能够使我们在LiDAR点云上进行3D对象检测比以往任何时候都更加高效!

背景

在构建自动驾驶汽车、自动导航机器人和其他现实世界的应用程序时,环境感知起着不可或缺的作用。

为什么要在点云上进行3D对象检测?

虽然基于深度学习的相机数据二维对象检测显示出很高的准确性,但它可能不是有效的活动,如定位、测量对象之间的距离和计算深度信息。

LiDAR传感器生成的点云提供对象的3D信息,以更有效地定位对象并表征形状。因此,点云上的3D对象检测正在各种应用中出现,尤其是在自动驾驶方面。

尽管如此,设计基于LiDAR的3D对象检测系统仍具有挑战性。首先,此类系统需要在模型推理中进行大量计算。其次,由于点云数据是不规则的,处理管道需要预处理和后处理才能提供端到端的感知结果。

KV260与3D物体检测系统完美匹配。模型推理的昂贵计算可以卸载到KV260的可编程逻辑部分并由其加速,而KV260强大的ARM内核能够处理预处理和后处理任务。

设计概述

我们现在讨论选择的用于点云上3D对象检测的深度学习模型以及包括软件和硬件的系统概述。

网络架构

作为对现有工作的完整性检查,我们选择了基于ResNet的关键点特征金字塔网络(KFPN),这是第一个在KITTI基准上具有最先进性能的单目3D检测实时系统。特别是,我们采用了它在点云上的开源PyTorch实现,称为SFA3D。

pYYBAGJnvfWAavm5AAHyyN3Lr_U640.png

KV260 上的 PYNQ-DPU

之所以我们使用Xilinx 开发板的 Ubuntu Desktop 20.04.3 LTS而不是 Petalinux 作为 KV260 上的操作系统,是因为 Ubuntu 是一个很好的开发环境,用于安装预处理点云和后处理结果所需的软件包。另一方面,KV260 对 Pynq 和 DPU 覆盖的支持避免了从头设计高效的 DPU,使我们能够在 python 环境下工作。这在很大程度上简化了基于 CPU/GPU 的深度学习实现向 KV260 的迁移。

设置环境

按照官方指南将Ubuntu镜像安装到KV260,然后参考Github在Ubuntu操作系统中安装Pynq 。Git 通过执行以下命令克隆所有必需的文件并将所需的包安装到板上。

git clone https://github.com/SoldierChen/DPU-Accelerated-3D-Object-Detection-on-Point-Clouds.git
cd DPU-Accelerated-3D-Object-Detection-on-Point-Clouds
pip install -r requirements.txt

在这里,我们需要 Pytorch 1.4,因为 Pynq DPU 的 VART 是 v1.4。

数据准备

需要下载的数据包括:

Velodyne 点云(29 GB)

对象数据集的训练标签(5 MB)

对象数据集的相机校准矩阵(16 MB)

对象数据集的左侧彩色图像(12 GB) (仅用于可视化目的)

要使用 3D 框可视化 3D 点云,让我们执行:

cd model_quant_compile/data_process/
python kitti_dataset.py

poYBAGJnve-ATVJiAANp_yMD2lk154.png

模型训练

python train.py --gpu_idx 0

该命令使用一个 GPU 进行训练,但它支持分布式训练。此外,您可以选择 fpn_resnet 或 resnet 作为目标模型。训练后的模型将存储在名为“Model_restnet/fpn_resnet_epoch_#”的检查点文件夹中。根据您的硬件,epoch 可以从 10 到 300,精度越高越好。

模型量化和编译

同样,由于 Pynq 的 VART 是 V1.4,我们需要 VITIS AI v1.4 而不是最新版本(V2.0)来进行模型量化。

# install the docker at first (if not stalled)
docker pull xilinx/vitis-ai-cpu:1.4.1.978

# run the docker
./docker_run.sh xilinx/vitis-ai-cpu:1.4.1.978

pYYBAGJnveuANqppAAHNXTdxXq4184.png

然后我们使用以下命令量化模型:

# activate the pytorch environment
conda activate vitis-ai-pytorch

# install required packages
pip install -r requirements.txt

# configure the quant_mode to calib
ap.add_argument('-q', '--quant_mode', type=str, default='calib', choices=['calib','test'], help='Quantization mode (calib or test). Default is calib')
# here, it quantize the example model: Model_resnet_18_epoch_10.pth
python quantize.py

# configure the quant_mode to test
ap.add_argument('-q', '--quant_mode', type=str, default='test', choices=['calib','test'], help='Quantization mode (calib or test). Default is calib')
# here, it outputs the quantized model.
python quantize.py

接下来,我们将编译模型:

./compile.sh zcu102 build/

不要介意 zcu102 与 KV260 共享相同的 DPU 架构。您将看到成功编译的以下消息:

pYYBAGJnveOALEBRAAIqqYmpSWs883.png

到目前为止,我们得到了可以在 DPU 上执行的编译 xmodel,在 KV260 上过度执行。接下来,我们将其部署在板上并开发应用程序代码

KV260部署

按照官方指南,我们先在KV260上搭建好Ubuntu操作系统。然后,我们按照PYNQ-DPU GitHub在板上安装 python 。

搭建好板子后,我们需要安装git,将代码克隆到板子上,并将编译好的xmodel复制到文件夹中。

应用程序代码设计

这里我们将介绍如何调用并与 DPU 接口进行推理。

我们首先加载 DPU 覆盖和自定义的 xmodel。然后,重要的是,必须知道输入和输出张量信息才能与数据集协调。在这里,我们只有一个张量作为输入,五个张量作为输出。相应地分配输入和输出缓冲区。

# load model and overly
overlay = DpuOverlay("dpu.bit")
overlay.load_model("./CNN_zcu102.xmodel")
dpu = overlay.runner

# get tensor information
inputTensors = dpu.get_input_tensors()
outputTensors = dpu.get_output_tensors()
shapeIn = tuple(inputTensors[0].dims)
outputSize = int(outputTensors[0].get_data_size() / shapeIn[0])
shapeOut = tuple(outputTensors[0].dims)
shapeOut1 = tuple(outputTensors[1].dims)
shapeOut2 = tuple(outputTensors[2].dims)
shapeOut3 = tuple(outputTensors[3].dims)
shapeOut4 = tuple(outputTensors[4].dims)

# allocate input and output buffers.
# Note the output is a list of five tensors.
output_data = [np.empty(shapeOut, dtype=np.float32, order="C"),
np.empty(shapeOut1, dtype=np.float32, order="C"),
np.empty(shapeOut2, dtype=np.float32, order="C"),
np.empty(shapeOut3, dtype=np.float32, order="C"),
np.empty(shapeOut4, dtype=np.float32, order="C")]
# the input is only one tensor.
input_data = [np.empty(shapeIn, dtype=np.float32, order="C")]

image = input_data[0]

一次性推理的过程封装在下面的函数中。在这里,我们将输入张量置换为 DPU 输入张量的形状,并将张量置换为后处理所需的形状。这对于正确的结果至关重要。

def do_detect(dpu, shapeIn, image, input_data, output_data, configs, bevmap, is_front):

if not is_front:
bevmap = torch.flip(bevmap, [1, 2])
input_bev_maps = bevmap.unsqueeze(0).to("cpu", non_blocking=True).float()

# do permutation
input_bev_maps = input_bev_maps.permute(0, 2, 3, 1)
image[0,...] = input_bev_maps[0,...] #.reshape(shapeIn[1:])

job_id = dpu.execute_async(input_data, output_data)
dpu.wait(job_id)

# convert the output arrays to tensors for the following post-processing.
outputs0 = torch.tensor(output_data[0])
outputs1 = torch.tensor(output_data[1])
outputs2 = torch.tensor(output_data[2])
outputs3 = torch.tensor(output_data[3])
outputs4 = torch.tensor(output_data[4])

# do permutation
outputs0 = outputs0.permute(0, 3, 1, 2)
outputs1 = outputs1.permute(0, 3, 1, 2)
outputs2 = outputs2.permute(0, 3, 1, 2)
outputs3 = outputs3.permute(0, 3, 1, 2)
outputs4 = outputs4.permute(0, 3, 1, 2)
outputs0 = _sigmoid(outputs0)
outputs1 = _sigmoid(outputs1)

# post-processing
detections = decode(
outputs0,
outputs1,
outputs2,
outputs3,
outputs4, K=configs.K)
detections = detections.cpu().numpy().astype(np.float32)
detections = post_processing(detections, configs.num_classes, configs.down_ratio, configs.peak_thresh)

return detections[0], bevmap

在 KV260 上执行

通过运行以下命令,将在 DPU 上执行演示数据的推理:

python demo_2_sides-dpu.py

poYBAGJnvdyAL9B1AAXY097iyE0689.png

然后运行以下命令:

pythondemo_front-dpu.py

pYYBAGJnvdiAIvgzAAQ2PWJcjnQ482.png

性能范围从10到20FPS,比在服务器级CPU(IntelXeonGold6226R)上的执行速度快100到200倍。

结论

总之,我们展示了在KV260上使用AMD-XilinxDPU来加速基于点云的3D对象检测是多么容易。为了进一步提升性能,我们计划通过使用多个DPU实例来优化模型推理阶段,以及通过使用多线程和批处理来优化预处理和后处理阶段。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 3D
    3D
    +关注

    关注

    9

    文章

    2993

    浏览量

    113851
  • LIDAR
    +关注

    关注

    11

    文章

    362

    浏览量

    31174
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    LiDAR如何构建3D?如何利用LiDAR提供深度信息

    3D模型。LiDAR 系统捕获的图像中的每个像素都将具有与之关联的深度。这样可以更好地识别物体,并消除仅采用图像传感器获得的2D图像中可能存在的模糊。 LiDAR如何构建
    的头像 发表于 04-06 12:00 4985次阅读
    <b class='flag-5'>LiDAR</b>如何构建<b class='flag-5'>3D</b><b class='flag-5'>点</b><b class='flag-5'>云</b>?如何利用<b class='flag-5'>LiDAR</b>提供深度信息

    基于3D的多任务模型在板端实现高效部署

    对于自动驾驶应用来说,3D 场景感知至关重要。3D数据就是具有3D特征的数据。一方面,3D
    的头像 发表于 12-28 16:35 2654次阅读
    基于<b class='flag-5'>3D</b><b class='flag-5'>点</b><b class='flag-5'>云</b>的多任务模型在板端实现高效部署

    基于深度学习的方法在处理3D进行缺陷分类应用

    背景部分介绍了3D应用领域中公开可访问的数据集的重要性,这些数据集对于分析和比较各种模型至关重要。研究人员专门设计了各种数据集,包括用于3D形状分类、
    的头像 发表于 02-22 16:16 2385次阅读
    基于深度学习的方法在处理<b class='flag-5'>3D</b><b class='flag-5'>点</b><b class='flag-5'>云</b><b class='flag-5'>进行</b>缺陷分类应用

    制作3D 对象,然后显示。 导入3D对象 ,然后显示。

    PS:Labview 版本是2014 最近开始测试 Labview的3D相关的功能。 制作3D 对象,然后显示。 导入3D对象 ,然后显示。
    发表于 12-23 22:00

    如何同时获取2d图像序列和相应的3d

    如何同时获取2d图像序列和相应的3d?以上来自于谷歌翻译以下为原文How to obtain the sequence of 2d im
    发表于 11-13 11:25

    3D技术介绍及其与VR体验的关系

    ;x>nkedIn上发表了一篇跟澳大利亚科技公司优立(Euclideon)所使用的数据有关的文章,并在业内引起了一番讨论。 1. 的问题
    发表于 09-15 09:28 20次下载

    问题的介绍及3D技术在VR中的应用

    1. 的问题 是由3D扫描硬件收集的数据,如FARO的Focus 3D激光扫描仪和Shi
    发表于 09-27 15:27 17次下载

    何在PADS 3D Layout中进行命令操作

    了解如何在 PADS 3D Layout 中对您的 PCB 使用“Measure Distance”和“Measure Minimum Distance”命令。
    的头像 发表于 05-15 06:05 6310次阅读
    如<b class='flag-5'>何在</b>PADS <b class='flag-5'>3D</b> Layout中<b class='flag-5'>进行</b>命令操作

    基于图卷积的层级图网络用于基于3D目标检测

    论文:A Hierarchical Graph Network for 3D Object Detection on Point Clouds 由于大多数现有的对象
    的头像 发表于 06-21 12:15 6804次阅读
    基于图卷积的层级图网络用于基于<b class='flag-5'>点</b><b class='flag-5'>云</b>的<b class='flag-5'>3D</b>目标<b class='flag-5'>检测</b>

    基于层级图网络的图卷积,用完成3D目标检测

    由于大多数现有的对象检测方法不能充分适应点的特征(例如稀疏性),所以一些关键的语义信息(如物体形状)不能被很好的捕捉到。本文提出了一种
    的头像 发表于 12-24 15:25 1139次阅读

    何为3D语义分割

    融合标注使用的3D标注工具仍以3D立体框为主,但在3D数据以外,还需要使用2D标注工具在
    的头像 发表于 07-21 15:52 1w次阅读

    3D数据集在3D数字化技术中的应用

    随着计算机视觉技术的不断发展,3D 数字化技术已经成为了当今工业制造领域和三维医学影像领域的关键技术。然而,构建高精度、高分辨率的 3D 数据集对于实现这一技术至关重要。在这篇文章
    的头像 发表于 05-06 16:46 2140次阅读

    基于3D障碍物检测介绍

    基于3D障碍物检测 主要有以下步骤: 数据的处理 基于
    的头像 发表于 06-26 10:22 1805次阅读
    基于<b class='flag-5'>点</b><b class='flag-5'>云</b>的<b class='flag-5'>3D</b>障碍物<b class='flag-5'>检测</b>介绍

    基于深度学习的3D实例分割方法

    3D实例分割(3DIS)是3D领域深度学习的核心问题。给定由云表示的 3D 场景,我们寻求为每个
    发表于 11-13 10:34 3686次阅读
    基于深度学习的<b class='flag-5'>3D</b><b class='flag-5'>点</b><b class='flag-5'>云</b>实例分割方法

    两种应用于3D对象检测深度学习方法

    随着激光雷达传感器(“光检测和测距”的缩写,有时称为“激光扫描”,现在在一些最新的 iPhone 上可用)或 RGB-D 摄像头(一种 RGB-D 摄像头)的兴起,3D 数据变得越来越
    的头像 发表于 01-03 10:32 2004次阅读
    两种应用于<b class='flag-5'>3D</b><b class='flag-5'>对象</b><b class='flag-5'>检测</b>的<b class='flag-5'>点</b><b class='flag-5'>云</b>深度学习方法