论文阅读 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-Lengthurl: https://conda.anaconda.org/nvidia/win-64/libcublas-dev-11.11.3.6-0.tar.bz2target_path: D:\Program\anaconda3\pkgs\libcublas-dev-11.11.3.6-0.tar.bz2Content-Length: 394161490downloaded 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.357271An 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)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于ensp的园区网络搭建综合实验

核心技术介绍 1、虚拟局域网&#xff08;VLAN&#xff09; 2、链路聚合&#xff08;E-trunk&#xff09; 3、多生成树协议&#xff08;MSTP&#xff09; 4、VLANIF三层逻辑接口 5、虚拟路由冗余协议&#xff08;VRRP&#xff09; 6、开放式最短路径优先&#xff08;OSPF&…

灵动岛动效:打造沉浸式用户体验

灵动岛是专属于 iPhone 14 Pro 系列交互UI&#xff0c;通过通知消息的展示和状态的查看与硬件相结合&#xff0c;让 iPhone 14 Pro 系列的前置摄像头和传感器的“感叹号”&#xff0c;发生不同形状的变化。这样做的好处是让虚拟软件和硬件的交互变得更为流畅&#xff0c;以便让…

手机建站介绍

随着科技的不断进步和移动互联网的普及&#xff0c;手机应用已经成为人们生活中最不可或缺的一部分。而手机建站作为一种新兴技术&#xff0c;在这一领域也有着广泛的应用。本文将为大家介绍手机建站的概念、优势和应用。 什么是手机建站&#xff1f; 手机建站是指将传统的网络…

信息系统项目管理师0144:裁剪考虑因素(9项目范围管理—9.2项目范围管理过程—9.2.2裁剪考虑因素)

点击查看专栏目录 文章目录 9.2.2 裁剪考虑因素 9.2.2 裁剪考虑因素 因为每个项目都是独特的&#xff0c;所以项目经理可能根据需要裁剪项目范围管理过程。裁剪时应考虑的因素包括&#xff1a; 知识和需求管理&#xff1a;项目经理应建立哪些指南&#xff1f;为了在未来项目中…

利用opencv-python实现图像全景拼接技术实现

这个代码的主要功能是将多张图像拼接成一张全景图。它使用了OpenCV库中的SIFT特征提取、特征匹配和图像变换等技术来实现图像拼接。 一、预览效果 二、安装依赖 contourpy1.2.1 cycler0.12.1 fonttools4.53.0 importlib_resources6.4.0 kiwisolver1.4.5 matplotlib3.9.0 numpy…

【数据结构】——线性表(顺序表)——内有代码详解

目录 一、引言 二、线性表 2.1 定义 2.2 特点 三、顺序表 3.1 顺序表的概念 3.2 顺序表的特点 3.3 顺序表的定义 3.3.1 静态定义 3.3.2 动态定义 3.4 顺序表的初始化 3.4.1 静态初始化 3.4.2 动态初始化 3.5 顺序表的销毁 3.6 顺序表元素的打印 3.7 顺序表的插入…

Golang | Leetcode Golang题解之第135题分发糖果

题目&#xff1a; 题解&#xff1a; func candy(ratings []int) int {n : len(ratings)ans, inc, dec, pre : 1, 1, 0, 1for i : 1; i < n; i {if ratings[i] > ratings[i-1] {dec 0if ratings[i] ratings[i-1] {pre 1} else {pre}ans preinc pre} else {decif dec…

前端面试项目细节重难点(已工作|做分享)想(八)

面试官&#xff1a;请你讲讲你在该项目中遇到的印象深刻的问题是什么&#xff1f; 答&#xff1a;我的回答&#xff1a;该项目的实现过程中我确实遇到了问题&#xff1a;【我会给大家整理回答思路和角度&#xff0c;那那么遇到这样的问题也可借鉴这种思路进行阐述】 第一层面…

JSONPath使用指南(掌握JSON数据提取)

大家好&#xff0c;在处理 JSON&#xff08;JavaScript Object Notation&#xff09;数据时&#xff0c;有时需要从复杂的结构中提取特定部分。JSONPath 就是一个非常有用的工具&#xff0c;它提供了一种简洁而强大的方式来定位和提取 JSON 数据中的元素。无论是在 Web 开发中处…

