推广 热搜: csgo  vue  2023  angelababy  gps  信用卡  新车  htc  落地  控制 

​硬件加速 3D 实时感知 (HARP-3D)项目分享

   2023-07-30 网络整理佚名1290
核心提示:简单来说,感知是理解数据的任务。对象检测是在传感器数据中定位和分类感兴趣的对象的任务。已经发展成为复杂感知算法的支柱,否则使用传统的计算机视觉算法几乎不可能进行设计。这就是硬件加速可以作为加速深度学习算法的一种手段。客户端是整个推理应用程序的一部分。然而,高帧率的一部分也归因于使用的网络非常小,准确性不是这里的关键问题。对我来说,这是一个非常有趣的机会,可以在硬件上尝试加速深度学习算法。

硬件加速3D实时感知(HARP-3D)

使用运行在 .

本项目中用到的东西

-V2

介绍理念

感知是自动驾驶中的一项关键任务,也可能是当今技术界讨论最多的话题之一。

简单来说,感知就是理解数据的任务。 这些数据通常由摄像头、雷达、激光雷达等各种传感器生成。

最常用的感知任务是对象检测和语义分割。

对象检测是在传感器数据中定位和分类感兴趣的对象的任务。

语义分割是将传感器数据的每个像素/元素标记为属于一组感兴趣的类别之一的任务。

深度神经网络 (DNN) 已发展成为复杂感知算法的支柱,否则使用传统计算机视觉算法几乎不可能进行设计。

任何类型的 DNN 的基本数学运算都是矩阵乘法。

事实证明,矩阵乘法是一种高度可并行化的运算。 这就是 GPU 对于深度学习有用的根本原因。

这就是硬件加速可以用作加速深度学习算法的一种手段的地方。

该项目旨在证明这一点,使用开发板作为硬件加速平台。

该开发板基于Zynq MPSoC平台,除了FPGA之外还有其他几个外设。

该项目演示了如何使用 Vitis-AI 作为硬件加速平台和 Vitis-AI 作为软件平台在 LiDAR 点云中执行对象检测。 它还以端到端的方式演示了对象检测模型如何作为边缘人工智能应用程序工作。

传感器数据

该项目使用 LiDAR 传感器数据作为输入。 现在,由于传感器的状态非常昂贵,该项目使用来自最先进的激光雷达传感器的预先记录的数据。 这是 KITTI 数据集()。

传感器的典型扫描(称为点云)如下所示。

点云中的每个点都由至少 3 个数字表示,这些数字对应于该点在 3D 空间中相对于传感器的 x、y 和 z 坐标。

目标

我们试图确定上述点云中汽车和其他物体的位置,并在它们周围放置一个边界框。

如下所示。

神经网络

使用的神经网络是称为 U-Net 的语义分割网络。

它被修改为预测关键点,其中关键点是范围图像中的对象中心。

获得关键点后,简单的后处理步骤会将它们转换回 3D 坐标 - x、y、z。

基于模型的盒子拟合是根据每个关键点的类别进行的。

这是通过计算 KITTI 训练数据集中不同对象类别的框的平均大小发现的。

例如,汽车的长、宽、高尺寸通常为 3.6、1.5、1.8。

下图显示了网络的架构。

数据预处理

3D 点云首先被转换为称为范围图像的 2D 表示,然后使用上面所示的 U-Net 架构进行处理。

转换过程的详细信息可以在论文()中找到。

作者还提供了一个预转换的数据集()。

欲了解更多详情,请参阅他们的页面()。

预测

为每个对象预测关键点,其中关键点是分割掩模中对象的中心。 下图显示了预测的一些要点。

一旦检测到关键点并过滤为每个对象 1 个关键点,球坐标就会转换回 3D 笛卡尔坐标,以获得 3D 空间中关键点的位置(在 3D PCL 中)。

公式可以在这里找到()。

上面附有将 2D 关键点转换为 3D 的代码。

上图显示了预测的 2D 关键点如何映射到点云中的 3D 位置。

一旦知道了对象位置,就会完成基于模型的框拟合,即,对于每个对象类别,从训练集中找到的平均框大小用于放置 3D 边界框,如下所示。

使用Vitis-AI-1.2将训练好的模型转换为.elf

原始模型是使用 keras 进行训练的。

训练好的模型可以在附件中找到。

第1步:获取系统镜像

() 可以使用教程中的系统镜像。 还可以为 构建您自己的板图像。

该映像包含实例化 DPU IP 所需的所有组件。

将镜像中的文件安装到SD卡上。

然后,将 .dcf 文件从 SD 卡复制到本地文件系统。

下一步在代码库中创建一个文件夹 - ,并将 dcf 文件复制到其中。

