主要内容

深度学习网络的代码生成

此示例显示了如何执行使用深度学习的图像分类应用程序的代码生成。它使用了Codegen.命令生成MEX函数,通过使用MobileNet-V2,Reset和Googlenet等图像分类网络运行预测。

第三方先决条件

必需的

此示例生成CUDA MEX并具有以下第三方要求。

  • CUDA®支持NVIDIA®GPU和兼容的驱动程序。

可选的

对于诸如静态,动态库或可执行文件的非MEX构建,此示例具有以下附加要求。

验证GPU环境

使用Coder.CheckGPuInstall.(GPU编码器)验证运行此示例所需的编译器和库是否已正确设置。

envcfg = coder.gpuenvconfig('主持人');envcfg.deeplibtarget ='cudnn';envcfg.deepcodegen = 1;Envcf​​g.quiet = 1;Coder.CheckGpuInstall(Envcf​​g);

MobileNetv2_predict.入学点函数

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

net = mobilenetv2();分析(网);

MobileNetv2_predict.m.入口点函数采用图像输入,并使用预制MobileNet-V2卷积神经网络在图像上运行预测。该函数使用持久对象yeNet.加载系列网络对象并重用持久对象以进行后续调用的预测。

类型('mobilenetv2_predict.m'
%Copyright 2017-2019 MathWorks,Inc。函数out = mobileNetv2_predict(in)%#codegen persistent mynet;如果是isempty(mynet)mynet = coder.loaddeeplearningnetwork('mobilenetv2','mobilenetv2');输入Out = mynet.predict(in);

运行MEX代码生成

为此产生CUDA代码MobileNetv2_predict.入口点函数,为MEX目标创建GPU代码配置对象,并将目标语言设置为C ++。使用coder.deeplearningconfig(GPU编码器)功能创建一个CUDNN.深度学习配置对象并将其分配给DeeplearningConfigGPU代码配置对象的属性。跑过Codegen.命令并指定[224,224,3]的输入大小。该值对应于MobileNet-V2网络的输入层大小。

cfg = coder.gpuconfig('mex');cfg.targetlang =.'c ++';cfg.deeplearningconfig = coder.deeplearningconfig('cudnn');Codegen.-Config.CFG.MobileNetv2_predict.-  args.{ONE(224,224,3)}-报告
代码生成成功:要查看报告,请打开('codegen / mex / mobileNetv2_predict / html / eport.mldatx')。

生成的代码描述

系列网络被生成为包含155层类的阵列和用于设置,呼叫预测和清理网络的阵列的C ++类。

班级b_mobilenetv2_0.{......公共:B_MOBILENETV2_0();void setup();void预测();void cleanup();〜b_mobilenetv2_0();};

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

入口点函数MobileNetv2_predict()在生成的代码文件中mobileenetv2_predict.cu.构建一个静态对象b_mobilenetv2.类类型和调用该网络对象的设置和预测。

静止的b_mobilenetv2_0.yeNet.;静止的Boolean_t.mynet_not_empty.;
/ *函数定义* /空白MobileNetv2_predict(Const Real_t [150528],Real32_t Out [1000]){如果!mynet_not_empty){Deeplearningnetwork_setup(&mynet);mynet_not_empty = true;}
/ *通过输入* / deeplearningnetwork_predict(&mynet,在,出);}

将二进制文件导出为具有参数的图层,例如网络中的完全连接和卷积图层。例如,文件CNN_MOBILENETV2_CONV * _W和CNN_MOBILENETV2_CONV * _B对应于网络中卷积层的权重和偏置参数。要查看生成的文件列表,请使用:

dir(fullfile(pwd,'codegen''mex''mobilenetv2_predict')))

运行生成的mex.

加载输入图像。

Im = imread('peppers.png');imshow(IM);

称呼mobileNetv2_predict_mex.在输入图像上。

IM = IMResize(IM,[224,224]);predict_cores = mobileNetv2_predict_mex(double(im));

获取前五个预测分数及其标签。

