代码生成深学习网络

这个例子展示了如何对使用深学习图像分类应用程序执行码生成。它使用codegen命令生成,通过使用图像分类网络,诸如MobileNet-V2,RESNET和GoogLeNet运行预测的MEX功能。

先决条件

  • 启用CUDA®GPUNVIDIA®计算能力3.2或更高版本。

  • NVIDIA CUDA工具包和驱动程序。

  • NVIDIA cuDNN库。

  • 环境变量的编译器和库。有关编译器和库的支持版本的信息,请参阅万博1manbetx第三方产品s manbetx 845。对于设置环境变量,看设置前提条件的产品s manbetx 845

  • GPU编码器接口深度学习库的支持包。万博1manbetx要安装此支持包,使用万博1manbetx扩展浏览器

验证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卷积神经网络的图像上运行预测。该函数使用一个持久化对象mynet加载串联网络对象并重用持久对象以预测后续调用。

类型('mobilenetv2_predict.m')
%版权所有2017年至2019年MathWorks公司功能OUT = mobilenetv2_predict(上)%#CODEGEN持久我的网;如果的isEmpty(我的网)我的网= coder.loadDeepLearningNetwork( 'mobilenetv2', 'mobilenetv2');结束输入%的合格出= mynet.predict(IN);

运行MEX代码生成

来生成CUDA的代码mobilenetv2_predict入口点函数,用于创建一个MEX目标一个GPU代码配置对象和目标语言设置为C ++。使用coder.DeepLearningConfig函数来创建CuDNN深度学习配置对象,并将其分配给DeepLearningConfigGPU代码配置对象的属性。运行codegen命令并且指定[224,224,3]的输入大小。此值对应于MobileNet-V2网络的输入层的大小。

cfg = coder.gpuConfig (墨西哥人的);cfg。TargetLang =“c++”;cfg.DeepLearningConfig = coder.DeepLearningConfig('cudnn');codegen配置cfgmobilenetv2_predictarg游戏{1 (224224 3)}-报告
代码生成成功:要查看报告,打开( '代码生成/ MEX / mobilenetv2_predict / HTML / report.mldatx')。

生成的代码描述

该系列网络是作为一个c++类生成的,包含155个层类和用于设置、调用predict和清理网络的函数。

b_mobilenetv2_0{公共:b_mobilenetv2_0();空隙设置();空隙预测();空隙清理();〜b_mobilenetv2_0();};

设置()类设置手柄和分配存储器,用于所述网络对象的每一层的方法。的预测()方法执行为每个网络中的155层的预测。

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

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

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

dir (fullfile (pwd,“代码生成”,墨西哥人的,“mobilenetv2_predict”))

运行生成的MEX

加载的输入图像。

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

调用mobilenetv2_predict_mex在输入图像上。

im = imresize(im, [224,224]);predict_scores = mobilenetv2_predict_mex(双(im));

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

[分数,INDX] =排序(predict_scores,“降序”);类名= net.Layers(结束).ClassNames;classNamesTop =类名(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从一个摄像头,执行预测,并且在每个所捕获的视频帧的显示的分类结果抓住帧。本例使用摄像头这是由MATLAB®Support万博1manbetx Package的USB摄像头支持™功能。您可以下载,并通过安装支持包万博1manbetx万博1manbetx支持包安装程序

类型('mobilenet_live.m')
% MathWorks, Inc.的函数mobilenet_live %连接到摄像头camera = webcam;%预测得分最高的5个标签被映射到相应的标签net = mobilenetv2();一会= net.Layers .ClassNames(结束);imfull = 0 (224,400,3, 'uint8');fps = 0;ax =轴;while true % Take a picture ipicture = camera.snapshot;%调整图片大小并将图片转换为单幅图片= imresize(ipicture,[224,224]);%调用MEX函数进行MobileNet-v2预测tic;撅嘴= 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网络RESNET-50图像分类。预训练RESNET-50模型MATLAB是提供深度学习工具箱的RESNET-50支持包。万博1manbetx要下载并安装支持包,请使用Add-On Explorer万博1manbetx。有关查找和安装附加组件的更多信息,请参见获得附加组件(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 (墨西哥人的);cfg。TargetLang =“c++”;cfg.DeepLearningConfig = coder.DeepLearningConfig('cudnn');codegen配置cfgresnet_predictarg游戏{1 (224224 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);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 (“使用ResNet-50的五大预测”)

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

明确MEX;

利用GoogLeNet (Inception)网络对图像进行分类

在深度学习工具箱的GoogLeNet支持包中提供了一个用于MATLAB的预先训练的GoogLeNet模型。万博1manbetx要下载并安装支持包,请使用Add-On Explorer万博1manbetx。有关查找和安装附加组件的更多信息,请参见获得附加组件(MATLAB)

网= googlenet;disp(净)
DAGNetwork与属性:层:[144×1 nnet.cnn.layer.Layer]连接:[170×2表] InputNames:{ '数据'} OutputNames:{ '输出'}

运行MEX代码生成

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

cfg = coder.gpuConfig (墨西哥人的);cfg。TargetLang =“c++”;cfg.DeepLearningConfig = coder.DeepLearningConfig('cudnn');codegen配置cfggooglenet_predictarg游戏{1 (224224 3)}-报告
代码生成成功:要查看报告,打开( '代码生成/ MEX / googlenet_predict / HTML / report.mldatx')。

调用googlenet_predict_mex在输入图像上。

im = imresize(im, [224,224]);predict_scores = googlenet_predict_mex(双(im));

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

[分数,INDX] =排序(predict_scores,“降序”);类名= net.Layers(结束).ClassNames;classNamesTop =类名(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”)

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

明确MEX;

另请参阅

||||||

相关话题