主要内容

MobileNet-v2网络到Raspberry Pi的代码生成和部署

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

先决条件

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

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

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

  • 编译器和库的环境变量

  • MATLAB®编码器™

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

  • 深度学习工具箱™

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

  • 图像处理工具箱™

  • MATLAB支万博1manbetx持包树莓派硬件

此示例使用的ARM计算库版本可能不是代码生成支持的最新版本。有关支持的库版本和有关设置环境变量的信息,请参阅万博1manbetx使用MATLAB编码器进行深入学习的先决条件

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

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

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

配置的代码生成美孚公司函数

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

类型美孚公司
函数out=mobilenet_predict(in)persistent net;opencv_linkflags='`pkg config--cflags--libs opencv`';coder.updateBuildInfo('addLinkFlags',opencv_linkflags');如果isempty(net)net=coder.loadDeepLearningNetwork('mobilenetv2',mobilenet');end out=net.predict(in);end

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

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

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

dlcfg=coder.DeepLearningConfig(“arm-compute”);s万博1manbetxupportedVersions=dlcfg.GetArmComputesSupportedVersions;dlcfg.ArmaArchitecture=v7的;dlcfg.ArmComputeVersion='19.05';cfg。DeepLearningConfig = dlcfg;

创建到Raspberry Pi的连接

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

  • 树莓名称主机名是你的树莓皮

  • 用户名使用您的用户名

  • 暗语用你的密码

r=拉斯皮(“raspiname”,“用户名”,“密码”);

为Raspberry Pi配置代码生成硬件参数

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

hw = coder.hardware (“覆盆子皮”);cfg。硬件= hw;

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

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

提供一个c++主文件

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

cfg。CustomSource =“main_mobilenet.cpp”

生成树莓派上的可执行程序

生成C++代码。编码基因通过Raspberry PI硬件万博1manbetx的MATLAB支持包,可执行文件构建在Raspberry PI上。

对于代码生成,必须设置环境变量ARM_COMPUTELIB图书馆路径在树莓派上。

编码基因-配置cfg美孚公司-args{(224、224、3,“单”)}报告

获取生成的可执行文件夹

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

ApplicationDirpath=raspi.utils.getRemoteBuildDirectory(“applicationName”,“mobilenet_predict”);targetDirPath=ApplicationDirPath{1}.目录;

将示例文件复制到Raspberry Pi

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

r、 putFile(“peppers\u raspi\u mobilenet.png”,targetDirPath);

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

在MATLAB的树莓派上运行可执行程序,并将输出直接返回到MATLAB。

爱克斯名称=“mobilenet_predict.elf”;Argsforex=“peppers_raspi_mobilenet.png”%提供输入图像;命令=[“cd”targetDirPath‘sudo’exeName argsforexe];输出=系统(r,命令);

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

outputfile=[targetDirPath,“/output.txt”];r.getFile(outputfile);

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

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

类型mapPredictedScores\u mobilenet
%%将预测分数映射到标签并显示输出net = mobilenetv2;一会= net.Layers .ClassNames(结束);%%读取分类fid = fopen('output.txt');S = textscan (fid, ' % S ');文件关闭(fid);S = S{1};@(x)str2double(x), S);%%删除字符串NaN值predict_scores(isnan(predict_scores))=[];[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);

另见

||

相关的话题