互联网相似图像识别检索引擎 —— 基于图像签名的方式

2023-05-16

一、引言  

多媒体识别是信息检索中难度较高且需求日益旺盛的一个问题。以图像为例,按照图像检索中使用的信息区分,图像可以分为两类:基于文本的图像检索和基于内容识别的图像检索(CBIR:Content Based Image Retrieval)。基于文本的图像检索完全不分析和利用图像本身的内容,其检索质量完全依赖于与图像关联的文字信息与图像内容的相关性,因此有必要引入基于内容的图像检索。本为主要讨论后者。 

在计算机视觉中,图像内容通常用图像特征进行描述。事实上,基于计算机视觉的图像检索也可以分为类似文本搜索引擎的三个步骤:提取特征、建索引build以及查询。本文也按照这三步来分别阐述。 

二、图像特征的提取

目前互联网上的图像识别可以归结为两类问题,其一是“近重复检索”,主要是针对同一源图经过不同形变(包括光照、水印、缩放、局部缺失替换等)的检索,或是针对大体类似的物件进行识别,主要应用在版权保护、违禁识别、图片去重以及基本的相似检索等等;其二是“局部检索”,指的是两张图片中只要有部分物件重复,即可匹配到,比如我们可以想象,不同offer的模特不一样,但只要她们都跨了同一款LV包,就可以认为是相似图像,即实现真正意义上的图像检索。 

与此相对应的,图像特征也可以分成两类:全局特征与局部特征。大部分图像签名算法都是利用图像的全局特征来描述一幅图像的内容,例如,颜色直方图、色彩分布、形状或者边缘信息等等,用一个字符串或是数组来作为一幅图像的hash值。 

总的来说,全局特征是对图像内容高度抽象的概括,只回答了“图像是什么”,而大多数场合以用户的视角来看,更希望回答“图像有什么”。例如,用户在检索图像时,经常更加关心的是图像中的场景、物体或者特定的任务,单单一个全局特征无法区分些信息,因此引入了局部特征。其中最为著名的就是“基于尺度不变特征变换的图像检索”,Scale Invariant Feature Transform,也就是大名鼎鼎的SIFT。其基本思想是将图像打散为许多高维特征点,因此将互联网上的图片已视觉词库的形式加以保存。由于SIFT特征在描述向量时不受尺度变换和旋转的影响,对图像噪音、仿射变形、光照变化以及三维视角皆不敏感,因此具有极强的区分度,被广泛应用于物体识别、视频追踪、场景识别、图像检索等问题。 
为简单起见,本文主要讨论基于全局特征的图像相似检索技术,而局部特征可以在此基础上自行加以扩展。 

MPEG(即Moving Picture Experts Group运动图像专家小组)是个国际标准,即所谓ISO11172。准确说来, MPEG-7 并不是一种压缩编码方法,而是一个多媒体内容描述接口。继 MPEG-4 之后,要解决的矛盾就是对日渐庞大的图像、声音信息的管理和迅速搜索。MPEG7就是针对这个矛盾的解决方案。MPEG-7 力求能够快速且有效地搜索出用户所需的不同类型的多媒体影像资料,比如在影像资料中搜索有长江三峡镜头的片段。预计这个方案于2001年初最终完成并公布。虽然没有实现代码,MPEG-7公布了一些图像描述接口,制定了一些诸如颜色分布、纹理、边缘、主体颜色的标准。这里主要介绍一下后边使用到的边缘直方图描述算法的原理。计算边缘直方图的主要步骤如下: 

  • 首先将一个原始图像平均分割为4×4 共16 个子图像,之后的处理都是对每一个子图像局部边缘的直方图进行计算。每个局部的边缘直方图使用五个5边缘算子进行处理。最终得到80维向量,用于唯一标识这张图片。
  • 把每个子图像分割成为一系列图像块, 这些图像块的,面积随着图像面积的变化而变化。其中每个子图像的图像数目是固定的,可参考图一。
  • 计算并统计每个图像块的五种边缘类型( 水平、垂直、45°、135°和无方向) ,此为MPEG-7推荐的五种边缘检测算子,最终得到五个边缘方向的最大值。
  • 对得到的边缘直方图的值进行归一化和量化。考虑到人眼视觉的非均匀性,将归一化以后的80 个直方条的值进行非线性量化, 每个直方条使用固定长度的3位进行编码(即量化范围为0~8),总共用240个bit来表示边缘直方图。
  • 考虑两个边缘直方图描述符, 通过计算直方图间的欧几里德距离得到两个纹理图像的相似度,十分直观的,距离为0说明两幅图片的边缘纹理完全相同,距离越大说明相似度越小。



