图像检索传统算法学习笔记

2023-11-19

  • 图像检索领域传统算法学习笔记

(与组内同学一起找到的一些图像检索传统算法,作一小结,以防忘记)

性能统计:

 

传统图像检索算法

CIFAR-10数据集mAP值(编码数不同)

LSH局部敏感哈希

0.116-0.131

SH谱哈希

0.124-0.126

ITQ迭代量化

0.162-0.175

SDH监督离散哈希

0.255-0.360

BRE

0.343-0.421

KSH

0.382-0.439

VLAD局部聚合向量

-

PQ乘积量化

-

SIFT

-

K-D树

-

深度图像检索算法

CIFAR-10数据集mAP值(编码数不同)

DBH深度二进制哈希

0.891-0.894

DSH深度监督哈希

0.615-0.676

 

传统算法原理介绍:

  • LSH局部敏感哈希:             

LSH(Locality Sensitive Hashing)翻译成中文,叫做“局部敏感哈希”,它是一种针对海量高维数据的快速最近邻查找算法。

在信息检索,数据挖掘以及推荐系统等应用中,我们经常会遇到的一个问题就是面临着海量的高维数据,查找最近邻。如果使用线性查找,那么对于低维数据效率尚可,而对于高维数据,就显得非常耗时了。为了解决这样的问题,人们设计了一种特殊的hash函数,使得2个相似度很高的数据以较高的概率映射成同一个hash值,而令2个相似度很低的数据以极低的概率映射成同一个hash值。我们把这样的函数,叫做LSH(局部敏感哈希)。LSH最根本的作用,就是能高效处理海量高维数据的最近邻问题。

定义如下:

我们将这样的一族hash函数 H={h:S→U}称为是(r1,r2,p1,p2)敏感的,如果对于任意H中的函数h,满足以下2个条件:

如果d(O1,O2)<r1,d(O1,O2)<r1,那么Pr[h(O1)=h(O2)]≥p1,Pr[h(O1)=h(O2)]≥p1

如果d(O1,O2)>r2,d(O1,O2)>r2,那么Pr[h(O1)=h(O2)]≤p2,Pr[h(O1)=h(O2)]≤p2

其中,O1,O2∈S表示两个具有多维属性的数据对象,d(O1,O2)为2个对象的相异程度,也就是1 - 相似度。其实上面的这两个条件说得直白一点,就是当足够相似时,映射为同一hash值的概率足够大;而足够不相似时,映射为同hash值的概率足够小。

  • SH谱哈希算法:   

谱哈希将编码过程视为图分割过程,对高维数据集进行谱分析,将问题转化成拉普拉斯特征图的降维问题,从而求解得到图像数据的哈希编码。首先对高维数据样本集进行谱分析,在数据集服从高维平均分布的前提下给出哈希函数。通过主成分分析法对高维数据进行降维,得到各个维度互不相关的低维数据,进而对结果直接进行二元索引结果计算。
基本算法流程是:

(1)采用主成分分析(PCA)算法获取图像数据的各个主成分方向;

(2)在每个主成分方向计算特征值,并选取前r个最小的值,总共得到r * d个特征值,再将其按从小到大的顺序排序,取前r个最小的特征值,计算其对应的特征函数值;

(3)将特征函数值在零点进行二元量化(sign函数)得到哈希编码。

主成分分析(PCA)算法中每个主成分方向上的方差是不同的,方差较大的主成分方向包含更多的信息,因此谱哈希为方差大的主成分方向分配更多的比特。
最终的图像检索就是通过二进制编码的汉明距离来进行匹配。

 

  • ITQ迭代量化:

                       

ITQ迭代量化的算法步骤为:

(1)降维:在上述推导的指导下,先将数据从d维降到c维,然后使用随机旋转方法找个旋转矩阵R,大小为c*c(实际中可以先随机生成一个矩阵,然后做SVD分解,用S作为旋转矩阵),右乘到降维后的数据V,最小化目标式(2)求得一个粗糙解。下面开始应用ITQ算法迭代新R,使得目标式(2)的值减少。

                                                        

 

(2)固定R,更新B:

                                                 

因为矩阵V=XW是固定的,最小化(3)等价于最大化:

                                                         

(3)固定B,更新R:当B固定时先对矩阵做SVD分解为,更新R使得

(4)分支判断:迭代次数是否达到50次,如果没有,则回到第2步;如果达到了,就结束循环。计算最后得到的编码就是sgn(XWR),大小为n*c。

 

  • SDH监督离散哈希:

