首页 > 编程语言 >【DL】CAM | 与嵌入的概念相比,图像中有什么相似或不同之处?| 热力图可视化 | python | Adapting pixel attribution methods for embeddin

【DL】CAM | 与嵌入的概念相比,图像中有什么相似或不同之处?| 热力图可视化 | python | Adapting pixel attribution methods for embeddin

时间:2024-11-08 09:16:15浏览次数:3  
标签:Adapting embeddin DL features img self __ cam model

本文将采用像素属性方法嵌入模型输出Adapting pixel attribution methods for embedding outputs from models)的实践。话不多说,先看看效果吧!!!

目录

1 安装pytorch-gradcam

2 实践

① 代码

② 效果图



与嵌入的概念相比,图像中有什么相似或不同之处?

为了实现这一点,将创建一个目标函数,通过引用嵌入来计算模型输出的相似性与不同。本示例将只使用resnet50 Global Average Pooling层的输出,并删除全连接部分

# A model wrapper that gets a resnet model and returns the features before the fully connected layer.

class ResnetFeatureExtractor(torch.nn.Module):

    def __init__(self, model):

        super(ResnetFeatureExtractor, self).__init__()

        self.model = model

        self.feature_extractor = torch.nn.Sequential(*list(self.model.children())[:-1])

                

    def __call__(self, x):

        return self.feature_extractor(x)[:, :, 0, 0]

目标函数

对于分类网络,这通常是模型类别输出之一,例如,ClassifierOutputTarget(281)。然而,这里的目标是与目标嵌入的相似性(或不相似性),所以将为这个用例实现它。

① 相似

class SimilarityToConceptTarget:

    def __init__(self, features):

        self.features = features

    

    def __call__(self, model_output):

        cos = torch.nn.CosineSimilarity(dim=0)

        return cos(model_output, self.features)

② 不同

class DifferenceFromConceptTarget:

    def __init__(self, features):

        self.features = features

    

    def __call__(self, model_output):

        cos = torch.nn.CosineSimilarity(dim=0)

        return 1 - cos(model_output, self.features)

目标层

希望使用模型中具有2D空间输出的哪一层。这通常是网络中最后一个卷积层的输出。

target_layers = [resnet.layer4[-1]]

1 安装pytorch-gradcam

pip install grad-cam==1.4.8 -i https://pypi.tuna.tsinghua.edu.cn/simple

2 实践

① 代码

import warnings
warnings.filterwarnings('ignore')
warnings.simplefilter('ignore')
from torchvision.models.segmentation import deeplabv3_resnet50
import torch
import numpy as np
import cv2
import torchvision
from pytorch_grad_cam.utils.image import show_cam_on_image, preprocess_image
from pytorch_grad_cam import GradCAM
import matplotlib.pyplot as plt
import os


# 这部分根据自己的实际路径去对应
os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = '/home/test/anaconda3/envs/yolov11/lib/python3.9/site-packages/PyQt5/Qt5/plugins'

# A model wrapper that gets a resnet model and returns the features before the fully connected layer.
class ResnetFeatureExtractor(torch.nn.Module):
    def __init__(self, model):
        super(ResnetFeatureExtractor, self).__init__()
        self.model = model
        self.feature_extractor = torch.nn.Sequential(*list(self.model.children())[:-1])

    def __call__(self, x):
        return self.feature_extractor(x)[:, :, 0, 0]


