主要内容

代码生成和部署MobileNet-v2覆盆子π网络

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

先决条件

  • ARM处理器,支持霓虹灯扩展万博1manbetx

  • 目标臂臂计算库(硬件)

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

  • 环境变量的编译器和库

  • MATLAB®编码器™

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

  • 深度学习工具箱™

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

  • 图像处理工具箱™

  • MATLAB为万博1manbetx覆盆子π硬件支持包

臂计算库版本,这个示例使用可能不是最新版本,代码生成支持。万博1manbetx为支持版万博1manbetx本的库和设置环境变量信息,明白了先决条件与MATLAB编码器深度学习

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

下面的例子使用了DAG网络MobileNet-v2执行图像分类与手臂®计算库。的pretrained MobileNet-v2网络深度学习MATLAB提供的工具箱模型MobileNet-v2网络支持包。万博1manbetx

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

配置的代码生成mobilenet_predict函数

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

类型mobilenet_predict
函数= mobilenet_predict(在)持续净;opencv_linkflags =“pkg-config——cflags填词opencv”;coder.updateBuildInfo (addLinkFlags, opencv_linkflags);如果isempty(净)净=编码器。loadDeepLearningNetwork (“mobilenetv2”、“mobilenet”);结束= net.predict(在);结束

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

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

指定使用手臂的计算库。手臂计算库提供优化功能的覆盆子π硬件。来生成代码,使用手臂计算库,创建一个coder.ARMNEONConfig对象。指定版本的手臂计算库安装在你的树莓和覆盆子的体系结构π。深度学习配置对象附加到代码生成配置对象。

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

创建一个连接的覆盆子π

使用MATLAB支持包树莓π硬万博1manbetx件功能raspi创建一个连接的覆盆子π。在这段代码中,替换:

  • raspiname与你的主机名覆盆子π

  • 用户名和你的用户名

  • 密码用你的密码

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

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

创建一个coder.Hardware对象树莓π和附加代码生成配置对象。

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

指定一个建立文件夹树莓π:

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

主要提供一个c++文件

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

cfg。CustomSource =“main_mobilenet.cpp”;

覆盆子π生成可执行程序

生成c++代码。当你使用codegenMATLAB支持包的覆盆子π硬件万博1manbetx,可执行文件是建立在覆盆子π。

对于代码生成,您必须设置环境变量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);

地图预测分数标签和显示输出

五大预测分数映射到对应的标签在训练网络,并显示输出。

类型mapPredictedScores_mobilenet
% %地图预测分数标签和显示输出净= mobilenetv2;一会= net.Layers .ClassNames(结束);% %阅读分类fid = fopen (“output.txt”);S = textscan (fid, ' % S ');文件关闭(fid);S = {1};predict_scores = cellfun (@ (x) str2double (x));% %去除NaN值是字符串predict_scores (isnan (predict_scores)) = [];[val, indx] =排序(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);

另请参阅

||

相关的话题