SDH监督离散哈希算法主要思想是主要思想有两点:首先通过将哈希码映射到label标签信息上,从而不需要通过计算相似性矩阵来将标签信息嵌入到哈希码生成过程当中;其次不对离散约束进行松弛,直接使用DCC算法在离散约束下按位求解哈希码。具体算法步骤如下:

(1)输入:训练集,编码长度L,锚点数量m,最大迭代次数t,参数λ和v。

(2)随机从训练集中挑选出m个样本,计算出RBF核映射

(3)随机初始化B

(4)循环以下过程直到收敛或者达到最大迭代次数:

a.通过下式计算W:

                          

b.计算P,并构造出F(x):

                         

c.使用DCC方法求解

(5)输出:二进制码,和哈希函数H(x)=sgn(F(x))。

 

  • KSH算法:

KSH算法是一种基于监督学习和核的Hash算法。利用kernel主要是为了解决线性不可分问题,监督学习则是为了学习到更有区分度的hash值,使得我们可以直接使用hash后的value作为特征,大大降低特征维数。

(1) hash函数的生成

该算法首先随机选取了M个样本(anchor),之后构造了如下式的prediction函数:

                                                                    

  上式中,k代表核函数(论文选择了高斯径向基kernel),得到f(x)后,哈希函数h(x) = sgn(f(x)) 。上式中参数主要是a(b可以化解掉),也是监督学习的目标。注意,上式只生成了一个bit的hash value,若生成r bit 特征,那么就需要训练r次,生成r组a参数(论文中逐bit生成参数a)。

(2) 目标函数

在训练中,文章选择的目标函数是在汉明空间,最大化类间距离、最小化类内距离。但是在实现方式上,由于汉明距离数学表达上的不方便,采用了code inner products的方式来计算汉明距离:

                             

 

(3)优化算法

由于不同bit hash函数是相互独立的,且总得代价函数值是有每一bit代价函数值相加得来的,因此如果我们使每一bit的代价函数取得最小值,那么就可以得到总得最优解;论文中采用贪婪算法,逐位采用梯度下降求解最优解

 

  • VLAD(vector of locally aggregated descriptors):

即局部聚合向量。是一种利用图像的局部描述子如:SIFT、SURF、ORB等,做一些聚合的操作,然后用一个长向量来表征一幅图像的过程。把图像表征成向量,是图像检索的先决条件。因为,图像检索的思想是对查询图像和检索库中的图像做相似性度量,然后输出相似性最大的值,数学本质是向量间的相似性度量。

当然也可以用两幅图像直接进行相似度量,比如像素值做差或者是计算颜色直方图的分布的相似性,这样的操作对于小数据可以,但是对于大型数据,首先是存储图像需要很大的空间,其次是这样做的检索速度太慢。

VLAD算法流程:

(1)提取图像的SIFT描述子;

(2)利用提取到的SIFT描述子(是所有训练图像的SIFT)训练一本码书,训练方法是K-means;

(3)把一幅图像所有的SIFT描述子按照最近邻原则分配到码数上(也就是分配到k个聚类中心);

(4)对每个聚类中心做残差和(即属于当前聚类中心的所有SIFT减去聚类中心然后求和);

(5)对这个残差和做L2归一化,然后拼接成一个K*128的长向量。128是单条SIFT的长度.

  • PQ(product quantization):

即乘积量化,是一种编码方法。当图像数据库过于庞大的时候,直接存储所有的数据并且做相似性度量检索是不现实的。为了能减少存储资源的开销,并且提高检索的效率,必须对原始数据做一些瘦身操作。其中包括提取图像的特征向量和对提取出的特征向量进行编码。

我们可能并不需要图像中的所有信息就可以判断它是否是我们的目标图像。比如,要想知道一幅图中是否有猫,只需要在图中找到猫的特征就可以证明猫的存在。提取图像中的特征向量有很多成熟的算法,如SIFT、SURF、ORB等。传统的图像检索方法,如VLAD、BOF等都是针对小数据集的,而为了能够实现海量数据的检索,PQ是一个很理想的方法。哈希算法也是一个很不错的算法,但是空间复杂度过高,它只能产生少量的明确距离。

                                                      

  • SIFT算法:

SIFT算法即尺度不变特征变换是一种广泛应用的传统图像特征提取算法,其特点有:

  1. 能提取出图像的局部特征,并对旋转、尺度缩放、亮度变化保持不变,对视角变化、仿射变换、噪声也保持一定程度的稳定性;
  2. 独特性好,信息量丰富,适用于海量特征库进行快速、准确的匹配;
  3. 速度快,经优化的SIFT匹配算法甚至可以达到实时性。

算法具体步骤:

