使用 Vision API 和 Cloud AutoML Vision 的图片搜索应用

本文探讨了如何使用 Vision APIAutoML Vision 为图片搜索和分类应用提供支持。当与其他 Google Cloud Platform (GCP) 服务搭配使用时,这些服务可帮助您轻松完成以下任务:

  • 在图片中搜索检测到的对象和场景。
  • 根据检测到的图片标签将图片分为不同的类别。
  • 将图片标签和类别用作搜索分面。

Vision API 由 Google 的深度学习模型提供支持,可提供以下高级计算机视觉功能:

  • 标签检测
  • 面部和地标检测
  • 光学字符识别 (OCR)
  • 露骨内容检测

通过 AutoML Vision,您可以训练出高质量的模型,以利用 Google 的神经架构搜索技术和最先进的迁移学习技术来执行自定义标签检测。借助这些技术,您只需具备一点点机器学习技能,便可使用训练数据创建自己的视觉模型。

通过 REST API,您可以将这些功能集成到新的应用和现有的应用中。

要了解如何构建本文中所述的应用,请参阅构建使用 Vision API 和 Cloud AutoML Vision 的图片搜索应用

使用标签检测实现图片搜索

标签检测是 Vision API 和 AutoML Vision 中的一个图片注释功能。此功能可预测最适合用来描述图片的标签。该功能可在数千个不同对象类别中识别众多对象集,然后返回图片中的标签注释或每个检测到的标签。它还会返回以下内容:

  • 标签标识符:标签的不透明实体 ID,如 "/m/0bt9lr"
  • 标签描述:标签的文本描述,如“狗”。
  • 置信度分数:与每个返回的标签注释有关的数字,表示 Vision API 对标签准确度的评估。置信度分数范围为 0(零置信度)到 1(极高置信度)。

通过 AutoML Vision,您可提供添加了标签的数据集,用于训练模型以对您的标签执行自定义标签检测。通过将标签检测与搜索索引结合使用,您可以采用全新方式实现图片搜索。下图演示了此方法:

标签检测和搜索索引

在这个解决方案架构中:

  1. 用户将图片从客户端应用上传到 Cloud Storage 存储分区。
  2. 当新图片到达存储分区时,Cloud Pub/Sub 会生成通知
  3. Cloud Pub/Sub 通知包含新图片文件的详情,用于通知的 Cloud Pub/Sub 主题被配置为向 App Engine 端点推送送达通知。
  4. 现在,App Engine 后端会注意到新文件的存在。App Engine 对上传的图片调用 Vision API 以处理标签,并为其添加标签。这些标签还会添加到搜索索引中。
  5. (可选)App Engine 使用 AutoML Vision 将已检测到的自定义标签添加到搜索索引中。
  6. (可选)App Engine 调用 AI Platform,以根据已检测到的标签将图片归类到用户定义的类别。该类别还会添加到搜索索引中。
  7. 使用 App Engine 的 Search API 搜索已检测到的图片标签。Search API 提供关键字和分面搜索等一系列搜索功能。

使用标签进行分面搜索

分面搜索是在搜索界面中显示 Vision API 和 AutoML Vision 标签(在本文中又称为图片标签)的一种方法。当您使用分面搜索时,图片标签和标签数量会和作为可导航搜索分面的搜索结果一起显示。用户根据不同索引字段进行查询以开始一般关键字搜索后,可以使用搜索分面优化搜索结果以查找包含具体图片标签的图片。

搜索界面还详述了各个标签优化中包含的结果数。结果包含大量常见标签时,分面搜索效果特别突出。

分面搜索示例

当您使用一个简单的关键字(如“城市”)搜索图片时,搜索结果会包含数千张图片。在这种情况下,您需要添加关键字缩小搜索结果的范围,但您可能不确定应该添加哪些关键字。使用分面搜索,即可通过收集使用关键字“城市”进行搜索所找到图片带有的其他标签,从而帮助您确定要添加的关键字。这些标签被视为分面,候选列表中会显示常见的分面供您选择。

例如,分面搜索可以显示搜索结果图片带有的前十个标签的列表。通过此列表,您可以从预填充的列表中选择其他关键字。下面的屏幕截图描述了一个已部署的示例。

已部署的分面搜索

