论文阅读 Explainable Image Similarity Integrating Siamese Networks and Grad-CAM

给出论文(Explainable Image Similarity Integrating Siamese Networks and Grad-CAM)的内容解读、代码运行说明

论文链接:J. Imaging | Free Full-Text | Explainable Image Similarity: Integrating Siamese Networks and Grad-CAM (mdpi.com)

代码文件:ioannislivieris/Grad_CAM_Siamese (github.com)

论文理解

Grad CAM Siamese 算法集成了孪生网络和 Grad-CAM,以提供图像相似性任务的可解释性。前者用于计算两个输入图像之间的相似性,而后者用于可视化和解释由基于卷积的孪生网络做出的决策。

该算法的一个优点是,它能够提供图像相似度评分以及支持决策的视觉直观解释(事实解释)和不支持决策的解释(反事实解释)。

非事实性解释:当删除这些特征,决策会更加准确,或理解为:a description of “what would have not happened when a certain decision was taken”。详见参考文献19:Grad-CAM: Visual Explanations from Deep Networks via Gradient-based Localization

数据集

  1. 花卉数据集(Flowers dataset):
    • 包含4242张花卉图片,分辨率为320×240。
    • 图片被分类为五个类别:“chamomile”(甘菊)、“tulip”(郁金香)、“rose”(玫瑰)、“sunflower”(向日葵)和“dandelion”(蒲公英)。
  2. 皮肤癌数据集(Skin cancer dataset):
    • 包含2800张图片,分辨率为224×224。
    • 图片涉及1400个恶性(Malignant)和1400个良性(Benign)的肿瘤病例。
  3. AirBnB数据集(AirBnB dataset):
    • 包含864张室内和室外房屋图片,分辨率为600×400。
    • 图片被分类为12个类别:“backyard”(后院)、“basement”(地下室)、“bathroom”(浴室)、“bedroom”(卧室)、“decor”(装饰)、“dining-room”(餐厅)、“entrance”(入口)、“house-exterior”(房屋外观)、“kitchen”(厨房)、“living-room”(客厅)、“outdoor”(户外)、“staircase”(楼梯)和“TV room”(电视房)。

模型训练过程

  1. 创建训练对。对于训练数据集中的每张图片,研究者会随机选择另外两张图片。其中一张图片与原始图片属于同一个类别(同类图片),另一张图片属于不同的类别(异类图片)。也因此,Training instances、Validation instances、Testing instances输出均为偶数,而且三者和为输入图片数的两倍。
  2. 分配标签。如果两张图片属于同一个类别,这对图片会被标记为标签零(0)。这意味着它们是相似的或相同的。如果两张图片属于不同的类别,这对图片会被标记为标签一(1)。这意味着它们是不同的。
  3. 定义相似度。孪生网络的输出是一个距离值,它表示两张图片之间的相似程度。距离值越小,表示图片越相似;距离值越大,表示图片越不相似。相似度是通过 1 减去距离值 d 来定义的,即相似度 = 1 − d。这样,如果d接近0(即图片非常相似),相似度就会接近1;如果d较大(即图片不相似),相似度就会接近0。当然可以预设阈值为 0.5 来准确判断相似与否,这也是论文中所采用的方式。
  4. 通过随机选择正样本(同一类别的图片)和负样本(不同类别的图片),孪生网络可以通过对比学习来优化其参数,使得正样本间的距离减小,负样本间的距离增大。
  5. 对于正样本对(同一类别的图片),我们希望这个得分接近1(或较高的值),表示它们是相似的;对于负样本对(不同类别的图片),我们希望得分接近0(或较低的值),表示它们是不相似的。

关于计算相似度值的细节:

02.Inference.pypred = model(image1, image2),调用 utils/Siamese.pyforward(),进一步利用欧氏距离 F.pairwise_distance 计算距离值,并将这个距离视为不相似度,后面 1-model() 就是相似度。

