このページは前リリースの情報です。該当の英語のページはこのリリースで削除されています。

ロゴ認識ネットワーク

この例では、深層学習を使用するロゴ分類用途のコード生成を説明します。codegen コマンドを使用し、LogoNet と呼ばれる SeriesNetwork オブジェクトについて予測を実行する MEX 関数を生成します。

必要条件

  • Compute Capability 3.2 以上の CUDA® 対応 NVIDIA® GPU。

  • NVIDIA CUDA ツールキットおよびドライバー。

  • NVIDIA cuDNN ライブラリ。

  • コンパイラおよびライブラリの環境変数。サポートされているコンパイラおよびライブラリのバージョンの詳細は、サードパーティ製品 (GPU Coder)を参照してください。環境変数の設定は、前提条件となる製品の設定 (GPU Coder)を参照してください。

  • GPU Coder Interface for Deep Learning Libraries サポート パッケージ。このサポート パッケージをインストールするには、アドオン エクスプローラーを使用します。

GPU 環境の検証

関数 coder.checkGpuInstall を使用し、この例を実行するのに必要なコンパイラおよびライブラリが正しく設定されていることを検証します。

envCfg = coder.gpuEnvConfig('host');
envCfg.DeepLibTarget = 'cudnn';
envCfg.DeepCodegen = 1;
envCfg.Quiet = 1;
coder.checkGpuInstall(envCfg);

ロゴ認識ネットワーク

ロゴは、ユーザーがブランドを識別したり認識したりするのに役立ちます。多くの企業が広告、ドキュメント資料、プロモーションに自社のロゴを取り入れています。ロゴ認識ネットワーク (logonet) は MATLAB® で開発されたものであり、さまざまなライティング条件とカメラの動きの下で 32 個のロゴを認識できます。このネットワークは認識にのみ焦点を当てているため、位置推定が不要な用途で使用できます。

ネットワークの学習

ネットワークは、ロゴあたり約 200 個のイメージが含まれる学習データを使用して MATLAB で学習しています。ネットワークの学習に使用されるイメージの数が少ないため、データ拡張によって学習サンプルの数を増やしています。コントラスト正規化、ガウスぼかし、ランダム反転、およびせん断の 4 種類のデータ拡張が使用されています。このデータ拡張は、さまざまなライティング条件とカメラの動きで取得されたイメージのロゴの認識に役立ちます。logonet の入力サイズは [227 227 3] です。標準の SGDM では、ミニバッチ サイズが 45 で学習率が 0.0001 の学習を 40 エポック実行して学習を行います。trainLogonet.m 補助スクリプトでは、サンプル イメージのデータ拡張、logonet のアーキテクチャ、学習オプションについて示しています。

事前学習済みの SeriesNetwork の取得

logonet ネットワークが存在しない場合、ダウンロードして LogoNet.mat に保存します。

getLogonet();

保存したネットワークには、畳み込み層、全結合層、分類出力層など、22 個の層が含まれています。

load('LogoNet.mat');
convnet.Layers
ans = 

  22x1 Layer array with layers:

     1   'imageinput'    Image Input             227x227x3 images with 'zerocenter' normalization and 'randfliplr' augmentations
     2   'conv_1'        Convolution             96 5x5x3 convolutions with stride [1  1] and padding [0  0  0  0]
     3   'relu_1'        ReLU                    ReLU
     4   'maxpool_1'     Max Pooling             3x3 max pooling with stride [2  2] and padding [0  0  0  0]
     5   'conv_2'        Convolution             128 3x3x96 convolutions with stride [1  1] and padding [0  0  0  0]
     6   'relu_2'        ReLU                    ReLU
     7   'maxpool_2'     Max Pooling             3x3 max pooling with stride [2  2] and padding [0  0  0  0]
     8   'conv_3'        Convolution             384 3x3x128 convolutions with stride [1  1] and padding [0  0  0  0]
     9   'relu_3'        ReLU                    ReLU
    10   'maxpool_3'     Max Pooling             3x3 max pooling with stride [2  2] and padding [0  0  0  0]
    11   'conv_4'        Convolution             128 3x3x384 convolutions with stride [2  2] and padding [0  0  0  0]
    12   'relu_4'        ReLU                    ReLU
    13   'maxpool_4'     Max Pooling             3x3 max pooling with stride [2  2] and padding [0  0  0  0]
    14   'fc_1'          Fully Connected         2048 fully connected layer
    15   'relu_5'        ReLU                    ReLU
    16   'dropout_1'     Dropout                 50% dropout
    17   'fc_2'          Fully Connected         2048 fully connected layer
    18   'relu_6'        ReLU                    ReLU
    19   'dropout_2'     Dropout                 50% dropout
    20   'fc_3'          Fully Connected         32 fully connected layer
    21   'softmax'       Softmax                 softmax
    22   'classoutput'   Classification Output   crossentropyex with 'adidas' and 31 other classes

