KV260视觉AI套件--PYNQ-DPU-Resnet50

目录

1. 简介

2. 代码解析

3. 全部代码展示

4. 总结


1. 简介

Resnet50

一种深度卷积神经网络(CNN),它由50层构成。这种网络特别设计用于图像识别任务,并且在2015年的ImageNet大规模视觉识别挑战赛(ILSVRC)中取得了胜利。Resnet50的“残差学习”能力使得它可以通过添加更多的层来提高准确性,而不会导致训练难度增加或准确性下降。

这个网络的核心是“残差块”,它允许数据在网络的多个层之间直接传递,从而解决了深度网络训练中的“退化问题”。这种设计使得即使是非常深的网络也能有效地训练,并且随着网络深度的增加,性能也能得到提升。

2. 代码解析

  • 硬件和模型加载
overlay = DpuOverlay("dpu.bit")
overlay.load_model("dpu_resnet50.xmodel")
  • runner类,来自VART的方法
dpu = overlay.runner # runner类,来自VART的方法
inputTensors = dpu.get_input_tensors() # 返回是单个元素的列表
outputTensors = dpu.get_output_tensors() # 即[xir.Tensor]
  • 获取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)
  •  转化为一维向量
# 转化为一维向量,放入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. 全部代码展示

import os
import time
import numpy as np
import cv2
import matplotlib.pyplot as plt
%matplotlib inline

from 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.94

MEANS = [_B_MEAN,_G_MEAN,_R_MEAN]

def resize_shortest_edge(image, size):
    H, W = image.shape[:2]
    if H >= W:
        nW = size
        nH = int(float(H)/W * size)
    else:
        nH = size
        nW = 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 image

def BGR2RGB(image):
    B, G, R = cv2.split(image)
    image = cv2.merge([R, G, B])
    return image

def central_crop(image, crop_height, crop_width):
    image_height = image.shape[0]
    image_width = image.shape[1]
    offset_height = (image_height - crop_height) // 2
    offset_width = (image_width - crop_width) // 2
    return image[offset_height:offset_height + crop_height, offset_width:
                 offset_width + crop_width, :]

def normalize(image):
    image=image/256.0
    image=image-0.5
    image=image*2
    return image

def 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 image

def calculate_softmax(data):
    result = np.exp(data)
    return result

def 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.runner

inputTensors = 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)

4. 总结

在这个总结中,我们探讨了Resnet50,这是一个由50层构成的深度卷积神经网络,它在图像识别任务中表现出色。通过“残差学习”的创新设计,Resnet50解决了深度网络训练中的退化问题,使得网络能够通过增加更多的层来提高性能,而不会增加训练难度。我们还分析了如何在Xilinx Zynq平台上使用VART运行Resnet50模型的代码,包括模型加载、数据预处理、异步推理和结果分类。这个过程展示了如何利用Zynq芯片的强大功能,将深度学习应用于边缘计算,为各种行业,特别是高级驾驶辅助系统(ADAS)等应用,提供了新的可能性。这个例子不仅展示了深度学习在实际应用中的潜力,也突显了Zynq芯片在处理复杂计算任务时的高效性和灵活性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/763357.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

notepad++安装并打开json文件

1、notepad安装 1、首先下载Notepad.exe 2、选择简体中文安装 点击下一步 点击“我接受” 选择安装目录,进行下一步安装 默认下一步 选择安装 等待安装完成 点击完成 2、保存json文件 复制返回结果 先把返回结果复制出来。保存到text里面 把文件另存为json格式 3、…

Mac搭建anaconda环境并安装深度学习库

1. 下载anaconda安装包 根据自己的操作系统不同,选择不同的安装包Anaconda3-2024.06-1-MacOSX-x86_64.pkg,我用的还是旧的intel所以下载这个,https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/,如果mac用的是M1&#xff0…

通过百度文心智能体创建STM32编程助手-实操

一、前言 文心智能体平台AgentBuilder 是百度推出的基于文心大模型的智能体(Agent)平台,支持广大开发者根据自身行业领域、应用场景,选取不同类型的开发方式,打造大模型时代的产品能力。开发者可以通过 prompt 编排的…

拍摄的vlog视频画质模糊怎么办?视频画质高清修复

在短视频逐渐成为主流的今天,许多朋友都会通过vlog的形式记录下自己的生活。但我们会发现,自己拍摄的视频与专业博主拍摄的视频,在画质上就会有所差别,拍摄的vlog视频画质模糊不清晰怎么办? 拍摄的vlog视频画质模糊怎么…

昇思第6天

函数式自动微分 神经网络的训练主要使用反向传播算法,模型预测值(logits)与正确标签(label)送入损失函数(loss function)获得loss,然后进行反向传播计算,求得梯度&#…

推荐算法学习笔记2.2:基于深度学习的推荐算法-基于特征交叉组合+逻辑回归思路的深度推荐算法-Deep Crossing模型

Deep Crossing模型(微软,搜索引擎,广告推荐) 前置知识:推荐算法学习笔记1.3:传统推荐算法-逻辑回归算法,推荐算法学习笔记1.4:传统推荐算法-自动特征的交叉解决方案:FM→FFM 本文含残差块反向传…

人工智能--目标检测