Linux-桌面操作系统在服务器上未关闭休眠机制,使其开机半小时左右死机无法远程ssh连接

故障表述 操作系统:ubuntu desktop 18.04 异常描述:开机半小时左右死机 1、登录iBMC查看硬件无异常 2、登录ubuntu desktop 18.04操作系统,导出日志文件syslog、dmesg、lastlog(路径:/var/log),操作系统在11月8号~11月9号之间出现异常 经分析操作系统日志文件,操作系…

OpenStack云平台管理

OpenStack云平台管理 文章目录 OpenStack云平台管理资源列表基础环境一、部署Openstack二、创建网络和路由2.1、删除默认的网络2.2、创建网络和路由2.2.1、创建外部网络2.2.2、创建内部网络 2.3、创建路由 三、创建实例3.1、配置实例3.2、配置NAT转换 四、绑定浮动IP地址五、添…

【TB作品】MSP430F149 单片机 音乐喷泉

功能 声音越大&#xff0c;亮的灯越多。 oled显示出当前的声音大小。 硬件接线 //OLED----MSP430 //VCC-----3.3V //GND-----GND //D0------P3.2 //D1------P3.0 //RES-----P2.0 //DC------P2.2 //CS------P8.1 led P4八个引脚 adc P6.0 部分代码 _EINT();while (1){adok…

上位机图像处理和嵌入式模块部署(f407 mcu中的项目开发特点)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 和soc相比较&#xff0c;mcu的项目规模一般不算大。因为&#xff0c;soc项目中&#xff0c;从规划、硬件开发、驱动、应用端、服务器端到测试&…

举个栗子!Quick BI 技巧(8):柱形图的制作及应用

众所周知&#xff0c;在数据分析中&#xff0c;柱形图是利用率非常高的一种图&#xff0c;主要是用于比较各组数据之间的差别&#xff0c;并且可以显示一段时间内的数据变化情况。那么在 Quick BI 中要如何来制作柱形图呢&#xff1f; 今天的栗子&#xff0c;我们就来分享如何…

DP:子序列模型

子数组vs子数列 1、子数组&#xff08;n^2&#xff09; 子序列(2^n) 2、子数组是子序列的一个子集 3、子数组必须连续&#xff0c;子序列可以不连续 一、最长递增子序列 . - 力扣&#xff08;LeetCode&#xff09; 算法原理&#xff1a; 1、状态表示&#xff…

数据管理积重难返?这有一个新药方丨直播预告

大数据产业创新服务媒体 ——聚焦数据 改变商业 在数智化转型的浪潮中&#xff0c;数据管理领域正面临着前所未有的挑战和机遇。企业在数据管理过程中&#xff0c;普遍遭遇数据孤岛、数据质量不佳、存储和处理成本高昂、数据安全与隐私保护压力以及多源异构数据整合困难等诸多…

【MMU】——MMU 页命中/缺页

文章目录 MMU 页命中/缺页MMU 命中MMU 缺页 MMU 页命中/缺页 MMU 命中 处理器产生一个虚拟地址。MMU生成 PTE 地址&#xff0c;并从高速缓存/主存请求得到它。高速缓存/主存向 MMU 返回 PTE。MMU 构造物理地址&#xff0c;并把它传送给高速缓存/主存。高速缓存/主存返回所请求…

SpringBoot引入WebSocket依赖报ServerContainer no avaliable

1、WebSocketConfig 文件报错 Configuration EnableWebSocket public class WebSocketConfig {Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}2、报错内容 Exception encountered during context initialization - canc…

SpringBoot+Vue校园管理系统(前后端分离)

技术栈 JavaSpringBootMavenMyBatisMySQLVueElement-UIShiro 系统角色 管理员用户院系管理员 系统功能截图

《互联网政务应用安全管理规定》电子邮件安全如何整改?

继上篇文章&#xff08;解读《互联网政务应用安全管理规定》网络和数据安全中的身份认证和审计合规&#xff09;之后&#xff0c;本篇文章继续解读第五章“电子邮件安全”&#xff0c;为党政机关事业单位提供电子邮件系统整改思路。 “电子邮件安全”内容从第三十一条到第三十…