损失函数计算公式
L = 1 2 [ ( 1 − y ) ( D w ) 2 + y { max ⁡ ( 0 , m − D w ) } 2 ] , \mathcal{L}=\frac{1}{2}\left[(1-y)\left(D_w\right)^2+y\left\{\max \left(0, m-D_w\right)\right\}^2\right], L=21[(1y)(Dw)2+y{max(0,mDw)}2],
where D w D_w Dw is the model’s output and m m m is the margin value, which was set to 2 .

损失函数的取值范围为:[0, +∞],详见参考文献34:Understanding the Behaviour of Contrastive Loss

应用场景

论文针对三种数据集分别进行训练和评估,下面详细介绍花卉、房间数据集的结果,以便更好理解事实性解释和非事实性解释以及对模型输出的解读。
在这里插入图片描述

上面两个图象均属于玫瑰类别。模型的预测值为 0.24,也即模型预测输入图像间的相似性为 76%。由于相似度得分大于预定义的阈值 0.5,因此模型提示输入图像属于同一类。图 a、d 为原图,对比图 b、e,可知模型做出相似的的决策依据为花瓣处,对比图 c、f,可知模型做出不相似的的决策依据为花茎处,或者说,如果改变两朵花的花茎处,那么能提高图像的相似度,使得相似这一决策更加准确。

在这里插入图片描述

上面两个图象均属于 AirBnB 数据集中的不同类别,即第一张图片属于卧室类,而第二张图片属于客厅类。模型预测值为 0.516,即相似度得分为 48.4%,表明该模型预测输入图像大致属于不同的类。图 b、e 表明模型将重点放在第一张图像中的椅子和第二张图像中的灯、壁炉和时钟上,以预测图像不相似。图 c、f 给出了两幅图像的反事实解释,这表明模型分别关注了第一幅和第二幅图像中的床和沙发,以及两幅图像中呈现的桌子。两张图像都有一个共同的项目(桌子)以及两个视觉上相似的项目(床和沙发),所以有 48.4% 的相似得分。

代码复现

代码层级目录

- checkpoints  # 存放训练好的模型
  - car
    |-- model.pth  # 此文件为未训练至拟合的模型
- Data  # AirBnB、Flowers、Skin_cancer 均为论文提供的数据集
        # data_for_compare 是用于计算相似度的图片文件夹
  - AirBnB
    |-- class 1  # 每个class文件夹下,存放图片文件
    |-- class 2
    |-- ...
  - car
    |-- class 1
    |-- class 2
    |-- ...
  - Flowers
    |-- class 1
    |-- class 2
    |-- ...
  - ...
- utils  # 工具类文件夹
  - dataset.py
  - early_stopping.py
  - Grad_CAM.py
  - imshow.py
  - ...
- 01.Train_Siamese_model.ipynb  # 用于训练模型,测试集评估模型
- 02.Inference.ipynb  # 利用训练好的模型计算两个图片的相似度
- environment.yml  # 环境依赖
- README.md

环境配置

conda 环境

基础环境:Anaconda 3、文本编辑器(非必要,如:vscode、notepad++)

方式一:

# 切换路径至 environment.yml 所在目录
> conda env create -f environment.yml
# 切换虚拟环境
> conda activate pytorch_siamese

方式二:(推荐)

# 根据 environment.yml 文件中的 python 版本信息,先创建带有 Python 版本的虚拟环境(h6244533_0 标识特定版本)
> conda create -n pytorch_siamese python=3.8.17=h6244533_0
# 切换虚拟环境
> conda activate pytorch_siamese
# 若网络下载慢,则做如下设置。意为:若 1000s 没有收到任何数据,就认为是一个超时错误,默认值为 60s
> conda config --set remote_read_timeout_secs 1000.0
# 切换目录至 environment.yml 所在路径,安装其他包
> conda env update --file environment.yml

不需要设置镜像源,保持默认即可。

如果下载扩展包失败,可以尝试将 environment.yml 文件拆封成多个文件,多次小批量下载 Python 扩展包,定位到不易下载的扩展包,搜索相关解决办法。