(1)尺度空间的极值检测 搜索所有尺度空间上的图像,通过高斯微分函数来识别潜在的对尺度和选择不变的兴趣点。

(2)删除不稳定的极值点:主要删除两类:低对比度的极值点以及不稳定的边缘响应点。

(3)确定特征点的主方向:以特征点的为中心、计算一定的半径领域内各个像素点的梯度的幅角和幅值,然后使用直方图对梯度的幅角进行统计。直方图的横轴是梯度的方向,纵轴为梯度方向对应梯度幅值的累加值,直方图中最高峰所对应的方向即为特征点的方向。

(4)生成特征点的描述子:首先将坐标轴旋转为特征点的方向,以特征点为中心的16×16的窗口的像素的梯度幅值和方向,将窗口内的像素分成16块,每块是其像素内8个方向的直方图统计,共可形成128维的特征向量。

                                                 

  • K-D树算法:

在图像检索任务中,当我们构造了多个特征时,可用K-D树检索方法来进行快速匹配。K-D树算法通过每次寻找所有数据方差最大的维度作为判别标准进行树的构造,中位数作为节点,小于节点的在左子树,大于在右子树,之后对每个子树也相同。

查找过程:将查询数据Q从根节点开始,按照Q与各个节点的比较结果向下遍历,直到到达叶子节点为止。到达叶子节点时,计算Q与叶子节点上保存的所有数据之间的距离,记录最小距离对应的数据点,假设当前最邻近点为p_cur,最小距离记为d_cur。进行回溯操作,该操作的目的是找离Q更近的数据点,即在未访问过的分支里,是否还有离Q更近的点,它们的距离小于d_cur。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

图像检索传统算法学习笔记 的相关文章

  • TensorRT(11):python版本序列化保存与加载模型

    TensorRT系列传送门 不定期更新 深度框架 TensorRT 文章目录 一 序列化保存模型 二 反序列化加载模型 三 完整代码 楼主曾经在TensorRT 7 python版本使用入门一文中简要记录了python版本是序列化与反序列化
  • 成为编程高手的二十二条军规

    1 大学生活丰富多彩 会令你一生都难忘 但难忘有很多种 你可以学了很多东西而难忘 也会因为什么都没学到而难忘 2 计算机专业是一个很枯燥的专业 但即来之 则安之 只要你努力学 也会发现其中的乐趣的 3 记住 万丈高楼平地起 基础很重要 尤其
  • 数据挖掘:数据(数据对象与属性类型)

    一 概述 现实中的数据一般有噪声 数量庞大并且可能来自异种数据源 数据集由数据对象组成 一个数据对象代表一个实体 数据对象 又称样本 实例 数据点或对象 数据对象以数据元组的形式存放在数据库中 数据库的行对应于数据对象 列对应于属性 属性是
  • WIN10下怎么找到MYSQL数据库中存储数据的位置。

    版权声明 本文为博主原创文章 遵循 CC 4 0 BY SA 版权协议 转载请附上原文出处链接和本声明 本文链接 https blog csdn net qq 36098284 article details 79841920 今天我想找到
  • C++中Template的用法

    模板 Template 指C 程序设计设计语言中采用类型作为参数的程序设计 支持通用程序设计 C 的标准库提供许多有用的函数大多结合了模板的观念 如STL以及IO Stream 函数模板 函数模板定义一族函数 template1 cpp i

