主要内容

MobileNet-v2网络在树莓派上的代码生成与部署

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

先决条件

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

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

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

  • 编译器和库的环境变量

  • 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
Function out = mobilenet_predict(in) persistent net;Opencv_linkflags = ' ' pkg-config——cflags——libs opencv ";coder.updateBuildInfo (addLinkFlags, opencv_linkflags);如果是空的(net) net =编码器。loadDeepLearningNetwork(“mobilenetv2”、“mobilenet”);End out = net.predict(in);结束

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

cfg = coder.config (exe”);cfg。TargetLang =“c++”

指定ARM计算库的使用。ARM Compute库为Raspberry PI硬件提供了优化的功能。要生成使用ARM Compute库的代码,请创建一个编码器。ARMNEONConfig对象。指定安装在树莓派上的ARM计算库的版本和树莓派的架构。将深度学习配置对象附加到代码生成配置对象。

dlcfg =编码器。DeepLearningConfig ('arm-compute');金宝appsupportedVersions = dlcfg.getARMComputeSupportedVersions;dlcfg。ArmArchitecture ='ARMV7';dlcfg。ArmComputeVersion =“19.05”;cfg.deeplearningconfig = dlcfg;

创建到树莓派的连接

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

  • raspiname主机名是树莓派

  • 用户名用你的用户名

  • 密码用你的密码

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

配置树莓派的代码生成硬件参数

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

hw = coder.hardware (“树莓π”);cfg.hardware = hw;

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

builddir =“~ / remoteBuildDir”;cfg.Hardware.BuildDir = buildDir;

提供C ++主文件

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

cfg.customsource ='main_mobilenet.cpp'

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

生成c++代码。当你使用codegen与MATLAB支持包的树莓派硬件金宝app,可执行文件是建立在树莓派。

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

codegen配置cfgmobilenet_predictarg游戏{ONE(224,224,3,'单')}-报告

获取生成的可执行文件夹

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

applicationDirPaths = raspi.utils.getRemoteBuildDirectory ('应用名称''mobilenet_predict');targetDirPath = applicationDirPaths {1} .directory;

复制示例文件到树莓派

要复制运行可执行程序所需的文件,请使用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);

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

将前5个预测得分映射到训练网络中对应的标签,并显示输出。

类型mapPredictedScores_mobilenet
%%将预测分数映射到标签和显示输出NET = MOBILENETV2;ClassNames = Net.Layers(END).Classnames;%%读取分类FID = fopen('output.txt');s = TextScan(FID,'%S');fclose(FID);s = s {1};predict_comes = 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);

另请参阅

||

相关话题