代码生成深学习网络

这个例子展示了如何对使用深学习图像分类应用程序执行码生成。它使用代码生成命令生成一个MEX函数,该函数使用MobileNet-v2、ResNet和GoogLeNet等图像分类网络运行预测。

先决条件

验证GPU环境

使用coder.checkGpuInstall函数,以验证运行此示例所需的编译器和库是否已正确设置。

envCfg = coder.gpuEnvConfig ('主办');envCfg。DeepLibTarget =“cudnn”;envCfg.DeepCodegen = 1;envCfg.Quiet = 1;coder.checkGpuInstall(envCfg);

mobilenetv2_predict入口点函数

MobileNet-V2是从ImageNet数据库超过一百万的图像训练的卷积神经网络。该网络是155层深和可以将图像分类成1000个对象类别,如键盘,鼠标,笔,和许多动物。该网络具有的224-通过-224图像输入大小。使用analyzeNetwork函数来显示深学习网络架构的交互式可视化。

净= mobilenetv2();analyzeNetwork(净值);

mobilenetv2_predict.m入口点函数拍摄图像输入,并使用预训练MobileNet-V2卷积神经网络的图像上运行预测。该函数使用一个持久化对象我的网加载系列网络对象和重新使用持久对象为在后续调用预测。

类型(“mobilenetv2_predict.m”
% MathWorks, Inc.函数out = mobilenetv2_predict(in) %#codegen persistent mynet;如果是空的(mynet), mynet = code . loaddeeplearningnetwork ('mobilenetv2','mobilenetv2');end %传入输入输出= mynet.predict(in);

运行MEX代码生成

要生成CUDA代码mobilenetv2_predict入口点函数,为一个MEX目标创建一个GPU代码配置对象,并将目标语言设置为c++。使用coder.DeepLearningConfig函数创建CuDNN深学习配置对象,并将其分配给DeepLearningConfig所述GPU代码配置对象的属性。跑过代码生成命令并指定输入大小[224,224,3]。这个值对应于MobileNet-v2网络的输入层大小。

CFG = coder.gpuConfig('MEX');cfg.TargetLang ='C ++';cfg。DeepLearningConfig = coder.DeepLearningConfig (“cudnn”);代码生成-configCFGmobilenetv2_predict-args{酮(224,224,3)}报告
代码生成成功:打开(“codegen/mex/mobilenetv2_predict/html/report.mldatx”)查看报告。

生成的代码说明

串联网络被作为包含155级的类和函数的阵列设置一个C ++类,呼叫预测产生的,并清理网络。

b_mobilenetv2_0{...公众:b_mobilenetv2_0 ();无效的设置();无效的预测();无效的清理();~ b_mobilenetv2_0 ();};

设定()类的方法为网络对象的每一层设置句柄并分配内存。该预测()方法对网络中的155层中的每一层进行预测。

该入口点函数mobilenetv2_predict()在生成的代码文件mobilenetv2_predict.cu构造的静态对象b_mobilenetv2类的类型,并在此网络对象上调用设置和预测。

静态的b_mobilenetv2_0我的网;静态的boolean_Tmynet_not_empty;
/ *函数定义* /空虚mobilenetv2_predict(常量real_T在[150528],real32_T出[1000]){如果! mynet_not_empty) {DeepLearningNetwork_setup (&mynet);mynet_not_empty = true;}
/ *传中输入* / DeepLearningNetwork_predict(我的网,IN,OUT);}

二进制文件导出用于层用参数,例如网络中的完全连接和卷积层。例如,文件cnn_mobilenetv2_conv * _w和cnn_mobilenetv2_conv * _b对应于权重和偏置参数为网络中的卷积层。要看到生成的文件的列表,使用方法:

DIR(完整文件(PWD,“代码生成”'MEX''mobilenetv2_predict'))

运行生成的墨西哥人

加载输入图像。

IM = imread(“peppers.png”);imshow(IM);

呼叫mobilenetv2_predict_mex输入图像。

IM = imresize(1M,[224224]);predict_scores = mobilenetv2_predict_mex(双(IM));

获得前五名的预测成绩和他们的标签。

