翻译|朱宪忠审稿人|梁策孙淑娟项目介绍相似图像检索是指任何与图像相关的搜索,即“基于内容的图像检索系统”,简称“CBIR”系统。上图来自文章《基于内容的图像检索:前沿文献调查(2017年)》(https://arxiv.org/abs/1706.06064)在图片搜索应用广泛的今天,尤其是在电商服务领域(如AliExpress、Wildberries等).“关键字搜索”(包括图片内容理解)已经在Google、Yandex等搜索引擎中站稳脚跟,但在市场和其他私有搜索引擎中的应用还比较有限。在计算机视觉领域,连接文本和图像的对比语言-图像预训练CLIP(https://openai.com/blog/clip/)问世后引起了轰动,也将加速其全球化进程过程。我们的团队专门研究计算机视觉中的神经网络,因此在本文中我将重点关注图像搜索。1.基础服务组件第一步:训练模型。模型部分可以建立在经典的计算机视觉或神经网络的基础上。模型的输入部分是图像,输出部分是D维描述符/嵌入层。在经典的实现方案中,可以采用SIFT(Scale-invariantfeaturetransform,尺度不变特征变换)描述子和BoW(bag-of-visual-words,视觉词袋)算法相结合的策略。但在神经网络方案中,可以使用标准的算法模型(如ResNet、EfficientNet等)结合复杂的池化层,再进一步结合优秀的学习技术。如果有足够的数据或训练有素,选择神经网络方案几乎总能得到令人满意的结果(有个人测试例子),因此我们将在本文中重点介绍该方案。第2步:索引图像。这一步是关于在所有图像上运行经过训练的模型并将嵌入写入特殊索引以进行快速搜索。第三步:搜索。使用用户上传的图片,运行模型,得到embedding层,并将该embedding层与数据库中的其他embedding层数据进行比较。最终搜索结果按相关性排序。2.神经网络和度量学习在寻找相似性的任务中,我们使用神经网络作为特征提取器(主干网络)。当然,骨干网络的选择取决于数据的容量和复杂度——你可以根据自己的开发需要选择从ReNET18残差网络模型到VisualTransformer模型的所有选项。图像检索模型的第一个特点无疑是神经网络输出部分的实现技术。在图像检索排行榜(https://kobiso.github.io/Computer-Vision-Leaderboard/cars.html)上,设计了不同的图像检索算法来构建最理想的描述符——例如,使用并行池TheCombinedGlobalDescriptors该层的算法,以及用于在输出函数上更均匀地分布激活的BatchDeleteBlocks算法。第二个主要特征是损失函数。目前,人工智能领域已经有很多损失函数。比如在文章《深度图像检索调查》(https://arxiv.org/abs/2101.11282)中提到了十几种推荐的损失函数算法。同时,还有相当多的分类功能。所有这些损失函数的主要目标是训练一个神经网络将图像转换成线性可分的空间向量,这可以通过余弦或欧氏距离进一步比较:相似的图像将具有相似的嵌入层,不同的相似图像将具有非常不同的嵌入层。接下来,让我们仔细看看这些。损失函数1.ContrastiveLoss这个算法中有一个doubleloss,经常发生在比较彼此距离的物体上。如果图像p和q实际上非常相似,则神经网络会受到图像p和q嵌入层之间距离的惩罚。类似地,由于嵌入层的图像实际上彼此不同,因此由于所应用的嵌入层的接近性,存在神经网络惩罚。在后一种情况下,我们可以设置一个边界值m(例如0.5),以克服我们的假设,即神经网络已经处理了“分离”不同图像的任务。2.TripletLoss函数(TripletLoss)这里,我们的目标是最小化锚点到正例的距离,最大化锚点到负例的距离。三元组损失函数最早出现在谷歌关于人脸识别的FaceNet模型论文中,长期以来一直是最先进的解决方案。3.N元组损失函数(N-tupled)N元组损失函数是在三元组损失函数的基础上进一步研究的结果。这个函数同样使用了锚点和正例的概念,但是使用了多个而不是单个负例的技术。4.配对损失函数(AngularAdditiveMargin,又名ArcFace)的问题是选择正例、负例和锚点的组合——如果只是从数据集中随机选择,那么就会有“光配对”的问题。通过这个简单的图像配对,损失为0。事实证明,在这种情况下,网络会迅速收敛到一种状态,在这种状态下,批处理中的大多数元素都非常容易处理,以至于其损失变为零——此时神经网络停止学习。为了避免这个问题,该算法的开发者开始提出复杂的成对挖掘技术——hardnegativemining和hardpositivemining。相关问题见(https://gombru.github.io/2019/04/03/ranking_loss/),里面比较了各种损失函数。此外,PML库(https://github.com/KevinMusgrave/pytorch-metric-learning)也实现了很多挖掘方法。值得注意的是,这个存储库包含大量对PyTorch框架上的度量学习任务有用的信息。上述问题的另一种解决方案是使用分类损失函数。我们不妨回忆一下,三年前推出的人脸识别算法ArcFace,在当时是最先进的,也导致了当时众所周知的“硬伤”特征存在。该算法的主要思想是在通常的交叉熵上添加一个缩进m,将一类图像的嵌入层分布在该类图像的质心区域上,使它们都与其他类的嵌入层聚类至少相隔一个角度m。这似乎是一个完美的损失函数解决方案,尤其是在以MegaFace基准(https://paperswithcode.com/sota/face-verification-on-megaface)规模开发AI系统时。但是你需要记住,这个算法只有在有分类标签的情况下才有效;否则,您将不得不面对成对损失函数问题。上图直观地展示了在使用单类标记和多类标记时哪种损失函数最合适(配对标记可以通过计算多类标记向量样本之间的交集百分比来导出成对标记)。池现在,让我们回顾一下神经网络架构,并考虑在图像检索任务中使用一对池化层。1.R-MACpoolingR-MAC(regionalmaximumconvolutionalactivation)是一个池化层,它接受神经网络的输出图(在全局池化层或分类层之前)并返回一个描述符向量,该向量是和输出映射中每个窗口中的激活。这里,窗口的激活量被取为针对每个通道单独获得的窗口的最大值。这个结果描述符的计算考虑了图像在不同尺度下的局部特征,创建了丰富的特征描述。这个描述符本身可以是一个嵌入层,因此可以直接发送到损失函数。2.GeMPoolingGeM(GeneralizedMeanPooling)是一种简单的池化算法,可以提高输出描述符的质量。最重要的是,经典的平均池可以推广到lambda范数。通过添加lambda层,我们使神经网络专注于图像的重要部分,这在某些任务中可能很重要。范围1.索引高质量类似搜索图像的关键是排名,即显示给定查询最相关的样本。这个过程的本质特征包括:描述符索引的速度、搜索的速度和内存使用。最简单的方法是让嵌入层“面向前方”并对其进行强力搜索,例如使用余弦距离实现。然而,当嵌入层数量很多时——可能有数百万、数千万甚至更多,这种方法就会出现问题。而且搜索速度明显降低,占用的堆空间会进一步增加。不过,也有积极的一面——使用现有的嵌入层可以实现完美的搜索质量。这几个问题可以以牺牲质量为代价来解决——以压缩(量化)而不是原始形式存储嵌入层。并且还更改搜索策略——而不是使用强力搜索,尝试进行最少数量的比较以找到与给定查询最接近的所需比较数量。已经有大量有效的搜索框架可以逼近最接近的内容。为此,创建了一个特殊的基准测试——通过这个基准测试,您可以观察每个库在不同数据集上的性能。其中,最受欢迎的库有:NMSLIB(非度量空间库)、Spotify的Have库、Facebook的Faiss库和Google的Scann库。另外,如果你想使用RESTAPI进行索引,你可以考虑Jina应用程序(https://github.com/jina-ai/jina)。2.重新排序信息检索领域的研究人员早就认识到,在收到原始搜索结果后,可以通过某种方式对项目进行重新排序来改进有序的搜索结果。一个著名的算法是查询扩展。该算法的核心思想是利用最接近的元素集中top-K个元素生成新的embedding层。在最简单的情况下,均值向量可以取如上图所示。其实也可以根据问题中的距离或者与请求的余弦距离来给embedding层加权。《基于注意力的查询扩展学习》(https://arxiv.org/abs/2007.08019)中详细提到了一个框架,也可以递归使用扩展查询算法。3.K-近邻算法上图是一个人最近物体识别的应用截图。其中,图中上半部分展示了query及其10个最近邻数据,其中P1-P4为正例,NI-N6为负例。图底部的两列中的每一列都显示了样本人的10个最近邻居。蓝色和绿色框分别对应样本人和正例。我们可以观察到样本人和正例之间有10个最近的邻居。k近邻算法主要围绕top-k个元素,包括距离请求本身最近的k个元素。在此集合的基础上,建立了对结果进行重新排序的程序,论文《基于k近邻算法的人物再识别信息重排序研究》(https://arxiv.org/abs/1701.08398)中描述了其中一个程序。根据定义,k-倒数算法比k-最近邻算法更接近查询结果。因此,可以粗略地将K近邻算法集合中的元素视为正例,进一步改变扩展查询等算法的权重规则。在本文中,开发了一种机制,该机制使用top-k中元素本身的k最近邻集重新计算距离。本文包含大量计算信息,暂时不在本文讨论范围之内。建议感兴趣的读者自行查找阅读。相似图搜索算法效果分析接下来我们分析一下本文提出的相似图搜索算法的质量问题。值得注意的是,在这个搜索任务的实现中有很多细节是初学者在第一次开发图像检索项目时很可能不会注意到的。1.Metrics本文将讨论图像检索领域常用的一些流行的度量算法,如precision@k、recall@k、R-precision、mAP和nDCG等。【译者补充】一般来说,precision在以下算法中,表示检索到的项目中有多少是准确的,recall表示检索到的所有准确项目中有多少。(1)precision@R算法上式中,参数RELk表示:top-k结果中相关样本的个数;参数k表示:需要考虑的top位置固定样本的个数。优点:可以显示相关样本在top-k中的百分比值。缺点:对给定查询的相关样本数量非常敏感,这使得无法客观地评估搜索质量,因为不同的查询具有不同数量的相关样本。只有当所有查询中的相关样本数大于或等于k??时,才达到值1。(2)R-precision(准确率)算法上式中,参数RELR表示:top-R结果中相关样本的个数;参数R表示:给定查询中所有相关样本项的数量。与算法precision@k相同,参数k也设置为相关查询样本的数量。优点:不像precision@k中的数字k那么敏感,metric变得稳定。缺点:必须事先知道与请求关联的样本总数(如果未先标记所有相关数字,可能会导致问题)。(3)Recall@k(召回率)算法上式中,参数RELk表示:top-k结果中相关样本的个数;参数k表示:需要考虑的top位置的固定样本数;参数REL的意思是:给指定查询中所有相关样本项的数量。该算法能够显示在top-k中找到的相关样本项的比例。优点:回答在top-k中原则上是否相关的问题稳定且平均超过要求(4)mAP(MeanAveragePrecision)算法该算法可以在搜索结果的顶部显示相关样本的密度。您可以将其视为搜索引擎用户收到的信息量,此时搜索引擎读取的页面数量最少。因此,信息量与阅读页数之比越大,指标越高。优点:客观稳定地评估搜索质量精度召回曲线的个位数表示,本身携带丰富的分析信息缺点:必须知道与请求关联的样本总数(如果不是所有相关样本都被首先标记有可能是问题)[提示]你可以从https://nlp.stanford.edu/IR-book/html/htmledition/evaluation-of-ranked-retrieval-results-1.html信息中了解更多关于mAP算法输出的信息。(4)nDCG(NormalizedCumulativeGain)算法上式中,参数RELk表示:位置k之前的相关样本项列表(按相关性排序);参数ri表示:检索结果性别得分中第i项的舍入真值相关性。这个指标显示了top-k中的元素在它们之间排序的正确程度。由于这是上述方法中唯一考虑元素顺序的度量算法,我们不再详述其优缺点。但研究表明,这种度量算法相当稳定,在大多数需要考虑顺序的情况下效果很好。2.算法整体估计(1)宏观方面:对每个请求计算一个metric,对所有请求计算平均值。优点:与此查询关联的不同数据量没有显着波动。缺点:所有查询都被认为是等价的,尽管有些查询比其他查询更相关。(2)微观方面:在所有查询中,将标记的关联数和单独成功找到的关联数相加,然后全部参与相应度量的计算。优点:在评估查询时,会考虑与每个查询关联的令牌数量。缺点:如果某个请求中有很多flagd相关的metrics,系统没有成功或成功将它们置顶,metrics的计算结果可能会变得很低或很高。3.系统验证建议读者对本文算法采用以下两种验证方案:(1)基于一组查询和选定的相关查询验证输入:图像请求及其相关图像,并且有与此查询表单标记相关的列表。为了计算度量,可以基于元素相关性的二进制信息计算每个元素的相关性矩阵。(2)Full-BaseVerification该算法的输入部分包括:一个图像请求和与之相关的图像,还应该有一个图像验证数据库——理想情况下,所有相关的查询都会被标记在里面。此外,该数据库中不应包含任何查询图像;否则,此类图像必须在搜索阶段进行清理,以免它们阻塞在top-1层上。此外,还提供了一组负面示例作为验证基础——我们的任务是找出与之相关的内容。要计算指标,您需要遍历所有请求,计算到所有元素(包括相关元素)的距离,并将它们发送到指标计算函数。已完成项目的例子公司之间经常就一家公司是否应该使用另一家公司的品牌元素发生争执。在这种情况下,较弱的制造商试图通过使用类似符号展示其产品和服务来寄生一个成功的大品牌。然而,消费者也受此影响——你可能想从你信任的制造商那里购买奶酪,但没有仔细阅读标签,而错误地从假冒制造商那里购买了假冒产品。最近有一个案例,Apple试图阻止使用Prepear的徽标商标(https://www.pcmag.com/news/apple-is-attempting-to-block-a-pear-logo-trademark)。因此,有一些专业的政府机构或私人公司来打击非法移植。他们持有注册商标名册,通过名册可以对拟引进的商标进行比对,最终决定是批准还是驳回商标注册申请。以上是一个典型的使用WIPO(https://www3.wipo.int/branddb/en/)系统界面的例子,在这样的系统中,搜索相似图片的功能将大大方便快速搜索相似图片。1.系统应用示例在我们开发的系统中,索引图像数据库中有数百万个商标。下面给出的第一张图片是查询结果的展示,下一行(第二张图片)给出了预期相关图片的列表,其余行中的图片是搜索引擎按照相关搜索结果的降序排列给出的。译者介绍朱宪忠,社区编辑,专家博主,讲师,潍坊某高校计算机教师,自由编程资深人士。早期专注于各种微软技术(编译成三本与ASP.NETAJX和Cocos2d-X相关的技术书籍)。/ESP32/RaspberryPi等物联网开发技术和Scala+Hadoop+Spark+Flink等大数据开发技术。原标题:HowtoBuildanImageSearchEnginetoFindSimilarImages,作者:EORA