添加镜像源下载 Python 扩展包时,可能出现报错信息有:error3、error4,因未能解决,故不推荐设置镜像源。

GPU 配置

nvcc -V 查看 CUDA 编译器版本;nvidia-smi 查看 NVIDIA 驱动支持 CUDA 的版本。

较低版本的 CUDA 编译版本可以在较高版本驱动下运行,为了确保最佳兼容性和充分利用新特性,理想的情况是确保 CUDA 工具包版本与 GPU 驱动支持的 CUDA 运行时版本相匹配或相近。

有时需要指定某一块 GPU 用于训练模型,需要为每块 GPU 指定唯一的编号,而后在代码中指定 GPU。

代码运行

  1. 更新数据集。汽车图片数据存放在 \Data\car 中,图片大小与已有汽车图片保持统一,均为:宽 1200px,高 800px,若大小不一致,则 02.Inference.ipynb 输出的图像变形,暂时未知是否对模型训练有影响。子文件夹按汽车类别划分,文件夹名称无要求,最好直观可理解,目录层级关系详见「代码层级目录」。
  2. 更新 config.yml 文件中的参数,如:backbone_model、optimizer。
  3. 运行 01.Train_Siamese_model.ipynb,训练模型并用测试集评估。运行 Training 部分可能会报错 「报错记录及解决」部分的 error1,按提供的解决方法操作即可。
  4. 运行 02.Inferences.ipynb 计算两个图像的相似度,并以热力图的形式展示两张图像的事实性解释(Factual explanations)和非事实性解释(Counterfactual explanations),以获得可解释的结果。其中,用于比对相似度的图像,需要手动设置路径。代码会输出热力图等图片到当前路径下,需及时存放输出图片,以免被覆盖。

报错记录及解决

error1 - Initializing libiomp5md.dll, but found libiomp5md.dll already initialized

本报错信息,出现在 Training 部分。

详细报错信息:

OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized.
OMP: Hint This means that multiple copies of the OpenMP runtime have been linked into the program. That is dangerous, since it can degrade performance or cause incorrect results. The best thing to do is to ensure that only a single OpenMP runtime is linked into the process, e.g. by avoiding static linking of the OpenMP runtime in any library. As an unsafe, unsupported, undocumented workaround you can set the environment variable KMP_DUPLICATE_LIB_OK=TRUE to allow the program to continue to execute, but that may cause crashes or silently produce incorrect results. For more information, please see http://www.intel.com/software/products/support/.

解决办法:

若代码基于 conda 虚拟环境 pytorch_siamese 中的 Python 运行,那么删除 .\anaconda3\envs\pytorch_siamese\Library\bin 中的 libiomp5md.dll

若代码基于 base 环境中的 Python运行(不建议这样),则删除 .\anaconda3\Library\bin\libiomp5md.dll 文件。

参考链接:

关于OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized.错误解决方法 - 知乎 (zhihu.com)

就是他!让你的python内核莫名挂掉 | KMP_DUPLICATE_LIB_OK=TRUE 的始作俑者 - 知乎 (zhihu.com)

error2 - CondaError: Downloaded bytes did not match Content-Length

CondaError: Downloaded bytes did not match Content-Length
  url: https://conda.anaconda.org/nvidia/win-64/libcublas-dev-11.11.3.6-0.tar.bz2
  target_path: D:\Program\anaconda3\pkgs\libcublas-dev-11.11.3.6-0.tar.bz2
  Content-Length: 394161490
  downloaded bytes: 389249421
> conda config --set remote_read_timeout_secs 1000.0

error3 - CondaHTTPError: HTTP 429 TOO MANY REQUESTS

CondaHTTPError: HTTP 429 TOO MANY REQUESTS for url <https://mirrors.ustc.edu.cn/anaconda/cloud/menpo/win-64/repodata.json>
Elapsed: 00:49.357271

