Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

オクルージョンを使用したネットワーク予測の理解

この例では、オクルージョン感度マップを使用して、深層ニューラル ネットワークによる分類の判定理由を理解する方法を説明します。オクルージョン感度は、深層ネットワークの分類においてイメージのどの部分が最も重要かを理解するためのシンプルな手法です。データの小さな摂動を使用することで、データのさまざまな領域におけるオクルージョンへのネットワークの感度を測定できます。オクルージョン感度は、ネットワークが特定の分類を行うためにどのイメージ特徴を使用するかに関するおおまかな理解を得るとともに、ネットワークによってイメージが誤分類される理由についての洞察を得るために使用します。

Deep Learning Toolbox には、イメージの入力を受け取る深層ニューラル ネットワークのためにオクルージョン感度マップを計算する関数 occlusionSensitivity が提供されています。関数 occlusionSensitivity は、入力の小さな領域をオクルージョン マスク (通常は灰色の正方形) に置き換えて摂動を与えます。マスクはイメージ全体を移動し、与えられたクラスの確率スコアの変化が、マスクの位置の関数として測定されます。この手法を使用して、イメージのどの部分が分類に最も重要かを強調表示することができます。イメージのその部分が隠されると、予測されたクラスの確率スコアは急激に下がります。

事前学習済みのネットワークとイメージの読み込み

事前学習済みのネットワーク GoogLeNet を読み込みます。これはイメージ分類に使用されます。

net = googlenet;

イメージの入力サイズとネットワークの出力クラスを抽出します。

inputSize = net.Layers(1).InputSize(1:2);
classes = net.Layers(end).Classes;

イメージを読み込みます。イメージは Laika という名前の犬です。イメージのサイズをネットワークの入力サイズに変更します。

imgLaikaGrass = imread("laika_grass.jpg");
imgLaikaGrass = imresize(imgLaikaGrass,inputSize);

イメージを分類して、分類スコアの最も高い 3 つのクラスをイメージ タイトルに表示します。

[YPred,scores] = classify(net,imgLaikaGrass);
[~,topIdx] = maxk(scores, 3);
topScores = scores(topIdx);
topClasses = classes(topIdx);

