Keras可视化类激活热力图

8 篇文章 0 订阅
8 篇文章 0 订阅
#page142#########类激活图(CAM,class activation map)可视化。
from keras.applications.vgg16 import VGG16
model=VGG16(weights='imagenet')#这次网络中没有舍弃密集连结分类
#对应vgg16_weights_tf_dim_ordering_tf_kernels.h5
#加载图像使得大小调整为224*224#带分类器识别出是哪个物体
from keras.preprocessing import image
from keras import backend as K
from keras.applications.vgg16 import preprocess_input,decode_predictions
import numpy as np
img_path = './data/creative_commons_elephant.jpg'
img=image.load_img(img_path,target_size=(224,224))
x=image.img_to_array(img)
x=np.expand_dims(x,axis=0)#增加一个维度(1,224,224,3)
#卷积神经网络都是4维的
x=preprocess_input(x)#对批量进行预处理,按通道进行颜色标准化
preds=model.predict(x)
print('预测结果:',decode_predictions(preds,top=3)[0])
#C:\Users\Administrator\.keras\models\imagenet_class_index.json
 #[('n02504458', 'African_elephant', 0.9101744),
 #('n01871265', 'tusker', 0.08544522), 
 #('n02504013', 'Indian_elephant', 0.0043368954)]
print('索引编号:',np.argmax(preds[0]))#386
#######为了展示图像中那些部分是非洲象我们使用Grad_Cam算法#######
african_elephant_output=model.output[:386]#预测向量中的非洲象元素
last_conv_layer=model.get_layer('block5_conv3')
#得到指定层的输出特征图,这是Vgg16最后一个卷积层
grads=K.gradients(african_elephant_output,last_conv_layer.output)[0]
#得到非洲象在block5_conv3输出特征图的梯度
pooled_grads=K.mean(grads,axis=(0,1,2))
#(512,)的向量,每个元素是特征图通道的梯度平均大小
print('合并梯度形状:',pooled_grads.shape)
iterate=K.function([model.input],[pooled_grads,last_conv_layer.output[0]])
#访问pooled_grads:对于给定的样本图像,pooled_grads和block5_conv3层的输出特征图
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/=np.max(heatmap)
###########用openCv来生成一张图片,然后将原始图像叠加在刚刚生成的热力图上########
import cv2
img=cv2.imread(img_path)#加载原始图像
heatma=cv2.resize(heatmap,(img.shape[1],img.shape[0]))
#将热力图调整为与原始图像一样大小
heatmap=np.uint8(255*heatma)#将热力图改为rgb格式
heatmap=cv2.applyColorMap(heatmap,cv2.COLORMAP_JET)#将热力图应用于原始图像
superimposed_img=heatmap*0.4+img#0.4是热力图的强度因子
#cv2.imwrite('./data/大象_cam.jpg',superimposed_img) #不支持中文,可以写入但是文件名乱码
###############################################################################################################
#newimg = cv2.imdecode(np.fromfile("'./data/大象_cam.jpg'",dtype=np.uint8),cv2.IMREAD_UNCHANGED)#中文读取
img_write = cv2.imencode(".jpg",superimposed_img)[1].tofile('./data/大象_cam.jpg')#中文写入

 

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值