大家好,我是讯享网,大家多多关注。
译者|朱
修订|梁书娟
项目简介
相似图像检索是任何与图像相关的搜索,即“基于内容的图像检索系统”,简称“CBIR”系统。
以上图片来自《基于内容的图像检索:前沿文献调查(2017)》(https://arxiv.org/abs/1706.06064)
如今,图像搜索被广泛应用,尤其是在电子商务服务领域(如全球速卖通、野果等)。).“关键词搜索”(包括图像内容理解)在Google、Yandex等搜索引擎中早已站稳脚跟,但在市场和其他私有搜索引擎中的应用仍然有限。图像预训练剪辑(https://openai.com/blog/clip/)作为计算机视觉领域链接文本和图像的对比语言,自问世以来就引起了轰动,也将加速其全球化进程。
我们团队专门研究计算机视觉中的神经网络,所以在这篇文章中,我将重点介绍图像搜索的方法。
1、基本服务组件
第一步:训练模型。模型的一部分可以建立在经典计算机视觉或神经网络的基础上。模型的输入部分是图像,输出部分是D维描述符/嵌入层。在经典的实现方案中,我们可以采用SIFT(尺度不变特征变换)描述符和BoW(视觉单词包)算法相结合的策略。但是,在神经网络方案中,标准算法模型(如ResNet、EfficientNet等。)可以和复杂的池层结合使用,再进一步结合优秀的学习技术。如果有足够的数据或良好的训练,神经网络方案的选择几乎总是会得到满意的结果(有亲测的例子),所以本文将重点讨论这个方案。
步骤2:索引图像。这一步是在所有图像上运行训练好的模型,并将嵌入的内容写入一个特殊的索引中,以便快速搜索。
第三步:搜索。使用用户上传的图像,运行模型,获得嵌入层,并将嵌入层与数据库中的其他嵌入层数据进行比较。最终的搜索结果按相关性排序。
2、神经网络与度量学习
在寻找相似性的任务中,我们使用神经网络作为特征提取器(主干网络)。当然,骨干网的选择取决于数据的容量和复杂程度——你可以根据自己的开发需求,选择从ReNET18残差网络模型到Visual Transformer模型的所有选项。
图像检索模型的第一个特点是神经网络输出部分的实现技术。在图像检索排行榜(https://kobiso . github . io/computer-vision-leaderboard/cars . html)上,设计了不同的图像检索算法来构造最佳描述符——例如,使用并行池层的组合全局描述符算法,以及在输出函数上实现更均匀激活分布的批量删除块算法。
第二个主要特征是损失函数。目前人工智能领域有很多损失函数。比如《深度图像检索研究》(https://arxiv . org/ABS/2101.11282)一文中只提到了十几种推荐的损失函数算法。同时,还有相当数量的分类功能。所有这些损失函数的主要目标是训练神经网络将图像转换成线性可分的空向量,并进一步通过余弦或欧几里德距离来比较这些向量:相似的图像将具有相似的嵌入层,而不相似的图像将具有非常不同的嵌入层。接下来,我们进一步介绍这些内容。
损失函数1、对比损失函数(Contrastive Loss)
这个算法有一个双重损失,经常发生在比较它们之间距离的物体上。
如果图像P和Q实际上非常相似,神经网络将因图像P和Q的嵌入层之间的距离而受到惩罚..同样,当使用嵌入层的邻近性时,会出现神经网络惩罚的情况,因为实际上嵌入层的图像实际上是彼此不同的。在后一种情况下,我们可以设置一个边界值M(例如,赋值0.5),以克服我们想当然地认为神经网络已经处理了“分离”不相似图像的任务的想法。
2、三元组损失函数(Triplet Loss)
这里,我们的目标是最小化锚点和正例之间的距离,最大化锚点和反例之间的距离。三重损失函数最早发现于Google FaceNet模型中关于人脸识别的文章,长期以来一直是最先进的解决方案。
3、N元组损失函数(N-tupled)
n元损失函数是在三元损失函数基础上的进一步研究成果。这个函数也采用了锚点和正例的概念,但是它使用了多个负例,而不是单个负例。
4、加性角度间隔损失函数(Angular Additive Margin,也称ArcFace)
配对损失函数的问题在于选择正例、反例和锚点的组合——如果只是从数据集中随机选取,那么就会出现“轻配对”的问题。当这种简单的图像配对发生时,损失为0。事实证明,在这种情况下,网络会迅速收敛到一种状态,在这种状态下,批量中的大部分元素都很容易处理,它的损失会变为零——这时,神经网络就会停止学习。为了避免这个问题,该算法的开发者开始提出复杂的配对挖掘技术——硬负例挖掘和硬正例挖掘。见(https://gom bru . github . io/2019/04/03/ranking _ loss/)比较了各种损失函数。此外,https://github.com/KevinMusgrave/pytorch-metric-learning PML图书馆也实施了许多挖掘方法。值得注意的是,这个库包含了很多在PyTorch框架上测量学习任务的有用信息。
上述问题的另一个解决方案是使用分类损失函数。让我们回想一下三年前推出的面部识别算法ArcFace。在当时是最先进的,也导致了当时众所周知的“缺陷”特征的存在。
该算法的主要思想是在通常的交叉熵的基础上增加一个缩进M。该交叉熵将一类图像的嵌入层分布在该类图像的质心区域中,使得它们都至少与其他类的嵌入层簇分开角度m
这似乎是一个完美的损失函数解决方案,尤其是在为mega face benchmark(https://paper with code . com/sota/face-verification-on-mega face)规模开发人工智能系统时。但是要记住,这个算法只有在有分类标记的情况下才会起作用。否则,你将不得不面对配对损失函数问题。
上图直观地展示了在使用单类标签和多类标签(通过计算多类标签向量样本之间的交集百分比,可以从多类标签中导出成对标签)时,哪些损失函数最合适。
池化
现在,让我们回顾神经网络的架构,并考虑在图像检索任务中使用一对池层的情况。
1、R-MAC池化
r-MAC(Area Maximum Volume Activation)是一个池层,它接受神经网络的输出映射(在全局池层或分类层之前)并返回一个描述符向量,这个向量是输出图中每个窗口的激活量之和。这里,窗口的激活量被认为是为每个通道单独获得的窗口的最大值。
在这个结果描述符的计算过程中,考虑了图像在不同尺度下的局部特征,从而创建了一个内容丰富的特征描述。这个描述符本身可以是一个嵌入层,所以可以直接发送给损失函数。
2、GeM池化
GeM(广义平均池)是一种简单的池算法,可以提高输出描述符的质量。底线是经典的平均池可以扩展到λ范数。通过增加lambda层,我们使神经网络聚焦在图像的重要部分,这在某些任务中可能是重要的。
测距1、索引
高质量搜索相似图像的关键是排序,即显示给定查询的最相关样本。这个过程的基本特征包括:建立描述符索引的速度、搜索的速度和占用的内存。
最简单的方法是保持嵌入层“面向前方”,强行搜索,比如使用余弦距离。然而,当有大量嵌入层时,这种方法会产生问题——数目可能是几百万、几千万甚至更多。而且搜索速度明显降低,占用的heap 空空间会进一步增加。然而,仍然有一个积极的方面-通过使用现有的嵌入层可以实现完美的搜索质量。
这些问题可以以牺牲质量为代价来解决-以压缩(量化)而不是原始形式来存储嵌入层。而且还要改变搜索策略——不要使用强力搜索,而是尝试进行最少次数的比较,以找到与给定查询最接近的所需次数的比较。目前有大量有效的搜索框架,可以搜索到近似最接近的内容。为了实现这个目标,创建了一个特殊的基准测试——根据这个基准,您可以在不同的数据集上观察每个库的性能。
其中,最受欢迎的图书馆是NMSLIB(非公制空图书馆)、Spotify的Have图书馆、脸书的Faiss图书馆和谷歌的Scann图书馆。另外,如果想使用REST API进行索引,可以考虑使用纪娜应用(https://github . com/jina-ai/jina)。
2、重新排名
信息检索领域的研究人员很早就知道,在接收到原始搜索结果后,可以通过某种方式对条目进行重新排序来改进排序后的搜索结果。
一个著名的算法是查询扩展。该算法的核心思想是利用最近元素集中的前K个元素生成新的嵌入层。最简单的情况,可以取上图所示的平均向量。其实你也可以根据问题中的距离或者距离要求的余弦距离来对嵌入层进行加权。《基于注意力查询的扩展学习》(https://arxiv . org/ABS/2007.08019)中详细提到了一个框架,也可以递归使用扩展查询算法。
3、k近邻算法
上图是某人物最近物体识别的应用截图。该查询及其10个最近邻数据在图的上部给出,其中P1-P4是正例,NI-N6是反例。图底部的每两列显示样本字符的10个最近邻。蓝框和绿框分别对应样本图和正例。我们可以观察到样本图和正例彼此有10个最近的邻居。
K近邻算法主要围绕前K个元素,包括最接近请求本身的K个元素。
在这个集合的基础上,建立了结果重排序的过程,其中一个过程在文章《基于K近邻算法的人物识别信息重排序研究》(https://arxiv . org/ABS/1701.08398)中有描述。根据定义,K-最近邻算法比K-最近邻算法更接近查询结果。因此,人们可以大致认为K近邻算法集合中的元素是正例,并可以进一步改变扩展查询之类算法的加权规则。
本文开发了一种机制,它可以使用top-k中元素本身的k-最近邻集来重新计算距离。本文包含大量的计算信息,暂时不在本文讨论范围之内。建议有兴趣的读者可以自己找来看看。
相似图像搜索算法效果分析
接下来,我们来分析一下本文提出的相似图像搜索算法的质量。值得注意的是,这个搜索任务的实现过程中有很多细节,但初学者在刚开发一个图像检索项目时,大概不会注意到这些问题。
1、度量
本文将讨论图像检索领域常用的一些流行的度量算法,如precision@k、recall@k、R- precision、mAP和nDCG等。
一般来说,以下算法中的精度代表检索到多少个准确项,召回代表检索到多少个全部准确项。
(1)precision@R算法
在上面的公式中,
参数RELk表示:top-k结果中相关样本的个数;
参数k表示:要考虑的顶部位置的固定数量的样本。
优点:可以显示TOP-K中相关样本的百分比值。
缺点:
对给定查询的相关样本数量非常敏感,这就导致无法对搜索质量进行客观评估,因为不同查询的相关样本数量不同。只有当所有查询中的相关样本数量大于或者等于k时,才能达到值1。(2)R-precision(精确率)算法
上式中,参数RELR表示:top-R结果中相关样本的个数;
r参数表示:给定查询中所有相关样本项的数量。
与precision@k算法一样,参数k也被设置为相关查询样本的数量。
优点:不像precision@k中的数字K那么灵敏,测量变得稳定。
缺点:与请求相关的样本总数必须事先知道(如果没有先标记所有相关数字,可能会产生问题)。
(3)Recall@k(召回率)算法
上式中,参数RELk表示:top-k结果中相关样本的个数;
参数k表示:要考虑的顶部位置的固定数量的样本;
参数REL表示:给定查询中所有相关样本项目的数量。
该算法可以显示在TOP-K中找到的相关样本项的比例。
优势:
回答了在top-k中原则上是否相关的问题稳定且平均超过请求(4)mAP (均值平均精确率)算法
这种算法可以在搜索结果的顶部显示相关样本的密度。你可以把它想象成搜索引擎用户收到的信息量。此时,搜索引擎读取的页面数量最少。因此,信息量与读取的页数之比越大,度量就越高。
优势:
对搜索质量进行客观稳定的评估精确召回曲线的一位数表示,其本身携带有丰富的分析信息
缺点:
必须知道与请求相关的总样本数量(如果不先把所有相关的样本都标记出来可能有问题)
【提示】可以从https://NLP . Stanford . edu/IR-book/html/html edition/evaluation-of-ranked-retrieval-results-1 . html了解更多关于mAP算法的输出。
(4)nDCG(归一化累积增益)算法
在上面的公式中,
参数RELk表示:k位置之前的相关样本项列表(按相关性排序);参数ri表示:
检索结果中第I项的舍入真值相关分数。
这个测量算法显示了top-k中的元素在它们之间排序的正确程度。由于这是上述方法中唯一考虑元素顺序的测量算法,所以我们就不细说它的优缺点了。然而,一些研究表明,当需要考虑阶数时,测量算法在大多数情况下是相当稳定和适用的。
2、算法整体估计
(1)宏观方面:计算每个请求的度量,并计算所有请求的平均值。
优点:与此查询相关的不同数量的数据没有显著波动。缺点:所有查询都被认为等同,尽管有些查询比其他查询相关性更强。
(2)微观方面:在所有的查询中,分别标记相关和找到相关的量进行求和,然后全部参与到对应的度量的计算中。
优点:对查询进行评估时,会考虑与每个查询相关的标记数量。缺点:如果某个请求中有很多标记的相关度量,并且系统没有成功或者成功地将它们带到顶部,那么度量的计算结果可能变得非常低或者非常高。3、系统验证
建议读者对此算法采用以下两种验证方案:
(1)基于一组查询和选定的相关查询进行验证
输入:图片请求和与之相关的图片,还有与这个查询相关的列表形式的标签。为了计算度量,可以根据元素相关性的二进制信息来计算和计算每个元素的相关性矩阵。
(2)全基验证
这个算法的输入部分包括:图片请求和相关图片,还应该有一个图片验证数据库——理想情况下,所有相关的查询都会在里面做标记。此外,数据库不应包含查询图像;否则,这种类型的图像将不得不在搜索阶段被清理,以便它们不会在顶层被阻挡。此外,还提供了一组反例作为验证基础——我们的任务是找出与它们相关的东西。
要计算度量,您可以遍历所有请求,计算到所有元素(包括相关元素)的距离,然后将它们发送到度量计算函数。
已完成项目示例
关于一家公司是否应该使用另一个品牌的设计元素,公司之间经常会有争议。在这种情况下,较弱的制造商试图寄生于一个成功的大品牌,并以类似的符号展示自己的产品和服务。但是,消费者也会因此受到影响——你可能想从你信任的厂家购买奶酪,但是你没有仔细阅读标签,所以你错误地从一个假的厂家购买了假的产品。在最近的一个案例中,苹果试图停止使用Prepear的标志(https://www . pcmag . com/news/Apple-is-attempting-to-block-a-pear-logo-trade mark)。
因此,有一些专业的政府组织或私人公司来打击非法移植。他们持有注册商标登记簿,通过登记簿可以对拟引进的商标进行比较,最终决定是否批准或驳回商标注册申请。以上是使用WIPO(https://www3.wipo.int/branddb/en/)系统接口的典型例子。在这样的系统中,搜索相似图像的功能将为其提供极大的便利,并帮助相关专家更快地搜索相似图像。
1、系统应用举例
在我们开发的系统中,索引图像数据库中有数百万个商标。下面第一张图是查询结果的显示,下一行(第二张图)给出了预期的相关图片列表,其余各行的图片是搜索引擎按照相关性递减的顺序给出的搜索结果。
译者介绍
朱,51CTO社区编辑,51CTO专家博客及讲师,潍坊某高校计算机教师,是自由编程领域的资深人士。早期,他专注于微软的各种技术(用ASP编写了三本与AJX和Cocos 2d-X相关的技术书籍。NET),并投身开源世界(熟悉流行的全栈Web开发技术)十余年,了解基于OneNet/a lios+Arduino/ESP32/Raspberry Pi的物联网开发技术和Scala+Hadoop+Spark+Flink等大数据开发技术。
原标题:如何建立一个图片搜索引擎来查找相似图片,作者:EORA
来源:51CTO技术栈
本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://51itzy.com/32765.html