三、图像特征索引的build与基于图像的query  

在海量(百万以上)的图像特征中,寻找亚线性时间复杂度的匹配算法是十分有挑战的,特别的,由于是近似检索,我们需要的是数字上的非精确匹配,让我们看一下能想到的方法: 

  • 线性扫描:即对整个样本向量集合进行穷举式的顺序扫描,分别计算其与query图像的欧式距离,然后排序输出。准确度100%但过高的时间复杂度导致其实用性极差
  • 基于树结构的索引:比如sift作者推荐的KD-tree,SR-tree等。但由于“维度灾难(curse of dimensionality)”的存在,当向量维度大于10到20之后,基于树结构的索引需要扫描整个向量集合的绝大部分,加上算法本身的开销,其效果甚至要差于上述的蛮力查找。
  • 聚类:摒弃了树型结构建立索引之后,许多研究人员继而使用基于Kmeans聚类(层级聚类)的向量量化方法,其本质是将向量映射为标量,取得了一定的成功。但是,该方法的时间复杂度与图像的数量息息相关,当规模扩大时,biuld与query的时间开销仍然无法达到线上使用的地步。
  • 基于散列表的索引:与上类似,其本质也是将向量转化为标量进行匹配。散列表的主要好处有两点,一是query时间与数据结构的大小无关,基本上是O(1)的时间复杂度;二是增量build较其它方法更为方便。当然,直接将图像特征存放在散列表中,或者放在数据库的某一个字段中,只能进行精确匹配,只能返回一模一样的图片,对于图像检索来说,其价值点几乎为零;因此单纯的散列表技术还是无法满足我们的需求。
  • 常用的hash函数(crc、md5等),本质上都是基于密码学的脆弱哈希函数,其特点是输入只要有略微不同,产生的结果应该尽可能大的变化。本文采用的局部敏感哈希(Locality Sensitive Hashing, LSH)方法,在向量匹配方面与索引方面都要比传统的树结构和聚类算法快上好几个数量级,支持非精确查找,在我看来,是目前所知最适用于多媒体检索的算法。


LSH主要是用来解决多维向量的K近邻(K Nearst Neighgor)问题,即查找某一多维向量间的K个最相似的向量。这是一种概率算法,其原理类似于bloom filter,存在一定的false positive,但换来的是检索效率的飞跃提升。 

LSH的主要原理是:建立L个散列表来存放索引,每一个散列表Ti包含M个存放数据的桶,另外提供两套函数族Gi与Hi与之相关联。局部敏感哈希算法在概率意义上将相近的向量映射到相同的桶当中去,利用该特质可以对图像特征进行非精确匹配。为了最大限度的避免概率上的失误,采用多个hash函数映射到不同的hash表中去,分散误差,如图二所示。 

利用LSH为图像特征建立索引的具体流程如下: 

  • 将向量p标识转化为Hamming空间中的二进制向量(每一维仅为1或0),设某一维的向量值为x,最大值为c,则表示为连续的x个1紧跟c-x个0的c维二进制向量。因此该向量在原始空间的距离与其Hamming距离一致。
  • 将散列函数G作用在前面所产生的结果上,G的定义为,选取目标向量的K维二进制向量进行拼接。可以看出,目标向量之间相似度越大,其产生的hash值相等的概率越大。这是达到非精确检索的关键一环。
  • 基于2产生的结果,再用常规的哈希函数(md5)进行二次哈希将二次哈希得到的结果存放到一张哈希表的一个桶里,再使用下一个函数进行计算,周而复始。正如我们前面所说的那样,采用了多个hash函数来减少相似检索的误差。这样,相似的图像就被放到同一个桶里,而不同的图像则被放到另外的桶里了,如图三所示。

  • query图像时,计算其特征值,并从前面建立的多个表中查询出结果,拼接在一起,如图四所示。

  • 针对上一步返回的近似图像,分别计算其欧式距离,排序,进一步去除极小概率上的false positive。