此屏幕截图说明了作为搜索分面可显示多少个图片标签。用户进行搜索时,从匹配文档组中检测到的图片标签会和作为可点击搜索分面的搜索结果一起显示。在此示例中,将显示图片标签分面。选择一个图片标签链接会触发搜索查询优化,并且仅返回包含所选标签(如“城市景观”或“夜晚”)的图片。

此外,还可使用 App Engine 的 Search API 将图片标签添加到文档索引字段中。此示例还会显示作为额外关键字列表的预定图片类别映射的类别最相似的类别分面)。下一节将介绍如何实现此功能。

使用标签进行图片分类

有时候,您可能想要应用直接显示标签。而其他时候,您可能想要将来自已检测到标签的图片归入预定的类别中,而不是直接显示标签。

例如,除了直接搜索图片标签外,您可能还想要用户搜索与预定类别(如“自然”或“城市景观”)匹配的图片。在这种情况下,您可以通过不同方式使用图片标签来获取最合适的图片类别。

要实现此方案,您可以使用 Vision API 和 AutoML Vision:

  • 如果 Vision API 已识别您的类别,并将其作为图片标签返回,则 Vision API 标签检测是理想的选择。如果您的应用处理的是与不同主题相关且可从 Vision API 的广泛理解中受益的图片,则标签检测也很有用。

    在这两种情况下,您都可以使用 Vision API 返回的图片标签以通过不同方式确定范围更广的类别。例如,“污染”、“工厂”、“垃圾填埋场”和“冰山”等图片标签可用于确定范围更广的类别,如“气候变化”。如需了解详情,请参阅本文档后面的使用 Vision API 进行图片分类

  • AutoML Vision 是针对用户提供的已加标签的训练集进行自定义图片分类的理想选择。AutoML Vision 中的自定义标签检测功能会返回训练集内用户定义的标签,您可以使用这些标签创建自定义图片类别。

    如果 Vision API 标签检测为您的分类任务返回了合适的标签,我们建议使用 AutoML Vision 训练自定义图片模型。如需了解详情,请参阅本文档后面的使用 AutoML Vision 进行图片分类

使用 Vision API 进行图片分类

Vision API 从数千个不同的具体类别和抽象类别中检测对象。这种广泛的理解可用于将图片归入对您应用有用的预定义类别。

要实现此方案,您需要实施一种可将 Vision API 图片标签与特定类别相关联的方法。以下各部分介绍了两种可能实现的方法:

  • 将已检测到的标签映射到预定类别
  • 使用字词向量查找相似的类别

在这两种方法中,Vision API 的图片标签都会提供合适的上下文来进行图片分类。

将已检测到的标签映射到预定类别

假定您正在开发一个销售图库照片的网站。您的用户界面可能允许访客在预定义的类别(如野生动物自然城市景观)中搜索或浏览图片。当 Vision API 将“长颈鹿”、“大象”或“热带草原”作为图片标签返回时,您需要使图片自动整理到野生动物类别下。

Vision API 标签检测会返回图片中的各种类别,而不是特定预定类别的分数。一种将标签映射到类别的简单方法是,将 Vision API 标签映射到特定类别,而在这些特定类别中,每个类别都与一个或多个特定 Vision API 标签相关联。(在解决方案剩下的部分中,此方法被称为固定标签类别映射。)在此架构中,Vision API 返回的标签将与定义各个类别的字词列表以及与由图片标签置信度分数确定的最合适类别相关联的图片进行比较。

对于每张图片,Vision API 会返回一个或多个标签,并且已检测到的图片标签会与定义指定类别的字词进行比较。当存在一个或多个直接匹配时,会汇总各个匹配标签的 Vision API 置信度分数,从而创建各个类别的类别置信度分数。此分数是定义预定类别的字词是否很好地映射到指定图片返回的 Vision API 标签的数值表示。具有最高类别置信度值的类别会被选为图片类别,并添加到搜索索引中。在置信度值相同的情况下,您可以将图片添加到符合条件的类别中,或者另外定义一个启发法,将图片映射到唯一类别。

下图说明了适用于一小组预定义类别的方法。

映射到预定类别

