深層学習を使用した Web カメラ イメージの分類
この例では、事前学習済みの深層畳み込みニューラル ネットワーク GoogLeNet を使用して、Web カメラのイメージをリアルタイムで分類する方法を説明します。
MATLAB®、シンプルな Web カメラ、および深層ニューラル ネットワークを使用して、身の回りの物を識別します。この例では、GoogLeNet を使用します。この事前学習済みの深層畳み込みニューラル ネットワーク (CNN または ConvNet) は、100 万個を超えるイメージについて学習済みであり、イメージを 1000 個のオブジェクト カテゴリ (キーボード、マグ カップ、鉛筆、多くの動物など) に分類できます。GoogLeNet をダウンロードし、MATLAB を使用してカメラのイメージをリアルタイムで連続的に処理できます。
GoogLeNet は広範囲のイメージに対する豊富な特徴表現を学習しています。入力としてイメージを取り、イメージ内のオブジェクトのラベルと各オブジェクト カテゴリの確率を表示します。身の回りの物で実験して、GoogLeNet によってイメージがどの程度正確に分類されるかを確認できます。ネットワークによるオブジェクト分類の詳細を確認するには、最終的なクラスの判定だけでなく、上位 5 クラスのスコアをリアルタイムで表示します。
カメラおよび事前学習済みのネットワークの読み込み
カメラを接続し、事前学習済みの GoogLeNet ネットワークを読み込みます。この手順では任意の事前学習済みのネットワークを使用できます。この例には、MATLAB Support Package for USB Webcams、および Deep Learning Toolbox™ Model for GoogLeNet Network が必要です。必要なサポート パッケージがインストールされていない場合、ダウンロード用リンクが表示されます。
camera = webcam; net = googlenet;
例をもう一度実行する場合は、まずコマンド clear camera
を実行します。ここで、camera
は Web カメラへの接続です。そうしない場合、同じ Web カメラへの新しい接続は作成できないため、エラーが表示されます。
カメラのスナップショットの分類
イメージを分類するには、ネットワークの入力サイズに合わせてイメージのサイズを変更しなければなりません。ネットワークのイメージ入力層の InputSize
プロパティから最初の 2 つの要素を取得します。イメージ入力層は、ネットワークの最初の層です。
inputSize = net.Layers(1).InputSize(1:2)
inputSize = 224 224
カメラのイメージを、予測ラベルとその確率と共に表示します。classify
を呼び出す前に、ネットワークの入力サイズに合わせてイメージのサイズを変更しなければなりません。
figure im = snapshot(camera); image(im) im = imresize(im,inputSize); [label,score] = classify(net,im); title({char(label),num2str(max(score),2)});
カメラのイメージの連続的な分類
カメラのイメージを連続的に分類するには、前の手順をループ内に含めます。Figure が開いている間、ループを実行します。ライブ予測を停止するには、単に Figure を閉じます。反復が終了するたびに drawnow
を使用して Figure を更新します。
h = figure; while ishandle(h) im = snapshot(camera); image(im) im = imresize(im,inputSize); [label,score] = classify(net,im); title({char(label), num2str(max(score),2)}); drawnow end
上位の予測の表示
予測されるクラスは急速に変化する可能性があります。そのため、上位の予測を一緒に表示すると便利な場合があります。予測の最高スコアを使用してクラスをプロットすることで、上位 5 つの予測とその確率を表示できます。
カメラのスナップショットを分類します。カメラのイメージを、予測ラベルとその確率と共に表示します。関数 classify
の score
出力を使用して、上位 5 つの予測について確率のヒストグラムを表示します。
Figure ウィンドウを作成します。まず、幅が 2 倍になるようにウィンドウのサイズを変更して、2 つのサブプロットを作成します。
h = figure; h.Position(3) = 2*h.Position(3); ax1 = subplot(1,2,1); ax2 = subplot(1,2,2);
左のサブプロットに、イメージと分類をまとめて表示します。
im = snapshot(camera); image(ax1,im) im = imresize(im,inputSize); [label,score] = classify(net,im); title(ax1,{char(label),num2str(max(score),2)});
スコアの高いクラスを選択して、上位 5 つの予測を選択します。
[~,idx] = sort(score,'descend');
idx = idx(5:-1:1);
classes = net.Layers(end).Classes;
classNamesTop = string(classes(idx));
scoreTop = score(idx);
上位 5 つの予測をヒストグラムとして表示します。
barh(ax2,scoreTop) xlim(ax2,[0 1]) title(ax2,'Top 5') xlabel(ax2,'Probability') yticklabels(ax2,classNamesTop) ax2.YAxisLocation = 'right';
イメージの連続的な分類と上位の予測の表示
カメラのイメージを連続的に分類して上位の予測を表示するには、前の手順をループ内に含めます。Figure が開いている間、ループを実行します。ライブ予測を停止するには、単に Figure を閉じます。反復が終了するたびに drawnow
を使用して Figure を更新します。
Figure ウィンドウを作成します。まず、幅が 2 倍になるようにウィンドウのサイズを変更して、2 つのサブプロットを作成します。座標軸のサイズが変更されないようにするには、PositionConstraint
プロパティを 'innerposition'
に設定します。
h = figure;
h.Position(3) = 2*h.Position(3);
ax1 = subplot(1,2,1);
ax2 = subplot(1,2,2);
ax2.PositionConstraint = 'innerposition';
上位 5 つの予測のヒストグラムをイメージと共に連続的に表示して分類します。
while ishandle(h) % Display and classify the image im = snapshot(camera); image(ax1,im) im = imresize(im,inputSize); [label,score] = classify(net,im); title(ax1,{char(label),num2str(max(score),2)}); % Select the top five predictions [~,idx] = sort(score,'descend'); idx = idx(5:-1:1); scoreTop = score(idx); classNamesTop = string(classes(idx)); % Plot the histogram barh(ax2,scoreTop) title(ax2,'Top 5') xlabel(ax2,'Probability') xlim(ax2,[0 1]) yticklabels(ax2,classNamesTop) ax2.YAxisLocation = 'right'; drawnow end
参考
imagePretrainedNetwork
| dlnetwork
| trainingOptions
| trainnet