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

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

3天内不再提示

使用Vitis AI在Zynq MP上实现手势识别

FPGA技术江湖 来源:XILINX开发者社区 2023-06-25 10:52 次阅读

本文作者:赛灵思工程师 Chao Zhang

FPGA得益于其高可编程性以及低延迟,低功耗的特点,在机器学习的推理领域已获得了广泛的关注。在过去,FPGA对于软件开发人员来说有较高的开发门槛,把一部分开发者挡在了门外。如今越来越完善的高阶工具以及软件堆栈使得开发者可以充分利用FPGA优点对关键应用进行加速,同时不需花费时间去了解FPGA的底层实现。

Xilinx Vitis AI 是用于 Xilinx 硬件平台上的 AI 推理的开发堆栈。它由优化的 IP(DPU)、工具、库、模型和示例设计组成,使用Xilinx ZynqMP SOC或者Versal ACAP器件并借助强大的Vitis AI堆栈,已大大降低了FPGA上部署机器学习应用的门槛。

本文将使用Tensorflow 2.0从零搭建并训练一个简单的CNN模型来进行数字手势识别,并部署运行在ZynqMP开发板上,来熟悉Vitis AI的工作流程。

我们首先用Tensorflow 2.0创建模型并针对目标数据集进行训练,然后使用Vitis AI 工具对模型进行量化/编译等处理,获得运行DPU所需要的xmodel文件。最后需要编写调用Vitis AI runtime的主机应用,该应用运行在CPU上,进行必要的预处理/后处理以及对DPU进行调度。

1d6dece2-1078-11ee-962d-dac502259ad0.png

1Vitis AI环境配置

Vitis AI支持业界通用的Pytorch/Tensorflow/Caffe训练框架。模型创建和训练工作完全在通用框架下进行开发。开始工作之前需要先在Host机器上配置好Vitis-AI Docker环境,这部分完全参考https://github.com/Xilinx/Vitis-AI Guide即可。以下所有在Host机器上完成的步骤(训练/量化/编译)都是在Vitis AI docker 及vitis-ai-tensorflow2 conda env环境下完成。

2数据集

本实例使用的数字手势数据集:

https://github.com/ardamavi/Sign-Language-Digits-Dataset (感谢开源数据集作者Arda Mavi )

3源码说明

本项目的工程文件保存在 Github目录:

https://github.com/lobster1989/Handsign-digits-classification-on-KV260

有4个主要文件夹:

1. code:

此处包含所有源代码,包括用于训练/量化/编译任务的脚本,以及在 ARM 内核上运行的主机应用程序。

2. output:

生成的模型文件。

3. Sign-Language-Digits-Dataset:

数据集应该下载并放在这里。

4. target_zcu102_zcu104_kv260:

准备复制到目标板运行的文件。

4创建/训练模型

Host机器上运行 "train.py" 脚本,train.py脚本中包含了模型的创建和训练过程。模型的创建主要代码如下,使用Keras的function式 API(注意sequential 式API目前Vitis AI不支持)。创建的模型包含4个连续的Conv2D+Maxpolling层,然后跟随一个flatten layer,一个dropout layer,以及两个全连接层。

这个模型仅仅作为示例,各位也可以尝试使用其它的CNN模型或进行优化。

# Function: create a custom CNN model

def customcnn():

inputs = keras.Input(shape=image_shape)

x = layers.Conv2D(32, (3,3), activation='relu', input_shape=image_shape)(inputs)

x = layers.MaxPooling2D((2,2))(x)

x = layers.Conv2D(64, (3,3), activation='relu')(x)

x = layers.MaxPooling2D((2,2))(x)

x = layers.Conv2D(128, (3,3), activation='relu')(x)

x = layers.MaxPooling2D((2,2))(x)

x = layers.Conv2D(128, (3,3), activation='relu')(x)

x = layers.MaxPooling2D((2,2))(x)

x = layers.Flatten()(x)

x = layers.Dropout(0.5)(x)

x = layers.Dense(512, activation='relu')(x)

outputs = layers.Dense(10, activation='softmax')(x)

model = keras.Model(inputs=inputs, outputs=outputs, name='customcnn_model')

model.summary()

# Compile the model

model.compile(optimizer="rmsprop",

loss="categorical_crossentropy",

metrics=['acc']

)

return model

该模型在第 10 个epoch在验证数据集上获得了 0.7682 的精确度。

1d8800e6-1078-11ee-962d-dac502259ad0.png

5模型量化

训练完Tensorflow2.0模型后,下一步是使用Vitis AI quantizer工具对模型进行量化。量化过程将 32 位浮点权重转换为 8 位整型 (INT8),定点模型需要更少的内存带宽,从而提供更快的速度和更高的运行效率。如果需要进一步优化计算量级,还可以使用Vitis AI提供的剪枝(pruning)工具。

1d8f33e8-1078-11ee-962d-dac502259ad0.png

运行quantize.py脚本进行量化,运行结束后将生成量化后的模型''quantized_model.h5''。