局部敏感哈希将多维近似检索的时间复杂度进一步降低到亚线性级别,同时,合理选择哈希函数的个数与种类又可以使检索的准确率和召回率达到平衡。 

四、实验结果  

为验证MPEG-7边缘直方图配合局部敏感哈希算法的结果,本文使用了隐网项目中的违禁数据库进行测试。测试环境为公司的Dell PC,测试条件如下所示: 

样本库数量:14085 
样本类别:国家安全类、文化传媒类、限售、药物器械 
持久化index文件容量:3.07MB 
从图片build时间:406ms 
从索引文件build时间:15min 
query时间:0ms 

测试效果范例: 
输入的待检索图片: 



Query得到相似图片结果: 


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

互联网相似图像识别检索引擎 —— 基于图像签名的方式 的相关文章

  • C++ 笔记10 | 多态(polymorphic)

    span class token variable eg 实现图形库 xff0c 用于显示各种图形 span span class token variable 图形基类 span span class token punctuation
  • QT 笔记3 | Qt设计师使用 Qt创造器使用

    六 Qt设计师使用 designer 案例1 xff1a 使用设计师重构加法计算器 1 创建工程目录 mkdir Calculator2 2 进入工程目录 xff0c 执行 designer 启动设计师 1 xff09 在新建窗体界面 xf
  • QT 笔记5 |Qt多线程(QThread)

    一 Qt多线程 QThread 1 创建线程方法1 xff1a QObject moveToThread class Myclass public QObject Q OBJECT public slots void func void 耗
  • QT 笔记6 | Qt网络编程

    回顾 xff1a 1 Qt多线程 QThread 1 xff09 创建线程 方法1 xff1a moveToThread 方法2 xff1a 继承QThread xff0c 重写run函数 2 xff09 线程同步 互斥锁 xff1a QM
  • QT 笔记7 | UDP编程

    回顾 xff1a 1 xff09 控件类 QT 43 61 widgets QApplication Qt的gui应用程序 QWidget 控件基类 QLabel 标签 QPushButton 按钮 QDialog 对话框 QMainWin
  • 学习c语言

    今天学习了if语句和 xff45 xff4c xff53 xff45 运用 xff43 语言更加顺手 xff0c 之前一些都能实施 xff0c 真是太开心了 include lt stdio h gt int main 初始化 int pr
  • 求符合给定条件的整数集(做题)

    题目如上 xff1b 首先我们先想思路 xff1a 先来一个输入 xff0c 读入这个数 xff0c 然后我们需要三个变量来储存这三个数 xff1b 然后我们遍历所有的组合 xff0c 这个依靠循环 接下来是代码 xff1a include
  • 水仙花数(做题)

    代码如下 xff1a include lt stdio h gt int main int a scanf 34 d 34 amp a float t t 61 0 1 while a gt 0 t 61 t 10 a 判断几位数 int
  • 一分钟了解动态内存分配

    谈到这 xff0c 必然离不开malloc函数 在上面可以看出此函数需要一个头文件 include lt stdilb h gt 而且返回类型是void 传进去的是空间大小 xff0c 此函数申请的空间是字节为单位的 这其中的就分配了100
  • 动态内存分配深究

    接下来我们将探究以下三个问题 xff1a 1 相邻两次malloc得到的空间是否是连续的呢 xff1f 2 你得到的空间的实际大小是否就是你要求的大小呢 xff1f 3 如果你malloc零长度会得到什么结果呢 xff1f 第一个问题 xf
  • 同一个页面不打开两次

    lt script language 61 34 javascript 34 gt function popwin3 path window open path 34 cart 34 34 height 61 520 width 61 52
  • 超易懂!二分查找 详析

    二分算法的 本质 是 xff1a 假如我们可以找到事物的 某种性质 xff0c 这种性质 可以将区间一分为二 xff0c 一半满足 xff0c 一半不满足 我们就可以二分 另外 xff0c 有 连续性 必可以 二分 二分模板一共有两个 xf
  • 手摸手 Spring Cloud Gateway + JWT 实现登录认证

    你好 xff0c 我是悟空 前言 上篇我已经讲解了 Spring Cloud 的原理和实战 xff0c 这次就要结合 JWT 来实现登录认证的功能了 本文已收录至 深入剖析 Spring Cloud 底层架构原理 xff0c 已更新 18
  • 百行代码实现VLC简易视频播放器【VLC环境配置过程+可执行源码注释完整】

    文章目录 什么是VLC x1f680 VLC 库的集成 VLC环境配置演示 win10系统 43 vs2017 43 win64 x1f34e VLC 库的基本使用 x1f382 视频播放器实现 自定义函数Unicode2Utf8讲解 x1
  • HttpWebRequest 使用NetworkCredential 进行域认证下载时不成功 的解决方案

    最近在项目中使用pWebRequest 使用NetworkCredential 进行域认证下载时老不成功 xff0c 最后Google了解决方案 xff0c 发现几乎所有讨论的方案都不成功 xff0c 只好埋头自己解决 xff0c 最后总算
  • Firefox 的用户脚本管理器 greasemonkey 的使用一例

    一 什么是greasemonkey Firefox 的用户脚本管理器 greasemonkey 使你可以向任何网页添加DHTML语句 用户脚本 来改变它们的显示方式 就像CSS可以让你接管网页的样式 xff0c 而用户脚本 User Scr
  • Apache Http 服务器安装教程

    我在学习网络开发的时候需要从服务器上获得json数据 xff0c 所以在自己的电脑上安装了一个本地服务器 xff0c 其中遇到的一些问题 xff0c 在这里都写出来 首先 xff0c 我们需要访问apache http服务器的下载网页 xf
  • STM32的UART奇偶校验注意

    STM32的UART奇偶校验注意 STM32的UART在初始化时 xff0c 我们通常用到最多的就是无校验位 xff0c 1停止位 但是我在项目中也遇到某些芯片通信用的需要奇校验或者偶校验 xff0c 这里需要特别注意的是STM32中开启奇
  • Realtek RTL8762C/Realtek RTL8762D学习记录

    本人基于日常工作整理编写的8762C FAQ文档 xff0c 记录RTL8762C 8762D系列软件开发常见问题以及解决方案 希望它能发挥更多作用 帮到有需要的朋友 关键字 xff1a 8762CMF 8762CK 8762CJ 8762
  • 蓝牙BLE---DA14683的SPI主机通信讲解

    DA14683的SPI主机通信例程 Date 2018 12 19 Create Jim 导入例程 首先导入ble peripheral例程或者pxp reporter例程 再到以下位置打开硬件SPI的宏定义 xff1a 获取SPI例程源码

