这个例子展示了如何生成和部署使用MobileNet-v2预训练网络进行对象预测的c++代码。
ARM处理器,支持NEON扩展金宝app
ARM计算库(在目标ARM硬件上)
开源计算机视觉库(OpenCV) v2.4(在目标ARM硬件上)
编译器和库的环境变量
MATLAB®编码器™
MATLAB编码器接口的深度学习库支持包金宝app
深度学习工具箱™
MobileNet-v2网络支持包的深度学习工具箱模型金宝app
图像处理工具箱™
树莓派硬件的M金宝appATLAB支持包
本例使用的ARM Compute库版本可能不是代码生成支持的最新版本。金宝app有关受支金宝app持的库版本以及有关设置环境变量的信息,请参见用MATLAB编码器进行深度学习的先决条件.
此示例不支持MATLAB在线。金宝app
本例使用DAG网络MobileNet-v2使用ARM®计算库执行图像分类。用于MATLAB的预先训练的MobileNet-v2网络可在用于MobileNet-v2网络的深度学习工具箱模型支持包中获得。金宝app
当你生成使用ARM计算库和硬件支持包的代码时,金宝appcodegen
在主机上生成代码,将生成的文件复制到目标硬件,并在目标硬件上构建可执行文件。
mobilenet_predict
函数的mobilenet_predict
函数在输入图像上调用MobileNet-v2网络对象的predict方法,并返回预测分数输出。函数调用coder.updateBuildInfo
为生成的makefile指定链接选项。
类型mobilenet_predict
函数out = mobilenet_predict(in)持久网;Opencv_linkflags = ' ' pkg-config——cflags——libs opencv ";coder.updateBuildInfo (addLinkFlags, opencv_linkflags);如果为空(net) net =编码器。loadDeepLearningNetwork(“mobilenetv2”、“mobilenet”);End out = net.predict(in);结束
创建一个c++代码生成配置对象。
CFG = code .config(exe”);cfg。TargetLang =“c++”;
指定使用ARM计算库。ARM计算库为树莓派硬件提供了优化的功能。要生成使用ARM计算库的代码,请创建一个编码器。ARMNEONConfig
对象。指定安装在树莓派上的ARM计算库的版本和树莓派的架构。将深度学习配置对象附加到代码生成配置对象上。
DLCFG =编码器。DeepLearningConfig (“arm-compute”);金宝appsupportedVersions = dlcfg.getARMComputeSupportedVersions;dlcfg。ArmArchitecture =v7的;dlcfg。ArmComputeVersion =“19.05”;cfg。DeepLearningConfig = dlcfg;
使用MATLAB支持包实现树莓金宝app派硬件功能raspi
与树莓派建立连接。在这段代码中,替换:
raspiname
树莓派的主机名
用户名
用你的用户名
密码
用你的密码
R =树皮(“raspiname”,“用户名”,“密码”);
创建一个编码器。硬件
对象,并将其附加到代码生成配置对象。
Hw = code .hardware(“树莓π”);cfg。硬件= hw;
在树莓派上指定一个构建文件夹:
buildDir =“~ / remoteBuildDir”;cfg.Hardware.BuildDir = buildDir;
指定主文件main_mobilenet.cpp
在代码生成配置对象中。文件调用生成的c++代码mobilenet_predict
函数。该文件读取输入图像,将数据传递给生成的函数调用,检索图像上的预测,并将预测分数打印到文件中。
cfg。CustomSource =“main_mobilenet.cpp”;
生成c++代码。当你使用codegen
利用树莓派硬件的MATLAB支持金宝app包,在树莓派上构建可执行文件。
对于代码生成,必须设置环境变量ARM_COMPUTELIB
而且LD_LIBRARY_PATH
在树莓派上
codegen配置cfgmobilenet_predictarg游戏{ones(224,224,3,'single')}报告
要在树莓派上测试生成的代码,请将输入的图像复制到生成的代码文件夹中。方法可以手动或使用raspi.utils.getRemoteBuildDirectory
API。该函数列出了使用生成的二进制文件的文件夹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 =' pepper_raspi_mobilenet .png ';%提供输入图像;命令= [“cd”targetDirPath“sudo。/”exeName argsforexe];Output = system(r,command);
outputfile = [targetDirPath]' / output.txt '];r.getFile (outputfile);
将排名前五的预测分数映射到训练网络中对应的标签,并显示输出。
类型mapPredictedScores_mobilenet
将预测分数映射到标签和显示输出net = mobilenetv2;ClassNames = net.Layers(end).ClassNames;读取分类fid = fopen('output.txt');S = textscan(fid,'% S ');文件关闭(fid);S = S{1};predict_scores = cellfun(@(x)str2double(x), S);删除字符串类型的NaN值predict_scores(isnan(predict_scores))=[];[val,indx] = sort(predict_scores, '下降');分数= 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);
编码器。ARMNEONConfig
|编码器。DeepLearningConfig
|coder.hardware