keras可视化特征响应

参考:https://blog.csdn.net/C_chuxin/article/details/85265082

以目标检测基于VGG16的SSD为例,先建立SSD模型model

示例图片如下。若最大概率检测到火车train的anchor为6856号(0开始),即19*19特征图(即fc7)的(9,9),aspect ratio=1.,则以下实验观察该anchor的train类在fc7特征图上的响应。该示例图片在batch中为1号,令i=1

keras可视化特征响应_第1张图片

from keras.models import Model
import cv2 
import matplotlib.pyplot as plt
import numpy as np
import keras.backend as K

i = 1
model1 = Model(model.input, model.get_layer('fc7_mbox_conf').output)
pred1 = model1.predict(processed_images)#(batch, height, width, channel)
r = np.argmax(pred1[i,:,:,19])//19#9, 该图片位于batch的1号
c = np.argmax(pred1[i,:,:,19])-r*19#9
most_act = model1.output[i,r,c,19]

grads = K.gradients(most_act, model.get_layer('fc7').output)[0]#结果是长度同most_act的列表,这里由于most_act是标量,所以直接取[0]
pooled_grads = K.mean(grads, axis=(1, 2))   # 形状是(batch, 1024)的向量,每个元素是特定特征图通道的梯度平均大小
iterate = K.function([model.input], [pooled_grads[i], model.get_layer('fc7').output[i]])
# 这个函数允许我们获取刚刚定义量的值:对于给定样本图像,pooled_grads和fc7层的输出特征图
pooled_grads_value, conv_layer_output_value = iterate([processed_images])
# processed_images是batch
 
for j in range(1024):
    conv_layer_output_value[:, :, j] *= pooled_grads_value[j]
# 将特征图数组的每个通道乘以这个通道对train类别重要程度
heatmap = np.mean(conv_layer_output_value, axis=-1)
heatmap = np.maximum(heatmap, 0)  # heatmap与0比较,取其大者
heatmap /= np.max(heatmap)
plt.matshow(heatmap)
plt.show()

img = cv2.imread(filenames[i])  # 用cv2加载原始图像
heatmap = cv2.resize(heatmap, (img.shape[1], img.shape[0]))  # 将热力图的大小调整为与原始图像相同
heatmap = np.uint8(255 * heatmap)  # 将热力图转换为RGB格式
heatmap = cv2.applyColorMap(heatmap, cv2.COLORMAP_JET)[...,::-1]   # 将热力图应用于原始图像
superimposed_img = heatmap * 0.9 + img    # 这里的0.9是热力图强度因子
plt.figure(figsize=(20,12))
plt.imshow(superimposed_img/255)
plt.figure(figsize=(20,12))
#plt.imshow(img)
plt.imshow(heatmap)

keras可视化特征响应_第2张图片

keras可视化特征响应_第3张图片

keras可视化特征响应_第4张图片

你可能感兴趣的:(keras)