KV260視覺AI套件--PYNQ-DPU-Resnet50

目錄

1. 簡介

2. 代碼解析

3. 全部代碼展示

4. 總結


1. 簡介

本文以?Resnet50 為例,展示使用 PYNQ 調用 DPU 運行 Resnet50 網絡的詳細過程,并對其中關鍵代碼做出解釋。

PYNQ是一個針對Xilinx Zynq平臺的Python開發框架,它允許開發者使用Python語言和庫來利用Zynq的高效計算資源,使用 PYNQ 可以非常方便地處理各種與 Zynq 相關的計算任務,包括調用 DPU 進行推理。

Resnet50

一種深度卷積神經網絡(CNN),它由50層構成。這種網絡特別設計用于圖像識別任務,并且在2015年的ImageNet大規模視覺識別挑戰賽(ILSVRC)中取得了勝利。Resnet50的“殘差學習”能力使得它可以通過添加更多的層來提高準確性,而不會導致訓練難度增加或準確性下降。

這個網絡的核心是“殘差塊”,它允許數據在網絡的多個層之間直接傳遞,從而解決了深度網絡訓練中的“退化問題”。這種設計使得即使是非常深的網絡也能有效地訓練,并且隨著網絡深度的增加,性能也能得到提升。

2. 代碼解析

  • 硬件和模型加載
overlay = DpuOverlay("dpu.bit")
overlay.load_model("dpu_resnet50.xmodel")

首先,加載一個名為 dpu.bit 的 FPGA 比特流到 Zynq 設備上。DpuOverlay 是 PYNQ 庫中用于管理 FPGA 上的疊加層(overlay)的一個類。?

然后加載一個名為 dpu_resnet50.xmodel 的深度學習模型到已經配置好的 DPU 上。load_model 是 DpuOverlay 類的一個方法,它用于加載編譯后的深度學習模型文件。這里的 dpu_resnet50.xmodel 是一個已經被轉換和優化以適應 DPU執行的深度學習模型文件。

  • runner類,來自VART的方法
dpu = overlay.runner # runner類,來自VART的方法
inputTensors = dpu.get_input_tensors() # 返回是單個元素的列表
outputTensors = dpu.get_output_tensors() # 即[xir.Tensor]

VART(Vitis AI Runtime)是Xilinx提供的一套運行時庫,用于在Xilinx平臺上執行深度學習模型推理。

dpu = overlay.runner,這行代碼通過訪問overlay對象的runner屬性,獲取了一個VART運行時的實例。

  • 獲取dimensions?
# 元組tuple,類似于列表list,但不可更改;dims -> dimensions
shapeIn = tuple(inputTensors[0].dims) # 元組(1, 224, 224, 3)
shapeOut = tuple(outputTensors[0].dims) # (1, 1, 1, 1000)
  • 計算輸出數據大小
# get_data_size()方法返回輸出張量的總大小,除以輸入張量的第一維大小(即batch size),可以得到單個輸出張量的大小。outputSize為1000
outputSize = int(outputTensors[0].get_data_size() / shapeIn[0])
  • ?構建一維陣列,dtype=f64
softmax = np.empty(outputSize)
  • 形狀shape創建內存數據陣列;order="C"行優先存儲,"F"列優先存儲?
output_data = [np.empty(shapeOut, dtype=np.float32, order="C")]
input_data  = [np.empty(shapeIn,  dtype=np.float32, order="C")]
  • 為 input_data 中第一個元素設置別名 image
image = input_data[0]
  • 圖像預處理?
preprocessed = preprocess_fn(cv2.imread(os.path.join(image_folder, original_images[image_index])))
  • 格式轉換,切片操作
image[0,...] = preprocessed.reshape(shapeIn[1:])
  • 執行異步推理作業,并等待結果返回
job_id = dpu.execute_async(input_data, output_data)
dpu.wait(job_id)

job_id = dpu.execute_async(input_data, output_data),這行代碼調用execute_async方法來異步啟動一個深度學習模型的推理任務。這個方法接收兩個參數:input_data和output_data,分別代表模型的輸入數據和用于接收模型輸出結果的容器。input_data應該與模型的輸入張量格式匹配,而output_data則應該是足夠大以容納預期的輸出結果的容器。

execute_async方法立即返回一個job_id,這是一個標識符,用于追蹤異步執行的推理任務。此時,推理任務已經在DPU上啟動,但該方法不會阻塞調用線程等待任務完成。這允許CPU繼續執行其他任務,而不必等待DPU完成推理。

dpu.wait(job_id),這行代碼調用wait方法,并傳入之前execute_async方法返回的job_id,以等待對應的推理任務完成。如果推理任務已經完成,wait方法將立即返回;如果推理任務尚未完成,wait方法將阻塞調用線程,直到任務完成。這確保了在繼續進行任何依賴于推理結果的操作之前,推理任務已經成功完成。

  • ?轉化為一維向量
