主要内容

MobileNet-V2网络的代码生成和部署到Raspberry PI

此示例显示了如何生成和部署使用MobiLenet-V2备用网络进行对象预测的C ++代码。

先决条件

  • 支持霓虹灯扩展的ARM处理器金宝app

  • ARM Compute库(目标臂硬件上)

  • 开源计算机视觉库(OpenCV)V2.4(在目标臂硬件上)

  • 编译器和库的环境变量

  • MATLAB®Coder™

  • MATLAB编码器界面用于深度学习库支持包金宝app

  • 深度学习工具箱™

  • MobileNet-V2网络支持包的深度学习工具箱模型金宝app

  • 图像处理工具箱™

  • 覆盆子PI硬件金宝app的MATLAB支持包

此示例使用的ARM计算库版本可能不是代码生成支持的最新版本。金宝app有关设置金宝app环境变量的支持版本,请参阅与Matlab编码器深入学习的先决条件

Matlab在线不支持此示例。金宝app

此示例使用DAG网络MobileNet-V2与ARM®计算库执行图像分类。MobileNet-V2网络支持包的深度学习工具箱模型中提供了MATLAB的预雷达MobileNet-V2网络。金宝app

生成使用ARM Compute库和硬件支持包的代码时,金宝appCodegen.在主机上生成代码,将生成的文件复制到目标硬件,并在目标硬件上构建可执行文件。

配置代码生成MobileNet_Predict.功能

MobileNet_Predict.函数调用在输入图像上的MobileNet-V2网络对象的预测方法,并返回预测分数输出。函数调用Coder.updateBuildInfo.为生成的makefile指定链接选项。

类型MobileNet_Predict.
函数OUT = MOBILENET_PREDICT(IN)持久网络;opencv_linkflags ='`pkg-config --cflags --libs opencv`';coder.updatebuildinfo('addlinkflags',opencv_linkflags);如果是isempty(net)net = coder.loaddeeplearningnetwork('mobilenetv2','mobilenet');结束= net.predict(in);结尾

创建C ++代码生成配置对象。

cfg = coder.config('EXE文件');cfg.targetlang ='c ++';

指定ARM计算库的使用。ARM Compute库为Raspberry PI硬件提供了优化的功能。要生成使用ARM Compute库的代码,请创建一个Coder.armneonConfig目的。指定Raspberry PI上安装的ARM计算库的版本以及覆盆子PI的体系结构。将深度学习配置对象附加到代码生成配置对象。

dlcfg = coder.deeplearningconfig('arm-compute');金宝app支持versions = dlcfg.getarmcomputesupportedVersions;dlcfg.armarchitecture ='ARMV7';dlcfg.armcomputeversion =.'19 .05';cfg.deeplearningconfig = dlcfg;

创建与覆盆子PI的连接

使用MATLAB支持包进行覆盆金宝app子PI硬件功能raspi.创建与Raspberry PI的连接。在此代码中,替换:

  • raspiname.使用覆盆子pi的主机名

  • 用户名使用您的用户名

  • 密码使用您的密码

r = raspi('raspiname''用户名''密码');

配置覆盆子PI的代码生成硬件参数

创建一个编码器。硬件raspberry pi对象并将其附加到代码生成配置对象。

hw = coder.hardware('覆盆子pi');cfg.hardware = hw;

在raspberry pi上指定构建文件夹:

builddir ='〜/ remotebuilddir';cfg.hardware.builddir = builddir;

提供C ++主文件

指定主文件main_mobilenet.cpp.在代码生成配置对象中。该文件调用生成的C ++代码MobileNet_Predict.功能。该文件读取输入映像,将数据传递给生成的函数调用,检索图像上的预测,并将预测得分打印到文件。

cfg.cusomsource ='main_mobilenet.cpp';

在覆盆子pi上生成可执行程序

生成C ++代码。当你使用时Codegen.使用Raspberry PI硬件金宝app的MATLAB支持包,可执行文件基于覆盆子PI构建。

对于代码生成,必须设置环境变量ARM_Comptelib.ld_library_path.在覆盆子pi上。

Codegen.-Config.CFG.MobileNet_Predict.-  args.{ONE(224,224,3,'单')}-报告

获取生成的可执行文件夹

要在raspberry pi上测试生成的代码,请将输入图像复制到生成的代码文件夹。您可以手动或使用此文件夹或使用Raspi.utils.getRemoteBuildDirectory.API。此函数列出了使用的二进制文件的文件夹Codegen.。假设二进制文件仅在一个文件夹中找到,请输入:

applicationDirPaths = Raspi.utils.getRemoteBuildDirectory('应用名称''mobilenet_predict');targetdirpath = applicationdirpaths {1} .directory;

将示例文件复制到raspberry pi

要复制运行可执行程序所需的文件,请使用putfile.

r.putfile('peppers_raspi_mobilenet.png',targetdirpath);

在覆盆子pi上运行可执行程序

从MATLAB运行Raspberry PI上的可执行程序并将输出引导回MATLAB。

exename ='mobilenet_predict.elf';argsforexe ='peppers_raspi_mobilenet.png';%提供输入图像;命令= ['CD'targetdirpath.'; sudo ./'exename argsforexe];输出=系统(r,命令);

获取网络的1000个输出类的预测分数

outputfile = [targetdirpath,'/output.txt'];r.getfile(outputfile);

将预测分数映射到标签和显示输出

将前五个预测分数映射到培训的网络中的相应标签,并显示输出。

类型mappredicticeScores_Mobilenet.
%%将预测分数映射到标签和显示输出NET = MOBILENETV2;ClassNames = Net.Layers(END).Classnames;%%读取分类FID = fopen('output.txt');s = TextScan(FID,'%S');fclose(FID);s = s {1};predict_cores = cellfun(@(x)str2double(x),s);%%删除了字符串预测_cores的NaN值(ISNAN(Predict_scores))= [];[val,Indx] =排序(预测_cores,'descend');得分= val(1:5)* 100; top5labels = ClassNames(indx(1:5)); %% Display classification labels on the image im = imread('peppers_raspi_mobilenet.png'); im = imresize(im, [224 224]); outputImage = zeros(224,400,3, 'uint8'); for k = 1:3 outputImage(:,177:end,k) = im(:,:,k); end scol = 1; srow = 1; outputImage = insertText(outputImage, [scol, srow], 'Classification with MobileNetv2', 'TextColor', 'w','FontSize',20, 'BoxColor', 'black'); srow = srow + 30; for k = 1:5 outputImage = insertText(outputImage, [scol, srow], [top5labels{k},' ',num2str(scores(k), '%2.2f'),'%'], 'TextColor', 'w','FontSize',15, 'BoxColor', 'black'); srow = srow + 25; end imshow(outputImage);

也可以看看

||

相关话题