主要内容

深度学习为不同批量大小对英特尔的目标代码生成

这个例子展示了如何使用codegen命令来生成代码的图像分类应用程序,使用深度学习在Intel®处理器。生成的代码使用英特尔数学内核库深神经网络(MKL-DNN)。这个例子包括两个部分:

  • 第一部分展示了如何生成一个墨西哥人函数接受一批图像作为输入。

  • 第二部分展示了如何生成一个可执行的,它接收一批图像作为输入。

先决条件

这个例子是支持Linux®、Wi万博1manbetxndows®和Mac在线为MATLAB®平台和不支持。

输入视频文件下载

下载一个视频文件示例。

如果~存在(“。/ object_class。avi”、“文件”)的url = ' //www.tianjin-qmedu.com/su万博1manbetxpportfiles/gpucoder/media/object_class.avi.zip ';websave (object_class.avi.zip, url);解压缩(“object_class.avi.zip”);结束

定义resnet_predict函数

下面的例子使用了DAG网络ResNet-50显示图像分类在英特尔台式机。一个pretrained ResNet-50 MATLAB模型可作为支持包的一部分,深度学习工具箱ResNet-50网络模型。万博1manbetx

resnet_predict函数将ResNet-50网络加载到一个持续的网络对象,然后对输入执行预测。后续调用函数重用持久的网络对象。

类型resnet_predict
% 2020年版权MathWorks公司= resnet_predict函数()% # codegen %一系列持久对象mynet用于加载网络对象。%在第一次调用这个函数,构造持久对象和%设置。只有在函数被调用时,随后的时间,相同的对象被重复使用%叫预测输入,避免重建并重新加载%网络对象。持久mynet;如果isempty (mynet) % resnet50调用的函数,返回一个DAG网络% ResNet-50模型。mynet = coder.loadDeepLearningNetwork (“resnet50”、“resnet”);结束%通过在输入= mynet.predict(的);

生成墨西哥人resnet_predict

生成一个墨西哥人的功能resnet_predict功能,使用codegen深入学习MKL-DNN库配置对象。深度学习配置对象附加到墨西哥人传递给代码生成配置对象codegen。运行codegen命令并指定输入的4 d矩阵大小(224224 3 | batchSize |]。这个值对应的输入层大小ResNet-50网络。

