图像检索技术研究:深度度量与深度散列在相似性学习中的应用比较与实践 - 使用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…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...
【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?
FTP(File Transfer Protocol)本身是一个基于 TCP 的协议,理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况,主要原因包括: ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...
前端调试HTTP状态码
1xx(信息类状态码) 这类状态码表示临时响应,需要客户端继续处理请求。 100 Continue 服务器已收到请求的初始部分,客户端应继续发送剩余部分。 2xx(成功类状态码) 表示请求已成功被服务器接收、理解并处…...
Canal环境搭建并实现和ES数据同步
作者:田超凡 日期:2025年6月7日 Canal安装,启动端口11111、8082: 安装canal-deployer服务端: https://github.com/alibaba/canal/releases/1.1.7/canal.deployer-1.1.7.tar.gz cd /opt/homebrew/etc mkdir canal…...
【Qt】控件 QWidget
控件 QWidget 一. 控件概述二. QWidget 的核心属性可用状态:enabled几何:geometrywindows frame 窗口框架的影响 窗口标题:windowTitle窗口图标:windowIconqrc 机制 窗口不透明度:windowOpacity光标:cursor…...
【Axure高保真原型】图片列表添加和删除图片
今天和大家分享图片列表添加和删除图片的原型模板,效果包括: 点击图片列表的加号可以显示图片选择器,选择里面的图片; 选择图片后点击添加按钮,可以将该图片添加到图片列表; 鼠标移入图片列表的图片&…...
【仿生机器人】刀剑神域——爱丽丝苏醒计划,需求文档
仿生机器人"爱丽丝"系统架构设计需求文档 一、硬件基础 已完成头部和颈部硬件搭建 25个舵机驱动表情系统 颈部旋转功能 眼部摄像头(视觉输入) 麦克风阵列(听觉输入) 颈部发声装置(语音输出)…...
Java严格模式withResolverStyle解析日期错误及解决方案
在Java中使用DateTimeFormatter并启用严格模式(ResolverStyle.STRICT)时,解析日期字符串"2025-06-01"报错的根本原因是:模式字符串中的年份格式yyyy被解释为YearOfEra(纪元年份),而非…...
