0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用Vitis AI在Zynq MP上實(shí)現(xiàn)手勢(shì)識(shí)別

FPGA技術(shù)江湖 ? 來(lái)源:XILINX開(kāi)發(fā)者社區(qū) ? 2023-06-25 10:52 ? 次閱讀

本文作者:賽靈思工程師 Chao Zhang

FPGA得益于其高可編程性以及低延遲,低功耗的特點(diǎn),在機(jī)器學(xué)習(xí)的推理領(lǐng)域已獲得了廣泛的關(guān)注。在過(guò)去,F(xiàn)PGA對(duì)于軟件開(kāi)發(fā)人員來(lái)說(shuō)有較高的開(kāi)發(fā)門檻,把一部分開(kāi)發(fā)者擋在了門外。如今越來(lái)越完善的高階工具以及軟件堆棧使得開(kāi)發(fā)者可以充分利用FPGA優(yōu)點(diǎn)對(duì)關(guān)鍵應(yīng)用進(jìn)行加速,同時(shí)不需花費(fèi)時(shí)間去了解FPGA的底層實(shí)現(xiàn)。

Xilinx Vitis AI 是用于 Xilinx 硬件平臺(tái)上的 AI 推理的開(kāi)發(fā)堆棧。它由優(yōu)化的 IP(DPU)、工具、庫(kù)、模型和示例設(shè)計(jì)組成,使用Xilinx ZynqMP SOC或者Versal ACAP器件并借助強(qiáng)大的Vitis AI堆棧,已大大降低了FPGA上部署機(jī)器學(xué)習(xí)應(yīng)用的門檻。

本文將使用Tensorflow 2.0從零搭建并訓(xùn)練一個(gè)簡(jiǎn)單的CNN模型來(lái)進(jìn)行數(shù)字手勢(shì)識(shí)別,并部署運(yùn)行在ZynqMP開(kāi)發(fā)板上,來(lái)熟悉Vitis AI的工作流程。

我們首先用Tensorflow 2.0創(chuàng)建模型并針對(duì)目標(biāo)數(shù)據(jù)集進(jìn)行訓(xùn)練,然后使用Vitis AI 工具對(duì)模型進(jìn)行量化/編譯等處理,獲得運(yùn)行DPU所需要的xmodel文件。最后需要編寫調(diào)用Vitis AI runtime的主機(jī)應(yīng)用,該應(yīng)用運(yùn)行在CPU上,進(jìn)行必要的預(yù)處理/后處理以及對(duì)DPU進(jìn)行調(diào)度。

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

1Vitis AI環(huán)境配置

Vitis AI支持業(yè)界通用的Pytorch/Tensorflow/Caffe訓(xùn)練框架。模型創(chuàng)建和訓(xùn)練工作完全在通用框架下進(jìn)行開(kāi)發(fā)。開(kāi)始工作之前需要先在Host機(jī)器上配置好Vitis-AI Docker環(huán)境,這部分完全參考https://github.com/Xilinx/Vitis-AI Guide即可。以下所有在Host機(jī)器上完成的步驟(訓(xùn)練/量化/編譯)都是在Vitis AI docker 及vitis-ai-tensorflow2 conda env環(huán)境下完成。

2數(shù)據(jù)集

本實(shí)例使用的數(shù)字手勢(shì)數(shù)據(jù)集:

https://github.com/ardamavi/Sign-Language-Digits-Dataset (感謝開(kāi)源數(shù)據(jù)集作者Arda Mavi )

3源碼說(shuō)明

本項(xiàng)目的工程文件保存在 Github目錄:

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

有4個(gè)主要文件夾:

1. code:

此處包含所有源代碼,包括用于訓(xùn)練/量化/編譯任務(wù)的腳本,以及在 ARM 內(nèi)核上運(yùn)行的主機(jī)應(yīng)用程序。

2. output:

生成的模型文件。

3. Sign-Language-Digits-Dataset:

數(shù)據(jù)集應(yīng)該下載并放在這里。

4. target_zcu102_zcu104_kv260:

準(zhǔn)備復(fù)制到目標(biāo)板運(yùn)行的文件。

4創(chuàng)建/訓(xùn)練模型

Host機(jī)器上運(yùn)行 "train.py" 腳本,train.py腳本中包含了模型的創(chuàng)建和訓(xùn)練過(guò)程。模型的創(chuàng)建主要代碼如下,使用Keras的function式 API(注意sequential 式API目前Vitis AI不支持)。創(chuàng)建的模型包含4個(gè)連續(xù)的Conv2D+Maxpolling層,然后跟隨一個(gè)flatten layer,一個(gè)dropout layer,以及兩個(gè)全連接層。

這個(gè)模型僅僅作為示例,各位也可以嘗試使用其它的CNN模型或進(jìn)行優(yōu)化。

# 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 個(gè)epoch在驗(yàn)證數(shù)據(jù)集上獲得了 0.7682 的精確度。

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

5模型量化

訓(xùn)練完Tensorflow2.0模型后,下一步是使用Vitis AI quantizer工具對(duì)模型進(jìn)行量化。量化過(guò)程將 32 位浮點(diǎn)權(quán)重轉(zhuǎn)換為 8 位整型 (INT8),定點(diǎn)模型需要更少的內(nèi)存帶寬,從而提供更快的速度和更高的運(yùn)行效率。如果需要進(jìn)一步優(yōu)化計(jì)算量級(jí),還可以使用Vitis AI提供的剪枝(pruning)工具。

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

運(yùn)行quantize.py腳本進(jìn)行量化,運(yùn)行結(jié)束后將生成量化后的模型''quantized_model.h5''。

進(jìn)行quantize的代碼部分如下,調(diào)用VitisQuantizer,需要提供的輸入包括上個(gè)步驟生成的float模型,以及一部分圖片(推薦為100~1000張)作為calibration的輸入。Calibration操作使用提供的圖片進(jìn)行正向運(yùn)算,不需要提供label

# Run quantization

quantizer = vitis_quantize.VitisQuantizer(float_model)

quantized_model = quantizer.quantize_model(

calib_dataset=train_generator

)

6評(píng)估量化后模型

我們可以測(cè)試評(píng)估下量化后的模型是否有精度的損失。量化模型的評(píng)估可以直接在 python 腳本中利用TensorFlow框架完成。讀入模型,重新compile, 然后調(diào)用evaluation相關(guān) API對(duì)模型進(jìn)行評(píng)估。主要代碼部分如下

# 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

運(yùn)行“eval_quantize.py”腳本即可完成評(píng)估。通過(guò)評(píng)估發(fā)現(xiàn),量化后的模型沒(méi)有發(fā)生精度損失。當(dāng)然實(shí)際并不總是如此,有時(shí)候量化后的模型會(huì)有些許精度損失,這和不同的模型有關(guān)系。這時(shí)候我們可以使用Vitis AI提供finetuning來(lái)精調(diào)模型 。

7編譯模型

模型的編譯需要用到Vitis AI compiler(VAI_C)。這個(gè)步驟實(shí)際上是把量化后的模型轉(zhuǎn)化為可以在DPU上運(yùn)行的指令序列。VAI_C 框架的簡(jiǎn)化流程如下圖所示,包含模型解析,優(yōu)化和代碼生成三個(gè)階段。模型解析步驟對(duì)模型的拓?fù)溥M(jìn)行解析,生成用Xilinx的中間表示層(Intermediate Representation)表示的計(jì)算圖(computation graph)。然后是執(zhí)行一些優(yōu)化操作,例如計(jì)算節(jié)點(diǎn)融合或者提高數(shù)據(jù)重用。最后的步驟是生成DPU架構(gòu)上運(yùn)行的指令序列。

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

