主要内容

Intel目标对不同批量尺寸的深度学习代码

此示例显示了如何使用Codegen.命令为在英特尔®处理器上使用深度学习的图像分类应用程序生成代码。生成的代码使用Intel Math Kernel库进行深神经网络(MKL-DNN)。此示例由两部分组成:

  • 第一部分显示如何生成接受批量图像的MEX功能。

  • 第二部分示出了如何生成可执行文件,该可执行文件接受批量图像作为输入。

先决条件

  • Intel处理器支持英特尔高级矢量扩展2(万博1manbetx英特尔AVX2)说明

  • 用于深神经网络的英特尔数学内核库(MKL-DNN)

  • 编译器和库的环境变量。有关支持版本的编译器版本的信息,请参阅万博1manbetx万博1manbetx支持的编译器。设置环境变量,请参阅与Matlab编码器深入学习的先决条件(MATLAB编码器)

此示例在Linux®,Windo万博1manbetxws®和Mac®平台上支持,不支持Matlab在线。

下载输入视频文件

下载示例视频文件。

如果〜存在('./ object_class.avi','文件')url ='//www.tianjin-qmedu.com/supportf万博1manbetxiles/gpucoder/media/object_class.avi.zip'WebSave('object_class.avi.zip',URL);解压缩('object_class.avi.zip');结尾

定义resnet_predict.功能

此示例使用DAG网络Reset-50在英特尔桌面上显示图像分类。用于MATLAB的预制Reset-50型号可作为Reset-50网络的支持包深度学习工具箱模型的一部分提供。万博1manbetx

resnet_predict.功能将Reset-50网络加载到持久网络对象中,然后对输入执行预测。后续调用函数重用持久网络对象。

类型resnet_predict.
%Copyright 2020 MathWorks,Inc。函数out = Reset_predict(in)%#codegen%持久对象mynet用于加载系列网络对象。%在第一个调用此函数时,构建持久对象并%设置。当函数被称为后续时间时,重复使用相同的对象以呼叫在输入上的预测,避免重建和重新加载%网络对象。持久性yornet;如果isEmpty(mynet)%呼叫reset50返回resnet-50模型的DAG网络%。MyNet = Coder.LoadDeePlearningnetwork('resnet50','resnet');输入Out = mynet.predict(in);

生成mexresnet_predict.

为此产生MEX函数resnet_predict.功能,使用Codegen.具有MKL-DNN库的深度学习配置对象。将深度学习配置对象附加到您传递的MEX代码生成配置对象Codegen.。跑过Codegen.命令并将输入指定为尺寸的4D矩阵[224,224,3,|批量化|]。该值对应于Reset-50网络的输入层大小。

Batchsize = 5;cfg = coder.config('mex');cfg.targetlang =.'c ++';cfg.deeplearningconfig = coder.deeplearningconfig('mkldnn');Codegen.-Config.CFG.resnet_predict.-  args.{ONE(224,224,3,Batchsize,'单')}-报告
代码生成成功:要查看报告,请打开('codegen \ mex \ resnet_predict \ html \ thine.mldatx')。

对一批图像进行预测

假设已下载object_class.avi视频文件。创建录像机对象并使用录像机读取功能读取五个帧。将批量化设置为5读5张图像.ResNet50网络预期的Resnet50尺寸的批次输入图像的批次输入图像批量。

VideoReader = Videoreader('object_class.avi');imbatch =读取(Videoreader,[1 5]);imbatch = imresize(imbatch,[224,224]);

打电话给生成resnet_predict_mex.输出您提供的输入的分类结果。

predict_cores = resnet_predict_mex(单个(imbatch));

为批次中的每个图像获取前5个概率分数及其标签。