随机推荐

  • 06.5 Code

    06 5 Code 推力 force 推力的应用旋翼的气动阻力空气阻力矩滚转力矩电机的转速 推力 force span class token comment force 61 电机的转速 xff5c 电机的转速 xff5c xff08 带
  • C、C++ 对于char*和char[]的理解

    1 char 和char 的共同点 都是指针 xff0c 指向第一个字符所在的地址 2 char 的用法 char a 61 34 aaa 34 char p1 61 a char 是常量指针 xff08 常量的指针 xff09 xff0c
  • 重新抛出(rethrow)

    有可能单个catch不能完全处理一个异常 在进行了一些校正行动之后 xff0c catch可能确定该异常必须由函数调用链中更上层的函数来处理 xff0c catch可以通过重新抛出 rethrow 将异常传递给函数调用链中更上层的函数 重新
  • 4-2 图像聚类算法

    4 2 图像聚类算法 目录1 分类与聚类1 1 分类1 2 聚类1 3 聚类样本间的属性1 4 聚类的常见算法 2 K Means聚类2 1 概念2 2 步骤2 3 例子2 4 K Means聚类与图像处理2 5 K Means聚类优缺点优
  • JavaWeb-03 统一字符集编码、JSP的页面元素、JSP九大内置对象-request

    1 使用Eclipse开发Web项目 JSP项目 tomacat 2 在Eclipse中创建的Web项目 xff1a 浏览器可以直接访问WebContent中的文件例如 http 127 0 0 1 8888 MyJspProject in
  • 9-1 从零开始训练网络

    9 1 从零开始训练网络 目录1 搭建网络基本架构要完成的功能 2 构建训练网络1 实现网络训练功能2 获取训练数据及预处理 3 启动训练网络并测试数据 目录 搭建网络基本架构构建训练网络启动训练网络并测试数据 1 搭建网络基本架构 要完成
  • 基于知识图谱的推荐系统

    基于知识图谱的推荐系统 推荐系统 xff1a 核心目标是通过分析用户行为 兴趣 需求等信息 在海量的数据中挖掘用户感兴趣的信息 如商品 新闻 POI point of interest 和试题 等 个性化推荐算法是推荐系统的核心 其主要可以
  • mysql级联删除

    mysql级联删除 场景 xff1a 员工表 id xff1a 员工idleader id xff1a 该员工的领导的id xff08 也是员工id xff09 外键dept id xff1a 该员工的部门id xff08 部门表外键 xf
  • 【Seata】安装 - mac

    1 下载 官网 xff1a https seata io zh cn index html 2 修改配置文件 2 1 file conf 还有user password 2 2 registry conf 1 xff09 registry
  • Go Modules模式

    Go Modules模式 xff08 1 xff09 go mod 命令 命令作用go mod init生成 go mod 文件 在当前文件夹下初始化一个新的 go mod 文件go mod download下载 go mod 文件中指明的
  • 【Go】flag

    flag String span class token keyword func span span class token function String span span class token punctuation span n
  • Mybatis 逆向工程

    Mybatis 逆向工程 Maven项目generatorConfig xmlpom xml Maven项目 项目结构 xff1a generatorConfig xml span class token prolog lt xml ver
  • 原理分享 | 单片机常用通信协议汇总(上)

    vx 嵌入式工程师成长日记 https mp weixin qq com s biz 61 Mzg4Mzc3NDUxOQ 61 61 amp mid 61 2247484134 amp idx 61 1 amp sn 61 b779ccf0
  • C语言模拟TCP通信-------收发数据

    简介 这篇是我学习网络编程时初次接触到的 xff0c 感觉挺适合初学者 xff0c 下文主要介绍了如何使用Linux模拟TCP通信 xff0c 分为客户端和服务器端两大部分 xff0c 外加一个总的头文件 流程 服务器端和客户端使用TCP的
  • 多传感器融合记录

    多传感器信息融合的典型应用 多传感器融合中的时间硬同步1 论文阅读 weixin 39606911的博客 CSDN博客 前言阅读硕士论文 自动驾驶中多传感器集成同步控制器设计与实现 xff0c 该论文为自动驾驶设计了一套时间同步控制器 xf
  • VINS记录

    euroc launch lt launch gt lt arg name 61 34 config path 34 default 61 34 find feature tracker config euroc euroc config
  • OpenCV介绍与入门

    OpenCV入门 OpenCV介绍关于OpenCV1 OpenCV能做什么 xff1b 2 OpenCV与图形学与FFmpeg的关系 xff1b 3 OpenCV的未来 xff1b OpenCV介绍 OpenCV是计算机视觉的框架 关于Op
  • 【可见光室内定位】(一)概览

    目录 一 室内无线定位技术概况二 研究现状三 应用前景背景 一 室内无线定位技术概况 二 研究现状 得益于可见光通信 xff08 xff36 xff2c xff23 xff09 技术的迅速发展 xff0c 可 见光定位 xff08 xff3
  • 【机器学习中的数学】比例混合分布

    比例混合分布 Scale Mixture Distribution 混合分布是来自其他随机变量的集合构成的随机变量的概率分布 xff1a 一个随机变量是根据给定的概率从集合随机选取的 xff0c 然后所选随机变量的值就得到了 first a
  • 互联网相似图像识别检索引擎 —— 基于图像签名的方式

    一 引言 多媒体识别是信息检索中难度较高且需求日益旺盛的一个问题 以图像为例 xff0c 按照图像检索中使用的信息区分 xff0c 图像可以分为两类 xff1a 基于文本的图像检索和基于内容识别的图像检索 xff08 CBIR xff1a