这个例子展示了如何为使用深度学习的图像分类应用程序执行代码生成。它使用Codegen.
命令生成一个MEX函数,该函数通过使用诸如MobileNet-v2、ResNet和googleet等图像分类网络来运行预测。
要求
这个例子生成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;if isempty(mynet) mynet = code . loaddeeplearningnetwork ('mobilenetv2','mobilenetv2');End % pass in input out = mynet.predict(in);
为此产生CUDA代码mobilenetv2_predict
入口点函数,为MEX目标创建GPU代码配置对象,并将目标语言设置为c++。使用编码器。DeepLearningConfig
函数创建CuDNN
深度学习配置对象并将其分配给DeepLearningConfig
GPU代码配置对象的属性。跑过Codegen.
命令并指定输入大小为[224,224,3]。这个值对应于MobileNet-v2网络的输入层大小。
cfg = coder.gpuconfig(墨西哥人的);cfg.targetlang =.'c ++';cfg。DeepLearningConfig =编码器。DeepLearningConfig (“cudnn”);Codegen.-Config.CFG.mobilenetv2_predict- args.{ONE(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_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”那墨西哥人的那“mobilenetv2_predict”))
加载输入图像。
Im = imread(“peppers.png”);imshow (im);
称呼mobilenetv2_predict_mex
在输入图像上。
IM = IMResize(IM,[224,224]);predict_cores = mobileNetv2_predict_mex(double(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®支持包的U金宝appSB Webcams™。您可以通过金宝app金宝app支持包安装程序。
类型(“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
清除加载在内存中的静态网络对象。
清晰的墨西哥人;
还可以使用DAG网络ResNet-50进行图像分类。Deep Learning Toolbox的ResNet-50支持包中提供了用于MATLAB的预训练的ResNet-50模型。金宝app要下载和安装支持包,请使用Add-On Explorer金宝app。要了解有关查找和安装加载项的更多信息,请参阅获得附加组件(MATLAB)。
网= resnet50;DISP(网)
连接:[192×2 table] InputNames: {'input_1'} OutputNames: {'ClassificationLayer_fc1000'}
为此产生CUDA代码resnet_predict.m入口点函数,为MEX目标创建GPU代码配置对象,并将目标语言设置为c++。此入口点函数调用resnet50
函数来加载网络并对输入图像进行预测。
cfg = coder.gpuconfig(墨西哥人的);cfg.targetlang =.'c ++';cfg。DeepLearningConfig =编码器。DeepLearningConfig (“cudnn”);Codegen.-Config.CFG.resnet_predict.- args.{ONE(224,224,3)}报告
代码生成成功:要查看报告,打开('codegen/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('使用Reset-50'的五大预测)
清除加载在内存中的静态网络对象。
清晰的墨西哥人;
Googlenet支持包的Deave Learning Toolbox的Googlenet支持包中提供了预介的Googlenet模型。金宝app要下载和安装支持包,请使用Add-On Explorer金宝app。要了解有关查找和安装加载项的更多信息,请参阅获得附加组件(MATLAB)。
net = googlenet;DISP(网)
连接:[170×2 table] InputNames: {'data'} OutputNames: {'output'}
为此产生CUDA代码googlenet_predict.m入口点函数。此入口点函数调用googlenet
函数来加载网络并对输入图像进行预测。要为这个入口点函数生成代码,请为MEX目标创建一个GPU配置对象。
cfg = coder.gpuconfig(墨西哥人的);cfg.targetlang =.'c ++';cfg。DeepLearningConfig =编码器。DeepLearningConfig (“cudnn”);Codegen.-Config.CFG.googlenet_predict- args.{ONE(224,224,3)}报告
代码生成成功:查看报告,打开('codegen/mex/googlenet_predict/html/report.mldatx')。
称呼googlenet_predict_mex
在输入图像上。
IM = IMResize(IM,[224,224]);predict_cores = googlenet_predict_mex(double(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(“使用谷歌网络的五大预测”)
清除加载在内存中的静态网络对象。
清晰的墨西哥人;
Codegen.
|coder.checkGpuInstall
|编码器。DeepLearningConfig
|Coder.LoadDeePlearningnetwork.
|mobilenetv2
(深度学习工具箱)|resnet50
(深度学习工具箱)