- 元画像imgと解析結果gradcamMapのサイズが同一
- 元画像imgはRGBイメージデータ(uint8)
- 解析結果gradcamMapはdouble型データ(値域は任意)
Grad-CAMイメージとオリジナルイメージを同じ大きさで並べて表示する方法
5 views (last 30 days)
Show older comments
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表示周辺のコードは以上です。
いい解決策があれば、教えてください。
また、現在横長のイメージを使用しているので、縦に並べて表示する方法があれば、
合わせて教えていただけると幸いです。
よろしくお願いいたします。
0 Comments
Accepted Answer
Atsushi Ueno
on 18 Aug 2022
>いい解決策があれば、教えてください。
>現在横長のイメージを使用しているので、縦に並べて表示する方法があれば、合わせて教えていただけると幸いです。
% 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);
下記条件が成立していれば上手くいくと思います。
【良く解る解説】
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
More Answers (0)
See Also
Categories
Find more on イメージのセグメンテーションと解析 in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!