grad-CAM用于自己的语义分割网络【亲测】

一、如果不出错的话

参考链接:https://github.com/jacobgil/pytorch-grad-cam 

1、 先将此github源码clone到本地

2、 参考pytorch-grad-cam/tutorials/Class Activation Maps for Semantic Segmentation.ipynb

3、 把包都导好。

4、注意推理做的归一化与标准化跟自己训练的时候弄成一样的
import warnings
warnings.filterwarnings('ignore')
warnings.simplefilter('ignore')
from torchvision.models.segmentation import deeplabv3_resnet50
import torch
import torch.functional as F
import numpy as np
import requests
import torchvision
from PIL import Image
from pytorch_grad_cam.utils.image import show_cam_on_image, preprocess_image
from models.model_stages_double import BiSeNet
from pytorch_grad_cam.grad_cam import GradCAM


# 读入自己的图像
image = np.array(Image.open('/media/wlj/soft_D/WLJ/WJJ/STDC-Seg/camera_4_crop/leftImg8bit/test/nok/NoK_4_leftImg8bit.png'))
rgb_img = np.float32(image) / 255
input_tensor = preprocess_image(rgb_img,
                                mean=[0.485, 0.456, 0.406],
                                std=[0.229, 0.224, 0.225])

# 读入自己的模型并且加载训练好的权重
model = BiSeNet(backbone='STDCNet813',n_classes=6)
model.cuda()
model = model.eval()
save_pth = '/media/wlj/soft_D/WLJ/WJJ/STDC-Seg/checkpoints/camera_4_crop/batch8_11.2_15000it_dublebaseline_left1xSGE2345_right0.5x_DFConv2_SGE3_RGB/model_maxmIOU100.pth'
model.load_state_dict(torch.load(save_pth))

if torch.cuda.is_available():
    model = model.cuda()
    input_tensor = input_tensor.cuda()

# 推理
output = model(input_tensor)[0]
normalized_masks = torch.softmax(output, dim=1).cpu()

# 自己的数据集的类别
sem_classes = [
    '__background__', 'round', 'nok', 'headbroken', 'headdeep', 'shoulderbroken'
]

sem_class_to_idx = {cls: idx for (idx, cls) in enumerate(sem_classes)}
round_category = sem_class_to_idx["nok"]
round_mask = torch.argmax(normalized_masks[0], dim=0).detach().cpu().numpy()
round_mask_uint8 = 255 * np.uint8(round_mask == round_category)
round_mask_float = np.float32(round_mask == round_category)

# 推理结果图与原图拼接
# both_images = np.hstack((image, np.repeat(round_mask_uint8[:, :, None], 3, axis=-1)))
# img = Image.fromarray(both_images)
# img.save("./hhhh.png")


class SemanticSegmentationTarget:
    def __init__(self, category, mask):
        self.category = category
        self.mask = torch.from_numpy(mask)
        if torch.cuda.is_available():
            self.mask = self.mask.cuda()

    def __call__(self, model_output):
        return (model_output[self.category, :, :] * self.mask).sum()

# 自己要放CAM的位置
target_layers = [model.conv_out]
targets = [SemanticSegmentationTarget(round_category, round_mask_float)]


with GradCAM(model=model, target_layers=target_layers,
             use_cuda=torch.cuda.is_available()) as cam:

    grayscale_cam = cam(input_tensor=input_tensor,
                        targets=targets)[0, :]
    cam_image = show_cam_on_image(rgb_img, grayscale_cam, use_rgb=True)

# 保存CAM的结果
img = Image.fromarray(cam_image)
img.show()
img.save('./result.png')

二、可能出错

我遇到了 如下错误

解决方法:

将base_cam.py的第81行修改为:

 就不报错了!

拿下!

 

 

  • 14
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 29
    评论
您可以使用Grad-CAM(Gradient-weighted Class Activation Mapping)来可视化自己的模型。Grad-CAM 是一种可视化技术,可以帮助我们理解度学习模型在做出测时关注的像区域。 下面是使用Grad-CAM的一般步骤: 1. 加载训练好的模型:首先,您需要加载自己训练好的模型。您可以使用深度学习框架(如PyTorch、TensorFlow等)提供的API来加载模型。 2. 准备输入图像:您需要准备一张输入图像,该图像将用于Grad-CAM的可视化。确保将图像进行预处理,以便与训练时使用的预处理方式相匹配。 3. 定义Grad-CAM类:您需要定义一个Grad-CAM类,该类将包含一些方法来计算Grad-CAM热力图并可视化结果。这些方法通常会通过反向传播和梯度计算来实现。 4. 前向传播:将输入图像传递给模型进行前向传播,以获取特征图。 5. 反向传播和梯度计算:使用目标类别对输出进行反向传播,并计算相对于特征图的梯度。 6. 特征图权重计算:对特征图上的梯度进行池化操作,以获取每个通道的权重。 7. 加权特征图:将特征图与相应的权重相乘,得到加权特征图。 8. 热力图生成:将加权特征图进行求和操作,得到热力图。 9. 可视化:使用热力图来可视化模型关注的图像区域。可以通过叠加热力图到原始图像上或者将其作为单独的图像进行显示。 请注意,实现Grad-CAM可能因深度学习框架而异。您可以参考相关的教程或者代码示例,以了解如何在您选择的框架中实现Grad-CAM。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值