An HTTP error occurred when trying to retrieve this URL.
HTTP errors are often intermittent, and a simple retry will get you on your way.
'https//mirrors.ustc.edu.cn/anaconda/cloud/menpo/win-64'

不清楚是不是访问量太多,导致报错。尝试删除在镜像源中报错链接,但又会出现新的报错链接。

error4 - 尝试 aliyun 报错

UnavailableInvalidChannel: HTTP 403 FORBIDDEN for channel anaconda/pkgs/msys2 <http://mirrors.aliyun.com/anaconda/pkgs/msys2>

应该是阿里云的链接无法访问。

error5 - 根据 environment.yml 下载扩展包时,报错 UnicodeDecodeError

详细报错信息:UnicodeDecodeError: 'gbk' codec can't decode byte 0xff in position 0: illegal multibyte sequence

原因:yaml 文件编码非 utf-8,重新设置编码即可

具体操作(以 vscode 为例):用 vscode 打开 yaml 文件后,点击右下角文件编码,save with Encoding -> UTF-8

error6 - torch.cuda.OutOfMemoryError: CUDA out of memory

x详细报错信息:torch.cuda.OutOfMemoryError: CUDA out of memory. Tried to allocate 236.00 MiB (GPU 0; 23.65 GiB total capacity; 13.64 GiB already allocated; 49.12 MiB free; 18.92 GiB allowed; 13.85 GiB reserved in total by PyTorch) If reserved memory is >> allocated memory try setting max_split_size_mb to avoid fragmentation

解决办法:减小batch_size

error7 - 下载包时,报错 Solving environment: failed、ResolvePackageNotFound

原因:environment.yml 中对扩展包除了有版本号约束,还有特定版本标识,如: tqdm=4.65.0=pyhd8ed1ab_1,这导致难以找到对应的版本。

解决方法1:将 conda-forge 添加到 channel 列表,以便搜索扩展包时也在 conda-forge channel 中查找:

> conda config --append channels conda-forge

解决方法2:根据报错信息的提示,进入 Anaconda Cloud 中,寻找指定版本的扩展包并下载。

  1. 搜索指定扩展包
  2. 查看列表中的扩展包及版本号
  3. 点击目标版本的扩展包链接
  4. intallers 部分,找到 conda 下载命令

解决方法3:删除 yaml 文件中的第二个等号后的内容。如果仍报错,则将报错的扩展包暂时不安装,等其他扩展包安装好后再安装。

解决方法4:在 Anaconda Cloud 中寻找指定版本扩展包的 Files,离线下载扩展包。此方法不推荐,可能导致 conda 无法识别到来源(unknown),并报错。

补充:Linux 系统/服务器中安装 Anaconda

  1. 通过在 Linux 终端中运行 uname -m 命令来确定的系统架构

  2. 下载 Anaconda。访问 Anaconda 官方网站 或者 清华大学开源软件镜像站 等提供下载链接的网站。

  3. 选择版本。在下载页面,找到对应于的操作系统和系统架构的 Anaconda 安装包链接。

  4. 使用 wget 命令在 Linux 终端中下载安装包。例如:

    wget https://repo.anaconda.com/archive/Anaconda3-2024.02-1-Linux-x86_64.sh
    
  5. 下载完成后,给予安装脚本执行权限:

    chmod +x Anaconda3-2024.02-1-Linux-x86_64.sh
    
  6. 执行安装脚本开始安装过程:

    ./Anaconda3-2024.02-1-Linux-x86_64.sh
    
  7. 按照安装程序的提示进行操作,阅读并接受许可协议,选择安装路径,并决定是否要初始化 Anaconda 环境变量。浏览协议,enter,最后yes

  8. 配置环境变量

    vim ~/.bashrc
    
    # 在末尾添加如下语句,此处路径为 anacodda3 实际安装路径
    export PATH=/home/xxxx/anacodnae/bin:$PATH
    
    # 添加完后激活环境
    source ~/bashrc
    
  9. conda -V 测试


参考文章:

