Grad-CAMイメ​ージとオリジナルイメ​ージを同じ大きさで並​べて表示する方法

14 views (last 30 days)
YutaKawaguchi
YutaKawaguchi on 18 Aug 2022
Commented: YutaKawaguchi on 19 Aug 2022
Grad-CAMイメージと、オリジナルイメージを並べて表示するコードを作成したのですが、
Grad-CAM側のイメージが小さく表示されてしまいます。
イメージをjpgで保存した際の背景も含めてサイズ調整してしまっていることが原因のようです。
問題点としては、
①いったん保存しないと、エラーでサイズ変更、並列表示ができない。
②実際のイメージ部分のみ保存する。
このいずれかで、解決できると考えています。
Originimg = imshow(img);
解析画像ごとのファイル名を指定。指定は元ファイル名+gradcam
file = ClassFile{FileNum,1};
[filepath,fileName,imageFT] = fileparts(file);
GradCAMFileName=fileName+"【Grad-CAM】"+imageFT;
元画像に重ねて解析結果を表示
hold on;
Gradimg = imagesc(gradcamMap,'AlphaData',0.5);
colormap jet
hold off;
saveas(Gradimg,GradCAMFileName);
1度保存して、読み込む必要あり
outputSize = [160 704]
Gradimg = imread(GradCAMFileName)
imshow(Gradimg)
Gradimg = imresize(Gradimg,outputSize)
Gradimg = imshow(Gradimg)
saveas(Gradimg, GradCAMFileName)
Comparisonimg = imtile({GradCAMFileName;GradDs})
Comparisonimg = imshow(Comparisonimg)
解析画像を保存する。
title(sprintf("%s(%2f)",classfn,score(classfn)));
saveas(Comparisonimg,GradCAMFileName);
現在のGradCAM表示周辺のコードは以上です。
いい解決策があれば、教えてください。
また、現在横長のイメージを使用しているので、縦に並べて表示する方法があれば、
合わせて教えていただけると幸いです。
よろしくお願いいたします。

Accepted Answer

Atsushi Ueno
Atsushi Ueno on 18 Aug 2022
>いい解決策があれば、教えてください。
figure を経由せず画像データを直接処理すれば、問題点①・②とも回避する事ができます。
>現在横長のイメージを使用しているので、縦に並べて表示する方法があれば、合わせて教えていただけると幸いです。
imtile関数のオプション 'GridSize' を変更して画像を縦に並べる事が出来ます。
% Originimg = imshow(img);
% 解析画像ごとのファイル名を指定。指定は元ファイル名+gradcam
file = ClassFile{FileNum,1};
[filepath,fileName,imageFT] = fileparts(file);
GradCAMFileName=fileName+"【Grad-CAM】"+imageFT;
% 元画像に重ねて解析結果を表示
gradcamMapRGB = uint8(ind2rgb(uint8(rescale(gradcamMap,1,256)),colormap(jet))*255); % 解析結果のデータ型を変更
Gradimg = uint8(gradcamMapRGB * 0.5 + img * (1 - 0.5)); % 元画像と解析結果を重ね合わせる
% 比較画像を作成・表示する
Comparisonimg = imtile({Gradimg;GradDs},'GridSize',[2 1]); % 縦に並べる
Comparisonimg = imshow(Comparisonimg)
% 解析画像を保存する。
title(sprintf("%s(%2f)",classfn,score(classfn)));
saveas(Comparisonimg,GradCAMFileName);
下記条件が成立していれば上手くいくと思います。
  • 元画像imgと解析結果gradcamMapのサイズが同一
  • 元画像imgはRGBイメージデータ(uint8)
  • 解析結果gradcamMapはdouble型データ(値域は任意)
【良く解る解説】
figure を経由せず画像データを直接処理すれば良いのですが、その際に元画像 img と解析結果 gradcamMap のデータ型を合わせて演算する必要があります。(解析結果 gradcamMapを1-256にリスケール ⇒インデックス付きイメージ (カラーマップ 'jet') ⇒ RGB イメージに変換しています。結構めんどい)
Grad-CAM での深層学習による判定の理由の解明 - MATLAB & Simulink - MathWorks 日本の例を参考にして、imagesc関数の「透明度のデータ」を使わずに元画像と解析結果を重ね合わせた画像を作成してみました。
net = googlenet;
img = imresize(imread("sherlock.jpg"),net.Layers(1).InputSize(1:2)); % リサイズ済の元画像
[classfn,score] = classify(net,img);
map = gradCAM(net,img,classfn);
mapRGB = uint8(ind2rgb(uint8(rescale(map,1,256)),colormap(jet))*255); % 解析結果のデータ型を変更
Gradimg = uint8(mapRGB * 0.5 + img * (1 - 0.5)); % 元画像と解析結果を重ね合わせる
imshow(Gradimg);
  3 Comments
YutaKawaguchi
YutaKawaguchi on 19 Aug 2022
縦表示、確認できました。
条件の『解析結果gradcamMapはdouble型データ(値域は任意)』はsingle型でも問題ないようです。
同様の処理をしたい方の参考になれば幸いです。
YutaKawaguchi
YutaKawaguchi on 19 Aug 2022
サイズ変更についても巧く行きました。
outputSize = [320 704]%元画像のサイズを設定
Comparisonimg = imresize(Comparisonimg,outputSize)%サイズ変更
Comparisonimg =imshow(Comparisonimg)
ありがとうございました。

Sign in to comment.

More Answers (0)

Products


Release

R2021b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!