- 元画像imgと解析結果gradcamMapのサイズが同一
- 元画像imgはRGBイメージデータ(uint8)
- 解析結果gradcamMapはdouble型データ(値域は任意)
Grad-CAMイメージとオリジナルイメージを同じ大きさで並べて表示する方法
2 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
YutaKawaguchi
am 18 Aug. 2022
Kommentiert: YutaKawaguchi
am 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 Kommentare
Akzeptierte Antwort
Atsushi Ueno
am 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 Kommentare
Weitere Antworten (0)
Siehe auch
Kategorien
Mehr zu イメージのセグメンテーションと解析 finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!