imshow(imgLaikaGrass)
titleString = compose("%s (%.2f)",topClasses,topScores');
title(sprintf(join(titleString, "; ")));

Laika はプードルとコッカー スパニエルの雑種です。この品種は GoogLeNet のクラスにないため、ネットワークにとってイメージの分類が難しくなります。ネットワークによる予測の信頼度はあまり高くありません。予測クラス miniature poodle のスコアはわずか 23% です。次に高いスコアのクラスもプードルの一種で、これは妥当な分類です。ネットワークは Tibetan terrier クラスにも中程度の確率を割り当てています。オクルージョンを使用することで、ネットワークがイメージのどの部分に基づいてこれら 3 つのクラスを提示したかを理解できます。

ネットワークが分類に使用するイメージ領域の特定

オクルージョンを使用することで、分類にとってイメージのどの部分が重要かを理解できます。最初に、miniature poodle の予測クラスを確認します。イメージのどの部分がこのクラスを提示するのでしょうか。オクルージョン感度関数を使用して、イメージの一部が隠されたときの分類スコアの変化をマッピングします。

map = occlusionSensitivity(net,imgLaikaGrass,YPred);

オクルージョン感度マップを重ね合わせた Laika のイメージを表示します。

imshow(imgLaikaGrass,'InitialMagnification', 150)
hold on
imagesc(map,'AlphaData',0.5)
colormap jet
colorbar

title(sprintf("Occlusion sensitivity (%s)", ...
    YPred))

オクルージョン マップにより、イメージのどの部分が miniature poodle クラスのスコアに正の寄与をし、どの部分が負の寄与をしたかがわかります。マップの赤い領域は値が高く、miniature poodle クラスの証拠になる部分です。赤い領域が隠れると、miniature poodle のスコアは下がります。このイメージでは、Laika の頭、背中、および耳が、miniature poodle クラスの強い証拠になっています。

値が低いマップの青い領域は、隠れると miniature poodle クラスのスコアが上がるイメージの部分です。多くの場合、これらの領域は他のクラスの証拠であり、ネットワークを混乱させる可能性があります。この場合、Laika の口と脚が miniature poodle の全体的なスコアに負の寄与をしています。

オクルージョン マップはイメージ内の犬に強い焦点を当てており、GoogLeNet はイメージの正しいオブジェクトを分類していることがわかります。ネットワークが期待どおりの結果を生成しない場合、その理由を理解するためのヒントをオクルージョン マップから得られる可能性があります。たとえば、ネットワークがイメージの他の部分に強く焦点を合わせている場合は、ネットワークに誤った特徴を学習させていることが示唆されます。

勾配クラスの活性化マッピング (Grad-CAM) 手法を使用することで同様の結果を得られます。Grad-CAM では、ネットワークの最後の畳み込み層についての分類スコアの勾配を使用して、イメージのどの部分が分類に最も重要であるかを理解します。例については、Grad-CAM での深層学習による判定の理由の解明を参照してください。

オクルージョン感度と Grad-CAM は通常、定性的に類似する結果を返しますが、その仕組みは異なります。通常、Grad-CAM マップを使用すると、パラメーターを 1 つも調整しないでオクルージョン感度よりも高速に計算できます。ただし、Grad-CAM マップはオクルージョン感度よりも空間的な解像度が通常低く、微細な部分を見逃す可能性があります。Grad-CAM の基となる解像度は、最後の畳み込み特徴マップの空間解像度で、GoogleNet の場合は 7 x 7 ピクセルです。オクルージョン感度から最適な結果を得るには、MaskSize オプションと Stride オプションに適切な値を選択しなければなりません。この調整により、長さのスケールが異なる入力の特徴を検査するうえで、さらに優れた柔軟性を得られます。

異なるクラスの証拠の比較

オクルージョンを使用して、ネットワークが異なるクラスについてイメージのどの部分を証拠として識別したかを比較できます。これは、ネットワークによる分類の信頼度が低く、複数のクラスに同様のスコアが付いている場合に役立ちます。

上位 3 クラスのオクルージョン マップをそれぞれ計算します。解像度をさらに高くしてオクルージョン結果を検査するには、MaskSize および Stride オプションを使用してマスク サイズとストライドを小さくします。Stride を小さくするとマップの解像度は高くなりますが、計算時間が長くなり、メモリ消費量が大きくなることがあります。MaskSize を小さくすると細部を表すことができますが、結果にノイズが多く含まれる可能性があります。

topClasses = classes(topIdx);
topClassesMap = occlusionSensitivity(net, imgLaikaGrass, topClasses, ...
    "Stride", 10, ...
    "MaskSize", 15);

上位 3 クラスの結果をそれぞれプロットします。

for i=1:length(topIdx)        
    figure
    imshow(imgLaikaGrass); 
    hold on
    imagesc(topClassesMap(:,:,i), 'AlphaData', 0.5);
    colormap jet;
    
    classLabel = string(classes(topIdx(i)));
    title(sprintf("%s", classLabel));
end

イメージの各部分では、クラスのスコアへの影響度が犬種によって大きく異なります。miniature poodle クラスと toy poodle クラスでは犬の背中が強く影響するのに対し、Tibetan terrier クラスでは口と耳が寄与します。

誤分類問題の調査

ネットワークが特定の入力データを常に誤分類する場合、オクルージョン感度を使用して、入力データの特定の特徴によってネットワークが混乱していないかどうかを判定することが可能です。芝生に座っている Laika のオクルージョン マップから、Laika の顔に焦点を当てたイメージでは Tibetan terrier と誤分類されやすいと予測できます。Laika の他のイメージを使用して、これが当てはまることを検証できます。

imgLaikaSit = imresize(imread("laika_sitting.jpg"),inputSize);

[YPred,scores] = classify(net,imgLaikaSit);
[score,idx] = max(scores);
YPred, score
YPred = categorical
     Tibetan terrier 

score = single
    0.5668

新しいイメージのオクルージョン マップを計算します。

map = occlusionSensitivity(net,imgLaikaSit,YPred);

imshow(imgLaikaSit); 
hold on;
imagesc(map, 'AlphaData', 0.5);
colormap jet;

title(sprintf("%s (%.2f)",...
    string(classes(idx)),score));

ここでも、ネットワークでは犬の鼻と口が Tibetan terrier クラスに強く関連付けられています。これはネットワークの故障モードの可能性を強調しています。なぜなら、Laika の顔のイメージが一貫して Tibetan terrier に誤分類されることを示唆するからです。

関数 occlusionSensitivity から得られる洞察を用いて、ネットワークが入力データの正しい特徴に確実に焦点を当てるようにすることができます。この例における分類問題の原因は、GoogleNet の利用可能なクラスに Laika のような雑種が含まれていないことです。オクルージョン マップは、ネットワークがなぜ Laika のこのようなイメージによって混乱するのかを示しています。使用するネットワークが、実行中のタスクに適しているかどうかを確認することは重要です。

この例では、ネットワークにより、イメージのオブジェクトのさまざまな部分が異なるクラスとして誤って識別されました。この問題の 1 つの解決策は、誤分類されたクラスの観測値をより広くカバーする、さらに多くのラベル付きデータをネットワークに再学習させることです。たとえば、ここではネットワークに、さまざまな角度から撮影した Laika のイメージを大量に使用して再学習を行い、犬の背面と正面の両方を正しいクラスに関連付けるように学習させることができます。

参考文献

[1] Zeiler M.D., Fergus R. (2014) Visualizing and Understanding Convolutional Networks. In: Fleet D., Pajdla T., Schiele B., Tuytelaars T. (eds) Computer Vision – ECCV 2014. ECCV 2014. Lecture Notes in Computer Science, vol 8689.Springer, Cham

参考

|

関連するトピック