此示例显示了如何生成和部署使用MobileNet-V2预磨损网络进行对象预测的C ++代码。
支持霓虹灯扩展的ARM处理器金宝app
ARM Compute库(目标臂硬件上)
开源计算机视觉库(OpenCV) v2.4(在目标ARM硬件上)
编译器和库的环境变量
MATLAB®Coder™
MATLAB编码器接口的深度学习库支持包金宝app
深度学习工具箱™
MobileNet-v2网络支持包的深度学习工具箱模型金宝app
图像处理工具箱™
覆盆子PI硬件金宝app的MATLAB支持包
本例使用的ARM计算库版本可能不是代码生成支持的最新版本。金宝app有关库受金宝app支持的版本以及有关设置环境变量的信息,请参见深度学习与MATLAB编码器的先决条件.
Matlab在线不支持此示例。金宝app
此示例使用DAG网络MobileNet-V2使用ARM®计算库执行图像分类。MobileNet-V2网络支持包的深度学习工具箱模型中提供了用于MATLAB的预雷达MobileNet-V2网络。金宝app
生成使用ARM Compute库和硬件支持包的代码时,金宝appcodegen
在主机上生成代码,将生成的文件复制到目标硬件,并在目标硬件上构建可执行文件。
mobilenet_predict
功能的mobilenet_predict
函数调用在输入图像上的MobileNet-V2网络对象的预测方法,并返回预测分数输出。函数调用coder.updateBuildInfo
为生成的makefile指定链接选项。
类型mobilenet_predict
Function out = mobilenet_predict(in) persistent net;Opencv_linkflags = ' ' pkg-config——cflags——libs opencv ";coder.updateBuildInfo (addLinkFlags, opencv_linkflags);如果是空的(net) net =编码器。loadDeepLearningNetwork(“mobilenetv2”、“mobilenet”);End out = net.predict(in);结束
创建C ++代码生成配置对象。
cfg = coder.config (exe”);cfg。TargetLang =“c++”;
指定ARM计算库的使用。ARM Compute库为Raspberry PI硬件提供了优化的功能。要生成使用ARM Compute库的代码,请创建一个编码器。ARMNEONConfig
对象。指定安装在树莓派上的ARM计算库的版本和树莓派的架构。将深度学习配置对象附加到代码生成配置对象。
dlcfg =编码器。DeepLearningConfig ('arm-compute');金宝appsupportedVersions = dlcfg.getARMComputeSupportedVersions;dlcfg。ArmArchitecture ='ARMV7';dlcfg。ArmComputeVersion =“19.05”;cfg.deeplearningconfig = dlcfg;
使用MATLAB支持包进行覆盆金宝app子PI硬件功能raspi.
创建与树莓派的连接在此代码中,替换:
raspiname
主机名是树莓派
用户名
用你的用户名
密码
用你的密码
r = raspi (“raspiname”,'用户名','密码');
创建一个编码器。硬件
raspberry pi的对象并将其附加到代码生成配置对象。
hw = coder.hardware (“树莓π”);cfg.hardware = hw;
在raspberry pi上指定构建文件夹:
builddir =“~ / remoteBuildDir”;cfg.Hardware.BuildDir = buildDir;
指定主文件main_mobilenet.cpp
在代码生成配置对象中。该文件调用生成的C ++代码mobilenet_predict
功能。该文件读取输入图像,将数据传递给生成的函数调用,检索图像上的预测,并将预测得分打印到文件。
cfg.customsource ='main_mobilenet.cpp';
生成c++代码。当你使用codegen
与MATLAB支持包的树莓派硬件金宝app,可执行文件是建立在树莓派。
对于代码生成,必须设置环境变量ARM_COMPULLIB.
和LD_LIBRARY_PATH
在覆盆子pi上。
codegen配置cfgmobilenet_predictarg游戏{ONE(224,224,3,'单')}-报告
要在raspberry pi上测试生成的代码,请将输入图像复制到生成的代码文件夹。您可以手动或使用此文件夹raspi.utils.getRemoteBuildDirectory
API。这个函数列出了使用codegen
.假设二进制文件仅在一个文件夹中找到,请输入:
applicationDirPaths = raspi.utils.getRemoteBuildDirectory ('应用名称','mobilenet_predict');targetDirPath = applicationDirPaths {1} .directory;
要复制运行可执行程序所需的文件,请使用Putfile.
.
r.putFile (“peppers_raspi_mobilenet.png”, targetDirPath);
从MATLAB运行Raspberry PI上的可执行程序并将输出引导回MATLAB。
exeName ='mobilenet_predict.elf';argsforexe ='peppers_raspi_mobilenet.png';%提供输入图像;命令= [“cd”targetdirpath.“sudo。/”exeName argsforexe];输出=系统(r,命令);
outputfile = [targetDirPath,' / output.txt '];r.getFile (outputfile);
将前5个预测得分映射到训练网络中对应的标签,并显示输出。
类型mapPredictedScores_mobilenet
%%将预测分数映射到标签和显示输出NET = MOBILENETV2;ClassNames = Net.Layers(END).Classnames;%%读取分类FID = fopen('output.txt');s = TextScan(FID,'%S');fclose(FID);s = s {1};predict_comes = cellfun(@(x)str2double(x),s);%%删除了字符串预测_cores的NaN值(ISNAN(Predict_scores))= [];[val,Indx] =排序(预测_cores,'descend');分数= 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
|coder.deeplearningconfig
|coder.hardware