運(yùn)行compile.sh腳本即可完成編譯過(guò)程。主要代碼如下,使用vai_c_tensorflow2命令。注意需要提供目標(biāo)DPU配置的arch.json文件作為輸入(--arch選項(xiàng))。編譯步驟完成后會(huì)生成DPU推理用的xmodel文件。

compile() {

vai_c_tensorflow2

--model $MODEL

--arch $ARCH

--output_dir $OUTDIR

--net_name $NET_NAME

}

8主機(jī)程序

DPU作為神經(jīng)網(wǎng)絡(luò)加速引擎,還需要CPU主機(jī)對(duì)其進(jìn)行控制和調(diào)度,提供給DPU數(shù)據(jù)輸入/輸出。另外還需要對(duì)這部分運(yùn)行在ARM或Host CPU上的應(yīng)用而言, Vitis AI提供了Vitis AI Runtime (VART) 以及Vitis AI Library來(lái)方便應(yīng)用開(kāi)發(fā)。VART比較底層,提供更大的自由度。Vitis AI library屬于高層次API,構(gòu)建于 VART 之上,通過(guò)封裝許多高效、高質(zhì)量的神經(jīng)網(wǎng)絡(luò),提供更易于使用的統(tǒng)一接口。

VART具有C++和Python兩套API。多數(shù)機(jī)器學(xué)習(xí)開(kāi)發(fā)者習(xí)慣用Python來(lái)開(kāi)發(fā)和訓(xùn)練模型,在部署階段甚至可以不用切換語(yǔ)言。本例子中提供了使用Python接口的host程序app_mt.py。使用Python API的簡(jiǎn)化流程如下。

# 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開(kāi)發(fā)板上運(yùn)行

如果使用的是 Xilinx zcu102/zcu104/KV260 官方 Vitis AI 啟動(dòng)文件,則3 塊板上的 DPU 配置都相同。可以在 3 個(gè)平臺(tái)上運(yùn)行相同的xmodel文件,主機(jī)上的所有步驟完成后,將以下文件復(fù)制到目標(biāo)板上。共需要xmodel文件,主機(jī)程序,以及一些用來(lái)測(cè)試的圖片。

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

啟動(dòng)開(kāi)發(fā)板并運(yùn)行 app_mt.py ,用 -d指定圖片路徑,-m指定xmodel文件,-t 指定CPU上運(yùn)行的線程數(shù)。

很幸運(yùn),10張測(cè)試圖片的推理結(jié)果都是正確的。

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

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1630

    文章

    21796

    瀏覽量

    605419
  • 手勢(shì)識(shí)別
    +關(guān)注

    關(guān)注

    8

    文章

    225

    瀏覽量

    47839
  • AI
    AI
    +關(guān)注

    關(guān)注

    87

    文章

    31493

    瀏覽量

    270044
  • Zynq
    +關(guān)注

    關(guān)注

    10

    文章

    610

    瀏覽量

    47260
  • Vitis
    +關(guān)注

    關(guān)注

    0

    文章

    147

    瀏覽量

    7489

原文標(biāo)題:使用Vitis AI 在Zynq MP上實(shí)現(xiàn)手勢(shì)識(shí)別