[分数,indx] =排序(predict_scores“下”);一会= net.Layers .ClassNames(结束);classNamesTop =一会(indx (1:5));h =图;h.Position (3) = 2 * h.Position (3);ax₁=情节(1、2、1);ax2 =情节(1、2、2);图像(ax₁, im);barh (ax2,分数(5:1:1))包含(ax2,“概率”)yticklabels(AX2,classNamesTop(5:-1:1))= ax2.YAxisLocation'对';sgtitle(“五大预测使用MobileNet-V2”

视频分类

包含的辅助函数mobilenet_live.m从一个摄像头,执行预测,并且在每个所捕获的视频帧的显示的分类结果抓住帧。本例使用网络摄像头MATLAB®USB Webcam金宝apps™支持包支持的功能。您可以通过。下载并安装支持包金宝app金宝app支持包安装程序

类型(“mobilenet_live.m”
%版权所有2017年至2019年MathWorks公司功能mobilenet_live%连接到照相机相机=摄像头;%与顶部5预测分数的标记是%映射到相应的标签网= mobilenetv2();类名= net.Layers(结束).ClassNames;imfull =零(224,400,3, 'UINT8');FPS = 0;AX =轴;而真%拍照IPICTURE = camera.snapshot;%调整大小和投图片单个图片= imresize(IPICTURE,[224224]);%呼叫MEX功能MobileNet-V2预测抽动;POUT = mobilenetv2_predict(单(画面)); newt = toc; % fps fps = .9*fps + .1*(1/newt); % top 5 scores [top5labels, scores] = getTopFive(pout,classnames); % display if isvalid(ax) dispResults(ax, imfull, picture, top5labels, scores, fps); else break; end end end function dispResults(ax, imfull, picture, top5labels, scores, fps) for k = 1:3 imfull(:,177:end,k) = picture(:,:,k); end h = imshow(imfull, 'InitialMagnification',200, 'Parent', ax); scol = 1; srow = 20; text(get(h, 'Parent'), scol, srow, sprintf('MobileNet-v2 Demo'), 'color', 'w', 'FontSize', 20); srow = srow + 20; text(get(h, 'Parent'), scol, srow, sprintf('Fps = %2.2f', fps), 'color', 'w', 'FontSize', 15); srow = srow + 20; for k = 1:5 t = text(get(h, 'Parent'), scol, srow, top5labels{k}, 'color', 'w','FontSize', 15); pos = get(t, 'Extent'); text(get(h, 'Parent'), pos(1)+pos(3)+5, srow, sprintf('%2.2f%%', scores(k)), 'color', 'w', 'FontSize', 15); srow = srow + 20; end drawnow; end function [labels, scores] = getTopFive(predictOut,classnames) [val,indx] = sort(predictOut, 'descend'); scores = val(1:5)*100; labels = classnames(indx(1:5)); end

显然,在内存中加载的静态网络对象。

明确MEX;

利用RESNET-50网络图像分类

您还可以使用DAG network ResNet-50进行图像分类。在深度学习工具箱的ResNet-50支持包中提供了一个为MATLAB预训练的ResNet-50模型。金宝app要下载并安装支持包,请使用Add-On Explorer金宝app。要了解更多有关寻找和安装附加组件,请参阅获取附加组件(MATLAB)

网= resnet50;DISP(净)
DAGNetwork与属性:层:[177×1 nnet.cnn.layer.Layer]连接:[192×2表] InputNames:{ 'INPUT_1'} OutputNames:{ 'ClassificationLayer_fc1000'}

运行MEX代码生成

要生成CUDA代码resnet_predict.m入口点函数,为一个MEX目标创建一个GPU代码配置对象,并将目标语言设置为c++。此入口点函数调用resnet50加载网络并对输入图像进行预测的函数。

CFG = coder.gpuConfig('MEX');cfg.TargetLang ='C ++';cfg。DeepLearningConfig = coder.DeepLearningConfig (“cudnn”);代码生成-configCFGresnet_predict-args{酮(224,224,3)}报告
代码生成成功:要查看报告,打开( '代码生成/ MEX / resnet_predict / HTML / report.mldatx')。

呼叫resnet_predict_mex输入图像。

predict_scores = resnet_predict_mex(双(im));

获得前五名的预测成绩和他们的标签。

[分数,indx] =排序(predict_scores“下”);一会= net.Layers .ClassNames(结束);classNamesTop =一会(indx (1:5));h =图;h.Position (3) = 2 * h.Position (3);ax₁=情节(1、2、1);ax2 =情节(1、2、2);图像(ax₁, im);barh (ax2,分数(5:1:1))包含(ax2,“概率”)yticklabels(AX2,classNamesTop(5:-1:1))= ax2.YAxisLocation'对';sgtitle(“五大预测使用RESNET-50”

显然,在内存中加载的静态网络对象。

明确MEX;

利用GoogLeNet(盗)网图片分类

预训练GoogLeNet模型MATLAB处于深度学习工具箱的GoogLeNet支持封装。金宝app要下载并安装支持包,请使用Add-On Explorer金宝app。要了解更多有关寻找和安装附加组件,请参阅获取附加组件(MATLAB)

净= googlenet;DISP(净)
带属性的DAGNetwork: Layers:[144×1 nnet.cn .layer. layer] Connections:[170×2 table] InputNames: {'data'} OutputNames: {'output'}

运行MEX代码生成

生成的代码CUDAgooglenet_predict.m入口点函数。此入口点函数调用googlenet加载网络并对输入图像进行预测的函数。要为这个入口点函数生成代码,需要为MEX目标创建一个GPU配置对象。

CFG = coder.gpuConfig('MEX');cfg.TargetLang ='C ++';cfg。DeepLearningConfig = coder.DeepLearningConfig (“cudnn”);代码生成-configCFGgooglenet_predict-args{酮(224,224,3)}报告
代码生成成功:要查看报告,打开( '代码生成/ MEX / googlenet_predict / HTML / report.mldatx')。

呼叫googlenet_predict_mex输入图像。

IM = imresize(1M,[224224]);predict_scores = googlenet_predict_mex(双(IM));

获得前五名的预测成绩和他们的标签。

[分数,indx] =排序(predict_scores“下”);一会= net.Layers .ClassNames(结束);classNamesTop =一会(indx (1:5));h =图;h.Position (3) = 2 * h.Position (3);ax₁=情节(1、2、1);ax2 =情节(1、2、2);图像(ax₁, im);barh (ax2,分数(5:1:1))包含(ax2,“概率”)yticklabels(AX2,classNamesTop(5:-1:1))= ax2.YAxisLocation'对';sgtitle(“使用GoogLeNet的五大预测”

显然,在内存中加载的静态网络对象。

明确MEX;

也可以看看

||||||

相关话题