欢迎来到 Papicatch的博客 文章目录 🍉引言 🍉概述 🍈目标检测的主要流程通常包括以下几个步骤 🍍数据采集 🍍数据预处理 🍍特征提取 🍍目标定位 🍍目标分类 🍈…

mac软件卸载后的残留文件删除 mac如何卸载应用程序

很多人都不知道,mac使用系统方式卸载后会有残留文件未被删除,久而久之就会占用大量的磁盘空间。今天小编就来教大家如何删除mac软件卸载后的残留文件,如果你想不留痕迹的删除,mac又该如何正确卸载应用程序,本文将一一为…

整合、速通 版本控制器-->Git 的实际应用

目录 版本控制器 -- Git1、Git 和 SVN 的区别2、Git 的卸载和安装2-1:Git 卸载1、先查下原本的Git版本2、删除环境变量3、控制面板卸载 Git 2-2:Git 下载安装1、官网下载2、详细安装步骤3、安装成功展示 3、Git 基础知识3-1:基本的 Linux 命令…

通俗易懂的chatgpg的原理简介

目录 一、深度学习与语言模型 二、ChatGPT训练三步走 三、情景学习与思维链 四、修改提示语优化结果 五、能力评估和注意问题 六.算法原理 简介: ChatGPT的人工智能原理主要基于深度学习技术,特别是大规模的预训练语言模型和Transformer结构。Cha…

SpringCloud_Eureka注册中心

概述 Eureka是SpringCloud的注册中心。 是一款基于REST的服务治理框架,用于实现微服务架构中的服务发现和负载均衡。 在Eureka体系中,有两种角色: 服务提供者和服务消费者。 服务提供者将自己注册到Eureka服务器,服务消费者从Eureka服务器中…

使用Qt制作一个简单的界面

1、创建工程 步骤一: 步骤二: 步骤三: 选择 build system,有qmake、CMake 和 Qbs 三个选项。 CMake 很常用,功能也很强大,许多知名的项目都是用它,比如 OpenCV 和 VTK,但它的语法繁…

【Android面试八股文】什么是ANR?如何分析和定位ANR?如何避免ANR?

文章目录 一、ANR概述二、触发ANR的主要场景三、Android四大组件中的潜在的ANR风险五、避免ANR的实践建议六、ANR的产生原因与出现的场景6.1 原因:6.2 出现场景:七、ANR的定位与分析7.1. ANR分析思路——traces7.2 ANR其他分析思路与相关日志7.2.1 分析logcat思路7.2.2 分析k…

Spring Cloud Circuit Breaker基础入门与服务熔断

官网地址&#xff1a;https://spring.io/projects/spring-cloud-circuitbreaker#overview 本文SpringCloud版本为&#xff1a; <spring.boot.version>3.1.7</spring.boot.version> <spring.cloud.version>2022.0.4</spring.cloud.version>【1】Circu…

易校网校园综合跑腿小程序源码修复运营版

简介&#xff1a; 易校网校园综合跑腿小程序源码修复运营版&#xff0c;带服务端客户端前端文档说明。 源码安装方法&#xff1a; 需要准备小程序服务号 服务器 备案域名 校园网跑腿小程序源码需要准备 1.小程序 2.服务器&#xff08;推荐配置2h4g3m&#xff09; 3.域名…

【Python实战因果推断】13_线性回归的不合理效果3

目录 Regression Theory Single Variable Linear Regression Multivariate Linear Regression Frisch-Waugh-Lovell Theorem and Orthogonalization Regression Theory 我不打算太深入地探讨线性回归是如何构建和估计的。不过&#xff0c;一点点理论知识将有助于解释线性回归…

更新!谷歌倾斜摄影OSGB数据V1.2版

谷歌倾斜摄影OSGB数据V1.2版终于来了&#xff01; 一个月前发布了谷歌倾斜摄影数据生成OSGB数据V1.0版&#xff0c;对谷歌倾斜摄影数据转换工具进行了重大更新&#xff0c;V1.1版主要解决了三个问题&#xff1a;1.支持Cesiumlab等数据处理软件&#xff0c;将OSGB数据转换成3DTi…

OFDM关键技术——PAPR降低技术

OFDM信号的峰均比问题 PAR问题由于不同子载波上N个正弦信号叠加引起&#xff0c;由于各个子载波的幅值和相位相互独立&#xff0c;当子载波数目较大时&#xff0c;由中心极限定理可知&#xff0c;同相分量的幅度服从高斯分布。 峰值功率&#xff1a;0.1033 平均功率&am…

网安小贴士(4)哈希函数

一、前言 哈希函数是密码学中的基础工具&#xff0c;哈希函数在密码学中扮演着至关重要的角色&#xff0c;广泛应用于确保数据的安全性和完整性。随着技术的发展&#xff0c;新的哈希算法和应用场景也在不断出现。 二、定义 哈希函数是一种数学函数&#xff0c;它接受一个输…

计算机I/O系统与外围设备详解:从基础概念到实际应用

计算机I/O系统与外围设备详解&#xff1a;从基础概念到实际应用 在计算机世界中&#xff0c;理解I/O系统和外围设备的基本概念对初学者来说至关重要。本文将详细介绍I/O系统的基础知识、I/O接口、计算机外围设备及其工作原理&#xff0c;帮助基础小白更好地理解这些概念。 I/O…