图像检索技术研究:深度度量与深度散列在相似性学习中的应用比较与实践 - 使用Python与Jupyter环境
引言
在计算机视觉领域,图像检索是一个长期存在并持续受到研究者关注的重要话题。随着大数据时代的到来,如何高效、准确地从海量数据中检索到相似的图像成为一个巨大的挑战。传统的检索方法在大数据环境下表现不佳,而深度学习技术的崛起为图像检索带来了新的机遇。尤其是深度度量和深度散列这两种方法,它们在图像检索的应用中展现出了巨大的潜力。
本文将深入探讨这两种方法的原理、应用,以及它们在实际项目中的效果比较。
1. 相似性学习简介
相似性学习的目标是学习一个函数,该函数可以度量两个输入样本之间的相似度。在图像检索中,这通常意味着比较两张图像的内容是否相似。
代码示例1: 计算图像的相似性
import numpy as np
from sklearn.metrics.pairwise import cosine_similaritydef compute_similarity(image1_feature, image2_feature):return cosine_similarity([image1_feature], [image2_feature])[0][0]# 假设image1_feature和image2_feature是提取的特征
similarity = compute_similarity(image1_feature, image2_feature)
print(f"图像相似度为: {similarity:.2f}")
2. 深度度量学习
深度度量学习的核心思想是利用深度学习模型来学习一个度量空间,在该空间中,相似的样本会被映射到接近的位置,而不相似的样本会被远离。
代码示例2: 使用Siamese网络进行深度度量学习
import tensorflow as tf
from tensorflow.keras.layers import Input, Dense, Flatten, Subtract
from tensorflow.keras.models import Model# 定义Siamese网络
input_shape = (224, 224, 3)
base_network = tf.keras.Sequential([Flatten(input_shape=input_shape),Dense(128, activation='relu'),Dense(64, activation='relu')
])input_1 = Input(shape=input_shape)
input_2 = Input(shape=input_shape)feature_1 = base_network(input_1)
feature_2 = base_network(input_2)distance = Subtract()([feature_1, feature_2])model = Model(inputs=[input_1, input_2], outputs=distance)
model.compile(optimizer='adam', loss='mse')
以上是Siamese网络的基本架构,它可以用于度量两张图像之间的差异。
具体过程请下载完整项目。
3. 深度散列学习
深度散列学习的目标是使用深度学习技术生成紧凑的二进制码(hash codes)来表示数据。这些二进制码可以用于高效的大规模图像检索,因为计算二进制码之间的汉明距离比计算原始特征的欧几里得距离要快得多。
代码示例3: 深度散列网络
import tensorflow as tf
from tensorflow.keras.layers import Input, Dense, Flatten, Lambda
from tensorflow.keras.models import Modeldef binary_activation(x):return tf.sign(x - 0.5)# 定义深度散列网络
input_shape = (224, 224, 3)
base_hash_network = tf.keras.Sequential([Flatten(input_shape=input_shape),Dense(128, activation='relu'),Dense(64, activation='relu'),Dense(32), # 32位散列码Lambda(binary_activation)
])input_image = Input(shape=input_shape)
binary_code = base_hash_network(input_image)hash_model = Model(inputs=input_image, outputs=binary_code)
hash_model.compile(optimizer='adam', loss='mse')
在这个模型中,我们使用了一个Lambda层,它应用了一个简单的阈值函数,将网络的输出转换为二进制形式。
4. 深度度量与深度散列的比较
-
计算效率: 深度散列的主要优势在于检索效率。一旦为数据生成了二进制hash码,检索过程仅需要计算汉明距离,这是一个非常快速的操作。而深度度量则需要在度量空间中计算距离,这在大规模数据集中可能较慢。
-
检索质量: 深度度量学习往往在检索质量上具有优势,因为它直接学习了数据之间的相似性。而深度散列则可能因为二进制限制丢失一些信息。
-
可扩展性: 深度散列非常适合大规模图像检索任务,因为二进制码可以非常紧凑。而深度度量需要更多的存储空间来保存特征。
-
应用场景: 对于需要高效检索的大规模应用,深度散列是首选。而对于需要更高检索质量的应用,深度度量可能更适合。
结论
深度度量学习和深度散列学习在图像检索中都有其优点和应用场景。选择哪一种方法取决于特定的应用需求和优先级。对于需要高效和大规模检索的应用,深度散列是更好的选择;而对于对检索质量有较高要求的应用,深度度量可能更为合适。
具体过程请下载完整项目。
5. 融合深度度量与深度散列的策略
尽管深度度量学习和深度散列学习各有优势,但在某些应用中,将两者结合使用可以实现更好的检索效果。
5.1 双模型策略
一个简单的策略是独立地训练深度度量模型和深度散列模型,并在检索时首先使用深度散列进行快速筛选,然后利用深度度量进行精确匹配。
代码示例4: 双模型策略
def dual_model_retrieval(query_image, database_images, hash_model, metric_model):# Step 1: 使用深度散列模型进行快速筛选query_hash = hash_model.predict(query_image)candidates = []for db_image in database_images:db_hash = hash_model.predict(db_image)hamming_distance = np.sum(np.bitwise_xor(query_hash, db_hash))if hamming_distance < threshold: # threshold可以根据实际需要调整candidates.append(db_image)# Step 2: 使用深度度量模型进行精确匹配query_feature = metric_model.predict(query_image)best_match = Nonebest_distance = float('inf')for candidate in candidates:candidate_feature = metric_model.predict(candidate)distance = np.linalg.norm(query_feature - candidate_feature)if distance < best_distance:best_distance = distancebest_match = candidatereturn best_match
5.2 联合训练策略
为了实现更深入的整合,可以考虑在同一个神经网络中结合深度度量和深度散列的目标。具体来说,网络的损失函数可以是深度度量损失和深度散列损失的加权和。
6. 优化策略和注意事项
-
负采样: 在训练时,选择难分类的负样本(与查询图像不相似的图像)可以提高模型的鉴别性。
-
数据增强: 对训练数据进行随机旋转、裁剪、颜色变换等操作,可以提高模型的泛化能力。
-
多任务学习: 除了图像检索任务外,还可以考虑将其他任务,如分类或分割,与当前任务一同训练,从而提高模型性能。
-
注意事项:尽管深度散列可以大大提高检索效率,但也可能因为二进制编码的限制导致信息损失。因此,需要仔细选择散列码的长度,确保它既可以表示足够的信息,又不会过于冗长。
结论
深度度量学习和深度散列学习为图像检索提供了强大的工具。根据应用的具体需求,可以选择使用其中之一,或者结合两者以获得最佳效果。在实际应用中,还需要考虑其他因素,如训练数据的质量、模型的复杂性以及计算资源,以确保检索系统的有效性和效率。
相关文章:
图像检索技术研究:深度度量与深度散列在相似性学习中的应用比较与实践 - 使用Python与Jupyter环境
引言 在计算机视觉领域,图像检索是一个长期存在并持续受到研究者关注的重要话题。随着大数据时代的到来,如何高效、准确地从海量数据中检索到相似的图像成为一个巨大的挑战。传统的检索方法在大数据环境下表现不佳,而深度学习技术的崛起为图…...
CSS加载失败的6个原因
有很多刚刚接触 CSS 的新手有时会遇到 CSS 加载失败这个问题,但测试时,网页上没有显示该样式的问题,这就说明 CSS 加载失败了。出现这种状况一般是因为的 CSS 路径书写错,或者是在浏览器中禁止掉了 CSS 的加载,可以重新…...
react之路由的安装与使用
一、路由安装 路由官网2021.11月初,react-router 更新到 v6 版本。使用最广泛的 v5 版本的使用 npm i react-router-dom5.3.0二、路由使用 2.1 路由的简单使用 第一步 在根目录下 创建 views 文件夹 ,用于放置路由页面 films.js示例代码 export default functio…...
基于RoCE的应用程序的MTU注意事项
目录 基于RoCE的应用程序的MTU注意事项 探测网络中的MTU设置 概要 原文 MTU测试结果 DOC: CentOS安装tshark抓包工具 基于RoCE的应用程序的MTU注意事项 原文:https://support.mellanox.com/s/article/MLNX2-117-1682kn InfiniBand协议最大传输单元ÿ…...
springboot集成Graphql相关问题汇总
1、idea在debug运行时出现java.lang.NoClassDefFoundError:kotlin/collections/AbstractMutableMap 解决:禁用idea dubugger中kotlin coroutine agent 见:https://stackoverflow.com/questions/70796177/after-the-spring-boot-source-code-is-compile…...
Angular16的路由守卫基础使用
Angular16的路由守卫基础使用 使用ng generate guard /guard/login命令生成guard文件因新版Angular取消了CanActivate的使用,改用CanActivateFn,因此使用router跳转需要通过inject的方式导入。 import { inject } from angular/core; import { CanActi…...
leetcode228. 汇总区间
题目 给定一个 无重复元素 的 有序 整数数组 nums 。 返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字 x 。 列表中的每个区间范围 [a,b]…...
删除有序链表中重复的元素-II(链表)
乌!蒙!山!连!着!山!外!山! 题目: 思路: 双指针,slow和fast,并且增加标记flag初始为1。 如果slow指向节点值等于fast指向节点值&…...
element单独检验form表单中的一项
<el-form-item prop"limitDays" style"margin-left: 5px;"><el-input v-model"ruleForm.limitDays" placeholder"天数" style"width: 100px;" /> </el-form-item> <el-form-item prop"limitCount…...
Webpack node、output.jsonpFunction 配置详解
Webpack node、output.jsonpFunction 配置详解 最近尝试给一些用到 webpack 的项目升级到最新 webpack5 版本,其中遇到了一些问题,我挑了两个比较典型的问题,其中主要涉及到了 webpack 的 node 属性跟 output.jsonpFunction (web…...
要跟静音开关说再见了!iPhone15新变革,Action按钮引领方向
有很多传言称iPhone 15 Pro会有很多变化,但其中一个变化可能意味着iPhone体验从第一天起就有的一项功能的终结。我说的是静音开关,它可以让你轻松地打开或关闭iPhone的铃声。 根据越来越多的传言,iPhone 15 Pro和iPhone 15 Pro Max将拆除静音…...
论文笔记 Graph Attention Networks
2018 ICLR 1 intro 1.1. GCN的不足 无法完成inductive任务 inductive任务是指: 训练阶段与测试阶段需要处理的graph不同。通常是训练阶段只是在子图上进行,测试阶段需要处理未知的顶点。GGN 的参数依赖于邻接矩阵A/拉普拉斯矩阵L,所以换了…...
看上去就很像的agree和degree有什么联系
“Agree”(同意)和 “degree”(程度)这两个词在语义上没有直接的联系,它们代表不同的概念。 “Agree” 意味着在意见、观点或立场上达成共识或一致。它表示同意或同意某人或某事。 例如: “We all agree…...
2023前端面试题第二弹(真实,一般人我还不给看)
为什么要初始化css? 避免浏览器差异,解决兼容问题 网格布局 display: grid; grid-template-columns: 1fr 1fr 1fr less的优点 可以兼容,可以嵌套,循环,运算,定义变量和继承样式(extendÿ…...
零基础如何学习 Web 安全,如何让普通人快速入门网络安全?
前言 网络安全现在是朝阳行业,缺口是很大。不过网络安全行业就是需要技术很多的人达不到企业要求才导致人才缺口大 【一一帮助安全学习(网络安全面试题学习路线视频教程工具)一一】 初级的现在有很多的运维人员转网络安全,初级…...
安全学习DAY18_信息打点-APP资产搜集
信息打点-APP资产&静态提取&动态抓包&动态调试 文章目录 信息打点-APP资产&静态提取&动态抓包&动态调试本节知识&思维导图本节使用到的链接&工具 如何获取目标APP从名称中获取APP从URL获取APP APP搜集资产信息APP提取信息分类信息提取方式信息…...
react 矩形波浪
"矩形波浪"(Square Wave)在信号处理和波形生成中是一种特殊类型的波形,通常由两个不同的值交替组成,一个是高电平,另一个是低电平,形成类似方波的波形。在 React 中创建一个矩形波浪的效果可以通…...
【GitHub】Pycharm本地项目打包上传到Github仓库的操作步骤
文章目录 1、Pycharm端的设置操作2、Github端的设置操作3、Pycharm上配置Github4、Git本地项目至GitHub仓库5、前往Github中查看确认6、常见报错 1、Pycharm端的设置操作 通过CtrlAltS快捷组合键的方式,打开设置,导航到版本控制一栏中的Git,…...
计算机网络基础
前言 在你立足处深挖下去,就会有泉水涌出!别管蒙昧者们叫嚷:“下边永远是地狱!” 博客主页:KC老衲爱尼姑的博客主页 博主的github,平常所写代码皆在于此 共勉:talk is cheap, show me the code 作者是爪哇岛的新手,水平很有限&…...
【图像分类】基于LIME的CNN 图像分类研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...
MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...
【C++】纯虚函数类外可以写实现吗?
1. 答案 先说答案,可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...
Windows电脑能装鸿蒙吗_Windows电脑体验鸿蒙电脑操作系统教程
鸿蒙电脑版操作系统来了,很多小伙伴想体验鸿蒙电脑版操作系统,可惜,鸿蒙系统并不支持你正在使用的传统的电脑来安装。不过可以通过可以使用华为官方提供的虚拟机,来体验大家心心念念的鸿蒙系统啦!注意:虚拟…...
【若依】框架项目部署笔记
参考【SpringBoot】【Vue】项目部署_no main manifest attribute, in springboot-0.0.1-sn-CSDN博客 多一个redis安装 准备工作: 压缩包下载:http://download.redis.io/releases 1. 上传压缩包,并进入压缩包所在目录,解压到目标…...
