小言_互联网的博客

PowerSensor AI教程1.3 - 数字识别 - edge调用

354人阅读  评论(0)

介绍

本章主要介绍edge环节,即如何通过调度程序看,将编译好elf模型部署到powersensor上面运行。

本章需要使用新的powersensor镜像(2020.5月以后发布的镜像会带有DPU),下载地址:
链接:https://pan.baidu.com/s/18CFK2aXonxuFF6-L_ittdw
提取码:8ve4

本章的例程与上一节的相同,请移步
Powersensor AI教程1.1-数字识别-tf模型训练下载。

主要过程

  1. 进入powersenosr的jupyter文件管理页面,在/powersensor_workspace/powersensor_ai下面新建ministNumber目录(随教程发布的案例已经准备好文件了)。在新建的ministNumber目录下新建dataset_validedge文件夹
  2. 通过jupyter的上传功能,把案例目录下的edge文件夹下的两个文件上传到powersensor的edge目录;验证集dataset_valid下的文件也同理上传到相应目录(可能需要新建minist-number文件夹)。
  • 如果要使用自己新训练的模型,可以把edge下的elf换成虚拟机里的compileResult下的elf文件。
  • 注意虚拟机里的文件不能直接上传(找不到),要先拷贝到自己的电脑里才能上传。
  1. 打开powersensor的edge下的powersensor_ministNumer.ipynb文件,按照notebook里面的指导逐个运行程序。

  2. 首先也是加载头文件和重要的参数,其中DPU网络参数应该与DPU的编译结果输出保持一致,否则会导致DPU崩溃。

from dnndk import n2cube
import numpy as np
from numpy import float32
import os
import cv2
import matplotlib.pyplot as plt
import random
import time
import matplotlib as mpl
from matplotlib import font_manager
import PowerSensor as ps

mpl.rcParams['axes.unicode_minus']=False     # 正常显示负号

# 训练用的网络尺寸
img_size_net = 28

# 词汇表
wordlist = ['1', '1', '2', '3', '4', '5', '6', '7', '8', '9']

# DPU网络参数
ELF_NAME = "dpu_testModel_0.elf"
CONV_INPUT_NODE = "x_input_Conv2D"
CONV_OUTPUT_NODE = "y_out_MatMul"
  1. 加载验证集,这个程序应该与pc环节的加载验证集一致。加载完会随机打印8个样本:
dataset_valid_path = '../dataset_valid//minist-number/'
# 1. 加载数据集
(validSet_images, validSet_lables) = load_mnist(dataset_valid_path, 't10k')

# 2. 图像预处理
validSet_images = validSet_images.reshape((-1,28,28,1)) / 255.
validSet_images = np.array(validSet_images, dtype='float32')

# 3. 随机打印8个测试图像
fig, ax = plt.subplots(5, 2)
fig.set_size_inches(15,15)
for i in range(5):
    for j in range(2):
        l = random.randint(0, len(validSet_lables))
        ax[i, j].imshow(validSet_images[l, :, :, 0])
        title = wordlist[validSet_lables[l]]
        title_utf8 = title.decode('utf8')
        ax[i, j].set_title(title_utf8, fontproperties=font)
plt.tight_layout()
  1. 加载DPU模型,powersensor在xilinx的dnndk的函数库上做了一个简单的封装,对于一些简单的分类任务已经够用,对于复杂的检测任务请使用xilinx的dpu的原生的dnndk函数。这里的ELF_NAME是elf文件的文件名,后面两个参数分布是网络的输入节点和输出节点,需要和dnndk的编译输出保持一致
dpu1 = ps.DpuHelper()
dpu1.load_kernel(ELF_NAME, input_node_name=CONV_INPUT_NODE, output_node_name=CONV_OUTPUT_NODE)
  1. 测试验证集的精度:注意dpu1.predit_softmax()输入是一个3维的图像,比如灰度图的最后一个维度虽然是1,但不能缺少。
tick_start = time.time()
test_num = len(validSet_lables)
right_eg_cnt = 0
for i in range(test_num):
    img1_scale = validSet_images[i]
    softmax = dpu1.predit_softmax(img1_scale)
    pdt= np.argmax(softmax, axis=0)
    if pdt == validSet_lables[i]:
        right_eg_cnt += 1
tick_end = time.time()
print('精度: ' + str((right_eg_cnt*1.) / test_num))
print('测试 ' + str(test_num) + ' 个样本。耗时 ' + str(tick_end - tick_start) + '秒!')

  1. 随机测试8个样本并打印结果:

转载:https://blog.csdn.net/linxiaobo110/article/details/106421162
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场