然后在同一文件夹中创建一个 arch.json file() 。

两者都可以在附件中找到。

打开开发板电源,连接到 Web 服务器并配置 WiFi。

通过 SSH 连接到开发板并从根文件夹验证 DPU 确实存在

dexporer --whoami

您应该看到类似于以下内容的输出:

[DPU Core Configuration List]
DPU Core                : #0
DPU Enabled             : Yes
DPU Arch                : B4096
DPU Target Version      : v1.4.1
DPU Freqency            : 300 MHz
Ram Usage               : High
DepthwiseConv           : Enabled
DepthwiseConv+Relu6     : Enabled
Conv+Leakyrelu          : Enabled
Conv+Relu6              : Enabled
Channel Augmentation    : Enabled
Average Pool            : Enabled

DPU Core                : #1
DPU Enabled             : Yes
DPU Arch                : B4096
DPU Target Version      : v1.4.1
DPU Freqency            : 300 MHz
Ram Usage               : High
DepthwiseConv           : Enabled
DepthwiseConv+Relu6     : Enabled
Conv+Leakyrelu          : Enabled
Conv+Relu6              : Enabled
Channel Augmentation    : Enabled
Average Pool            : Enabled

[DPU Extension List]
Extension Softmax
Enabled                 : Yes

步骤2:量化.h5模型并将其编译为.elf

使用 Vitis-AI 设置为本地系统

来自 Vitis-AI 的克隆示例

https://github.com/Xilinx/Vitis-AI-Tutorials.git

本教程包含将 .h5 训练的 keras 模型转换、量化和编译为要部署在 keras 上的 .elf 所需的所有文件。

克隆后,将 files/build/ 文件夹中的 .h5 文件替换为附加的训练模型。 或者,替换为您自己的自定义模型。 名称必须是 .h5。 这确保了后续步骤中需要的更改较少。

现在根据您的本地系统更改 .sh 脚本中的以下参数。

# network parameters
export INPUT_HEIGHT=64
export INPUT_WIDTH=256
export INPUT_CHAN=1
export INPUT_SHAPE=?,${INPUT_HEIGHT},${INPUT_WIDTH},${INPUT_CHAN}
export INPUT_NODE=input_1
export OUTPUT_NODE=conv2d_23/BiasAdd
export NET_NAME=u3d_kp

# training parameters
export EPOCHS=200
export BATCHSIZE=150
export LEARNRATE=0.001


# target board
sudo mkdir /opt/vitis_ai/compiler/arch/DPUCZDX8G/ULTRA96V2
sudo cp ./ULTRA96V2/arch.json /opt/vitis_ai/compiler/arch/DPUCZDX8G/ULTRA96V2
sudo cp ./ULTRA96V2/ULTRA96V2.dcf /opt/vitis_ai/compiler/arch/DPUCZDX8G/ULTRA96V2
export ARCH=/opt/vitis_ai/compiler/arch/DPUCZDX8G/ULTRA96V2/arch.json

#export ARCH=/opt/vitis_ai/compiler/arch/DPUCZDX8G/ZCU102/arch.json
# DPU mode - best performance with DPU_MODE = normal
export DPU_MODE=normal
#export DPU_MODE=debug

当我们启动工作区时,上述更改会自动将板文件复制到工作区中。 板文件应与此脚本位于同一文件夹中。

对于输出节点,如果是自定义模型,最好的方法是继续量化,然后查看错误消息并相应地修改参数。

继续查看有关如何获取输出节点名称的示例。

导航到克隆存储库的文件夹并键入:

sh -x docker_run.sh xilinx/vitis-ai:latest

应该看到:

现在,如下所示在本地更改量化文件,将其替换为您自己的校准数据生成函数。 该函数基本上是一个简单的脚本,它返回批量训练数据,并以与推理完全相同的方式进行预处理。

附上该项目使用的函数。

#!/bin/bash

# Copyright 2020 Xilinx Inc.

# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at

#     http://www.apache.org/licenses/LICENSE-2.0

# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.



# quantize
quantize() {
  
  echo "Making calibration images.."  

  # python tf_gen_images.py  \
  #     --dataset=train \
  #     --image_dir=${QUANT}/images \
  #     --calib_list=calib_list.txt \
  #     --max_images=${CALIB_IMAGES}

  # log the quantizer version being used
  vai_q_tensorflow --version

  # quantize
  # vai_q_tensorflow quantize \
  #   --input_frozen_graph ${FREEZE}/${FROZEN_GRAPH} \
 #  --input_fn           image_input_fn.calib_input \
 #  --output_dir         ${QUANT} \
 #   --input_nodes        ${INPUT_NODE} \
 #  --output_nodes       ${OUTPUT_NODE} \
 #  --input_shapes       ${INPUT_SHAPE} \
 #  --calib_iter         10

  vai_q_tensorflow quantize \
    --input_frozen_graph ${FREEZE}/${FROZEN_GRAPH} \
  --input_fn           datagen.get_calib_data \
  --output_dir         ${QUANT} \
   --input_nodes        ${INPUT_NODE} \
  --output_nodes       ${OUTPUT_NODE} \
  --input_shapes       ${INPUT_SHAPE} \
  --calib_iter         10
}