batchSize = 5;cfg = coder.config (墨西哥人的);cfg。TargetLang =“c++”;cfg。DeepLearningConfig = coder.DeepLearningConfig (“mkldnn”);codegen配置cfgresnet_predictarg游戏{的(224224 3 batchSize '单')}报告
代码生成成功:查看报告,打开(“codegen \墨西哥人\ resnet_predict \ html \ report.mldatx ')。

对一批图像进行预测

假设Object_class。avi视频文件已经下载。创建videoReader对象和读5帧使用videoReader读功能。自batchSize设置为5读5图像.Resize resnet50所需的批输入图像大小规模的预期resnet50网络。

videoReader = videoReader (“Object_class.avi”);imBatch =阅读(videoReader [1 5]);imBatch = imresize (imBatch [224224]);

调用生成的resnet_predict_mex功能,为您提供的输入,输出分类结果。

predict_scores = resnet_predict_mex(单(imBatch));

得分前5的概率及其标签为每个批处理的图像。

[val, indx] =排序(转置(predict_scores),“下降”);成绩=瓦尔(1:5:)* 100;网= resnet50;一会= net.Layers .ClassNames(结束);i = 1: batchSize标签=一会(indx(1:5,我));disp([五大预测图像,num2str (i)));j = 1:5 disp([标签{j},“num2str(分数(j,我),% 2.2 f), ' % '])结束

预测的第一形象,地图五大预测分数的话同义词集字典。

fid = fopen (“synsetWords.txt”);synsetOut = textscan (fid,“% s”、“分隔符”,' \ n ');synsetOut = synsetOut {1};文件关闭(fid);[val, indx] =排序(转置(predict_scores),“下降”);成绩=瓦尔(1:5,1)* 100;top5labels = synsetOut (indx (1:5, 1));

显示图片上的五大分类标签。

outputImage = 0 (224400 3 ' uint8 ');k = 1:3 outputImage(:, 177:最终,k) = imBatch (:,: k 1);结束
scol = 1;srow = 1;outputImage = insertText (outputImage [scol srow],“与ResNet-50分类”,“输入TextColor”、“w”,“字形大小”,20日‘BoxColor’,‘黑’);srow = srow + 30;k = 1:5 outputImage = insertText (outputImage [scol srow], [top5labels {k},‘, num2str(分数(k), % 2.2 f), ' % '],“输入TextColor”、“w”,“字形大小”,15日‘BoxColor’,‘黑’);srow = srow + 25;结束
imshow (outputImage);

明确持久的网络对象从内存中。

清晰的墨西哥人;

定义resnet_predict_exe入口点函数

从MATLAB生成可执行代码,定义一个新的入口点函数resnet_predict_exe。这个函数类似于前面的入口点函数resent_predict但是,除此之外,包括代码预处理和后处理。的APIresnet_predict_exe使用是平台独立的。这个函数接受一个视频和批量大小作为输入参数。这些参数是编译时常量。

类型resnet_predict_exe
% 2020年版权MathWorks公司函数resnet_predict_exe (inputVideo batchSize) % # codegen %一系列持久对象mynet用于加载网络对象。%在第一次调用这个函数,构造持久对象和%设置。只有在函数被调用时,随后的时间,相同的对象被重复使用%叫预测输入,避免重建并重新加载%网络对象。持久mynet;如果isempty (mynet) % resnet50调用的函数,返回一个DAG网络% ResNet-50模型。mynet = coder.loadDeepLearningNetwork (“resnet50”、“resnet”);结束%创建视频读者和视频播放器对象% videoReader = videoReader (inputVideo);depVideoPlayer = vision.DeployableVideoPlayer;%阅读分类标签名称% synsetOut = readImageClassLabels (“synsetWords.txt”);i = 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文件作为输入参数。它读取分类标签和填充单元阵列。

函数synsetOut = readImageClassLabels (classLabelsFile) %的分类标签名称从文件中读取输入% %:% classLabelsFile -由用户提供% %输出:% synsetOut -单元阵列充满1000图象类标签
synsetOut =细胞(1000 1);fid = fopen (classLabelsFile);因为我= 1:1000 synsetOut{我}= fgetl (fid);最终文件关闭(fid);结束

readImageInputBatch函数

这个函数读取和修改尺寸的图像视频输入文件传递函数作为输入参数。它读取指定的输入图像和调整他们,224 x224x3 resnet50网络预计大小。

函数reSizedImagesBatch = readImageInputBatch (videoReader, batchSize) %阅读和调整批帧所指定的输入参数输入% % %:% videoReader——对象用于读取图像视频文件% batchSize -批处理的图像。由用户提供% i -指数跟踪帧读取视频文件% %输出:% reSizedImagesBatch -批图片大小224 x224x3xbatchsize
img =阅读(videoReader,[我(我+ batchSize-1)]);reSizedImagesBatch = coder.nullcopy((224224年3 batchSize‘喜欢’,img));resizeTo = coder.const ([224224]);reSizedImagesBatch (:,::,:) = imresize (img, resizeTo);结束

mynet.predict函数

这个函数接受调整批图像作为输入,并返回预测结果。

%上运行预测调整输入图像% predict_scores = mynet.predict (reSizedImagesBatch);

overlayResultsOnImages函数

这个函数接受预测结果并在降序进行排序。它覆盖在输入图像和显示这些结果。

函数overlayResultsOnImages (predict_scores synsetOut、reSizedImagesBatch batchSize, depVideoPlayer) %阅读和调整批帧所指定的输入参数输入% % %:% predict_scores -分类结果为给定网络% synsetOut单元阵列满1000图象类标签% reSizedImagesBatch -批图片大小224 x224x3xbatchsize % batchSize -批处理的图像。由用户提供的% % % depVideoPlayer——对象显示结果输出:%预测结果显示在输入图像
%排序预测分数% [val, indx] =排序(转置(predict_scores),“下降”);
j = 1: batchSize分数=瓦尔(1:5,j) * 100;outputImage = 0 (224400 3 ' uint8 ');k = 1:3 outputImage(:, 177:最终,k) = reSizedImagesBatch (:,:, k, j);结束
%叠加结果图像% scol = 1;srow = 1;outputImage = insertText (outputImage [scol srow],“与ResNet-50分类”,“输入TextColor”,(255 255 255),“字形大小”,20日BoxColor, [0 0 0]);srow = srow + 30;k = 1:5 scoreStr = sprintf (% 2.2 f,分数(k));outputImage = insertText (outputImage [scol srow], [synsetOut {indx (k, j)},‘, scoreStr, ' % '],“输入TextColor”,(255 255 255),“字形大小”,15日“BoxColor”, [0 0 0]);srow = srow + 25;结束
depVideoPlayer (outputImage);结束结束

构建和运行可执行文件

创建一个配置对象生成一个可执行的代码。附加一个深度学习配置对象。设置batchSizeinputVideoFile变量。

如果你不打算创建一个自定义c++的主要功能和使用生成的示例c++主要相反,设置GenerateExampleMain参数“GenerateCodeAndCompile”。此外,禁用cfg。EnableOpenMP确保没有openmp库依赖关系当您运行可执行时从桌面终端。

cfg = coder.config (exe);cfg。TargetLang =“c++”;cfg。DeepLearningConfig = coder.DeepLearningConfig (“mkldnn”);batchSize = 5;inputVideoFile =“object_class.avi”;cfg。GenerateExampleMain =“GenerateCodeAndCompile”;cfg。EnableOpenMP = 0;

运行codegen命令来构建可执行。运行生成的可执行文件resnet_predict_exe在MATLAB命令行或在桌面终端。

codegen配置cfg resnet_predict_exe args {coder.Constant (inputVideoFile) coder.Constant (batchSize)}报告系统(“。/ resnet_predict_exe”)

另请参阅

|||

相关的话题