# 轉化為一維向量,放入temp列表中,此時temp形狀為(1,1,1000)
temp = [j.reshape(1, outputSize) for j in output_data]
  • 計算每個元素的指數
softmax = calculate_softmax(temp[0][0])
  • 計算最大值所在的index標簽?
print("Classification: {}".format(predict_label(softmax)))
  • 顯示圖像?
if display:display_image = cv2.imread(os.path.join(image_folder, original_images[image_index]))_, ax = plt.subplots(1)_ = ax.imshow(cv2.cvtColor(display_image, cv2.COLOR_BGR2RGB))

_ = ax.imshow(cv2.cvtColor(display_image, cv2.COLOR_BGR2RGB))

# 短橫線"_"用作一個變量名,臨時變量,一種書寫習慣

3. 全部代碼展示

以下代碼演示了使用PYNQ和DPU進行深度學習推理的全部過程,從圖像預處理、數據加載、模型推理到結果展示,為圖像分類任務提供了一個完整的流程:

import os
import time
import numpy as np
import cv2
import matplotlib.pyplot as plt
%matplotlib inlinefrom pynq_dpu import DpuOverlay
overlay = DpuOverlay("dpu.bit")overlay.load_model("dpu_resnet50.xmodel")_R_MEAN = 123.68
_G_MEAN = 116.78
_B_MEAN = 103.94MEANS = [_B_MEAN,_G_MEAN,_R_MEAN]def resize_shortest_edge(image, size):H, W = image.shape[:2]if H >= W:nW = sizenH = int(float(H)/W * size)else:nH = sizenW = int(float(W)/H * size)return cv2.resize(image,(nW,nH))def mean_image_subtraction(image, means):B, G, R = cv2.split(image)B = B - means[0]G = G - means[1]R = R - means[2]image = cv2.merge([R, G, B])return imagedef BGR2RGB(image):B, G, R = cv2.split(image)image = cv2.merge([R, G, B])return imagedef central_crop(image, crop_height, crop_width):image_height = image.shape[0]image_width = image.shape[1]offset_height = (image_height - crop_height) // 2offset_width = (image_width - crop_width) // 2return image[offset_height:offset_height + crop_height, offset_width:offset_width + crop_width, :]def normalize(image):image=image/256.0image=image-0.5image=image*2return imagedef preprocess_fn(image, crop_height = 224, crop_width = 224):image = resize_shortest_edge(image, 256)image = mean_image_subtraction(image, MEANS)image = central_crop(image, crop_height, crop_width)return imagedef calculate_softmax(data):result = np.exp(data)return resultdef predict_label(softmax):with open("img/words.txt", "r") as f:lines = f.readlines()return lines[np.argmax(softmax)-1]image_folder = 'img'
original_images = [i for i in os.listdir(image_folder) if i.endswith("JPEG")]
total_images = len(original_images)dpu = overlay.runnerinputTensors = dpu.get_input_tensors()
outputTensors = dpu.get_output_tensors()shapeIn = tuple(inputTensors[0].dims)
shapeOut = tuple(outputTensors[0].dims)
outputSize = int(outputTensors[0].get_data_size() / shapeIn[0])softmax = np.empty(outputSize)output_data = [np.empty(shapeOut, dtype=np.float32, order="C")]
input_data = [np.empty(shapeIn, dtype=np.float32, order="C")]
image = input_data[0]def run(image_index, display=False):preprocessed = preprocess_fn(cv2.imread(os.path.join(image_folder, original_images[image_index])))image[0,...] = preprocessed.reshape(shapeIn[1:])job_id = dpu.execute_async(input_data, output_data)dpu.wait(job_id)temp = [j.reshape(1, outputSize) for j in output_data]softmax = calculate_softmax(temp[0][0])if display:display_image = cv2.imread(os.path.join(image_folder, original_images[image_index]))_, ax = plt.subplots(1)_ = ax.imshow(cv2.cvtColor(display_image, cv2.COLOR_BGR2RGB))print("Classification: {}".format(predict_label(softmax)))run(1, display=True)

