Main Content

GoogLeNet を使用した Simulink でのイメージの分類

この例では、Image Classifier ブロックを使用して、Simulink® でイメージを分類する方法を説明します。この例では、事前学習済みの深層畳み込みニューラル ネットワーク GoogLeNet を使用して分類を実行します。

事前学習済みの GoogLeNet ネットワーク

GoogLeNet は、100 万枚を超えるイメージで学習しており、イメージを 1000 個のオブジェクト カテゴリ (キーボード、マグ カップ、鉛筆、多くの動物など) に分類できます。このネットワークは広範囲にわたるイメージについての豊富な特徴表現を学習しています。このネットワークは入力としてイメージを取り、イメージ内のオブジェクトのラベルを各オブジェクト カテゴリの確率と共に出力します。

net = googlenet;
inputSize = net.Layers(1).InputSize;
classNames = net.Layers(end).ClassNames;
numClasses = numel(classNames);
disp(classNames(randperm(numClasses,10)))
    {'speedboat'    }
    {'window screen'}
    {'isopod'       }
    {'wooden spoon' }
    {'lipstick'     }
    {'drake'        }
    {'hyena'        }
    {'dumbbell'     }
    {'strawberry'   }
    {'custard apple'}

イメージの読み取りとサイズ変更

分類するイメージを読み取って表示します。

I = imread('peppers.png');
figure
imshow(I)

このデータを Simulink モデルにインポートするには、入力イメージ データと空の時間ベクトルを含む構造体変数を指定します。

simin.time = [];
simin.signals.values = I;
simin.signals.dimensions = size(I);

予測用の Simulink モデル

イメージ分類用の Simulink モデルを以下に示します。モデルは、From Workspace ブロックを使用して入力イメージを読み込み、Deep Neural Networks ライブラリの Image Classifier ブロックを使用して入力を分類し、Display ブロックを使用して予測出力を表示します。

model = 'googlenet_classifier';
open_system(model);

シミュレーションの実行

Simulink モデルを検証するには、シミュレーションを実行します。

set_param(model,'SimulationMode','Normal');
sim(model);

このネットワークはイメージをピーマンとして分類します。

上位の予測の表示

上位 5 つの予測ラベルとそれらに対応する確率をヒストグラムとして表示します。ネットワークはイメージを非常に多くのオブジェクト カテゴリに分類しますが、多くのカテゴリは似ているため、ネットワークを評価するときは、通常、上位 5 つの精度を考慮します。このネットワークは高い確率でこのイメージをピーマンとして分類します。

scores = yout.signals(1).values(:,:,1);
labels = yout.signals(2).values(:,:,1);
[~,idx] = sort(scores,'descend');
idx = idx(5:-1:1);
scoresTop = scores(idx);
labelsTop = split(string(labels(idx)),'_');
labelsTop = labelsTop(:,:,1);

figure
imshow(I)
title(labelsTop(5) + ", " + num2str(100*scoresTop(5) + "%"));

figure
barh(scoresTop)
xlim([0 1])
title('Top 5 Predictions')
xlabel('Probability')
yticklabels(labelsTop)