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')
参考
codegen
|编码器。DeepLearningConfig
|编码器。MklDNNConfig
|coder.loadDeepLearningNetwork