現在,CNNを用いて画像分類を行っています.
その過程でヒートマップを求めるためにgrad camを実装しました.
この時,grad camから出力されたヒートマップのサイズが64x46でした.
また,入力画像のサイズは,640x480です.
grad camのサイトを参考にしていたところ,
このヒートマップを拡大すれば入力画像と同じサイズになり,上手に重なっていました.
しかし,ネット上の多くの例では,入力画像もヒートマップも正方形であるので,拡大すると上手に重なっています.
しかし,私の場合は,64x46を入力サイズに合わせて(640x480)に拡大すると
縦横比が違うために入力サイズにヒートマップを重ねるとズレが出てしまいます.
これが64x48サイズだったらよかったのか?
何かこの問題を解決するためのアイデア等があるかた,よろしくお願いします.
追加情報が必要な方は,返信しますのでコメントをお願いします.
python
1 2#準備 3model = load_model('cnn_model.h5') 4print(model.summary()) 5 6 7data = img_to_array(load_img('./input/cat10007.jpg', target_size=(480,640))) 8 9 10 11#backend動作 12layer_name = 'max_pooling3d_4' 13last_conv = model.get_layer(layer_name) 14data_output = model.output[:,0] 15 16 17 18 19grads = K.gradients(data_output, last_conv.output)[0] 20pooled_grads = K.mean(grads, axis=(0,1,2) 21iterate = K.function([model.input], 22 [pooled_grads, last_conv.output[0]]) 23 24 25#Main 26 27pooled_grads_val,conv_output_val = iterate([data]) 28 29for i in range(pooled_grads_val.shape[0]): 30 conv_output_val[:,:,i] *= pooled_grads_val[i] 31 32heatmap = np.mean(conv_output_val,axis=-1) 33print(heatmap.shape) #(46,64) 34 35#ヒートマップの後処理 36 37heatmap = np.maximum(heatmap,0) 38heatmap /= np.max(heatmap) 39 40 41 42##################### 43heatmap = cv2.resize(heatmap,(640,480)) 44heatmap = np.uint8(255 * heatmap) 45 46#動画にヒートマップを適用していく. 47image0 = cv2.applyColorMap(heatmap,cv2.COLORMAP_JET) 48plt.imshow(image0) 49plt.show() 50 51frame = '元のイメージ' #入力画像 52superimposed_img = frame + 0.6*image0 53#superimposed_img = cv2.addWeighted(frame,0.7, image0, 0.3, 0) 54 55 56 57plt.imshow(superimposed_img) 58plt.imshow(image0) 59plt.show() 60