写点什么

如何做好大规模视觉搜索?eBay 基于实践总结出了 7 条建议

  • 2018-12-31
  • 本文字数:3788 字

    阅读完需:约 12 分钟

如何做好大规模视觉搜索?eBay基于实践总结出了7条建议

我们很荣幸于 2018 年 11 月 2 日参加ODSC West 2018的视觉搜索分会讨论,这篇文章是我们对发表在KDD2017上的论文“eBay 视觉搜索(Visual Search at eBay)”的总结。


假设你在一个看起来像一个大仓库的商店中,有许多用正整数标记的通道。eBay 在任何特定时间都有超过 1B 的活跃商品列表。所以,如果 eBay 是这样一家商店,它看起来就像 1999 年的电影《黑客帝国》中的无限储藏室。假设你有一张打印出来的管道零件目录,而你不知道你所寻找的零件的型号。你找到店员,指着纸上的零件图片。店员给你说了几个通道,比如说 183, 5276, 14098 号通道。如果没有这个信息,你必须经过每个通道,然后将管道的图片与通道上的每个项目进行比较才能找到你所要的零件。


如果这些零件看起来非常相似,这个比较任务就会变得非常复杂。在这种情况下,你需要注意每个细节,如颜色、形状、大小、品牌、包装等。如果通道是按商品的类型组织的,那么你可以从每个通道中大致查看一些商品,然后在相关的通道上花更多的时间去寻找。这是一项非常复杂的任务,如果你错过了感兴趣的项目,你可能需要把所有通道查找很多遍才能找到它。对于大规模搜索情况,算法搜索从本质上简化了这个过程。


正如我们的 KDD 论文中提到的,我们训练一个神经网络,从给定的图像中预测叶子类别(如图 1 所示)。这些叶子类别很像我们的“仓库”中不同的通道。这个基于神经网络的分类器就像我们的店员识别商品可能处在的通道位置。我们使用神经网络中Softmax层预测的概率,选择前几个预测概率最高的叶子类别。


图1 列表由层级分类结构组织,其中终端条目称为“叶子类别”。这些标签可以用来训练一个深度神经网络来预测给定图像的叶子类别。


图 1 列表由层级分类结构组织,其中终端条目称为“叶子类别”。这些标签可以用来训练一个深度神经网络来预测给定图像的叶子类别。


一旦我们找到了通道,我们需要知道如何比较两个图像(查询项目和货架上的项目)。我们用一个紧凑的签名来表示每幅图像,这个签名由一组数字组成的矢量表示。这个签名由相同的弱监督神经网络来提取。我们通过训练带有Sigmoid层的网络来预测叶子类别,提取二进制失量(由 1 和 0 组成)。我们发现最好在所有的步骤中尽可能多地使用监督信息。由于对于每一个叶子类别,我们有许多多样的数据,所以我们训练网络来预测叶子类别。


你可以看下 ECCV2018 的“探索弱监督预训练的极限(Exploring the Limits of Weakly Supervised Pretraining)”论文,以了解预训练大型网络并迁移到其他任务的强大能力。这种弱监督以及训练期间的数据扩充(如裁剪、翻转、旋转)能够帮助网络忽略图像背景,并更多地关注图像的关键部分,从而产生紧凑的语义签名。这些签名容易进行对比。在二进制表示的情况下,例如本文的情况,我们可以基于汉明距离来计算匹配的比特位数。汉明距离相似性可以用来排序叶子类别中匹配的项目。匹配的比特位越多,匹配程度越高。


在大规模的商业视觉搜索中我们面临的主要挑战包括:


  • 图像质量和构成不统一

  • 商品存货清单比较大

  • 商品存货清单严重细粒度

  • 需要简单的架构和模型,便于维护

建立大规模视觉搜索系统的建议

下面,我们总结了一些构建大规模的视觉搜索系统的建议。这些建议也适用于非视觉或多模态系统。

1. 理解数据,并使用分层抽样