代碼的主要步驟如下:

  • 環境配置與模型加載:首先,導入所需的Python庫,包括os、time、numpy、cv2(OpenCV庫)、matplotlib(用于圖像顯示)等,并加載DPU疊加層和預訓練的深度學習模型(dpu_resnet50.xmodel)。
  • 圖像預處理:定義了幾個預處理函數來準備圖像數據以供模型使用。這些函數包括:
    1. resize_shortest_edge:調整圖像大小,使得其最短邊為指定的尺寸,同時保持原始的寬高比。
    2. mean_image_subtraction:執行均值減法,用于圖像歸一化,減去圖像中每個通道的平均值。
    3. BGR2RGB:將圖像從BGR格式轉換為RGB格式,因為OpenCV默認讀入圖像為BGR格式,而大多數模型使用RGB。
    4. central_crop:從圖像中心裁剪指定大小的區域。
    5. normalize:將圖像數據歸一化到[-1, 1]的范圍內。
    6. preprocess_fn:將上述預處理步驟組合起來,為模型準備圖像數據。
  • 模型預測:圖像預處理后,使用DPU執行預測。首先,讀取輸入和輸出張量的形狀,準備好輸入數據的容器。然后,對指定的圖像進行預處理并將其加載到輸入數據容器中。通過DPU執行異步推理,并等待結果。使用calculate_softmax函數計算輸出數據的softmax,以獲得每個類別的預測概率。
  • 結果展示:定義predict_label函數,它根據softmax預測結果,從一個包含類別標簽的文件中選擇并返回最可能的類別標簽。如果display參數設為True,該函數還會顯示原圖像及其預測類別。
  • 執行預測:最后,選擇一個圖像文件并調用run函數來執行上述預測流程,并可選擇是否顯示圖像及其分類標簽。

4. 總結

在這個總結中,我們探討了Resnet50,這是一個由50層構成的深度卷積神經網絡,它在圖像識別任務中表現出色。通過“殘差學習”的創新設計,Resnet50解決了深度網絡訓練中的退化問題,使得網絡能夠通過增加更多的層來提高性能,而不會增加訓練難度。我們還分析了如何在Xilinx Zynq平臺上使用VART運行Resnet50模型的代碼,包括模型加載、數據預處理、異步推理和結果分類。這個過程展示了如何利用Zynq芯片的強大功能,將深度學習應用于邊緣計算,為各種行業,特別是高級駕駛輔助系統(ADAS)等應用,提供了新的可能性。這個例子不僅展示了深度學習在實際應用中的潛力,也突顯了Zynq芯片在處理復雜計算任務時的高效性和靈活性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/38782.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/38782.shtml
英文地址,請注明出處:http://en.pswp.cn/web/38782.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

KEYSIGHT是德科技 E5063A ENA 系列網絡分析儀

E5063A ENA 矢量網絡分析儀 18GHz 2端口 降低無源射頻元器件的測試成本 Keysight E5063A ENA 是一款經濟適用的臺式矢量網絡分析儀,可用于測試簡單的無源元器件,例如頻率最高達到 18 GHz 的天線、濾波器、電纜或連接器。 作為業界聞名的 ENA 系列…

深入解析 Laravel 事件系統:架構、實現與應用

Laravel 的事件系統是框架中一個強大且靈活的功能,它允許開發者在應用程序中定義和使用自定義事件和監聽器。這個系統基于觀察者模式,使得代碼解耦和可維護性大大提高。在本文中,我們將深入探討 Laravel 事件系統的工作原理、如何實現自定義事…

python @裝飾器的用法

裝飾器(decorators)是 Python 中的一種高級特性,它允許開發者修改函數或方法的行為,而不改變其定義。裝飾器通常用于日志記錄、權限檢查、性能測量等場景。裝飾器是通過在函數定義的前一行加上 decorator_name 來使用的。 基本用…

Qt簡單文本查找

Qt版本&#xff1a; Qt6 具體代碼&#xff1a; 1. 頭文件 mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow>class QLineEdit; class QDialog; class QPushButton; class QVBoxLayout; class QTextEdit;QT_BEGIN_NAMESPACE namespace Ui…

為什么AI算法工程師要求C++?

在開始前剛好我有一些資料&#xff0c;是我根據網友給的問題精心整理了一份「c&#xff0b;&#xff0b;的資料從專業入門到高級教程」&#xff0c; 點個關注在評論區回復“666”之后私信回復“666”&#xff0c;全部無償共享給大家&#xff01;&#xff01;&#xff01;能跑出…

找到字符串中所有子串出現的位置python

直接find干就完了。 如果你希望找到字符串中所有子串出現的位置&#xff0c;而不僅僅是一個位置&#xff0c;你可以通過循環查找并收集所有起始位置。以下是修改后的代碼&#xff1a; def find_all_substring_positions(string, substring): positions [] # 用于存儲所有…

與枚舉結合的策略模式

枚舉類&#xff1a; package com.dtranx.tools.corpora.businessapi.enums;import com.dtranx.tools.commons.vo.EnumResponseVo; import com.google.common.collect.Lists;import java.util.List;/*** ClassName SimpleSearchMode* Description TODO* Date 2024/5/28 15:55* A…

VTK- 可視化過程 四種坐標系統

可視化工具包 VTK(Visualization Toolkit),是一種開源的可視化軟件系統,主要實現計算機圖形學、圖像分析、渲染、圖像處理等功能。VTK 包含一個 C類庫和多個不同語言調用接口層&#xff0c;主要針對2D、3D 圖像和可視化用圖設計。 VTK設計作為一個工具包&#xff0c;不依賴于特…

