图像检索技术研究:深度度量与深度散列在相似性学习中的应用比较与实践 - 使用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…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