数据是确定整个过程策略的核心。图像质量可能会引入复杂性,需要谨慎处理。了解目录中的图像以及用户在视觉搜索期间上传的图像非常重要。图 2 给出了 eBay 手提包存货的一个子集的可视化结果。背景的复杂性以及手提包属性的复杂性混合在一起。图 3 表明了另一种情况:当引入相机姿态时,相同的对象可以有许多不同的视角。当我们训练神经网络时,使用多样性的、有代表性的图像集是非常关键的,以使神经网络能够处理数据集中出现的各种情况。


图2 使用t-SNE对eBay的手袋图像的可视化。注意,大约40%的图像具有复杂的背景,略微超过10%的图像具有白色背景。用户上传的图像有更多的变化,比如旋转。


图 2 使用 t-SNE 对 eBay 的手袋图像的可视化。注意,大约 40%的图像具有复杂的背景,略微超过 10%的图像具有白色背景。用户上传的图像有更多的变化,比如旋转。


图3 一个名为“法拉利PUMA~红皮运动鞋~男式8,5号(女式10号)”的eBay商品。同样的商品,非常不同的图片!


图 3 一个名为“法拉利 PUMA~红皮运动鞋~男式 8,5 号(女式 10 号)”的 eBay 商品。同样的商品,非常不同的图片!


训练集的大小由诸如我们想要预测的标签数量、每个标签内数据的多样性、训练结构带来的内存和计算约束,以及训练这种系统的时间预算等因素共同决定。当我们为神经网络创建训练集时,我们对叶子类别、销售商、商品状态、品牌等使用分层抽样,最后去除重复样本,以确保数据丰富的多样性。

2. 数据增强是关键,特别是图像旋转。

当训练数据不能包含真实场景中可能发生的所有变化时,数据扩充是训练神经网络的关键步骤。当用户使用手机拍摄对象时,很可能图像出现被裁剪、旋转、变得模糊或者没有被缩放到合适的尺寸等情况。数据增强(图 4)生成数据中的各种变化,尤其是当这些变化容易出现在真实场景中,但是往往不会出现在 eBay 商品列表训练集中时。举个例子,eBay 商品列表中的图像不太可能旋转。然而,这种情况在用户上传的图像中经常出现。因此,我们发现图像旋转是数据增强中的一个重要操作。图像旋转在数据增强中经常被忽略,但是对于视觉搜索来说是十分重要的。


图4 数据增强使我们能够从单个样本中产生更多的变化。这里展示几个选定的数据增广操作。图像旋转往往被忽略,但实际上它非常重要。


图 4 数据增强使我们能够从单个样本中产生更多的变化。这里展示几个选定的数据增广操作。图像旋转往往被忽略,但实际上它非常重要。

3. 提取语义签名时尽可能多地使用监督信息

正如上文中提到的,尽可能多地使用监督信息是非常重要的。这有助于训练分类器关注信息性内容而忽略其他非信息性区域。当实际任务(测量图像对之间的相似性)没有可用标签时,最好利用低采集成本、数量庞大且多样的数据进行强监督(例如叶子类别的预测结果)。

4. 签名的熵分析

这一步通常会被大型信息检索系统的系统设计所忽略。评估给定的签名容量内是否包括了足够的有效信息是至关重要的。例如,如果我们使用 8 位数字来表示二进制签名,我们可以表示多达 28 个独特的概念。在最佳情况下,每个数位值为 1 的频率为 50%。我们可以通过计算系统的熵,得到系统的有效比特长度,并与实际比特长度进行比较。有些情况下允许系统松弛来包容系统中的冗余不失为一个好办法(图 5),防止某些数位受到噪声和扰动的影响。


图5 最优比特位占用对于最优信息表示是至关重要的。这张图片来自我们的论文,与<a href=


ImageNet 对应。84.1%的数位在 45%到 55%的数据上是激活的(=1)。在系统中有一些冗余是很好的,因此对于所有比特来说频率不完全是 50%。" />