进行quantize的代码部分如下,调用VitisQuantizer,需要提供的输入包括上个步骤生成的float模型,以及一部分图片(推荐为100~1000张)作为calibration的输入。Calibration操作使用提供的图片进行正向运算,不需要提供label

# Run quantization

quantizer = vitis_quantize.VitisQuantizer(float_model)

quantized_model = quantizer.quantize_model(

calib_dataset=train_generator

)

6评估量化后模型

我们可以测试评估下量化后的模型是否有精度的损失。量化模型的评估可以直接在 python 脚本中利用TensorFlow框架完成。读入模型,重新compile, 然后调用evaluation相关 API对模型进行评估。主要代码部分如下

# Load the quantized model

path = os.path.join(MODEL_DIR, QAUNT_MODEL)

with vitis_quantize.quantize_scope():

model = models.load_model(path)

# Compile the model

model.compile(optimizer="rmsprop",

loss="categorical_crossentropy",

metrics=['accuracy']

)

# Evaluate model with test data

loss, acc = model.evaluate(val_generator) # returns loss and metrics

运行“eval_quantize.py”脚本即可完成评估。通过评估发现,量化后的模型没有发生精度损失。当然实际并不总是如此,有时候量化后的模型会有些许精度损失,这和不同的模型有关系。这时候我们可以使用Vitis AI提供finetuning来精调模型 。

7编译模型

模型的编译需要用到Vitis AI compiler(VAI_C)。这个步骤实际上是把量化后的模型转化为可以在DPU上运行的指令序列。VAI_C 框架的简化流程如下图所示,包含模型解析,优化和代码生成三个阶段。模型解析步骤对模型的拓扑进行解析,生成用Xilinx的中间表示层(Intermediate Representation)表示的计算图(computation graph)。然后是执行一些优化操作,例如计算节点融合或者提高数据重用。最后的步骤是生成DPU架构上运行的指令序列。

1da9d0f4-1078-11ee-962d-dac502259ad0.png

运行compile.sh脚本即可完成编译过程。主要代码如下,使用vai_c_tensorflow2命令。注意需要提供目标DPU配置的arch.json文件作为输入(--arch选项)。编译步骤完成后会生成DPU推理用的xmodel文件。

compile() {

vai_c_tensorflow2

--model $MODEL

--arch $ARCH

--output_dir $OUTDIR

--net_name $NET_NAME

}

8主机程序

DPU作为神经网络加速引擎,还需要CPU主机对其进行控制和调度,提供给DPU数据输入/输出。另外还需要对这部分运行在ARM或Host CPU上的应用而言, Vitis AI提供了Vitis AI Runtime (VART) 以及Vitis AI Library来方便应用开发。VART比较底层,提供更大的自由度。Vitis AI library属于高层次API,构建于 VART 之上,通过封装许多高效、高质量的神经网络,提供更易于使用的统一接口

VART具有C++和Python两套API。多数机器学习开发者习惯用Python来开发和训练模型,在部署阶段甚至可以不用切换语言。本例子中提供了使用Python接口的host程序app_mt.py。使用Python API的简化流程如下。

# Preprocess

dpu_runner = runner.Runner(subgraph,"run")

# Populate input/out tensors

jid = dpu_runner.execute_async(fpgaInput, fpgaOutput)

dpu_runner.wait(jid)

# Post process

9开发板上运行

如果使用的是 Xilinx zcu102/zcu104/KV260 官方 Vitis AI 启动文件,则3 块板上的 DPU 配置都相同。可以在 3 个平台上运行相同的xmodel文件,主机上的所有步骤完成后,将以下文件复制到目标板上。共需要xmodel文件,主机程序,以及一些用来测试的图片。

1db758a0-1078-11ee-962d-dac502259ad0.png

启动开发板并运行 app_mt.py ,用 -d指定图片路径,-m指定xmodel文件,-t 指定CPU上运行的线程数。

很幸运,10张测试图片的推理结果都是正确的。

root@xilinx-zcu102-2021_1:/home/petalinux/Target_zcu102_HandSignDigit#python3 app_mt.py -d Examples/ -m customcnn.xmodel

Pre-processing 10 images...

Starting 1 threads...

Throughput=1111.96 fps, total frames = 10, time=0.0090 seconds

Correct:10, Wrong:0, Accuracy:1.0000

审核编辑:汤梓红

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

    关注

    1603

    文章

    21331

    浏览量

    593347
  • 手势识别
    +关注

    关注

    8

    文章

    219

    浏览量

    47584
  • AI
    AI
    +关注

    关注

    87

    文章

    26485

    浏览量

    264130
  • Zynq
    +关注

    关注

    9

    文章

    600

    浏览量

    46655
  • Vitis
    +关注

    关注

    0

    文章

    144

    浏览量

    7164

原文标题:使用Vitis AI 在Zynq MP上实现手势识别