随机推荐

  • LDSC:连锁不平衡回归分析

    欢迎关注 生信修炼手册 LDSC全称如下 linkage disequilibrium score regression 简称LDSR或者LDSC 在维基百科中 对该技术进行了简单介绍 通过GWAS分析可以识别到与表型相关的SNP位点 然而
  • Kettle同步表数据null处理

    kettle同步数据时会将空字符串 自动转换为 null 如果表字段非空则会报错 解决方案如下 方案一 kettle菜单栏 编辑 编辑kettle properties文件 配置项 KETTLE EMPTY STRING DIFFERS F
  • 制作及运行 WebUI(NovelAI)Docker 镜像

    准备 Novel AI 模型文件 下载地址 magnet xt urn btih 5bde442da86265b670a3e5ea3163afad2c6f8ecc 只需要部分下载其中的文件 必须的文件 文件 stableckpt anime
  • Node.js知识点详解(一)基础部分

    模块 Node js 提供了exports 和 require 两个对象 其中 exports 是模块公开的接口 require 用于从外部获取一个模块的接口 即所获取模块的 exports 对象 接下来我们就来创建hello js文件 代
  • AI圈最新深度学习量化算法!

    文章摘自AAAI21 译者 一元 量化交易和投资决策是复杂的金融任务 依赖于准确的股票选择 目前深度学习学习的策略使用于股票的问题的方案面临两个重大局限 他们不直接优化利润方面的投资目标 将每只股票视为独立于其他股票 忽略了相关股票之间的丰
  • SpringCloudGateway路由策略:Nacos同集群优先

    使用版本
  • Python sorted()

    最简单的用法 gt gt gt sorted 36 5 12 9 21 21 12 5 9 36 反向排序的 gt gt gt sorted 36 5 12 9 21 reverse True 36 9 5 12 21 更高级的用法 gt
  • win和linux下如何给Qt应用程序添加图标

    给程序添加图标 包含2个部分 第一个 是可执行文件的图标或桌面快捷方式图标 第二个 是程序运行时窗口的图标 分别如下 接下来 我们分别在windows和linux下 讲解如何设置这2种图标 一 在windows系统下 1 设置应用程序图标
  • kubernates k8s minikube 安装 及使用 CentOS 7

    参考文章 CentOS 7安装minikube 重点参考 https www cnblogs com harmful chan p 12731014 html Linux环境上安装MiniKube https blog csdn net u
  • Gitlab merge 时提示”Source branch does not exist”问题的一个解决方案

    背景 将 gitlab 从服务器上迁到阿里云主机 版本从 9 4 1 ce 0 升级到 11 4 3 ce 0 迁移前后均使用 docker 部署 在云主机上运行后 发现在本地推送新分支到 gitlab 并进行 merge 操作时 merg
  • (嵌入式开发)STM32 网站、开发工具使用、参考、数据手册下载不在求人

    目录 一 ST 常用资源网 1 1 ST 之数据手册与用户手册区别 1 2 如何搜索下载对应的芯片文档呢 二 CubeMX 的下载 2 1 如何下载CubeMX 相关软件 2 2 如何自己安装 2 3 CubeMX 资源包当中有什么 三 K
  • Pandas对Excel行和列进行操作

    获取行数据 filename 测试表 xlsx df pd DataFrame pd read excel filename df2 df df 状态 等待付款 df 状态 已提交 print df loc 6000 tolist 输出第6
  • laravel-admin 在指定的相册下添加照片

    相册与照片是一对多的关系 有以下需求 1 点开一条相册数据看到相册的照片列表 2 为相册添加照片时 表单中要看到相册的基本信息 以下是实现步骤 第一步 构建带参数路由 router gt resource manage albumid ph
  • 常用的chrome配置参数

    让chromedriver不打开网页在后台进行 如果对chrome的启动参数感兴趣可以去看看脑补连接 from selenium import webdriver chrome options webdriver ChromeOptions
  • 解决pycharm安装python第三方库时遇到的问题——pycharm实体环境与虚拟环境

    目录 关于cmd打开cd操作的提示 1 pycharm虚拟环境和本地环境有啥区别 2 实体环境和虚拟环境怎么安装库 3 如何查询实体环境安装的库和虚拟环境安装的库 4 怎么切换本地环境或虚拟环境 5 总结使用pycharm时常见的3中环境
  • Jenkins插件开发之环境构建

    1 环境 1 1 jdk 1 1 1 下载 Java Platform Standard Edition 8 ReferenceImplementations 或其他途径下载 1 1 2 java环境配置 1 1 2 1 右键此电脑 属性
  • 【Python】实用小脚本

    本文整理了我在学习和工作中用到的实用python脚本 希望也能帮助到需要的小伙伴 文章目录 视频格式转换 pip快速下载命令 多进程处理百万图片数据集 视频格式转换 安装视频处理库moviepy pip install moviepy 安装
  • 【程序员面试金典】请设计一个算法,求出a和b点的最近公共祖先的编号。

    题目描述 有一棵无穷大的满二叉树 其结点按根结点一层一层地从左往右依次编号 根结点编号为1 现在有两个结点a b 请设计一个算法 求出a和b点的最近公共祖先的编号 给定两个int a b 为给定结点的编号 请返回a和b的最近公共祖先的编号
  • JavaWeb servlet的使用

    在jsp文件中没有java代码我们才算是学完啦 从EL表达式和JSTL标签 在减少在login jsp和index jsp中的java代码 而今天的学习是让在jsp中彻底没有java代码 原本写在doLogin jsp做登录判断的java代
  • 图像检索传统算法学习笔记

    图像检索领域传统算法学习笔记 与组内同学一起找到的一些图像检索传统算法 作一小结 以防忘记 性能统计 传统图像检索算法 CIFAR 10数据集mAP值 编码数不同 LSH局部敏感哈希 0 116 0 131 SH谱哈希 0 124 0 12