图 5 最优比特位占用对于最优信息表示是至关重要的。这张图片来自我们的论文,与ImageNet对应。84.1%的数位在 45%到 55%的数据上是激活的(=1)。在系统中有一些冗余是很好的,因此对于所有比特来说频率不完全是 50%。

5. 当标签为粗粒度标签时,类内方差是很重要的。

我们使用粗粒度叶子类别标签代替产品 ID 来训练神经网络。部分原因是由于叶子类别虽然是粗粒度的,但是更容易获得。并且在服装和家具等类别中,有些商品没有产品 ID。典型分类系统的目标是最小化类内方差。理想情况是类内方差为 0。此时,一个类的所有样本都会坍塌成一个点(见图 6)。


例如,运动鞋的所有样本都会坍塌到一个点。但是,有很多独特的产品也属于“运动鞋”叶子类别,我们希望能够通过签名相似性找到它们。因此,我们认为,当标签为粗粒度但是需要进行细粒度搜索时,类间方差应该很高,但是类内方差也应该很高。这可以通过计算签名的熵来衡量,正如前面一条建议中所讨论的。


图6 分类器的推荐一般是类内方差小而类间方差大。然而,我们要做到的是更好的细粒度搜索,因此类间方差大、类内方差大是很重要的。当每个聚类簇中的点都坍塌到单个点时,不可能进行细粒度匹配。该图显示了使用二进制签名绘制的ImageNet中的五个类,其中来自相同类的样本属于相同类型(与产品类别相同)。类内方差对于商业的大规模视觉搜索变得更加重要,其中我们使用粗粒度类别标签(叶子类别),目的是细粒度搜索(产品)。


图 6 分类器的推荐一般是类内方差小而类间方差大。然而,我们要做到的是更好的细粒度搜索,因此类间方差大、类内方差大是很重要的。当每个聚类簇中的点都坍塌到单个点时,不可能进行细粒度匹配。该图显示了使用二进制签名绘制的 ImageNet 中的五个类,其中来自相同类的样本属于相同类型(与产品类别相同)。类内方差对于商业的大规模视觉搜索变得更加重要,其中我们使用粗粒度类别标签(叶子类别),目的是细粒度搜索(产品)。

6. 用排除法提高搜索速度和精度

专为高速度和高精度而设计的排除法具有强大的能力。例如,如果输入图像包含运动鞋,那么没有必要搜索裙子、桌子、计算机的库存清单。我们在 KDD 论文中提出,通过使用强分类器来预测前几个可能的叶子类别(通道)来减少搜索空间和提高精度(裙子的签名与鞋的签名不会混淆)是非常有效的。

7. 绝对 vs.累积 top-k 划分

我们使用强分类器,一个使用强叶子类别标签训练的深度神经网络,来预测首选叶子类别(通道)。当首选预测的置信度较高时,则不需要搜索其他分区。然而,当首选预测不确定时,最好包括其他竞争分区。因此,我们建议使用累计 top-k 类别来获得更好的搜索精度,并且只在要求精确匹配的情况下使用绝对 top-k,即使这样做的成本较高。详情请参阅图 7。



图 7 假设我们使用前 5 个预测叶子类别,通过排除法来缩小搜索空间。我们建议使用基于累积分数而不是绝对分数的前 5 位类别。只有当精度没有召回率那么重要时,才使用绝对分数,例如在场景中不计代价查找精确匹配的情况。可以在KDD论文中找到具体细节。我们在这个表格中给出了三个场景,得分阈值为 0.9。当置信度较低时,累积分数使用更多的类别(如 a、c 中的灰色单元格所示),当置信度较高时,累积分数使用较少的类别(如 b 中的灰色单元格所示)。

结论

在这篇文章中,我们介绍了七条构建大规模视觉搜索的建议。此外,我们也建议最小化人工的作用(包括用于评估),周期性地重新训练模型以应对数据分布的变化,并且为了便于维护,将模型的数量保持在最小值。


