可视化类激活的热力图

from tensorflow.keras.applications.vgg16 import VGG16

model = VGG16(weights='imagenet')
Using TensorFlow backend.
from tensorflow.keras.preprocessing import image
from tensorflow.keras.applications.vgg16 import preprocess_input,decode_predictions
import numpy as np
import matplotlib.pyplot as plt

img_path = 'H:/ele.jpg'
img = image.load_img(img_path,target_size=(224,224))
plt.imshow(img)
x=image.img_to_array(img)
x=np.expand_dims(x,axis=0)
x=preprocess_input(x)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R9QbeQor-1615960938367)(output_1_0.png)]

preds = model.predict(x)
print(decode_predictions(preds,top=3)[0])
[('n01871265', 'tusker', 0.65106356), ('n02504458', 'African_elephant', 0.24941316), ('n01518878', 'ostrich', 0.05441041)]
np.argmax(preds[0])
101
#为了展示图像中的哪些部分最像非洲象,我们使用Grad-CAM算法
from tensorflow.keras import backend as K
import tensorflow as tf
african_elephant_output = model.output[:,386]#预测向量中的‘非洲象’元素
last_conv_layer = model.get_layer('block5_conv3')#block5_conv3'层的输出特征图,它是VGG16的最后一个卷积层
tf.compat.v1.disable_eager_execution()
grads = K.gradients(african_elephant_output,last_conv_layer.output)[0]#‘非洲象’类别相对于block5_conv3输出特征图的梯度
pooled_grads = K.mean(grads,axis=(0,1,2))#形状为(512,)的向量,每个元素是特定特征图通道的梯度平均大小
iterate = K.function([model.input],[pooled_grads,last_conv_layer.output[0]])
pooled_grads_value,conv_layer_output_value = iterate([x])

for i in range(512):
    conv_layer_output_value[:,:,i] *= pooled_grads_value[i]#将特征图数组每个通道乘以‘这个通道对大象类别的重要程度’
    
heatmap = np.mean(conv_layer_output_value,axis=-1)#得到的特征图的逐通道平均值即为类激活的热力图 
#将热力图标准化到0-1范围内
heatmap = np.maximum(heatmap,0)#比较heatmap和0,返回较大值
heatmap /= np.max(heatmap)
plt.matshow(heatmap)
<matplotlib.image.AxesImage at 0x1ee9d19b0b8>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RlG8WVMi-1615960938369)(output_5_1.png)]

#将热力图与原始图像叠加
import cv2

img = cv2.imread(img_path)
heatmap = cv2.resize(heatmap,(img.shape[1],img.shape[0]))
heatmap = np.uint8(255*heatmap)#转化为RGB格式
heatmap = cv2.applyColorMap(heatmap,cv2.COLORMAP_JET)#将热力图应用于原始图像
superiposed_img = heatmap*0.4+img#加入0.4的热力图像因子
cv2.imwrite('H:/ele_cam.jpg',superiposed_img)#保存命令

True

以上代码在jupyter notebook中可以运行 但是相同的代码在pycharm中运行错误显示

Tensor Tensor(“Mean:0”, shape=(512,), dtype=float32) is not an element of this graph.这种错误

经过查找发现时tensorflow版本不太对,我之前的tensorflow的版本是2.0

在anaconda promt 中降低tensorflow版本

输入pip install tensorflow==1.13.1 -i https://pypi.tuna.tsinghua.edu.cn/simple

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值