代码生成和MobileNet-V2网络的部署,以树莓派

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

先决条件

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

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

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

  • 对于编译器和库环境变量

  • MATLAB®编码器™

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

  • 深度学习工具箱™

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

  • 图像处理工具箱™

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

对于库的万博1manbetx受支持版本,以及有关设置环境变量的信息,请参阅先决条件深度学习与MATLAB编码器(编码器MATLAB)。这个例子不支持MATLAB在线。万博1manbetx

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

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

配置代码生成的mobilenet_predict函数

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

类型mobilenet_predict
功能OUT = mobilenet_predict(在)持久网络;opencv_linkflags = '`pkg配置--cflags --libs opencv`';coder.updateBuildInfo( 'addLinkFlags',opencv_linkflags);如果的isEmpty(净值)=净coder.loadDeepLearningNetwork( 'mobilenetv2', 'mobilenet');端部转出= net.predict(IN);结束

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

CFG = coder.config('可执行程序');cfg.TargetLang ='C ++';

指定ARM计算图书馆的使用。ARM的计算库提供了树莓派的硬件优化的功能。要生成一个使用ARM计算库代码,创建coder.ARMNEONConfig宾语。指定安装在您的树莓派的ARM计算库的版本和树莓派的架构。附加的深度学习配置对象的代码生成配置对象。

dlcfg = coder.DeepLearningConfig(“arm-compute”);万博1manbetxsupportedVersions = dlcfg.getARMComputeSupportedVersions;dlcfg.ArmArchitecture =v7的;dlcfg.ArmComputeVersion ='19 0.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 ++代码。当您使用代码生成与MATLAB支持包覆盆子PI硬万博1manbetx件,可执行文件是建立在树莓派。

对于代码生成,你必须设置环境变量(MATLAB编码器)ARM_COMPUTELIBLD_LIBRARY_PATH在覆盆子派上。

代码生成-configCFGmobilenet_predict-args{(224、224、3,“单”)}报告

获取生成的可执行文件夹

要在Raspberry Pi上测试生成的代码,请将输入的图像复制到生成的代码文件夹中。您可以手动查找此文件夹,也可以使用raspi.utils.getRemoteBuildDirectoryAPI。此功能列出了使用生成的二进制文件的文件夹代码生成。假设二进制文件只在一个文件夹中找到,输入:

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

复制示例文件到树莓裨

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

r.putFile('peppers_raspi_mobilenet.png',targetDirPath);

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

从MATLAB中运行树莓Pi上的可执行程序,并将输出返回MATLAB。

EXENAME =“mobilenet_predict.elf”;argsforexe =“peppers_raspi_mobilenet.png”;%提供输入图像;命令= ['CD'targetDirPath';须藤./'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 = S{1};predict_scores = cellfun(@(x)str2double(x), S);删除字符串predict_scores(isnan(predict_scores))=[]的NaN值;[val,indx] =排序(predict_scores, ' decline ');成绩=瓦尔(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);

也可以看看

||

相关的话题