想了解更多细节,请阅读我们发表在 KDD2017 的论文:“eBay视觉搜索(Visual Search at eBay)”。


查看英文原文:Seven Tips for Visual Search at Scale.


2018-12-31 08:006381
用户头像

发布了 52 篇内容, 共 31.2 次阅读, 收获喜欢 73 次。

关注

评论 2 条评论

发布
用户头像
沙发
2018-12-31 13:08
回复
用户头像
都没人看吗
2018-12-31 13:07
回复
没有更多了
发现更多内容

Flux 源码之reactor 核心原理及概述

漫游指南

reactor Flux

人脸识别实战:使用Python OpenCV 和深度学习进行人脸识别

AI浩

人脸识别

太顶了!华为高工用一份423页的网络协议笔记把计算机网络讲清了

热爱java的分享家

Java 面试 程序人生 网络协议 经验分享

第四范式x英特尔“AI应用与异构内存编程挑战赛”圆满收官

第四范式开发者社区

WeTest.net全球能力开放:锻造高品质产品,构建全球竞争力

WeTest

热爱代码且发量惊人,一名反“内卷”研发工程师的日常

尔达Erda

程序员 开发者 技术人生 成长笔记

什么是色彩心理学?

坚果

心理学 11月日更

图文并茂!你管这破玩意儿叫TCP?

热爱java的分享家

Java TCP 程序人生 编程语言 经验分享

Shopee 末端物流智能提效之路

Shopee技术团队

人工智能 算法 后端 供应链 物流

供应链安全隐患迫在眉睫,2021年全球APT攻击暗藏何种趋势?

科技热闻

这一次,飞书改变「飞书」

ToB行业头条

百万关注的CSRF攻击是什么意思?

喀拉峻

黑客 网络安全 安全 信息安全

秀出新天际的SpringBoot笔记,让开发像搭积木一样简单

热爱java的分享家

Java 架构 程序人生 编程语言 经验分享

前端避坑指南丨辛辛苦苦开发的APP竟然被判定为简单网页打包?

YonBuilder低代码开发平台

阿里P8手敲出来这份565页凤凰架构分布式手册,惨遭GitHub直接封杀

热爱java的分享家

Java 面试 编程语言 经验分享 凤凰架构

打造数字化软件工厂 —— 一站式 DevOps 平台全景解读

CODING DevOps

DevOps 研发管理 CODING

TDengine助力顺丰科技大数据监控改造

TDengine

tdengine 时序数据库

React性能优化

CRMEB

如何使用SAP CRM Marketing Survey创建一个市场问卷调查

汪子熙

SAP abap 11月日更 Survey

Docker心经

卫先生

Python 编译器 编译器远程连接docker docker常用命令 docker总结

业务流程建模,你真的做对了吗

明道云

Go语言学习查缺补漏ing Day4

Regan Yue

Go 语言 11月日更

前端如何低门槛开发iOS、Android、小程序多端应用

YonBuilder低代码开发平台

Java 处理表格,真的很爽!

程序员鱼皮

Java

使用ABAP代码返回S/4HANA Material上维护的Attachment明细

汪子熙

SAP S/4HANA 11月日更 Material

保持清洁的Git提交记录,三招就够了

Geek_1df311

Java 开源 架构 git 学习

混沌工程:分布式系统稳定性的“疫苗”

中原银行

微服务 云原生 混沌工程

如果你正在准备面试TCP,看这一篇就够了

热爱java的分享家

Java 架构 程序人生 编程语言 经验分享

欢迎 Apache ShardingSphere 社区海外新晋 Committer!

SphereEx

开源社区 ShardingSphere SphereEx Committer

Alibaba 新产 SpringCloud Aliababa(全彩第四版)开源

Geek_1df311

Java 编程 架构 微服务

如何做好大规模视觉搜索?eBay基于实践总结出了7条建议_文化 & 方法_Fan Yang_InfoQ精选文章