[val,Indx] =排序(转置(predict_scores),'descend');得分= val(1:5,:) * 100;net = resnet50;ClassNames = Net.Layers(END).Classnames;对于i = 1:Batchsize标签= ClassNames(Indx(1:5,i));DISP(['上的第5页预测,',num2str(i)]);对于j = 1:5 disp([标签{j}'',num2str(scrores(j,i),'%2.2f'),'%']结束端

对于第一张图像的预测,将前五个预测分数映射到单词中SYNSET.字典。

fid = fopen('synsetwords.txt');synsetut = textscan(fid,'%s','delimiter','\ n');synsetut = synsetut {1};fclose(FID);[val,Indx] =排序(转置(predict_scores),'descend');得分= val(1:5,1)* 100;top5labels = synsetut(Indx(1:5,1));

在图像上显示前五个分类标签。

OpersimImage =零(224,400,3,'UINT8');对于k = 1:3 OutputImage(:,177:ex,k)= imbatch(:,:,k,1);结尾
scol = 1;srow = 1;OutputImage = InsertText(OutputImage,[Scol,SROW],'与Reset-50'的分类,'TextColor','W','fontsize',20,'BoxColor','Black');srow = srow + 30;对于k = 1:5 OutputImage = InsertText(OutputImage,[Scol,Srow],[Top5Labels {k}'',num2str(scores(k),'%2.2f'),'%'],'textcolor','w','fontsize',15,'boxcolor','黑');srow = srow + 25;结尾
imshow(产来自Opersimage);

从内存中清除持久网络对象。

清除梅克斯;

定义resnet_predict_exe.入学点函数

要从MATLAB代码生成可执行文件,请定义新的入口点resnet_predict_exe.。此功能类似于先前的入口点函数resent_predict.但另外,包括预处理和后处理的代码。那个apiresnet_predict_exe.使用是平台独立。此功能接受视频和批量大小作为输入参数。这些参数是编译时间常量。

类型resnet_predict_exe.
%Copyright 2020 MathWorks,Inc。函数Reset_predict_exe(InputVideo,Batchsize)%#codegen%持久对象mynet用于加载系列网络对象。%在第一个调用此函数时,构建持久对象并%设置。当函数被称为后续时间时,重复使用相同的对象以呼叫在输入上的预测,避免重建和重新加载%网络对象。持久性yornet;如果isEmpty(mynet)%呼叫reset50返回resnet-50模型的DAG网络%。MyNet = Coder.LoadDeePlearningnetwork('resnet50','resnet');结束%创建视频读者和视频播放器对象%videoreader = videoreader(inputvideo);depvideoplayer = Vision.DeployableVideplayer;%读取分类标签名称%synsetut = ReadimageClassLabels('synsetwords.txt');我= 1; % Read frames until end of video file % while ~(i+batchSize > (videoReader.NumFrames+1)) % Read and resize batch of frames as specified by input argument% reSizedImagesBatch = readImageInputBatch(videoReader,batchSize,i); % run predict on resized input images % predict_scores = mynet.predict(reSizedImagesBatch); % overlay the prediction scores on images and display % overlayResultsOnImages(predict_scores,synsetOut,reSizedImagesBatch,batchSize,depVideoPlayer) i = i+ batchSize; end release(depVideoPlayer); end function synsetOut = readImageClassLabels(classLabelsFile) % Read the classification label names from the file % % Inputs : % classLabelsFile - supplied by user % % Outputs : % synsetOut - cell array filled with 1000 image class labels synsetOut = cell(1000,1); fid = fopen(classLabelsFile); for i = 1:1000 synsetOut{i} = fgetl(fid); end fclose(fid); end function reSizedImagesBatch = readImageInputBatch(videoReader,batchSize,i) % Read and resize batch of frames as specified by input argument% % % Inputs : % videoReader - Object used for reading the images from video file % batchSize - Number of images in batch to process. Supplied by user % i - index to track frames read from video file % % Outputs : % reSizedImagesBatch - Batch of images resized to 224x224x3xbatchsize img = read(videoReader,[i (i+batchSize-1)]); reSizedImagesBatch = coder.nullcopy(ones(224,224,3,batchSize,'like',img)); resizeTo = coder.const([224,224]); reSizedImagesBatch(:,:,:,:) = imresize(img,resizeTo); end function overlayResultsOnImages(predict_scores,synsetOut,reSizedImagesBatch,batchSize,depVideoPlayer) % Read and resize batch of frames as specified by input argument% % % Inputs : % predict_scores - classification results for given network % synsetOut - cell array filled with 1000 image class labels % reSizedImagesBatch - Batch of images resized to 224x224x3xbatchsize % batchSize - Number of images in batch to process. Supplied by user % depVideoPlayer - Object for displaying results % % Outputs : % Predicted results overlayed on input images % sort the predicted scores % [val,indx] = sort(transpose(predict_scores), 'descend'); for j = 1:batchSize scores = val(1:5,j)*100; outputImage = zeros(224,400,3, 'uint8'); for k = 1:3 outputImage(:,177:end,k) = reSizedImagesBatch(:,:,k,j); end % Overlay the results on image % scol = 1; srow = 1; outputImage = insertText(outputImage, [scol, srow], 'Classification with ResNet-50', 'TextColor', [255 255 255],'FontSize',20, 'BoxColor', [0 0 0]); srow = srow + 30; for k = 1:5 scoreStr = sprintf('%2.2f',scores(k)); outputImage = insertText(outputImage, [scol, srow], [synsetOut{indx(k,j)},' ',scoreStr,'%'], 'TextColor', [255 255 255],'FontSize',15, 'BoxColor', [0 0 0]); srow = srow + 25; end depVideoPlayer(outputImage); end end

结构的结构resnet_predict_exe.功能

功能resnet_predict_exe.包含四个执行这些操作的小节:

  • 从提供的输入文本文件中读取分类标签

  • 读取输入批量图像并根据网络的需要调整它们的大小

  • 在输入图像批处理上运行推理

  • 覆盖图像上的结果

有关详细信息,每个步骤,请参阅后续部分。

ReadimageClassLabels.功能

此功能接受synsetwords.txt.文件作为输入参数。它读取分类标签并填充单元格数组。

函数synsetut = ReadimageClassLabels(classLabelsfile)%从文件%%输入中读取分类标签名称:%classlabelsfile  - 由用户%%输出提供:%synsetut  - 填充1000个图像类标签的单元格数组
synsetut = cell(1000,1);fid = fopen(classlabelsfile);对于i = 1:1000 synsetut {i} = fgetl(fid);结束fclose(FID);结尾

ReadImageInputbatch.功能

此函数从视频输入文件中读取并调整图像的大小,该文件被传递给函数作为输入参数。它读取指定的输入图像并将其调整为224x224x3,这是Resnet50网络期望的大小。

函数resizeimagebatch = ReadimageInputbatch(Videorer,Batchsize,i)%读取和调整批量帧的大小由输入参数%%输入指定的批量:%videoreader  - 用于从视频文件%batchsize读取图像的对象 - 批处理中的图像数量。由User%i-index提供,以跟踪从视频文件中读取的帧数%%输出:%resizedimagesbatch  - 批量显示为224x224x3xbatchsize
IMG =读取(Videoreader,[i(i + batchsize-1)]);resizizimagesbatch = coder.nullcopy((224,224,3,Batchsize,',IMG));ResizeTo = Coder.Const([224,224]);resizizimagesbatch(::,:,:) = imresize(img,reizeto);结尾

mynet.predict.功能

此功能接受调整大小的图像作为输入并返回预测结果。

%运行预测调整大小输入图像%predict_scores = mynet.predict(ResizedImagesbatch);

roplearayresultsonimages.功能

此函数接受预测结果并按降序排序。它将这些结果覆盖在输入图像上并显示它们。

函数ropleDresultsonimages(predict_scores,synsetut,synsizemagesbatch,batchsize,depvideoplayer)%读取和调整频额的大小频额,按输入参数%%输入指定的帧:%predict_scores  - 给定网络%synsetut的分类结果 - 单元格数组填充1000个图像类标签%ResizizimagesBatch  - 批量图像调整为224x224x3xbatchsize%batchsize  - 以批处理的图像数量。由User%DEPVIDEOPLAYER提供 - 用于显示结果的对象%% OUTPUTS:%预测结果覆盖在输入图像上
%对预测的分数%[val,Indx] =排序(转置(predict_scores),'descend');
对于j = 1:批量化得分= val(1:5,j)* 100;OpersimImage =零(224,400,3,'UINT8');对于k = 1:3 OutputImage(:,177:ex,k)= ResizizimageBatch(:,:,k,j);结尾
%覆盖图像%scol = 1的结果;srow = 1;OutputImage = InsertText(OutputImage,[Scol,SROW],“与Reset-50”,“TextColor”,[255 255 255],'FontSize',20,'BoxColor',[0 0]);srow = srow + 30;对于k = 1:5 scorstr = sprintf('%2.2f',分数(k));OutputImage = InsertText(OutputImage,[Scol,Srow],[Synsetut {Indx(k,j)},'',scorerent,'%'],'textcolor',[255 255 255],'fontsize',15,'BoxColor',[0 0 0]);srow = srow + 25;结尾
DEPVIDEOPLAYER(OutputImage);结束

构建并运行可执行文件

创建用于生成可执行文件的代码配置对象。将深度学习配置对象附加到它。设定Batchsize.InputVideoFile.变量。

如果您不打算创建自定义C ++主函数并使用生成的示例C ++ MAIN,请设置generateexamplemain.参数到'generatecodeandcompile'。此外,禁用CFG.EnableOpenMP以确保从桌面终端运行可执行文件时没有OpenMP库依赖关系。

cfg = coder.config('exe');cfg.targetlang ='C ++';cfg.deeplearningconfig = coder.deeplearningconfig('mkldnn');Batchsize = 5;InputVideoFile ='Object_Class.avi';cfg.genErideExamplemain ='generatecodeandcompile';cfg.enableopenmp = 0;

跑过Codegen.命令以构建可执行文件。在MATLAB命令行或桌面终端处运行生成的可执行文件resnet_predict_exe。

codegen -config cfg resnet_predict_exe -args {coder.constant(inputvideofile),coder.constant(batchsize)} -report系统('./​​ resnet_predict_exe')

相关话题