这个示例演示了如何为使用深度学习的图像分类应用程序执行代码生成。它使用Codegen.
命令生成MEX函数,通过使用MobileNet-V2,Reset和Googlenet等图像分类网络运行预测。
要求
此示例生成CUDA MEX并具有以下第三方要求。
CUDA®支持NVIDIA®GPU和兼容的驱动程序。
可选
对于非mex构建,如静态、动态库或可执行文件,本例有以下附加要求。
nvidia工具包。
英伟达cuDNN图书馆。
编译器和库的环境变量。有关更多信息,请参阅第三方硬件和设置先决条件产品s manbetx 845。
用来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。用来分析
(深度学习工具箱)函数显示深度学习网络架构的交互式可视化。
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);
为此产生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 = coder.deeplearningconfig('cudnn');Codegen.-Config.CFG.mobilenetv2_predict- args.{ONE(224,224,3)}-report.
代码生成成功:要查看报告,请打开('codegen / mex / mobileNetv2_predict / html / eport.mldatx')。
系列网络被生成为包含155层类的阵列和用于设置,呼叫预测和清理网络的阵列的C ++类。
班级b_mobilenetv2_0.{......。公共:B_MOBILENETV2_0();void setup();void预测();void cleanup();〜b_mobilenetv2_0();};
当setup()
该类的方法设置句柄并为网络对象的每层分配内存。当预测()
方法对网络中的155层中的每一个执行预测。
入口点函数mobilenetv2_predict ()
在生成的代码文件中mobilenetv2_predict.cu
构建一个静态对象b_mobilenetv2.类类型和调用该网络对象的设置和预测。
静止b_mobilenetv2_0.yeNet.;静止Boolean_t.mynet_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'的五大预测)
包括的辅助功能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
清除加载在内存中的静态网络对象。
清晰的墨西哥人;
您还可以使用DAG网络Reset-50进行图像分类。Reset-50支持包的Deep Learning Toolbox的Reset-50支持包中提供了Pretry Reset-50模型。万博1manbetx要下载并安装支持包,请使用附加资源管理器。万博1manbetx要了解有关查找和安装加载项的更多信息,请参阅获取和管理附加组件。
net = 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 = coder.deeplearningconfig('cudnn');Codegen.-Config.CFG.resnet_predict.- args.{ONE(224,224,3)}-report.
代码生成成功:要查看报告,打开('codegen/mex/resnet_predict/html/report.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支持包的Deave Learning Toolbox的Googlenet支持包中提供了预介的Googlenet模型。万博1manbetx要下载并安装支持包,请使用附加资源管理器。万博1manbetx要了解有关查找和安装加载项的更多信息,请参阅获取和管理附加组件。
net = googlenet;DISP(网)
具有属性的Dagnetwork:图层:[144×1 nnet.cnn.layer.layer]连接:[170×2表]输入名称:{'data'} OutputNames:{'输出'}
为此产生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)}-report.
代码生成成功:要查看报告,打开('codegen/mex/googlenet_predict/html/report.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的五大预测”)
清除加载在内存中的静态网络对象。
清晰的墨西哥人;
Codegen.
|coder.checkGpuInstall
|编码器。DeeplearningConfig
|Coder.LoadDeePlearningnetwork.
|googlenet.
(深度学习工具箱)|MobileNetv2.
(深度学习工具箱)|resnet50
(深度学习工具箱)coder.codeConfig
|编码器。CUDNN.Config
|Coder.embeddedCodeConfig
|Coder.gpuconfig.
|coder.gpuenvconfig
|Coder.TensorRTConfig