學校衛星電子怎么自動校準時間呢

在學校的教室里&#xff0c;衛星電子鐘精準地為師生們提供著時間服務&#xff0c;而其自動校準時間的功能令人稱奇。那么&#xff0c;學校衛星電子鐘是如何實現自動校準時間的呢&#xff1f; 學校衛星電子鐘自動校準時間的原理基于衛星導航系統。常見的如北斗衛星導航系統或 GP…

知迪科技驚艷亮相高工智能汽車開發者大會,精彩演講直擊行業痛點、探索未來趨勢

6月27-28日&#xff0c;高工智能汽車開發者大會在上海隆重舉行&#xff0c;知迪科技受邀攜產品與解決方案出席此次大會。 智能汽車已經進入跨域融合新時代。為了進一步降低成本和增強協同&#xff0c;汽車電子架構的設計開始向跨域融合方向演進&#xff0c;并且變革的速度在加快…

java 面試題 - 索引

上腦圖&#xff0c;大家要記住&#xff01;&#xff01; 看不清&#xff0c;上大圖&#xff01; 這幾總結就夠用&#xff01;&#xff01;

nginx優化和防盜鏈

1、隱藏版本號 [roottest1 conf]# vim nginx.conf ? server_tokens off; ? 2、防盜鏈 修改用戶和所在組 [roottest1 conf]# vim nginx.conf ? #user nginx nginx; #表示主進程master會有root創建&#xff0c;子進程會有nginx用戶來創建。 3、設置頁面的緩存時間 主要是…

ExoPlayer架構詳解與源碼分析(14)——ProgressiveMediaPeriod

系列文章目錄 ExoPlayer架構詳解與源碼分析&#xff08;1&#xff09;——前言 ExoPlayer架構詳解與源碼分析&#xff08;2&#xff09;——Player ExoPlayer架構詳解與源碼分析&#xff08;3&#xff09;——Timeline ExoPlayer架構詳解與源碼分析&#xff08;4&#xff09;—…

高考完的假期想學c語言 要注意那些問題?

在開始前剛好我有一些資料&#xff0c;是我根據網友給的問題精心整理了一份「c語言的資料從專業入門到高級教程」&#xff0c; 點個關注在評論區回復“666”之后私信回復“666”&#xff0c;全部無償共享給大家&#xff01;&#xff01;&#xff01;其實建議高考完之后好好玩一…

線上問題定位分析寶典——Linux中定位JVM問題常用命令

查詢Java進程ID #ps axu | grep java #ps elf | grep java查看機器負載及CPU信息 #top -p 1(進程ID) #top (查看所有進程)獲取CPU飆升線程堆棧 1. top -c 找到CPU飆升進程ID&#xff1b; 2. top -Hbp 9702(替換成進程ID) 找到CPU飆升線程ID&#xff1b; 3. $ printf &quo…

Java 7新特性深度解析:提升效率與功能

文章目錄 Java 7新特性深度解析&#xff1a;提升效率與功能一、Switch中添加對String類型的支持二、數字字面量的改進三、異常處理&#xff08;捕獲多個異常&#xff09;四、增強泛型推斷五、NIO2.0&#xff08;AIO&#xff09;新IO的支持六、SR292與InvokeDynamic七、Path接口…

64.ThreadLocal造成的內存泄漏

內存泄漏 程序中已動態分配的堆內存,由于某種原因程序為釋放和無法釋放,造成系統內存的浪費,導致程序運行速度減慢甚至系統崩潰等嚴重后果。內存泄漏的堆積終將導致內存溢出。 內存溢出 沒有足夠的內存提供申請者使用。 ThreadLocal出現內存泄漏的真實原因 內存泄漏的發…

Java中的多線程與并發編程詳解

Java中的多線程與并發編程詳解 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 在當今軟件開發中&#xff0c;利用多核處理器的能力并行執行任務已成為提高應用…

Transformer拆積木

文章目錄 ConceptsEmbeddingEncoderDecoderSelf-Attention matric calculationFinal Linear and Softmax LayerLoss function 參考 學一下已經問鼎中原七年之久的Transformer Concepts 開始拆積木&#xff01; Embedding Encoder Decoder Self-Attention matric calculati…

【文檔+源碼+調試講解】科研經費管理系統

目 錄 目 錄 摘 要 ABSTRACT 1 緒論 1.1 課題背景 1.2 研究現狀 1.3 研究內容 2 系統開發環境 2.1 vue技術 2.2 JAVA技術 2.3 MYSQL數據庫 2.4 B/S結構 2.5 SSM框架技術 3 系統分析 3.1 可行性分析 3.1.1 技術可行性 3.1.2 操作可行性 3.1.3 經濟可行性 3.1…