cam热力图
时间: 2025-04-23 21:10:59 浏览: 27
### CAM热力图概述
Class Activation Mapping (CAM) 是一种用于解释卷积神经网络(CNN)决策过程的方法。通过生成热力图,可以直观展示模型在分类过程中关注的图像区域[^2]。
CAM 的核心思想是在最后一层特征图上计算全局平均池化(GAP),并将这些特征图与对应的权重相乘并求和,从而得到整个图像对于某个类别的响应强度分布。这种技术能够突出显示输入图像中对特定类别有重要影响的部分[^1]。
### 实现方法
为了实现 CAM 热力图,通常需要满足两个条件:
- 卷积神经网络的最后一层是一个全局平均池化层(GAP)
- GAP 层之后紧跟一个全连接层作为分类器
以下是 Python 中基于 PyTorch 框架的一个简单示例来说明如何创建 CAM 图像:
```python
import torch
from torchvision import models, transforms
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
def preprocess_image(img_path):
"""预处理图片"""
transform = transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])
img_pil = Image.open(img_path).convert('RGB')
tensor_img = transform(img_pil)
return tensor_img.unsqueeze(0)
class CamExtractor():
"""
提取指定层之前的输出特征图
"""
def __init__(self, model, target_layer):
self.model = model
self.target_layer = target_layer
self.gradients = None
def save_gradient(self, grad):
self.gradients = grad
def forward_pass_on_convolutions(self, x):
conv_output = None
for module_pos, module in enumerate(list(self.model._modules.items())):
_, m = module
if isinstance(m, torch.nn.modules.container.Sequential):
for layer_name, layer in list(m.named_children()):
x = layer(x)
if int(layer_name) == self.target_layer:
x.register_hook(self.save_gradient)
conv_output = x
elif not isinstance(m, torch.nn.Linear):
x = m(x)
return conv_output, x
def generate_cam(feature_conv, weight_fc, class_idx):
size_upsample = (224, 224)
bz, nc, h, w = feature_conv.shape
output_cam = []
cam = weight_fc[class_idx].dot(feature_conv.reshape((nc, h * w)))
cam = cam.reshape(h, w)
cam = cam - np.min(cam)
cam_img = cam / np.max(cam)
cam_img = np.uint8(255 * cam_img)
output_cam.append(cv2.resize(cam_img, size_upsample))
return output_cam
if __name__ == '__main__':
# 加载预训练模型
net = models.vgg16(pretrained=True)
finalconv_name = 'features'
extractor = CamExtractor(net, finalconv_name)
params = list(net.parameters())
weight_softmax = np.squeeze(params[-2].data.numpy())
image_path = './example.jpg' # 替换成自己的测试图片路径
input_tensor = preprocess_image(image_path)
with torch.no_grad():
features, output = extractor.forward_pass_on_convolutions(input_tensor.cuda())
pred_probabilities = F.softmax(output, dim=1).cpu().numpy()[0]
H_x = output.data.squeeze()
probs, idx = H_x.sort(0, True)
for i in range(0, 5):
line = '{:.3f} -> {}'.format(probs[i], classes[idx[i]])
print(line)
CAMs = generate_cam(features.cpu(), weight_softmax, idx[0])
img = cv2.imread(image_path)
height, width, _ = img.shape
heatmap = cv2.applyColorMap(cv2.resize(CAMs[0], (width, height)), cv2.COLORMAP_JET)
result = heatmap * 0.3 + img * 0.5
cv2.imwrite("cam_result.png", result)
```
这段代码展示了如何利用 VGG16 架构构建一个简单的 CAM 应用程序,并将其应用于一张给定的图片文件 `./example.jpg` 上。注意,在实际操作前需安装必要的库如 OpenCV 和 Matplotlib 并准备好相应的环境配置。
### 应用场景
CAM 技术广泛应用于多个领域,特别是在医学影像分析、自动驾驶汽车视觉系统等领域具有重要意义。通过对 CNN 输出结果进行可视化解读,研究人员可以获得更深入的理解,进而改进算法性能或发现潜在问题所在[^3]。
阅读全文
相关推荐


















