这个示例演示了如何为使用深度学习的图像分类应用程序执行代码生成。它使用Codegen.
命令生成MEX函数,通过使用MobileNet-V2,Reset和Googlenet等图像分类网络运行预测。
要求
本例生成CUDA MEX,并具有以下第三方需求。
CUDA®支持NVIDIA®GPU和兼容驱动程序。
可选的
对于非mex构建,如静态、动态库或可执行文件,本例有以下附加要求。
英伟达工具包。
英伟达cuDNN图书馆。
编译器和库的环境变量。有关更多信息,请参见第三方硬件和设置前提产品下载188bet金宝搏。
使用coder.checkGpuInstall
函数来验证运行此示例所需的编译器和库是否正确设置。
envCfg = coder.gpuEnvConfig (“主机”);envcfg.deeplibtarget =“cudnn”;envCfg。DeepCodegen = 1;envCfg。安静= 1;coder.checkGpuInstall (envCfg);
mobilenetv2_predict
入学点函数MobileNet-v2是一个卷积神经网络,在ImageNet数据库的100多万张图像上进行训练。该网络有155层深度,可以将图像分为1000个对象类别,如键盘、鼠标、铅笔和许多动物。该网络的图像输入尺寸为224 × 224。使用analyzeNetwork
(深度学习工具箱)函数显示深度学习网络架构的交互式可视化。
net = mobilenetv2();分析(网);
这MobileNetv2_predict.m.
入口点函数取图像输入,并使用预先训练的MobileNet-v2卷积神经网络对图像进行预测。该函数使用持久对象yeNet.加载系列网络对象并重用持久对象以进行后续调用的预测。
类型(“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);
为此产生CUDA代码mobilenetv2_predict
为MEX目标创建一个GPU代码配置对象,并将目标语言设置为c++。使用编码器。DeepLearningConfig
功能创建一个CUDNN.
深度学习配置对象并将其分配给DeepLearningConfig
GPU代码配置对象的属性。跑过Codegen.
命令并指定[224,224,3]的输入大小。该值对应于MobileNet-V2网络的输入层大小。
cfg = coder.gpuconfig('mex');cfg.targetlang ='c ++';cfg。DeepLearningConfig =编码器。DeepLearningConfig (“cudnn”);Codegen.-Config.CFG.mobilenetv2_predict- args.{ONE(224,224,3)}报告
代码成功:查看报告
系列网络被生成为包含155层类的阵列和用于设置,呼叫预测和清理网络的阵列的C ++类。
班级b_mobilenetv2_0{......。公众:b_mobilenetv2_0 ();无效的设置();无效的预测();无效的清理();~ b_mobilenetv2_0 ();};
这设置()
方法为网络对象的每一层建立句柄并分配内存。这预测()
方法对网络中155层中的每一层进行预测。
入口点函数mobilenetv2_predict ()
在生成的代码文件中mobilenetv2_predict.cu
构建一个静态对象b_mobilenetv2.类类型并调用此网络对象上的设置和预测。
静止的b_mobilenetv2_0yeNet.;静止的boolean_Tmynet_not_empty.;
/ *函数定义*/无效mobilenetv2_predict(const real_T in[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'))
加载一个输入图像。
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'的五大预测)
清除加载在内存中的静态网络对象。
清晰的墨西哥人;
您也可以使用DAG网络ResNet-50进行图像分类。深度学习工具箱的ResNet-50支持包中有一个用于MATLAB的预训练的ResNet-50模型。金宝app要下载和安装支持包,请使用Add-On Explorer金宝app。要了解有关查找和安装加载项的更多信息,请参阅获取和管理附加组件。
网= resnet50;DISP(网)
带有属性的DAGNetwork: Layers: [177×1 nnet.cnn.layer.Layer] Connections: [192×2 table] InputNames: {'input_1'} OutputNames: {'ClassificationLayer_fc1000'}
为此产生CUDA代码resnet_predict.m.
为MEX目标创建一个GPU代码配置对象,并将目标语言设置为c++。此入口点函数调用resnet50
函数加载网络并对输入图像执行预测。
cfg = coder.gpuconfig('mex');cfg.targetlang ='c ++';cfg。DeepLearningConfig =编码器。DeepLearningConfig (“cudnn”);Codegen.-Config.CFG.resnet_predict.- args.{ONE(224,224,3)}报告
代码成功:查看报告
称呼resnet_predict_mex.
在输入图像上。
predict_scores = resnet_predict_mex(双(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支持包的Deave Learning Toolbox的Googlenet支持包中提供了预介的Googlenet模型。金宝app要下载和安装支持包,请使用Add-On Explorer金宝app。要了解有关查找和安装加载项的更多信息,请参阅获取和管理附加组件。
net = googlenet;DISP(网)
带有属性的DAGNetwork: Layers: [144×1 nnet.cnn.layer.Layer] Connections: [170×2 table] InputNames: {'data'} OutputNames: {'output'}
为此产生CUDA代码googlenet_predict.m
入口点函数。此入口点函数调用googlenet
函数加载网络并对输入图像执行预测。要为这个入口点函数生成代码,请为MEX目标创建一个GPU配置对象。
cfg = coder.gpuconfig('mex');cfg.targetlang ='c ++';cfg。DeepLearningConfig =编码器。DeepLearningConfig (“cudnn”);Codegen.-Config.CFG.googlenet_predict- args.{ONE(224,224,3)}报告
代码成功:查看报告
称呼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的五大预测”)
清除加载在内存中的静态网络对象。
清晰的墨西哥人;
coder.checkGpuInstall
|Codegen.
|编码器。DeepLearningConfig
|Coder.LoadDeePlearningnetwork.
|mobilenetv2
(深度学习工具箱)|resnet50
(深度学习工具箱)|googlenet
(深度学习工具箱)Coder.gpuconfig.
|编码器。CodeConfig
|Coder.embeddedCodeConfig
|coder.gpuenvconfig
|编码器。CUDNN.Config
|编码器。TensorRTConfig