echo "-----------------------------------------"
echo "QUANTIZE STARTED.."
echo "-----------------------------------------"

rm -rf ${QUANT} 
mkdir -p ${QUANT}/images
quantize 2>&1 | tee ${LOG}/${QUANT_LOG}
rm -rf ${QUANT}/images

echo "-----------------------------------------"
echo "QUANTIZE COMPLETED"
echo "-----------------------------------------"

上面的.py是文件,.py是函数。

键入以下命令并验证输出:

source ./0_setenv.sh
source ./2_keras2tf.sh

部分输出应显示:

-------------------------------------
keras_2_tf command line arguments:
 --keras_json: 
 --keras_hdf5: ./build/keras_model/k_model.h5
 --tf_ckpt   : ./build/tf_chkpt/tf_float.ckpt
-------------------------------------
Keras model information:
 Input names : ['input_1:0' shape=(?, 64, 256, 1) dtype=float32>]
 Output names: ['conv2d_23/BiasAdd:0' shape=(?, 64, 256, 2) dtype=float32>]
-------------------------------------
 Checkpoint created : ./build/tf_chkpt/tf_float.ckpt

上面我们可以看到输出节点名称是:/。

注意:不要添加':0'

返回.sh脚本,填写输出节点名称。

在此阶段,会在 build/ 中生成一个名为 -.pb 的冻结图

现在使用以下命令从工作区执行量化脚本:

source ./4_quant.sh

成功的量化应该产生:

我们可以看到使用的校准图像的一部分。

最后,编译

source ./6_compile.sh

成功的编译应该产生:

您现在应该在 /build/ 中看到 .elf 文件

部署和应用程序执行

现在我们有了模型,下一步是将模型复制到并编写使用该模型的应用程序。

将 .elf 复制到您在 /root 文件夹中选择的任何文件夹。

下图显示了我如何放置它:

上面,我曾经通过 ssh 进入主板。 它使应用程序开发变得非常容易。

虽然设计用于推理的物联网应用程序的方法有多种,但在该项目中,使用了模拟传感器,因为获取产生数据的传感器是不切实际的。

因此,再次使用 KITTI 测试/验证数据集,主机充当模拟传感器,通过 FTP 向其发送数据以进行推理。

整体应用架构如下图所示。

一个简单的 TCP 客户端/服务器套接字应用程序,用于同步和 .

具体来说,主机作为服务器打开一个TCP套接字,等待客户端连接。

客户端是整个推理应用程序的一部分。

然后客户端通过套接字发送开始消息,主机PC通过FTP将第一批测试数据复制到主机PC上的共享文件夹。

以下代码片段显示了数据传输。

from ftpretty import ftpretty
import numpy as np
import os
import socket

def place_test_file_in_fpga(local_file_path, host_addr, remote_path):
    """
    File copies the file at local_file_path to the remote_file_path on U96    
    "
""
    # Supply the credentisals
    f = ftpretty(host_addr, "root""root")
    file = np.load(file_path)  # read in the numpy file
    # Get a file, save it locally
    # f.get('someremote/file/on/server.txt', '/tmp/localcopy/server.txt')
    # Put a local file to a remote location
    # non-existent subdirectories will be created automatically
    f.put(file_path, remote_file_path+'/')

主应用程序充当附加组件。

检测到的关键点的一些预测结果如下所示。

批量大小为 1 的 50 帧的推理帧速率如下所示。

正如我们所看到的,它实现了 109 fps 的令人印象深刻的帧速率。

然而,高帧速率的部分原因也是由于使用的网络非常小,并且准确性在这里并不是关键问题。 因此,在这个项目中,准确性并不是基准。

第一部分中解释的最终后处理是在主机上完成的,因为这不是推理的一部分。

附件是一些测试文件。

链接: 提取码: 打开

综上所述

对我来说,这是一个非常有趣的机会,可以尝试在硬件上加速深度学习算法。 一些预处理和后处理也可以作为硬件IP来实现。 这将使推理速度更快。

项目参考地址:❝

 
反对 0举报 0 收藏 0 打赏 0评论 0
 
更多>同类资讯
推荐图文
推荐资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报
Powered By DESTOON