PyTorch 代码中 GPU 编号与 nvidia-smi 命令中的 GPU 编号不一致问题解决方法

PackagesNotFoundError: The following packages are not available from current channels的解决办法-CSDN博客

解决创建conda环境时Solving environment: failed 和 ResolvePackageNotFound 的错误_solving environment: failed resolvepackagenotfound-CSDN博客

图像相似度分析——相似度算法 (qq.com)
图片相似度计算(CVPR2015-DeepCompare) (qq.com)
无需训练/部署模型,一文学会图像相似度算法pHash原理和实战 (qq.com)

图像相似度分析——相似度算法 (qq.com)
图片相似度计算(CVPR2015-DeepCompare) (qq.com)
无需训练/部署模型,一文学会图像相似度算法pHash原理和实战 (qq.com)
教你如何实现图片特征向量提取与相似度计算 (qq.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/689129.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大数据开发统计数据的详细口径是什么

在进行开发数据需求之前&#xff0c;我们先要明确数据统计的详细口径是什么。 需求1&#xff1a;&#xff08;不明确的示例&#xff09; 统计商品的销售数量。 存在的问题&#xff1a; 这个需求表述过于简单&#xff0c;未明确指出统计商品销售数量的时间范围、商品类型等关键…

算法:前缀和题目练习

目录 题目一&#xff1a;一维前缀和[模版] 题目二&#xff1a;二维前缀和[模版] 题目三&#xff1a;寻找数组的中心下标 题目四&#xff1a;除自身以外数组的乘积 题目五&#xff1a;和为K的子数组 题目六&#xff1a;和可被K整除的子数组 题目七&#xff1a;连续数组 题…

LIUNX系统编程:信号(3)

目录 3.信号的处理 3.1信号是什么时候被处理的 read系统调用 3.2信号是怎样被处理的 内核态和用户态 3.3操作系统是如何运行处理信号的呢&#xff1f; 中断技术 什么让操作系统运行起来的 3.4捕捉信号的其他方式 ​编辑 demo代码 3.信号的处理 3.1信号是什么时候被处…

当C++的static遇上了继承

比如我们想要统计下当前类被实例化了多少次&#xff0c;我们通常会这么写 class A { public:A() { Count_; }~A() { Count_--; }int GetCount() { return Count_; }private:static int Count_; };class B { public:B() { Count_; }~B() { Count_--; }int GetCount() { return …

谷歌的AI大变革:商业模式转型

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

数字模拟EDA研发环境搭建

中小企业数字模拟EDA研发环境部署、集群搭建、网络配置、硬件咨询、数据备份、技术指导、环境生命周期维护等&#xff0c;Cadence、Synopsys、Mentor、Keysight、ANSYS&#xff0c;MATLAB、Xilinx等厂商软件工具安装调试。 EDA研发环境搭建经验交流&#xff0c;请加V

数据泄露防护(DLP)系统有哪些?2024年数据泄露防护系统TOP5排名

数据泄露防护&#xff08;DLP&#xff09;系统是企业为确保敏感信息不被非法访问、使用或泄露而采用的重要安全策略。以下是一些常见的数据泄露防护系统&#xff0c;以及它们的功能和优点。 1、安企神 DLP 安企神 DLP是一款为企业研发的数据防泄漏系统&#xff0c;以强大的功能…

超过20W个高质量组件的开源PCB库

项目介绍 Celestial Altium Library是由Altium行业专家Mark Harris创建的一个庞大的免费开源数据库库&#xff0c;专为Altium Designer而设计&#xff0c;库中包含超过20万个优质组件 . 特点 高质量数据&#xff1a;Celestial Altium Library注重数据的质量&#xff0c;用户可…

AIGC之Stable Diffusion Web Ui 初体验

前言 Stable Diffusion辣么火&#xff0c;同学你确定不尝试一下嘛&#xff1f; 纯代码学习版本搞啦&#xff0c;Web Ui 也得试试咧 网上有很多安装Stable Diffusion Web Ui 的介绍了&#xff0c;我在这说一下我的踩坑记录 想安装的同学&#xff0c;看这个链接 万字长文&#x…

采用JWT令牌和Filter进行登录拦截认证

原理描述&#xff1a; 1、第一次登录的时候&#xff0c;生成JWT令牌&#xff0c;并JWT令牌存放在localStorage。 localStorage.setItem(token, token); 2、每次通过axios发送请求的时候&#xff0c;都将这个令牌获取&#xff0c;并放于header中发送。 也就是JWT令牌只在登录…

【Linux】Centos7升级内核的方法:yum更新(ELRepo)

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主。 &#x1f913; 同时欢迎大家关注其他专栏&#xff0c;我将分享Web前后端开发、人工智能、机器学习、深…

SpringCloud中注册中心Nacos的下载与使用步骤

1.前言 Nacos&#xff08;Dynamic Naming and Configuration Service&#xff09;是阿里巴巴开源的一款服务发现和配置管理工具。它可以帮助用户自动化地进行服务注册、发现和配置管理&#xff0c;是面向微服务架构的一个重要组成部分。 2.下载 链接&#xff1a;https://pan.b…

redis学习路线

待更新… 一、nosql讲解 1. 为什么要用nosql&#xff1f; 用户的个人信息&#xff0c;社交网络&#xff0c;地理位置&#xff0c;自己产生的数据&#xff0c;日志等等爆发式增长&#xff01;传统的关系型数据库已无法满足这些数据处理的要求&#xff0c;这时我们就需要使用N…

JAVA-LeetCode 热题-第24题:两两交换链表中的节点

思路&#xff1a; 定义三个指针&#xff0c;其中一个临时指针&#xff0c;进行交换两个节点的值&#xff0c;重新给临时指针赋值&#xff0c;移动链表 class Solution {public ListNode swapPairs(ListNode head) {ListNode pre new ListNode(0,head);ListNode temp pre;wh…

知识图谱的应用---智慧教育

文章目录 智慧教育典型应用 智慧教育 根据《中国互联网教育平台专题分析2018》&#xff0c;2017年中国互联网教育市场规模达到2502亿元人民币,同比增长56.3%&#xff0c;但相比线下整体教育行业而言&#xff0c;互联网教育占比仍然较低,尚有巨大的发展空间。在消费升级、知识付…

计算机网络面试基础(一)

文章目录 一、HTTP基本概念1.HTTP是什么&#xff1f;2.HTTP 常见的状态码有哪些&#xff1f;3.http常见字段 二、GET和POST1.get和post有什么区别 三、HTTP缓存技术1.HTTP 缓存有哪些实现方式&#xff1f;2.什么是强制缓存&#xff1f;3.什么是协商缓存&#xff1f;(不太懂) 四…

Visual C++ Redistributable下载

安装程序的时候提示丢失mfc140u.dll 如下图,查了资料说可以下载Visual C Redistributable来进行处理 下载Visual C Redistributable 1.打开网站 https://www.microsoft.com/zh-cn/download/details.aspx?id48145&751be11f-ede8-5a0c-058c-2ee190a24fa6True) 2.点击下载 …

算法:94. 二叉树的中序遍历

给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[]示例 3&#xff1a; 输入&#xff1a;root [1] 输出&am…

刷完50题,搞定十大网络基础知识

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 上午好&#xff0c;我的网工朋友 咱新手网工&#xff0c;入行之前最需要做的准备之一&#xff0c;就是抓住网络基础知识&#xff0c;毕竟是饭碗&…

信息学奥赛初赛天天练-22-C++基础关键字、进制转换、结构体与联合体的实用技巧大揭秘

PDF文档公众号回复关键字:20240607 单项选择题&#xff08;共15题&#xff0c;每题2分&#xff0c;共计30分&#xff1a;每题有且仅有一个正确选项&#xff09; 1 在C中&#xff0c;下面哪个关键字用于声明一个变量&#xff0c;其值不能被修改&#xff1f;&#xff08; &#…