主要内容

基于深度学习的图像分类

这个示例向您展示如何创建、编译和部署dlhdl。工作流使用Xilinx FPGA和SoC的深度学习HDL工具箱™支持包,以alexnet作为网络对象。金宝app使用MATLAB®从目标设备检索预测结果。Alexnet是一个经过训练的卷积神经网络,已经在100多万张图像上训练过,可以将图像分类为1000个对象类别(如键盘、咖啡、马克杯、铅笔和许多动物)。你也可以使用vgg19和Darknet-19作为网络对象。

先决条件

  • Xilinx ZCU102 SoC开发工具包

  • 用于Xilinx FPGA和SoC的深度学习HDL工具金宝app箱™支持包

  • Alexnet的深度学习工具箱™模型

  • 深度学习工具箱™

  • 深度学习HDL工具箱™

加载预训练的串联网络

要加载预先训练的系列网络alexnet,输入:

snet = alexnet;

要加载预训练的系列网络vgg19,输入:

% snet = vgg19;

要加载预先训练的系列网络darknet19,输入:

% snet = darknet19;

要查看预先训练的系列网络的层,输入:

analyzeNetwork (snet)%保存的网络包含25层,包括输入、卷积、ReLU、跨通道归一化、% Max池,全连接,和softmax输出层。

创建目标对象

使用dlhdl。目标类创建具有目标设备的自定义名称的目标对象和连接目标设备到主机计算机的接口。接口选项有JTAG和Ethernet。要使用JTAG,请安装Xilinx™Vivado™Design Suite 2019.2。要设置Xilinx Vivado工具路径,输入:

% hdlsetuptoolpath('ToolName', 'Xilinx Vivado', 'ToolPath', 'C: Xilinx Vivado\2019.2\bin\ Vivado .bat');
hTarget = dlhdl。目标(“Xilinx”“界面”“以太网”);

创建工作流对象

使用dlhdl。工作流类创建对象。在创建对象时,指定网络和位流名称。指定保存的预训练alexnet神经网络作为网络。确保位流名称与您的目标数据类型和FPGA板匹配。本例中,目标FPGA板为Xilinx ZCU102 SoC板。位流使用单一的数据类型。

hW = dlhdl。工作流(“网络”snet,“比特流”“zcu102_single”“目标”, hTarget);

编制Alexnet系列网络

要编译Alexnet系列网络,运行的编译方法dlhdl。工作流对象。您可以选择指定输入帧的最大数目。

dn = hW.compile (“InputFrameNumberLimit”15)
offset_name offset_address allocated_space _______________________ ______________ _________________ "InputDataOffset" "0x00000000" "12.0 MB" " outputresultooffset " "0x00c00000" "4.0 MB" "SystemBufferOffset" "0x01000000" "28.0 MB" "InstructionDataOffset" "0x02c00000" "4.0 MB" "ConvWeightDataOffset" "0x03000000" "16.0 MB" "FCWeightDataOffset""0x04000000" "224.0 MB" "EndOffset" "0x12000000" "Total: 288.0 MB"
dn =结构体字段:操作符:[1×1 struct] layerconfig: [1×1 struct] NetConfigs: [1×1 struct]

在FPGA上编程Bitstream并下载网络权重

如果需要将网络部署到Xilinx ZCU102硬件上,请使用Xilinx ZCU102硬件的deploy功能dlhdl。工作流对象。该函数使用compile函数的输出,利用编程文件对FPGA板进行编程。它还下载了网络权重和偏差。deploy函数启动FPGA设备编程,显示进度消息,以及部署网络所需的时间。

hW.deploy
### FPGA位流编程已经被跳过,因为相同的位流已经加载到目标FPGA上。###深度学习网络编程已经被跳过,因为相同的网络已经加载到目标FPGA上。

用于预测的加载图像

加载示例图像。

imgFile =“espressomaker.jpg”;inputImg = imresize(imread(imgFile), [227,227]);imshow (inputImg)

运行一个图像的预测

执行预测方法dlhdl。工作流对象,然后在MATLAB命令窗口中显示标签。

[prediction, speed] = hW.predict(single(inputImg),“配置文件”“上”);
###完成写入输入激活。###运行单输入激活。
Deep Learning Processor Profiler Performance Results LastLayerLatency(cycles) LastLayerLatency(seconds) FramesNum Total Latency Frames/s ------------- ------------- --------- --------- --------- Network 33531964 0.15242 1 33531979 6.6 conv_module 8965629 0.04075 conv1 1396567 0.00635 norm1 622836 0.00283 pool1 226593 0.00103 conv2 3409730 0.01550norm2 378491 0.00172 pool2 233223 0.00106 conv3 1139273 0.00518 conv4 892869 0.00406 conv5 615895 0.00280 pool5 50267 0.00023 fc_module 24566335 0.11167 fc6 15819119 0.07191 fc7 7030644 0.03196 fc8 1716570 0.00780 * DL处理器的时钟频率为:220MHz
[val, idx] = max(预测);snet.Layers(结束).ClassNames {idx}
'espresso maker'

              

运行多个图像的预测

加载多幅图像并利用多帧支持特征检索其预测结果。金宝app有关更多信息,请参见多帧支持金宝app

demoOnImage函数加载多个图像并检索它们的预测结果。的annotateresults函数将图像预测结果显示在组装成3 × 5数组的图像顶部。

imshow (inputImg)

demoOnImage;
###完成写入输入激活。###运行单输入激活。
FPGA预测:信封FPGA预测:文件FPGA预测:折叠椅FPGA预测:搅拌碗FPGA预测:马桶座FPGA预测:饭桌FPGA预测:信封FPGA预测:咖啡机FPGA预测:计算机键盘FPGA预测:显示器FPGA预测:鼠标FPGA预测:圆珠笔FPGA预测:字母开瓶器FPGA预测:模拟时钟FPGA预测:垃圾桶