如果您确信自己可以想到与各个类别相关联的特定图片标签,则将已检测到的标签映射到类别会起到很好的效果。换句话说,您用来定义各种预定类别的字词组很可能包含高百分比的返回标签。例如,如果图片标签中常常检测到“狗”、“猫”或“鸟”的一些组合,则使用这些具体的标签定义您的类别,可轻松定义预定类别“动物”。在为图片返回一系列标签后,要确定如何将这些标签映射到特定类别将变得越来越困难。在上一个示例中,如果检测到“马”是标签,而非“狗”、“猫”或“鸟”,则图片不会被正确分类,因为“马”并不在定义“动物”类别的字词集中。

另一个限制是,已检测到的图片标签可能与多个类别相关,这会进一步使将图片与最高分数的类别相匹配的过程复杂化。例如,如果多个类别都有类似的固定标签类别映射,则每个类别对这些图片标签的类别置信度分数都有相同的贡献率。若将图片归入唯一类别至关重要,则必须为各个类别找到唯一标签映射来增加类别分数之间的差异。但是,要识别唯一标签进行完全匹配可能极具有挑战性。

使用字词向量查找最合适的类别

根据 Vision API 返回的已检测标签的种类,可能很难创建标签和类别之间的固定映射。在这种情况下,您可以使用另一种方法来衡量标签之间的概念相似度,而不是直接比较标签值。

请看一看作为已检测到图片标签返回的“鸟”、“鹦鹉”、“脊椎动物”和“动物群”的示例。这些标签可以和与以下预定义类别集相关联的代表性标签进行比较:

类别 Label1 Label2 Label3 Label4 Label5 是否类似
动物 动物 长尾小鹦鹉
交通工具 汽车 卡车 汽车 有轨电车 轮船

虽然此表中的类别标签并没有与已返回的图片标签完全匹配的,但动物类别显然在概念上是最合适的。换句话说,已检测到的标签与定义动物类别的字词的相似度比与定义交通工具类别的字词相似度高。此时,系统最好能够识别这种相似度,并将图片正确地归入动物类别。

自然语言处理技术通常依赖于将单个字词转换为向量表示。您可以采用数学方式操纵这些向量来查明这些字词之间的相关性。预训练字词嵌入字典(如 word2vecGloVe)已将常用字词转换为实数向量表示。借助这些向量表示,您可以计算图片标签和类别标签之间的相似度分数。相似度分数最接近图片的类别与图片相关联。

使用 GloVe 计算图片向量和类别向量

要为图片生成实数向量,请使用 GloVe 将已检测到的标签转换为等效的向量表示,然后通过计算单个字词向量的总和将已检测到的标签减少为单个合并向量。在上一个示例中,这种方法将图片的已检测出的标签(“鸟”、“鹦鹉”、“脊椎动物”和“动物群”)转换为单个字词向量。图片的合并字词向量是通过线性组合各个标签分数的单个字词向量创建的。采用这种方式,会将带有多个标签的单个图片转换为表示总体语义含义的合并向量。

使用最能表示类别的字词向量总和,还可计算各个类别的组合向量。该组合向量不一定是定义类别的所有字词,并且通常是一个相关子集。要将图片和类别的字词转换为向量,图片标签和类别元素必须存在于预训练 GloVe 嵌入中。

定义各个类别的字词数量各不相同。当多个字词用于一个类别时,字词向量的总和近似于该类别中所有字词的组合语义。将单个字词用于一个类别也是有效的。

选择字词用于生成类别的组合向量时,您应避免使用在各个类别中具有相似含义的字词。若保留此类字词,则很难消除类别之间的歧义。相反,请选择可描述类别的唯一字词。举一个假设性例子,“混凝土”和“沥青”这两个词可能太相似,而不足以消除建筑物类别和道路类别之间的歧义。相比之下,“房子”和“街道”的区别更为明显。

定义各种类别的字词的数量和值视具体情况而定。您可以使用不同组合进行实验和运行测试,以找到最佳结果。

计算图片向量和类别向量之间的相似度

要使用特定类别进行图片分类,您可以计算组合图片向量和每个组合类别向量之间的余弦相似度。相似度越高,图片与类别之间的相关性越高。下图说明了此过程:

计算图片向量和类别向量之间的相似度

在此例中,来自 GloVe 的字词向量用于计算组合图片向量和类别向量。组合图片向量和类别向量之间的余弦相似度用于判断等效性,在这种情况下,语义分数相对接近,也就是 0.75,它表示 picture.jpg 可以有效地与动物类别相关联。

