主要内容

Intelタゲットにおける異なるバッチサズの深層学習コドの生成

この例では,英特尔®プロセッサで深層学習を使用するイメージ分類アプリケーションのコードを生成するためのcodegenコマンドの使用方法を示します。生成されたコ,ドはIntel Math Kernel Library for Deep Neural Networks (MKL-DNN)を使用します。この例は次の2の部分で構成されます。

  • 最初の部分は,etc / etc / etc / etc / etc / etc / etc / etc / etc / etc / etc / etc / etc /

  • 2番目の部分は,。

前提条件

  • 英特尔先进矢量扩展2(英特尔AVX2)手順をサポ,トする英特尔プロセッサ

  • Intel深度神经网络数学内核库(MKL-DNN)

  • コンパ▪▪ラおよびラ▪▪ブラリの環境変数。サポトされるコンパラのバージョンの詳細については、サポトされるコンパラを参照してください。環境変数の設定にいては,MATLAB编码器を使用した深層学習の前提条件を参照してください。

この例は,Linux®、Windows®およびMac®プラットフォームでサポートされており,MATLAB在线ではサポートされていません。

入力ビデオファ▪▪ルのダウンロ▪▪ド

サンプルビデオファ▪▪ルをダウンロ▪▪ドします。

如果~存在(“。/ object_class。Avi ', 'file') url = '//www.tatmou.com金宝app/supportfiles/gpucoder/media/object_class.avi.zip';websave (object_class.avi.zip, url);解压缩(“object_class.avi.zip”);结束

関数resnet_predictの定義

この例では,DAGネットワークResNet-50を使用して,英特尔デスクトップでのイメージ分類を示します。MATLAB用の事前学習済みの ResNet-50 モデルは、サポート パッケージ Deep Learning Toolbox Model for ResNet-50 Network に含まれています。

関数resnet_predictは,ResNet-50ネットワークを永続的なネットワークオブジェクトに読み込み,入力に対する予測を実行します。後続の関数の呼び出しでは,永続的なネットワ,クオブジェクトが再利用されます。

类型resnet_predict
MathWorks, Inc.函数out = resnet_predict(in) %#codegen %一个持久化对象mynet用于加载系列网络对象。在第一次调用此函数时,将构造持久对象,并且% setup。在以后多次调用该函数时,将重用相同的对象%,以对输入调用predict,从而避免重构和重新加载% network对象。持久mynet;调用函数resnet50,返回ResNet-50模型的DAG网络%。mynet = code . loaddeeplearningnetwork ('resnet50','resnet');输入输出= mynet.predict(in);

resnet_predictのmexの生成

関数resnet_predictのmex関数を生成するには,mkl-dnnラaaplブラリ用の深層学習構成オブジェクトと共にcodegenを使用します。深層学習構成オブジェクトをcodegenに渡すmexコ,ド生成構成オブジェクトに添付します。codegenコマンドを実行して,サイズが[224224年3 | batchSize |]の4次元行列として入力を指定します。この値は,ResNet-50ネットワクの入力層サズに対応します。

batchSize = 5;CFG = code .config(墨西哥人的);cfg。TargetLang =“c++”;cfg。DeepLearningConfig =编码器。DeepLearningConfig (“mkldnn”);codegen配置cfgresnet_predictarg游戏{的(224224 3 batchSize '单')}报告
要查看报告,请打开('codegen\mex\resnet_predict\html\report.mldatx')。

メ,ジのバッチに対する予測の実行

Object_class。Aviビデオファaapl . aapl . aapl . aapl . aapl . aapl。videoReaderオブジェクトを作成し,読み取り関数videoReaderを使用して5フレームを読み取ります。batchSizeが5に設定されているため,5のメジを読み取ります。入力イメージのバッチサイズを,resnet50で必要とされるサイズ(resnet50ネットワークで想定されるサイズ)に変更します。

videoReader = videoReader ('Object_class.avi');imBatch = read(videereader,[1 5]);imBatch = imresize(imBatch, [224,224]);

指定された入力の分類結果を出力する,生成された関数resnet_predict_mexを呼び出します。

predict_scores = resnet_predict_mex(single(imBatch));

バッチ内の各▪▪メ▪ジに▪▪いて,上位5▪▪の確率スコアとそれらのラベルを取得します。

[val,indx] = sort(转置(predict_scores), '下降');分数= val(1:5,:)*100;Net = resnet50;classnames = net.Layers(end).ClassNames;for i = 1:batchSize标签= classnames(indx(1:5,i));disp(['图像上的前5个预测,',num2str(i)]);j = 1:5 disp([标签{j},“num2str(分数(j,我),% 2.2 f), ' % '])结束

最初の▪▪メ▪ジに対する予測に▪▪いて,上位5▪▪の予測スコアを同义词集ディクショナリのワ,ドにマッピングします。

fid = fopen('synsetWords.txt');synsetOut = textscan(fid,'%s', '分隔符','\n');synsetOut = synsetOut{1};文件关闭(fid);[val,indx] = sort(转置(predict_scores), '下降');分数= val(1:5,1)*100;top5labels = synsetOut(indx(1:5,1));

上位5の分類ラベルをメジに表示します。

outputImage = 0 (224,400,3, 'uint8');outputImage(:,177:end,k) = imBatch(:,:,k,1);结束
Scol = 1;麻雀= 1;outputImage = insertText(outputImage, [scol, srow], '分类与ResNet-50', 'TextColor', 'w','FontSize',20, 'BoxColor', '黑色');麻雀=麻雀+ 30;for k = 1:5 outputImage = insertText(outputImage, [scol, row], [top5labels{k},' ',num2str(scores(k), '%2.2f'),'%'], 'TextColor', 'w','FontSize',15, 'BoxColor', 'black');麻雀=麻雀+ 25;结束
imshow (outputImage);

永続的なネットワ,クオブジェクトをメモリからクリアします。

清晰的墨西哥人

エントリポ@ @ント関数resnet_predict_exeの定義

Matlabコドから実行可能ファルを生成するには,新しいエントリポント関数resnet_predict_exeを定義します。この関数は前のエントリポ@ @ント関数resent_predictに似ていますが,この関数にはさらに前処理と後処理を行うコ,ドが含まれます。resnet_predict_exeで使用されるAPIはプラットフォ,ムに依存します。この関数は,入力引数としてビデオとバッチ サイズを受け入れます。これらの引数はコンパイル時の定数です。

类型resnet_predict_exe
MathWorks, Inc.函数resnet_predict_exe(inputVideo,batchSize) %#codegen %一个持久对象mynet用于加载系列网络对象。在第一次调用此函数时,将构造持久对象,并且% setup。在以后多次调用该函数时,将重用相同的对象%,以对输入调用predict,从而避免重构和重新加载% network对象。持久mynet;调用函数resnet50,返回ResNet-50模型的DAG网络%。mynet = code . 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には,次のアクションを実行する4のサブセクションが含まれています。

  • 指定された入力テキストファ@ @ルから分類ラベルを読み取る

  • イメージの入力バッチを読み取り,ネットワークでの必要に応じてそのサイズを変更する

  • 入力▪▪メ▪▪ジバッチに対する推論を実行する

  • 結果を▪▪メ▪▪ジに重ねて表示する

これらの各手順の詳細にいては,以降の節を参照してください。

関数readImageClassLabels

この関数は,入力引数としてsynsetWords.txtファ@ @ルを受け入れます。分類ラベルを読み取り,cell配列に入力します。

function synsetOut = readImageClassLabels(classLabelsFile) %从文件中读取分类标签名称% %输入:% classLabelsFile -由用户提供% %输出:% synsetOut -填充1000个图像类标签的单元格数组
synsetOut = cell(1000,1);fid = fopen(classLabelsFile);for i = 1:1000 synsetOut{i} = fgetl(fid);最终文件关闭(fid);结束

関数readImageInputBatch

この関数は,関数に入力引数として渡されるビデオ入力ファイルからイメージを読み取り,そのサイズを変更します。指定された入力イメージを読み取り,そのサイズを,resnet50ネットワークで想定されるサイズである224 x224x3に変更します。

function reSizedImagesBatch = readImageInputBatch(videoReader,batchSize,i) %根据输入参数指定读取和调整批量帧的大小% % % input: % videoReader -用于从视频文件中读取图像的对象% batchSize -批量处理的图像数量。由用户% i提供- index从视频文件中读取的跟踪帧% %输出:% reSizedImagesBatch -将图像大小调整为224x224x3xbatchsize
img = read(视频读取器,[i (i+batchSize-1)]);reSizedImagesBatch = code .nullcopy(ones(224,224,3,batchSize,'like',img));resizeTo = code .const([224,224]);reSizedImagesBatch(:,:,:,:) = imresize(img,resizeTo);结束

関数mynet.predict

この関数は,サ@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @

% predict_scores = mynet.predict(reSizedImagesBatch);

関数overlayResultsOnImages

この関数は,予測結果を受け入れて降順に並べ替えます。これらの結果を入力▪▪メ▪▪ジに重ねて表示します。

function overlayResultsOnImages(predict_scores,synsetOut,reSizedImagesBatch,batchSize,depVideoPlayer) %根据输入参数读取和调整批量帧的大小% % %输入:% predict_scores -给定网络的分类结果% synsetOut -填充1000个图像类标签的单元格数组% reSizedImagesBatch -调整为224x224x3xbatchsize的批量图像% batchSize -批处理的图像数量。由用户% depVideoPlayer提供-用于显示结果% % Outputs: %预测结果叠加在输入图像上
% [val,indx] = sort(转置(predict_scores), '下降');
= val(1:5,j)*100;outputImage = 0 (224,400,3, 'uint8');outputImage(:,177:end,k) = reSizedImagesBatch(:,:,k,j);结束
将结果覆盖在图像上% scol = 1;麻雀= 1;outputImage = insertText(outputImage, [scol, srow], '分类与ResNet-50', 'TextColor', [255 255 255],'FontSize',20, 'BoxColor', [0 0 0 0]);麻雀=麻雀+ 30;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 0]);麻雀=麻雀+ 25;结束
depVideoPlayer (outputImage);结束结束

