主要内容

深度学习网络的代码生成

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

第三方的先决条件

必要

本例生成CUDA MEX,并具有以下第三方需求。

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

可选

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

验证GPU环境

使用Coder.CheckGPuInstall.函数来验证运行此示例所需的编译器和库是否正确设置。

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的图像输入大小。使用analyzeNetwork(深度学习工具箱)函数显示深度学习网络架构的交互式可视化。

网= mobilenetv2 ();analyzeNetwork(净);

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

类型(“mobilenetv2_predict.m”
% Copyright 2017-2019 The MathWorks, Inc. function out = mobilenetv2_predict(in) %#codegen persistent mynet;如果是空的(mynet) mynet = code . loaddeeplearningnetwork ('mobilenetv2','mobilenetv2');输入输出= mynet.predict(in);

运行MEX代码生成

生成的CUDA代码MobileNetv2_predict.为MEX目标创建一个GPU代码配置对象,并将目标语言设置为c++。使用coder.deeplearningconfig函数创建CuDNN的深度学习配置对象,并将其分配给DeepLearningConfig图形处理器代码配置对象的属性。运行codegen命令并指定输入大小[224,224,3]。该值对应于MobileNet-v2网络的输入层大小。

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

生成的代码描述

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

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

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

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

静态b_mobilenetv2_0mynet;静态boolean_Tmynet_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, in, out);}

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

dir (fullfile (pwd,'codegen'墨西哥人的“mobilenetv2_predict”))

运行生成的墨西哥人

加载一个输入图像。

我= 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);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.从网络摄像头抓取帧,执行预测,并在每个捕获的视频帧上显示分类结果。这个例子使用了网络摄像头(USB网络摄像金宝app头MATLAB支持包)MATLAB®USB Webcam金宝apps™支持包支持的功能。支持包可以通过金宝app金宝app支持包安装程序

类型(“mobilenet_live.m”
% Copyright 2017-2019 The MathWorks, Inc. function mobilenet_live % Connect to a camera camera = webcam;%预测得分前5名的标签%映射到相应的标签net = mobilenetv2();一会= net.Layers .ClassNames(结束);Imfull = 0 (uint8); / / uint8fps = 0;ax =轴;%拍照ipicture = camera.snapshot;%调整大小和cast图片到单一图片= imresize(ipicture,[224,224]);%为MobileNet-v2预测调用MEX函数;撅嘴= 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网络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 (墨西哥人的);cfg。TargetLang =“c++”;cfg。DeepLearningConfig =编码器。DeepLearningConfig (“cudnn”);codegen配置cfgresnet_predictarg游戏{1 (224224 3)}报告
代码生成成功:要查看报告,请打开('codegen / mex / resnet_predict / html / export.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的五大预测”

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

清楚梅克斯

基于GoogLeNet (Inception)网络的图像分类

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

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

运行MEX代码生成

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

cfg = coder.gpuConfig (墨西哥人的);cfg。TargetLang =“c++”;cfg。DeepLearningConfig =编码器。DeepLearningConfig (“cudnn”);codegen配置cfggooglenet_predictarg游戏{1 (224224 3)}报告
代码生成成功:要查看报告,请打开('codegen / mex / googlenet_predict / html / eport.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);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的五大预测”

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

清楚梅克斯

另请参阅

功能

对象

相关主题