使用VitisAI在ZynqMP上实现手势识别

FPGA技术江湖 2023-06-22 05:05


本文作者:赛灵思工程师 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进行调度。



1

Vitis 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 的精确度。


5

模型量化

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



运行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架构上运行的指令序列。



运行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文件,主机程序,以及一些用来测试的图片。



启动开发板并运行 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



END

往期精选 

 
 

【免费】FPGA工程师招聘平台

今日说“法”:FPGA芯片如何选型?

SANXIN-B01开发板verilog教程V3电子版

学员笔记连载 | FPGA Zynq 千兆以太网回环

就业班学员学习笔记分享:FPGA之HDMI、以太网篇

求职面试 | FPGA或IC面试题最新汇总篇

FPGA项目开发:204B实战应用-LMK04821代码详解(二)

项目合作 | 承接FPGA项目公告

资料汇总|FPGA软件安装包、书籍、源码、技术文档…(2023.01.02更新)

FPGA就业班,2023.07.09开班,系统性学习FPGA,高薪就业,线上线下同步!

FPGA技术江湖广发江湖帖

无广告纯净模式,给技术交流一片净土,从初学小白到行业精英业界大佬等,从军工领域到民用企业等,从通信、图像处理到人工智能等各个方向应有尽有,QQ微信双选,FPGA技术江湖打造最纯净最专业的技术交流学习平台。


FPGA技术江湖微信交流群

加群主微信,备注姓名+公司/学校+岗位/专业进群


FPGA技术江湖QQ交流群

备注姓名+公司/学校+岗位/专业进群