文章出處:【微信號(hào):HXSLH1010101010,微信公眾號(hào):FPGA技術(shù)江湖】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    如何用10行代碼輕松ZYNQ MP實(shí)現(xiàn)圖像識(shí)別

    Vitis-AI工具,如何僅僅使用10行代碼,就能在ZYNQ MP器件上部署深度學(xué)習(xí)模型實(shí)現(xiàn)圖像分類。 簡(jiǎn)介 Xilinx Vitis-AI
    的頭像 發(fā)表于 10-09 10:47 ?4697次閱讀
    如何用10行代碼輕松<b class='flag-5'>在</b><b class='flag-5'>ZYNQ</b> <b class='flag-5'>MP</b><b class='flag-5'>上</b><b class='flag-5'>實(shí)現(xiàn)</b>圖像<b class='flag-5'>識(shí)別</b>

    閑談Vitis AI|DPUUltraScale平臺(tái)下的軟硬件流程(1)

    本篇中,我想跳過(guò)一些細(xì)枝末節(jié), 先簡(jiǎn)單介紹 AMD Xilinx Vitis AI Zynq 這個(gè)硬件加速平臺(tái)下軟硬件開(kāi)發(fā)的基本思路和流程,把各個(gè)開(kāi)發(fā)流程和工具分開(kāi),幫助剛剛接觸
    的頭像 發(fā)表于 12-21 10:15 ?2074次閱讀

    labview 實(shí)現(xiàn)手勢(shì)識(shí)別 !?。。????

    新人小白想知道怎么用labview實(shí)現(xiàn)簡(jiǎn)單的手勢(shì)識(shí)別識(shí)別上下左右就行。哪位大神能給講講
    發(fā)表于 11-02 23:36

    使用Vitis EBAZ4205(ZYNQ)礦機(jī)上實(shí)現(xiàn)"Hello World!"

    立即學(xué)習(xí)—60天FPGA工程師入門就業(yè)項(xiàng)目實(shí)戰(zhàn)特訓(xùn)營(yíng)(3月16日開(kāi)班)Vitis是 Xilinx 最新推出的開(kāi)發(fā)平臺(tái),雖然Vitis 早就在電腦安裝好了,但一直沒(méi)怎么使用。現(xiàn)在用低成本的ZY
    發(fā)表于 03-06 22:59

    【創(chuàng)龍TLZ7x-EasyEVM評(píng)估板試用連載】基于ZYNQ的動(dòng)態(tài)手勢(shì)識(shí)別系統(tǒng)

    項(xiàng)目名稱:基于ZYNQ的動(dòng)態(tài)手勢(shì)識(shí)別系統(tǒng)試用計(jì)劃:申請(qǐng)理由:申請(qǐng)人為研究生,本科期間參加過(guò)多個(gè)國(guó)家級(jí)省市級(jí)競(jìng)賽并獲得多項(xiàng)榮譽(yù),擁有豐富的Xilinx嵌入式系統(tǒng)的開(kāi)發(fā)經(jīng)驗(yàn)。已對(duì)zynq
    發(fā)表于 04-23 10:33

    【KV260視覺(jué)入門套件試用體驗(yàn)】Vitis AI 初次體驗(yàn)

    一、基礎(chǔ)環(huán)境 硬件:KV260視覺(jué)入門套件 攝像頭:???20P USB攝像頭(因?yàn)椴渴?b class='flag-5'>Vitis AI之后懶得poweroff插MIPI camera了,直接USB) 軟件:Ubuntu
    發(fā)表于 09-10 13:15

    【KV260視覺(jué)入門套件試用體驗(yàn)】五、VITis AI (人臉檢測(cè)和人體檢測(cè))

    一、DPU 鏡像環(huán)境配置 官方鏡像已經(jīng)安裝好了可以安裝相關(guān)配置,示例來(lái)源Vitis AI Library用戶指南3.0版本,首先需要安裝DPU鏡像。 1.1、克隆Vitis
    發(fā)表于 09-26 16:22

    【KV260視覺(jué)入門套件試用體驗(yàn)】六、VITis AI車牌檢測(cè)&amp;車牌識(shí)別

    視覺(jué)技術(shù)實(shí)現(xiàn)的自動(dòng)識(shí)別車輛牌照號(hào)碼的過(guò)程。該技術(shù)通過(guò)圖像采集、車牌檢測(cè)、字符分割和字符識(shí)別等步驟,實(shí)現(xiàn)對(duì)車牌號(hào)碼的自動(dòng)獲取與識(shí)別。車牌
    發(fā)表于 09-26 16:28

    【KV260視覺(jué)入門套件試用體驗(yàn)】基于Vitis AI的ADAS目標(biāo)識(shí)別

    /vitis_ai_library/models -r 四、ADAS目標(biāo)識(shí)別體驗(yàn) (一)目標(biāo)識(shí)別 接上HDMI顯示器、鍵盤&鼠標(biāo),KV260
    發(fā)表于 09-27 23:21

    【KV260視覺(jué)入門套件試用體驗(yàn)】Vitis AI 構(gòu)建開(kāi)發(fā)環(huán)境,并使用inspector檢查模型

    推斷開(kāi)發(fā)平臺(tái),它可以幫助開(kāi)發(fā)者賽靈思的 FPGA 和自適應(yīng) SoC 實(shí)現(xiàn)高效的 AI 應(yīng)用部署。它是一個(gè)強(qiáng)大而靈活的 AI 開(kāi)發(fā)平臺(tái),
    發(fā)表于 10-14 15:34

    【KV260視覺(jué)入門套件試用體驗(yàn)】Vitis AI Library體驗(yàn)之OCR識(shí)別

    的接口。由此可簡(jiǎn)化深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)的使用,對(duì)于不具備深度學(xué)習(xí)或 FPGA 知識(shí)的用戶也是如此。Vitis AI Library 使開(kāi)發(fā)者能夠?qū)W⒂陂_(kāi)發(fā)自己的應(yīng)用,而不是底層硬件。 二、實(shí)現(xiàn) 相較于
    發(fā)表于 10-16 23:25

    10行代碼輕松ZYNQ MP實(shí)現(xiàn)圖像識(shí)別

    如今各種機(jī)器學(xué)習(xí)框架的普及使得個(gè)人搭建和訓(xùn)練一個(gè)機(jī)器學(xué)習(xí)模型越來(lái)越容易。然而現(xiàn)實(shí)中大量的機(jī)器學(xué)習(xí)模型訓(xùn)練完后需要在邊緣端部署,那么我們看看借助Xilinx Vitis-AI工具,如何僅僅使用10行代碼,就能在ZYNQ MP器件上
    的頭像 發(fā)表于 08-02 08:03 ?2251次閱讀
    10行代碼輕松<b class='flag-5'>在</b><b class='flag-5'>ZYNQ</b> <b class='flag-5'>MP</b><b class='flag-5'>上</b><b class='flag-5'>實(shí)現(xiàn)</b>圖像<b class='flag-5'>識(shí)別</b>

    Zynq使用Vitis的雙ARM Hello World

    電子發(fā)燒友網(wǎng)站提供《Zynq使用Vitis的雙ARM Hello World.zip》資料免費(fèi)下載
    發(fā)表于 12-14 10:15 ?3次下載
    <b class='flag-5'>Zynq</b><b class='flag-5'>上</b>使用<b class='flag-5'>Vitis</b>的雙ARM Hello World

    使用Vitis-AI進(jìn)行車牌識(shí)別

    電子發(fā)燒友網(wǎng)站提供《使用Vitis-AI進(jìn)行車牌識(shí)別.zip》資料免費(fèi)下載
    發(fā)表于 06-27 09:49 ?2次下載
    使用<b class='flag-5'>Vitis-AI</b>進(jìn)行車牌<b class='flag-5'>識(shí)別</b>

    10行代碼輕松ZYNQ MP實(shí)現(xiàn)圖像識(shí)別的步驟

    Xilinx Vitis-AI 是用于 Xilinx 硬件平臺(tái)上的 AI 推理的開(kāi)發(fā)堆棧。它由優(yōu)化的 IP、工具、庫(kù)、模型和示例設(shè)計(jì)組成。
    的頭像 發(fā)表于 07-04 09:20 ?1671次閱讀
    10行代碼輕松<b class='flag-5'>在</b><b class='flag-5'>ZYNQ</b> <b class='flag-5'>MP</b><b class='flag-5'>上</b><b class='flag-5'>實(shí)現(xiàn)</b>圖像<b class='flag-5'>識(shí)別</b>的步驟