[得分,Indx] =排序(预测_coves,“下降”);ClassNames = Net.Layers(END).Classnames;ClassNamestop = ClassNames(Indx(1:5));h =图;H.Position(3)= 2 * H.Position(3);AX1 =子图(1,2,1);AX2 =子图(1,2,2);图像(AX1,IM);BARH(AX2,分数(5:-1:1))XLABEL(AX2,'可能性')YTicklabels(AX2,ClassNamestop(5:-1:1))AX2.YAXISLOCATION ='正确的';sgtitle('使用MobileNet-V2'的五大预测

视频分类

包括的辅助功能mobilenet_live.m.从网络摄像头抓取帧,执行预测,并在每个捕获的视频帧上显示分类结果。这个例子使用了摄像头(USB网络摄像万博1manbetx头的MATLAB支持包)MATLAB®支持包支持USB W万博1manbetxebCams™的功能。您可以通过支持包安装程序下载并安装支持包。万博1manbetx

类型('mobilenet_live.m'
%Copyright 2017-2019 MathWorks,Inc。函数MobileNet_live%连接到相机摄像机=网络摄像头;%具有前5个预测分数的标签是%映射到相应的标签NET = MOBILENETV2();ClassNames = Net.Layers(END).Classnames;IMFULL =零(224,400,3,'UINT8');fps = 0;斧头=轴;虽然True%拍摄图像Ipicture = Camera.snapshot;%调整并将图片调整为单张图片= Imresize(Ipicture,[224,224]);MobileNet-V2预测TIC的%呼叫MEX函数;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

清除加载在内存中的静态网络对象。

清除梅克斯;

使用Reset-50网络分类图像

您还可以使用DAG网络Reset-50进行图像分类。Reset-50支持包的Deep Learning Toolbox的Reset-50支持包中提供了Pretry Reset-50模型。万博1manbetx要下载并安装支持包,请使用附加资源管理器。万博1manbetx要了解有关查找和安装加载项的更多信息,请参阅获取和管理附加组件

net = 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');Codegen.-Config.CFG.resnet_predict.-  args.{ONE(224,224,3)}-报告
代码生成成功:要查看报告,请打开('codegen / mex / resnet_predict / html / export.mldatx')。

称呼resnet_predict_mex.在输入图像上。

predict_cores = resnet_predict_mex(double(im));

获取前五个预测分数及其标签。

[得分,Indx] =排序(预测_coves,“下降”);ClassNames = Net.Layers(END).Classnames;ClassNamestop = ClassNames(Indx(1:5));h =图;H.Position(3)= 2 * H.Position(3);AX1 =子图(1,2,1);AX2 =子图(1,2,2);图像(AX1,IM);BARH(AX2,分数(5:-1:1))XLABEL(AX2,'可能性')YTicklabels(AX2,ClassNamestop(5:-1:1))AX2.YAXISLOCATION ='正确的';sgtitle('使用Reset-50'的五大预测

清除加载在内存中的静态网络对象。

清除梅克斯;

使用Googlenet(Inception)网络分类图像

Googlenet支持包的Deave Learning Toolbox的Googlenet支持包中提供了预介的Googlenet模型。万博1manbetx要下载并安装支持包,请使用附加资源管理器。万博1manbetx要了解有关查找和安装加载项的更多信息,请参阅获取和管理附加组件

net = googlenet;DISP(网)
具有属性的Dagnetwork:图层:[144×1 nnet.cnn.layer.layer]连接:[170×2表]输入名称:{'data'} OutputNames:{'输出'}

运行MEX代码生成

为此产生CUDA代码googlenet_predict.m.入口点函数。此入口点函数调用googlenet.用于加载网络并对输入图像执行预测的功能。要为此入门点函数生成代码,请为MEX目标创建GPU配置对象。

cfg = coder.gpuconfig('mex');cfg.targetlang =.'c ++';cfg.deeplearningconfig = coder.deeplearningconfig('cudnn');Codegen.-Config.CFG.googlenet_predict.-  args.{ONE(224,224,3)}-报告
代码生成成功:要查看报告,请打开('codegen / mex / googlenet_predict / html / eport.mldatx')。

称呼googlenet_predict_mex.在输入图像上。

IM = IMResize(IM,[224,224]);predict_cores = googlenet_predict_mex(double(im));

获取前五个预测分数及其标签。

[得分,Indx] =排序(预测_coves,“下降”);ClassNames = Net.Layers(END).Classnames;ClassNamestop = ClassNames(Indx(1:5));h =图;H.Position(3)= 2 * H.Position(3);AX1 =子图(1,2,1);AX2 =子图(1,2,2);图像(AX1,IM);BARH(AX2,分数(5:-1:1))XLABEL(AX2,'可能性')YTicklabels(AX2,ClassNamestop(5:-1:1))AX2.YAXISLOCATION ='正确的';sgtitle(“使用googlenet的五大预测”

清除加载在内存中的静态网络对象。

清除梅克斯;

相关话题