実行可能ファ@ @ルのビルドと実行

実行可能ファ▪▪ルの生成用にコ▪▪ド構成オブジェクトを作成します。それに深層学習構成オブジェクトを添付します。変数batchSizeと変数inputVideoFileを設定します。

カスタムc++主要関数を作成する代わりに,生成されたc++主要の例を使用する場合は,GenerateExampleMainパラメ,タ,を“GenerateCodeAndCompile”に設定します.また,cfg. cfg。EnableOpenMPを無効にして,デスクトップターミナルから実行可能ファイルを実行する際にopenmpライブラリの依存関係がないようにします。

CFG = code .config('exe');cfg。TargetLang = ' c++ ';cfg。DeepLearningConfig = code .DeepLearningConfig('mkldnn');batchSize = 5;inputVideoFile = 'object_class.avi';cfg。GenerateExampleMain = 'GenerateCodeAndCompile';cfg。EnableOpenMP = 0;

codegenコマンドを実行して実行可能ファ@ @ルをビルドします。生成された実行可能ファイルresnet_predict_exeをMATLABコマンドラインまたはデスクトップターミナルで実行します。

codegen -config cfg resnet_predict_exe -args {code . constant (inputVideoFile), code . constant (batchSize)} -report system('./resnet_predict_exe')

参考

|||

関連するトピック