主要内容

MobileNet-v2网络到树莓派的代码生成和部署

这个例子展示了如何生成和部署c++代码,该代码使用MobileNet-v2预先训练的网络进行对象预测。

先决条件

  • 支持NEON扩展的ARM处理器万博1manbetx

  • ARM计算库(在目标ARM硬件上)

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

  • 编译器和库的环境变量

  • MATLAB®编码器™

  • MATLAB编码器接口的深度学习库支持包万博1manbetx

  • 深度学习工具箱™

  • 深度学习工具箱模型的MobileNet-v2网络支持包万博1manbetx

  • 图像处理工具箱™

  • 树莓派硬件的M万博1manbetxATLAB支持包

本例使用的ARM Compute库版本可能不是代码生成支持的最新版本。万博1manbetx有关受支万博1manbetx持的库版本和有关设置环境变量的信息,请参见MATLAB编码器深度学习的先决条件(MATLAB编码器)

这个例子不支持MATLAB在线。万博1manbetx

本例使用DAG网络MobileNet-v2与ARM®计算库进行图像分类。预先训练的MobileNet-v2网络MATLAB是可在深度学习工具箱模型的MobileNet-v2网络支持包。万博1manbetx

当你生成使用ARM计算库和硬件支持包的代码时,万博1manbetxcodegen在主机上生成代码,将生成的文件复制到目标硬件,并在目标硬件上构建可执行文件。

的代码生成配置mobilenet_predict函数

mobilenet_predict函数在输入图像上调用MobileNet-v2网络对象的predict方法,并返回预测分数输出。的函数调用coder.updateBuildInfo为生成的生成文件指定链接选项。

类型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”);End out = net.predict(in);结束

创建一个c++代码生成配置对象。

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

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

dlcfg =编码器。DeepLearningConfig (“arm-compute”);万博1manbetxsupportedVersions = dlcfg.getARMComputeSupportedVersions;dlcfg。ArmArchitecture =v7的;dlcfg。ArmComputeVersion =“19.05”;cfg。DeepLearningConfig = dlcfg;

创建一个连接到树莓派

使用MATLAB支持包实现树莓万博1manbetx派硬件功能raspi创建到树莓派的连接。在这段代码中,替换:

  • raspiname你的树莓派的主机名

  • 用户名使用您的用户名

  • 密码用你的密码

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

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

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

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

在树莓派中指定一个构建文件夹:

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

提供一个c++主文件

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

cfg。CustomSource =“main_mobilenet.cpp”

生成树莓派的可执行程序

生成c++代码。当你使用codegen使用MATLAB支持包的树莓派硬万博1manbetx件,可执行文件是建立在树莓派。

对于代码生成,必须设置环境变量(MATLAB编码器)ARM_COMPUTELIBLD_LIBRARY_PATH在树莓派上

codegen配置cfgmobilenet_predictarg游戏{(224、224、3,“单”)}报告

获取生成的可执行文件夹

要在树莓派上测试生成的代码,请将输入的图像复制到生成的代码文件夹。可以手动或使用raspi.utils.getRemoteBuildDirectoryAPI。此函数列出使用生成的二进制文件的文件夹codegen.假设二进制文件只存在于一个文件夹中,输入:

applicationDirPaths = raspi.utils.getRemoteBuildDirectory (“applicationName”“mobilenet_predict”);targetDirPath = applicationDirPaths {1} .directory;

复制示例文件到树莓派

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

r.putFile (“peppers_raspi_mobilenet.png”, targetDirPath);

在树莓派上运行可执行程序

从MATLAB运行树莓派可执行程序,并直接输出到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
%%将预测分数映射到标签和显示输出网络= mobilenetv2;一会= net.Layers .ClassNames(结束);%%读取分类fid = fopen('output.txt');S = textscan (fid, ' % S ');文件关闭(fid);S = S{1};predict_scores = cellfun(@(x)str2double(x), S);%%删除字符串predict_scores(isnan(predict_scores))=[]的NaN值;[val,indx] = sort(predict_scores, '下降');成绩=瓦尔(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);

另请参阅

(MATLAB编码器)|(MATLAB编码器)|(MATLAB编码器)

相关的话题