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.mzph.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…