- 元画像imgと解析結果gradcamMapのサイズが同一
- 元画像imgはRGBイメージデータ(uint8)
- 解析結果gradcamMapはdouble型データ(値域は任意)
Grad-CAMイメージとオリジナルイメージを同じ大きさで並べて表示する方法
3 次查看(过去 30 天)
显示 更早的评论
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 个评论
采纳的回答
Atsushi Ueno
2022-8-18
>いい解決策があれば、教えてください。
>現在横長のイメージを使用しているので、縦に並べて表示する方法があれば、合わせて教えていただけると幸いです。
% 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 个评论
更多回答(0 个)
另请参阅
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!