def dealImg(imgpath):
    img = cv2.imread(imgpath)
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    img = cv2.resize(img, (512, 512))
    rgb_img_float = np.float32(img) / 255
    input_tensor = preprocess_image(rgb_img_float, mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
    return img, rgb_img_float, input_tensor


class SimilarityToConceptTarget:
    def __init__(self, features):
        self.features = features

    def __call__(self, model_output):
        cos = torch.nn.CosineSimilarity(dim=0)
        return cos(model_output, self.features)


class DifferenceFromConceptTarget:
    def __init__(self, features):
        self.features = features

    def __call__(self, model_output):
        cos = torch.nn.CosineSimilarity(dim=0)
        return 1 - cos(model_output, self.features)


def RUN(carimg_path, cloudimg_path, testimg_path):
    car_img, car_img_float, car_tensor = dealImg(carimg_path)
    cloud_img, cloud_img_float, cloud_tensor = dealImg(cloudimg_path)
    img, img_float, tensor = dealImg(testimg_path)
    resnet = torchvision.models.resnet50(pretrained=True)
    resnet.eval()
    model = ResnetFeatureExtractor(resnet)

    car_concept_features = model(car_tensor)[0, :]
    cloud_concept_features = model(cloud_tensor)[0, :]

    target_layers = [resnet.layer4[-1]]
    # 相似性
    car_targets = [SimilarityToConceptTarget(car_concept_features)]
    cloud_targets = [SimilarityToConceptTarget(cloud_concept_features)]
    # Where is the car in the image
    with GradCAM(model=model, target_layers=target_layers, use_cuda=False) as cam:
        car_grayscale_cam = cam(input_tensor=tensor, targets=car_targets)[0, :]
    car_cam_image = show_cam_on_image(img_float, car_grayscale_cam, use_rgb=True)
    # Where is the cloud in the image
    with GradCAM(model=model, target_layers=target_layers, use_cuda=False) as cam:
        cloud_grayscale_cam = cam(input_tensor=tensor, targets=cloud_targets)[0, :]
    cloud_cam_image = show_cam_on_image(img_float, cloud_grayscale_cam, use_rgb=True)

    # 非相似
    not_car_targets = [DifferenceFromConceptTarget(car_concept_features)]
    not_cloud_targets = [DifferenceFromConceptTarget(cloud_concept_features)]
    with GradCAM(model=model, target_layers=target_layers, use_cuda=False) as cam:
        not_cloud_grayscale_cam = cam(input_tensor=tensor, targets=not_cloud_targets)[0, :]
    cam_image_notcloud = show_cam_on_image(img_float, not_cloud_grayscale_cam, use_rgb=True)
    # Where is the car not in the image?
    with GradCAM(model=model, target_layers=target_layers,use_cuda=False) as cam:
        not_car_grayscale_cam = cam(input_tensor=tensor,targets=not_car_targets)[0, :]
    cam_image_notcar = show_cam_on_image(img_float, not_car_grayscale_cam, use_rgb=True)

    # display
    result1 = np.hstack((cloud_img, cloud_cam_image, car_img, car_cam_image))
    result2 = np.hstack((cloud_img, cam_image_notcloud, car_img, cam_image_notcar))
    titles = ["SimilarityToConceptTarget", "DifferenceFromConceptTarget"]
    imgs = [result1, result2]
    for i in range(2):
        plt.subplot(2, 1, i + 1), plt.imshow(imgs[i])
        plt.title(titles[i])
    plt.savefig("result.jpg")
    plt.show()


if __name__ == '__main__':
    RUN("car.jpg", "clouds.jpg", "test.jpg")
    pass

② 效果图

至此,本文分享的内容就结束啦。

标签:Adapting,embeddin,DL,features,img,self,__,cam,model
From: https://blog.csdn.net/wss794/article/details/143591050

相关文章

  • SCC.369 Working with GPIO Moodle
    SCC.369Coursework1:WorkingwithGPIO Moodlesubmission16:00Fridayweek4;weighting33%ofmodule.AimHavingfamiliarizedyourselfwiththeCdevelopmentenvironmentandthebasicprocessofwritingtoregisterstocontroltheGPIOpins,inthiscour......
  • 96_api_intro_metadata_middleschool
    全国中学基础信息API数据接口基础数据,高校高考,提供全国初级高级中学基础数据,定时更新,多维度筛选。1.产品功能2024年数据已更新;提供最新全国中学学校基本信息;包含全国初级中学与高等中学;总计近10万条全国中学精准数据;每月一次数据自动更新校正;包含学校各类属性信息......
  • IDEA远程运行使用rsync异常:rsync: connection unexpectedly closed (0 bytes received
    前提:已经使用了Cygwin64且IDEA版本2023、2024均有这个问题发生这个问题可能是使用的是windows自带的C:\Windows\System32\OpenSSH\ssh.exe安装Cygwin64时,需要同时选择安装rsync和ssh。第一次安装没选也没关系,可以再次运行安装程序安装,不用删除上一次的安装。或者使用Cygwin64T......
  • 词嵌入方法(Word Embedding)
    词嵌入方法(WordEmbedding)WordEmbedding是NLP中的一种技术,通过将单词映射到一个空间向量来表示每个单词✨️常见的词嵌入方法:......
  • SSL 固定(SSL Pinning)是一种提高应用程序安全性的技术,用于防止中间人攻击(MITM,Man-in-th
    SSL固定(SSLPinning)是一种提高应用程序安全性的技术,用于防止中间人攻击(MITM,Man-in-the-Middleattacks)和证书伪造攻击。它通过将服务器的SSL/TLS证书或其公钥“固定”到客户端应用程序中,确保客户端在与服务器通信时只信任特定的证书或公钥,从而降低了遭遇伪造证书或中间人攻击的......
  • UE5.4 打包 Android, gradle time out下载失败解决办法
     Downloadinghttps://services.gradle.org/distributions/gradle-7.5-all.zip        atjava.base/sun.net.www.http.HttpClient.openServer(HttpClient.java:531)        atjava.base/sun.net.www.http.HttpClient.openServer(HttpClient.java:636) ......
  • paddleSOT beginner
    paddleSOTbeginner入门学习一个例子说明什么是动转静示例:在动态图和静态图中的简单计算假设我们有一个简单的神经网络模型,每次输入一个张量x,然后做一些数学运算并输出结果。这个过程使用PaddlePaddle框架中的动转静技术可以分为两个部分来说明。1.动态图实现在动态图模......
  • 解决安装Dreamweaver时出现vic32.dll错误的方法(提示vic32.dll错误怎么办)
    在安装AdobeDreamweaver时,有时会遇到“vic32.dll”文件缺失或加载失败的错误提示。这不仅会影响安装过程,还会导致软件无法正常运行。本文将详细介绍如何解决这一问题,确保Dreamweaver能够顺利安装和使用。错误原因1.文件缺失:vic32.dll文件可能由于各种原因(如病毒攻击、系统......
  • 遇到XINPUT1-3.dll未在Windows上指定运行?尝试这些解决方案
    当出现“XINPUT1-3.dll没有被指定在Windows上运行”这样的错误提示时,可能是由于以下几种原因导致的,下面是一些相应的解决方法:一、文件损坏或不兼容1.重新下载DLL文件从可靠的来源获取XINPUT1-3.dll文件。最好是从微软官方网站或者游戏官方网站寻找该文件。避......
  • iedkcs32.dll文件丢失如何是好?详解找回IE浏览器加密DLL文件的方案
    在使用InternetExplorer(IE)浏览器时,有时可能会遇到iedkcs32.dll文件丢失的问题。这个文件是IE浏览器的一个重要组成部分,负责处理加密和解密任务,确保浏览器的安全通信。一旦iedkcs32.dll文件丢失,IE浏览器可能无法正常工作,甚至可能无法启动。那么,当iedkcs32.dll文件丢失时,我们应......