要实现此方法,请将简单的 TensorFlow 模型部署到 AI Platform。该模型接受 Vision API 的已检测到的标签,并将其转换为组合向量表示,然后计算各个组合类别向量的余弦相似度。TensorFlow 模型使用预训练的字词嵌入将图片标签和类别标签向量化,而无需额外的训练。

下图显示了融合 AI Platform 的更新解决方案架构:

融合 ML 的架构

触发 App Engine 后端

触发 App Engine 后端类似于之前使用固定标签类别映射的方法。在此方法中,上传到 Cloud Storage 存储分区的新图片会触发 App Engine 端点。已触发的端点使用 Vision API 请求对图片进行标签检测,并在 AI Platform 上调用预测模型,将图片标签转换为向量表示。然后,预测模型会计算图片向量和各个类别向量的余弦相似度分数。相似度最高的类别会应用于图片,并写入搜索索引。

方法之间的差异

以下屏幕截图说明了从固定标签类别映射获取类别(左侧屏幕截图)和使用字词向量获取类别(右侧屏幕截图)之间的差异。

标签类别的映射 字词向量

在此示例中,映射的类别:动物(使用固定标签类别映射)是由“狗”、“猫”、“鱼”、“马”、“动物”、“鸟”、“鹦鹉”和“虎皮鹦鹉”等字词集定义的。对于 cat.jpg,AutoML Vision 返回了“动物群”、“野生动物”和“动物园”等标签。

在左侧屏幕截图中选择映射的类别:动物分面值时,猫的图片不见了,这是因为映射的类别:动物描述了固定标签类别方法。由于 AutoML Vision 标签与类别元素并不匹配,因此图片没有与动物类别相关联,原因在于需要完全匹配才能计算类别相似度分数。在这种情况下,图片和类别之间的类别相似度分数为零,即标签元素和类别元素之间不存在重叠。

右侧的屏幕截图融合了 GloVe 字词向量,包含最相似的类别:动物中的猫图片。使用字词向量,将定义最相似的类别:动物(“动物”、“生物”、“物种”和“宠物”)的元素转换为组合类别向量。同样,cat.jpg 返回的图片标签(“动物群”、“野生动物”和“动物园”。)会转换为组合图片向量。由于组合类别向量和图片向量之间的余弦相似度足够接近,因此可确定它们具有符合要求的语义相似度。换句话说,尽管没有返回准确的“猫”标签,但 cat.jpg 图片标签类似于动物类别元素,足以使 TensorFlow 模型将猫图片放入正确的类别中。

在这两个屏幕截图中,分面值旁边显示的计数器反映出所显示结果集中指定标签的出现总次数。这解释了为什么右侧屏幕截图会在映射的类别分面中显示动物(1),而左侧屏幕截图表示 cat.jpg 并没有使用固定标签类别映射直接映射到动物

使用 AutoML Vision 进行图片分类

虽然 Vision API 标签检测会检测图片中的各种类别,但您的要求可能包含 Vision API 未检测到的类别。这些类别可能包含高度特定于领域的标签,如专门用例的标签(例如,对专利机器零件进行分类)。在这种情况下,我们建议使用 AutoML Vision 以及用户提供的数据集训练自定义图片模型。

使用 AutoML Vision 训练自定义图片模型时,请确保您的训练图片适合 AutoML Vision,并且代表预测中所用的图片。为了说明这一要求,旨在检测动物但仅使用四足生物训练的图片模型将不可能将鸟识别为动物。为便于比较,通过返回“动物”作为特定标签或者返回可从中获取正确类别的相关标签,Vision API 的现有标签检测已足够广泛,可以考虑到这种差异。(请参阅本文档前面的使用 Vision API 进行图片分类。)

下图显示了将 AutoML Vision 合并到图片搜索应用中的解决方案架构。在以下示例中,训练数据集内用户定义的标签将直接用作图片类别。

融合 AutoML Vision 的架构

与 Vision API 分类一样,在此方法中,上传到 Cloud Storage 存储分区的新图片会触发 App Engine 端点。已触发的端点使用 AutoML Vision 请求对图片进行自定义标签检测。具有最高置信度分数的图片标签会被分配为图片类别,并添加到搜索索引中。

AutoML Vision 可以与 Vision API 一起使用,来实现组合功能。例如,您可以使用 Vision API 标签检测在各种主题中进行分面搜索,使用 AutoML Vision 根据自定义图片标签进行图片分类。

后续步骤

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
Solutions