Press "Enter" to skip to content

以图搜图:基于机器学习的反向图像检索

原标题 | Reverse Image Search with Machine Learning

 

作者 | Mohit Nalavadi

 

翻译 |  少少东、chesc

 

审校  | Pita、潘妮•奥尔科

 

从commercetools中调用图像检索API的演示程序

 

commercetools的机器学习团队发布了新的图像检索API的测试版(https://commercetools.com/)。

 

图像检索(有时称为反向图像检索)是一种工具,当把给定图像作为查询时,将会返回相同或类似的图像。驱动这一搜索引擎的技术被称为计算机视觉,在该领域的进步带来了一些引人注目的产品功能。

 

   图像是什幺?

 

为了创建一个图像检索系统,我们首先需要一种能从图像数据中寻找其潜在意义的方法。对于计算机而言,图像是由成千上万个数字组成的3-D矩阵,这些数字分别表示红-绿-蓝(RGB)像素值。但是对于人来说,图像是语义模式的排列——线,曲线,梯度,纹理,颜色——所有这些都整合成了一些有意义的想法。

 

 

图1:在计算机屏幕的RGB像素视图中缩放

 

   卷积神经网络: 机器视觉的前沿

 

一种相对较新的计算机视觉模型,被称为卷积神经网络(CNN),可用于跨越人与机器之间的这种鸿沟–CNN从图像中提取潜在的意义。

 

与其他机器学习技术相比,使用CNN的最大优势在于,它可以对以下情况进行建模:相邻的像素通常是彼此局部相关的(如果图像中的某一个像素是一只可爱的狗的一部分,那幺其周围的像素很可能也是狗的一部分)。虽然这是一个简单的想法,但在实际应用中这是一个非常强大的算法,因为以前的图像识别技术仅通过检测颜色或非常低级的形状特征进行识别而受到限制。CNN会在训练过程中自动确定哪些特征是重要的,并从数百万个样本图像中学习哪些特征具有统计意义,哪些特征与统计意义无关。

 

CNN十分强大,自2012年以来,每年都有一些基于CNN的算法成为世界上最大的图像识别比赛ImageNet的获奖算法(http://image-net.org/challenges/LSVRC/)。你会发现CNNs随处可见,它就像自动驾驶汽车背后的眼睛(https://devblogs.nvidia.com/deep-learning-self-driving-cars/),手机上的人脸识别(https://machinelearning.apple.com/2017/11/16/face-detection.html),CT扫描中的癌症检测软件(https://www.medicalnewstoday.com/articles/325750.php),甚至在Google Deep Mind的Alpha Go中(http://www0.cs.ucl.ac.uk/staff/d.silver/web/Publications_files/deepgo.pdf)。

 

CNN的工作方式

 

CNN由是一系列的层构成,每一层都是一个函数,且是将前一层的输出作为输入。将一幅图片输入到第一层之后,图片每通过新的一层,都会提取出并且向下一层传递图片中最有意义的特征。每经过一层,新图像的语义表示变得更加多维。通常情况下,神经网络的第一层提取低级的特征(比如边缘特征),然后更高层将这些特征组合成更抽象的特征,而且往往是更加有意义的形状(形态)或构想——就比如:车轮通常在汽车的底部。

 

如下图2,我们可以看到第一层辨认出的图像中锐利的边缘信息,中间层将这些边缘整合为车轮和车身的形状,然后最后一层做出了完整的断言——这是一张汽车图片。在实际使用中,CNN往往有很多层。

 

 

图2:典型的CNN一览。图片来源:“Unsupervised Learning of Hierarchical Representations with Convolutional Deep Belief Networks” ICML 2009 & Comm. ACM 2011. Honglak Lee, Roger Grosse, Rajesh Ranganath, and Andrew Ng.”

 

神经网络的每一层对输入来说就像一个滤波器,这些过滤器对图像的作用属于深度学习“炼金术”的一部分。每一个滤波器都是一组独一无二的权重,这些权重在输入图片中以一个个小窗口与像素值相乘,从而生成新的图像(这个过程就我们经常说的卷积)。新生成的图像在Z轴上变得”更深“了(与长度和宽度相对的),而且这个“深度”封装了已经学习到的特征。

 

爱因斯坦有没有说过:“如果你不能解释的更简单一点,就用GIF。”(https://en.wikiquote.org/wiki/Talk:Albert_Einstein#If_you_can’t_explain_it_simply,_you_don’t_understand_it_well_enough)?

 

下面的图3显示了将过滤器应用于输入(蓝色图像),并将其压缩为绿色图像。3×3大小的输入窗口乘以滤波器权重,然后输出一个值。因此,将5×5图像中的信息映射到了更密集的版本——2×2。

 

 

图3:一个卷积样例。资料来源:Paul-LouisPröve(https://towardsdatascience.com/@pietz)

 

而且来说,可以用另一个过滤器对所得的压缩图像进行二次采样,该过滤器轻松的在窗口中找到最大值或平均值,能进一步减小他的尺寸。最终的那一层会将原始图片折叠成一维向量(即是一组数字数组),这样的特征向量是我们进行图像搜索的基础。那幺现在,瞧,我们有一个基本的CNN了!

 

 

图4:基本的CNN图解

 

在模型训练过程中,成千上万乃至数百万计的图像通过网络传递,这个过程中会确定过滤器中的权重值。每个图像都有包含其内容的标签,例如“猫”或“狗”。每次图像通过网络传递时,其特征都会映射到标签,并生成一个概率分数。CNN可能告诉你:“这是狗的几率是75%,猫是猫的几率是25%”。

 

每穿过一层,就会做出一个关于:朝哪个方向推动可以改进滤波器的权重可以得到更精确的概率分数的计算(我们当然希望模型预测结果的可行度更高)。一旦我们对分数感到满意(通常是几千遍之后,当分数停止改善时),我们就会结束训练,并使用该模型对没有见过的新图像进行预测。

 

   比较特征向量

 

到目前为止,我们已经训练好了网络,以我们觉得相关的方式查看图像。但是我们仍然需要一种机制来让计算机比较提取的特征向量的相似性。

 

如果您或我决定两幅图片是否相似,我们的大脑可能会去确定图像中某些特定特征的程度。相对于光溜溜的两足爬行动物的第三张图像,我们更可能会将这两只毛茸茸的四足动物配对。同样,对于CNN模型来说,我们通过测量向量之间的距离来比较得到的特征向量。距离测量结果得分较小的图像特征向量表示他们的原始图像包含相似的内容。

 

相对于光滑的两足爬行动物的第三张图像,我们更可能将这两只毛茸茸的四足动物配对。

 

 

图4:图像相似度

 

   测量距离(特征向量的距离)

 

“欧氏距离”(两点之间的线的长度,https://en.wikipedia.org/wiki/Euclidean_distance)虽然简单明了,但在这种情况下并不能作为一个好的度量标准。其中一个原因是,对于我们的特征向量来说,最好是测量特征之间的相关性,而不是特征本身。 “余弦距离”(https://en.wikipedia.org/wiki/Cosine_similarity)则通过测量两个向量之间的角度来实现特征相关性的测量。

 

我们预期会有一个100至4000维之间的特征,所以让我们把事情简化到2D的平面世界。下面的图5说明了欧氏距离与余弦距离之间的区别。

 

 

图5:余弦距离  θ1的角度小于θ2的角度,意味着它们是更相似的特征向量

 

狗狗们的特征向量指向相似的方向,这意味着它们的特征相对于恐龙向量变化更接近(角度θ1小于θ2)。然而,金发狗和其他两只动物之间的直线距离却大致相等。所以在图像搜索中,我们更喜欢用具有最相似变化模式(余弦距离),而不是用具有相似大小(欧氏距离)的值来识别向量。

 

给力!我们有了图像中生成特征向量并比较它们的相似性的方法,但是我们如何为用户提供这个应用程序并进一步扩张它呢?

 

   从特征向量到图像搜索

 

与所有产品型机器学习项目一样,下一步工作是围绕我们的预测好的模型来构建软件工程的基础设施。在实践中,这会矢量化数以万计的产品图像,并索引这些特征向量到关系数据库,然后作为API来提供服务。

 

 

图6:图像搜索管道的UML流示意图

 

为了索引客户的项目图像,我们首先为它们运行一个异步Python celery 进程(http://www.celeryproject.org/)。这个过程会遍历项目所有产品变体中包含的的所有特有的图像,并为这个唯一的产品和它的URL信息创建一个索引。

 

接下来,我们使用Python的深度学习库(keras),对每个独特的图像URL进行矢量化。该模型托管在Google ML Engine上,以实现快速响应的扩展并能处理需求变化。在评估了几个CNN模型的图像检索性能之后,我们的团队决定使用一种经过预训练的VGG16网络——它在imagenet上达到92.7%的准确率(这个数据集包含一千种标签的1400多万个图像)。当我们收集反馈时,我们计划使用更多电子商务特定的数据来改进我们的模型。

 

为了有效地存储和访问大量不断增长的图像数据,我们使用PostgreSQL 数据库(https://www.postgresql.org/)。我们将每个特征向量和它的URL/product索引存储在两个单独的表中,因为这样可以做到产品到图像的多对多映射。

 

SQL的一个重要特性是能够在查询中执行基本算法。由于包含着内容信息额余弦距离是一种列值的线性组合,因此在将所有图像特征向量与新输入图像向量进行比较时,我们使用选择查询中执行该操作。这让我们可以只把数据库返回最接近的向量作为响应,从而减少I/O绑定的延迟。

 

一旦客户的项目被编入索引,他或她就会以HTTP请求的形式向我们发送一个图像(参见文档中的示例请求),然后对图像进行矢量化,并针对我们的数据库查询类似的图像,最后在JSON响应中以图像URL的形式返回最上面的结果。

 

   把图像检索进行各种应用

 

在这一点上,我们不可避免的受限于自己的创造力。抛砖引玉一下,能找出相似图像的项目可以被商店的主人们用来制作一个更方便的应用程序,顾客可以在这里拍摄自己喜欢的产品的照片,看看商店是否有类似的东西,他或她还可以检查数据库中是否有重复的图像,或者验证是否有其他人在从数据库中窃取图像。

 

 

图7:使用图像搜索API的Commercetools演示应用程序。

 

还有可以应用于产品推荐到图像认证等等,还有更多更多的应用场景。我们新的图像搜索API为我们开拓了许多新的探索机会,我们很高兴看到我们的客户是如何将这个工具付诸实践的!

 

via:https://techblog.commercetools.com/reverse-image-search-with-machine-learning-92786a07c142

 

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注