FPGA技术江湖 任何技术的学习就好比一个江湖,对于每一位侠客都需要不断的历练,从初入江湖的小白到归隐山林的隐世高人,需要不断的自我感悟自己修炼,让我们一起仗剑闯FPGA乃至更大的江湖。
评论
  • 习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记
    youyeye 2024-12-11 17:58 83浏览
  • 全球知名半导体制造商ROHM Co., Ltd.(以下简称“罗姆”)宣布与Taiwan Semiconductor Manufacturing Company Limited(以下简称“台积公司”)就车载氮化镓功率器件的开发和量产事宜建立战略合作伙伴关系。通过该合作关系,双方将致力于将罗姆的氮化镓器件开发技术与台积公司业界先进的GaN-on-Silicon工艺技术优势结合起来,满足市场对高耐压和高频特性优异的功率元器件日益增长的需求。氮化镓功率器件目前主要被用于AC适配器和服务器电源等消费电子和
    电子资讯报 2024-12-10 17:09 98浏览
  • 近日,搭载紫光展锐W517芯片平台的INMO GO2由影目科技正式推出。作为全球首款专为商务场景设计的智能翻译眼镜,INMO GO2 以“快、准、稳”三大核心优势,突破传统翻译产品局限,为全球商务人士带来高效、自然、稳定的跨语言交流体验。 INMO GO2内置的W517芯片,是紫光展锐4G旗舰级智能穿戴平台,采用四核处理器,具有高性能、低功耗的优势,内置超微高集成技术,采用先进工艺,计算能力相比同档位竞品提升4倍,强大的性能提供更加多样化的应用场景。【视频见P盘链接】 依托“
    紫光展锐 2024-12-11 11:50 69浏览
  • 习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记
    youyeye 2024-12-10 16:13 115浏览
  • 在智能化技术快速发展当下,图像数据的采集与处理逐渐成为自动驾驶、工业等领域的一项关键技术。高质量的图像数据采集与算法集成测试都是确保系统性能和可靠性的关键。随着技术的不断进步,对于图像数据的采集、处理和分析的需求日益增长,这不仅要求我们拥有高性能的相机硬件,还要求我们能够高效地集成和测试各种算法。我们探索了一种多源相机数据采集与算法集成测试方案,能够满足不同应用场景下对图像采集和算法测试的多样化需求,确保数据的准确性和算法的有效性。一、相机组成相机一般由镜头(Lens),图像传感器(Image
    康谋 2024-12-12 09:45 74浏览
  • 智能汽车可替换LED前照灯控制运行的原理涉及多个方面,包括自适应前照灯系统(AFS)的工作原理、传感器的应用、步进电机的控制以及模糊控制策略等。当下时代的智能汽车灯光控制系统通过车载网关控制单元集中控制,表现特殊点的有特斯拉,仅通过前车身控制器,整个系统就包括了灯光旋转开关、车灯变光开关、左LED前照灯总成、右LED前照灯总成、转向柱电子控制单元、CAN数据总线接口、组合仪表控制单元、车载网关控制单元等器件。变光开关、转向开关和辅助操作系统一般连为一体,开关之间通过内部线束和转向柱装置连接为多,
    lauguo2013 2024-12-10 15:53 96浏览
  • 一、SAE J1939协议概述SAE J1939协议是由美国汽车工程师协会(SAE,Society of Automotive Engineers)定义的一种用于重型车辆和工业设备中的通信协议,主要应用于车辆和设备之间的实时数据交换。J1939基于CAN(Controller Area Network)总线技术,使用29bit的扩展标识符和扩展数据帧,CAN通信速率为250Kbps,用于车载电子控制单元(ECU)之间的通信和控制。小北同学在之前也对J1939协议做过扫盲科普【科普系列】SAE J
    北汇信息 2024-12-11 15:45 108浏览
  • 时源芯微——RE超标整机定位与解决详细流程一、 初步测量与问题确认使用专业的电磁辐射测量设备,对整机的辐射发射进行精确测量。确认是否存在RE超标问题,并记录超标频段和幅度。二、电缆检查与处理若存在信号电缆:步骤一:拔掉所有信号电缆,仅保留电源线,再次测量整机的辐射发射。若测量合格:判定问题出在信号电缆上,可能是电缆的共模电流导致。逐一连接信号电缆,每次连接后测量,定位具体哪根电缆或接口导致超标。对问题电缆进行处理,如加共模扼流圈、滤波器,或优化电缆布局和屏蔽。重新连接所有电缆,再次测量
    时源芯微 2024-12-11 17:11 106浏览
  • 首先在gitee上打个广告:ad5d2f3b647444a88b6f7f9555fd681f.mp4 · 丙丁先生/香河英茂工作室中国 - Gitee.com丙丁先生 (mr-bingding) - Gitee.com2024年对我来说是充满挑战和机遇的一年。在这一年里,我不仅进行了多个开发板的测评,还尝试了多种不同的项目和技术。今天,我想分享一下这一年的故事,希望能给大家带来一些启发和乐趣。 年初的时候,我开始对各种开发板进行测评。从STM32WBA55CG到瑞萨、平头哥和平海的开发板,我都
    丙丁先生 2024-12-11 20:14 66浏览
  • 我的一台很多年前人家不要了的九十年代SONY台式组合音响,接手时只有CD功能不行了,因为不需要,也就没修,只使用收音机、磁带机和外接信号功能就够了。最近五年在外地,就断电闲置,没使用了。今年9月回到家里,就一个劲儿地忙着收拾家当,忙了一个多月,太多事啦!修了电气,清理了闲置不用了的电器和电子,就是一个劲儿地扔扔扔!几十年的“工匠式”收留收藏,只能断舍离,拆解不过来的了。一天,忽然感觉室内有股臭味,用鼻子的嗅觉功能朝着臭味重的方向寻找,觉得应该就是这台组合音响?怎么会呢?这无机物的东西不会腐臭吧?
    自做自受 2024-12-10 16:34 166浏览
  • RK3506 是瑞芯微推出的MPU产品,芯片制程为22nm,定位于轻量级、低成本解决方案。该MPU具有低功耗、外设接口丰富、实时性高的特点,适合用多种工商业场景。本文将基于RK3506的设计特点,为大家分析其应用场景。RK3506核心板主要分为三个型号,各型号间的区别如下图:​图 1  RK3506核心板处理器型号场景1:显示HMIRK3506核心板显示接口支持RGB、MIPI、QSPI输出,且支持2D图形加速,轻松运行QT、LVGL等GUI,最快3S内开
    万象奥科 2024-12-11 15:42 83浏览
  • 天问Block和Mixly是两个不同的编程工具,分别在单片机开发和教育编程领域有各自的应用。以下是对它们的详细比较: 基本定义 天问Block:天问Block是一个基于区块链技术的数字身份验证和数据交换平台。它的目标是为用户提供一个安全、去中心化、可信任的数字身份验证和数据交换解决方案。 Mixly:Mixly是一款由北京师范大学教育学部创客教育实验室开发的图形化编程软件,旨在为初学者提供一个易于学习和使用的Arduino编程环境。 主要功能 天问Block:支持STC全系列8位单片机,32位
    丙丁先生 2024-12-11 13:15 63浏览
  • 铁氧体芯片是一种基于铁氧体磁性材料制成的芯片,在通信、传感器、储能等领域有着广泛的应用。铁氧体磁性材料能够通过外加磁场调控其导电性质和反射性质,因此在信号处理和传感器技术方面有着独特的优势。以下是对半导体划片机在铁氧体划切领域应用的详细阐述: 一、半导体划片机的工作原理与特点半导体划片机是一种使用刀片或通过激光等方式高精度切割被加工物的装置,是半导体后道封测中晶圆切割和WLP切割环节的关键设备。它结合了水气电、空气静压高速主轴、精密机械传动、传感器及自动化控制等先进技术,具有高精度、高
    博捷芯划片机 2024-12-12 09:16 80浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