keras CAM和Grad-cam原理简介与实现

keras CAM和Grad-cam原理简介与实现

两种分类模型

  1. feature extraction+Flatten+softmax

  2. feature extraction+GAP+softmax。

以VGG16为例(其他模型原理一样),在做完卷积激活池化操作后,每张图像特征提取可得到7x7x512大小的特征图,为了在全连接层作分类,需要将提取的特征图(三维)转化成一维的特征。这两种类型分类模型的唯一差异就在将三维特征转化成一维特征的方式

1、特征提取(feature extraction)+flatten+softmax

这种方式使用keras的flatten层将三维特征直接从左向右排列成一维向量(类似于np.flatten())。例如将7x7x512的特征图flatten后拉成了25088长的一维向量。然后接全连接层(FCN,可看到多层感知机分类器),最后经过softmax层输出每类的概率。

在这里插入图片描述

2、 feature extraction+GAP+softmax

Global average pooling(GAP)是论文Network In Network[1]提出的,主要为了解决全连接层参数过多,不易训练且容易过拟合等问题,例如VGG16网络模型的参数90%左右的参数是全连接层的参数。用GAP替换flatten操作将三维特征转化成一维向量。GAP层实现非常简单,就是一个与特征图大小相同的平均池化层。例如7x7x512的特征图,使用7x7大小的平均池化层,池化后可得到512长的一维向量。这里可以对比一下这两种方式的参数量,假设全连接层节点个数1024个,flatten的参数量是25088x1024。而GAP的参数量是512x1024。这个差异还是很大的。
在这里插入图片描述

二、CAM和Grad-CAM

CAM和Grad-cam都是求如下图右侧的结果。可视化模型根据图像的那个区域判别该图是猫。可以帮组我们理解模型学习的特征。

只需要得到heatmap(上图左侧),将heatmap叠加到原图即可。代码如下。cam和Grad-cam也就是要求heatmap。

import cv2
superimposed_img = cv2.addWeighted(img,0.6,heatmap,0.4,0)

Python-OpenCV 图像叠加or图像混合加权实现

cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]]) → dst

参数说明
src1 – first input array.
alpha – weight of the first array elements.
src2 – second input array of the same size and channel number as src1.
beta – weight of the second array elements.
dst – output array that has the same size and number of channels as the input arrays.
gamma – scalar added to each sum.
dtype – optional depth of the output array; when both input arrays have the same depth, dtype can be set to -1, which will be equivalent to src1.depth().

矩阵表达式来代替:
dst = src1 * alpha + src2 * beta + gamma;

由参数说明可以看出,被叠加的两幅图像必须是尺寸相同、类型相同的

并且,当输出图像array的深度为CV_32S时,这个函数就不适用了,这时候就会内存溢出或者算出的结果压根不对。

CV_32S is a signed 32bit integer value for each pixel

CAM和Grad-cam求heatmap的具体流程如下:

  1)求图像经过特征提取后最后一次卷积后得到的特征图(也就是VGG16 conv5_3的特征图(7x7x512))

  2)512张feature map在全连接层分类的权重肯定不同,利用反向传播求出每张特征图的权重。注意cam和Grad-cam的不同就在于求每张特征图权重的方式。其他流程都一样

  3)用每张特征图乘以权重得到带权重的特征图(7x7x512),在第三维求均值得到7x7的map(np.mean(axis=-1)),relu激活,归一化处理(避免有些值不在0-255范围内)。

该步最重要的是relu激活(relu只保留大于0的值),relu后只保留该类别有用的特征。正数认为是该类别有用的特征,负数是其他类别的特征(或无用特征)。如下图,假设某类别最后加权后为0.8965,类别值越大则是该类别的概率就越高,那么属于该类别的特征即为wx值大于0的特征。小于0的特征可能是其他类的特征。通俗理解,假如图像中出现一个猫头,那么该特征在猫类别中为正特征,在狗类别中为负特征,要增加猫的置信度,降低狗的置信度。
在这里插入图片描述

假如不加relu激活的话,heatmap代表着多类别的特征,论文中是这样概述的:如果没有relu,定位图谱显示的不仅仅是某一类的特征。而是所有类别的特征。

4) 将处理后的heatmap放缩到图像尺寸大小,便于与图像加权

从流程中可看到,cam和Grad-cam不同之处在于求每个特征图的权重的方式,这也是这两个方法的亮点之处,(其他部分,如求特征图我们在可视化卷积特征也常做,CAM和Grad-cam只是给这些特征加上权重,突出显示我们关注的重点),下面分别介绍cam和Grad-cam求特征图权重的方式,并给出各自的实现的keras版本源码。

1、CAM源码

CAM方法要求模型必须使用GAP层。 因为GAP层使模型具有更强的可解释性,GAP后每张特征图对应一个节点(下图中红色的节点),CAM的思想是把该节点的权重w作为该特征图的权重。具体做法是选择softmax层值最大的节点反向传播,求GAP层的梯度作为(7x7x512)特征图的权重。
在这里插入图片描述
CAM实现源码

# -*- coding=utf-8 -*-
"""
Created on 2019-6-19 21:39:53
@author: fangsh.suk
"""
import keras
import cv2
import numpy as np
import keras.backend as K
 
from keras.applications.resnet50 import preprocess_input
from keras.preprocessing
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值