文章出处:【微信号:HXSLH1010101010,微信公众号:FPGA技术江湖】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何用10行代码轻松在ZYNQ MP实现图像识别

    Vitis-AI工具,如何仅仅使用10行代码,就能在ZYNQ MP器件上部署深度学习模型实现图像分类。 简介 Xilinx Vitis-AI
    的头像 发表于 10-09 10:47 4410次阅读
    如何用10行代码轻松在<b class='flag-5'>ZYNQ</b> <b class='flag-5'>MP</b>上<b class='flag-5'>实现</b>图像<b class='flag-5'>识别</b>

    Vitis AI Library体验之OCR识别

    Vitis AI Library是一组高层次库和 API,专为利用 DPU 高效执行 AI 推断而构建。它是基于 Vitis AI运行时利用
    的头像 发表于 10-17 08:23 632次阅读
    <b class='flag-5'>Vitis</b> <b class='flag-5'>AI</b> Library体验之OCR<b class='flag-5'>识别</b>

    labview 实现手势识别 !!!????

    新人小白想知道怎么用labview实现简单的手势识别识别上下左右就行。哪位大神能给讲讲
    发表于 11-02 23:36

    使用Vitis EBAZ4205(ZYNQ)矿机上实现"Hello World!"

    立即学习—60天FPGA工程师入门就业项目实战特训营(3月16日开班)Vitis是 Xilinx 最新推出的开发平台,虽然Vitis 早就在电脑安装好了,但一直没怎么使用。现在用低成本的ZY
    发表于 03-06 22:59

    【创龙TLZ7x-EasyEVM评估板试用连载】基于ZYNQ的动态手势识别系统

    项目名称:基于ZYNQ的动态手势识别系统试用计划:申请理由:申请人为研究生,本科期间参加过多个国家级省市级竞赛并获得多项荣誉,拥有丰富的Xilinx嵌入式系统的开发经验。已对zynq
    发表于 04-23 10:33

    使用ADUX1020实现手势识别基础

    ADUX1020是一款集成式光学传感器和前端器件,能够进行高级单点手势识别和近距检测。光学传感器可灵敏感测入射光的强度和角度。通过光学和电子的环境光过滤,它能够各种嘈声环境中持续稳定工作。该芯片能够
    发表于 08-19 07:56

    【KV260视觉入门套件试用体验】Vitis AI 初次体验

    一、基础环境 硬件:KV260视觉入门套件 摄像头:海康720P USB摄像头(因为部署Vitis AI之后懒得poweroff插MIPI camera了,直接USB) 软件:Ubuntu
    发表于 09-10 13:15

    【KV260视觉入门套件试用体验】五、VITis AI (人脸检测和人体检测)

    一、DPU 镜像环境配置 官方镜像已经安装好了可以安装相关配置,示例来源Vitis AI Library用户指南3.0版本,首先需要安装DPU镜像。 1.1、克隆Vitis
    发表于 09-26 16:22

    【KV260视觉入门套件试用体验】六、VITis AI车牌检测&amp;车牌识别

    视觉技术实现的自动识别车辆牌照号码的过程。该技术通过图像采集、车牌检测、字符分割和字符识别等步骤,实现对车牌号码的自动获取与识别。车牌
    发表于 09-26 16:28

    【KV260视觉入门套件试用体验】基于Vitis AI的ADAS目标识别

    /vitis_ai_library/models -r 四、ADAS目标识别体验 (一)目标识别 接上HDMI显示器、键盘&鼠标,KV260
    发表于 09-27 23:21

    【KV260视觉入门套件试用体验】Vitis-AI加速的YOLOX视频目标检测示例体验和原理解析

    本文将介绍如何使用Vitis-AI加速YOLOX模型实现视频中的目标检测,并对相关源码进行解读。由于演示的示例程序源码是Vitis-AI开源项目提供的,本文演示之前会介绍所需要的准备工作。演示之后
    发表于 10-06 23:32

    【KV260视觉入门套件试用体验】Vitis AI 构建开发环境,并使用inspector检查模型

    推断开发平台,它可以帮助开发者赛灵思的 FPGA 和自适应 SoC 实现高效的 AI 应用部署。它是一个强大而灵活的 AI 开发平台,
    发表于 10-14 15:34

    【KV260视觉入门套件试用体验】Vitis AI Library体验之OCR识别

    的接口。由此可简化深度学习神经网络的使用,对于不具备深度学习或 FPGA 知识的用户也是如此。Vitis AI Library 使开发者能够专注于开发自己的应用,而不是底层硬件。 二、实现 相较于
    发表于 10-16 23:25

    10行代码轻松在ZYNQ MP实现图像识别

    如今各种机器学习框架的普及使得个人搭建和训练一个机器学习模型越来越容易。然而现实中大量的机器学习模型训练完后需要在边缘端部署,那么我们看看借助Xilinx Vitis-AI工具,如何仅仅使用10行代码,就能在ZYNQ MP器件上
    的头像 发表于 08-02 08:03 1963次阅读
    10行代码轻松在<b class='flag-5'>ZYNQ</b> <b class='flag-5'>MP</b>上<b class='flag-5'>实现</b>图像<b class='flag-5'>识别</b>

    使用Vitis-AI进行车牌识别

    电子发烧友网站提供《使用Vitis-AI进行车牌识别.zip》资料免费下载
    发表于 06-27 09:49 2次下载
    使用<b class='flag-5'>Vitis-AI</b>进行车牌<b class='flag-5'>识别</b>