エントリポイント関数 logonet_predict

エントリポイント関数 logonet_predict.m は、イメージ入力を受け取り、LogoNet.mat ファイルに保存されている深層学習ネットワークを使用して、イメージについて予測を実行します。この関数は、LogoNet.mat からネットワーク オブジェクトを永続変数 logonet に読み込み、それ以降の予測の呼び出しではこの永続変数を再利用します。

type('logonet_predict.m')
function out = logonet_predict(in)
%#codegen

% Copyright 2017-2019 The MathWorks, Inc.

persistent logonet;

if isempty(logonet)
    
    logonet = coder.loadDeepLearningNetwork('LogoNet.mat','logonet');
end

out = logonet.predict(in);

end

関数 logonet_predict の CUDA MEX の生成

MEX ターゲットの GPU 構成オブジェクトを作成し、ターゲット言語を C++ に設定します。関数 coder.DeepLearningConfig を使用して CuDNN 深層学習構成オブジェクトを作成し、それを GPU コード構成オブジェクトの DeepLearningConfig プロパティに割り当てます。CUDA MEX を生成するには、codegen コマンドを使用し、入力のサイズを [227,227,3] に指定します。この値は logonet ネットワークの入力層サイズに対応します。

cfg = coder.gpuConfig('mex');
cfg.TargetLang = 'C++';
cfg.DeepLearningConfig = coder.DeepLearningConfig('cudnn');
codegen -config cfg logonet_predict -args {ones(227,227,3,'uint8')} -report
Code generation successful: To view the report, open('codegen/mex/logonet_predict/html/report.mldatx').

生成された MEX の実行

入力イメージを読み込みます。入力イメージに対して logonet_predict_mex を呼び出します。

im = imread('test.png');
imshow(im);
im = imresize(im, [227,227]);
predict_scores = logonet_predict_mex(im);

上位 5 つの予測スコアを Wordnet 辞書の synset (ロゴ) に含まれる単語にマッピングします。

synsetOut = {'adidas', 'aldi', 'apple', 'becks', 'bmw', 'carlsberg', ...
    'chimay', 'cocacola', 'corona', 'dhl', 'erdinger', 'esso', 'fedex',...
    'ferrari', 'ford', 'fosters', 'google', 'guinness', 'heineken', 'hp',...
    'milka', 'nvidia', 'paulaner', 'pepsi', 'rittersport', 'shell', 'singha', 'starbucks', 'stellaartois', 'texaco', 'tsingtao', 'ups'};

[val,indx] = sort(predict_scores, 'descend');
scores = val(1:5)*100;
top5labels = synsetOut(indx(1:5));

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

outputImage = zeros(227,400,3, 'uint8');
for k = 1:3
    outputImage(:,174:end,k) = im(:,:,k);
end

scol = 1;
srow = 20;

for k = 1:5
    outputImage = insertText(outputImage, [scol, srow], [top5labels{k},' ',num2str(scores(k), '%2.2f'),'%'], 'TextColor', 'w','FontSize',15, 'BoxColor', 'black');
    srow = srow + 20;
end

 imshow(outputImage);

メモリに読み込まれた静的ネットワーク オブジェクトをクリアします。

clear mex;

関連するトピック