我们如何为神经网络上的衣服选择创建推荐服务

图片

在本文中,我想谈一谈我们如何为照片中的相似衣服(更确切地说是衣服,鞋子和包包)创建搜索系统。 也就是说,在业务方面,是基于神经网络的推荐服务。

像大多数现代IT解决方案一样,当我们采用许多小细节,说明并由此创建现成的模型时,我们可以将系统的开发与Lego构造函数进行比较。 这是一条指令:您将在本文中找到哪些细节以及如何应用这些细节,以使您的GPU能够从照片中选择相似的产品。

我们的系统由哪些部分组成:

  • 图像上的衣服,鞋子和包包的检测器和分类器;
  • 用于处理商店电子目录的搜寻器,索引器或模块;
  • 相似图片搜索模块;
  • JSON-API,方便与任何设备和服务进行交互;
  • Web界面或移动应用程序以查看结果。

在本文的结尾,我们将描述在开发过程中踩下的所有“ rakes”以及有关如何消除它们的建议。

设置任务并创建摩擦符


系统的任务和主要用例听起来非常简单明了:

  • 用户向入口(例如,通过移动应用程序)提交照片,其中有衣物和/或箱包和/或鞋子;
  • 系统确定(检测)所有这些对象;
  • 在真实的在线商店中为他们找到最相似(相关)的产品;
  • 使用户产品能够转到特定产品页面进行购买。

简而言之,我们系统的目标是回答一个著名的问题:“只有珍珠母按钮,您才没有?”

在进入神经网络的编码,标记和训练池之前,您需要非常清楚地确定系统内部的类别,即神经网络将检测到的类别。 重要的是要理解,类别列表越广,越详细,它就越通用,因为许多狭窄的小类别(例如迷你连衣裙,中长连衣裙,超长连衣裙)总是可以一触即合地组合成一种类型的连衣裙但反之亦然。 换句话说,必须在项目的开始阶段就仔细考虑和设计好编译器,以免在3次之后重做相同的工作。 我们以多个大型商店(例如Lamoda.ru,Amazon.com)为基础,对分类器进行了编译,并试图一方面使其尽可能宽,另一方面又使其尽可能通用,以便将来将检测器类别与不同类别关联起来更容易。网上商店(我将在“抓取工具和索引器”部分中详细介绍如何制作这类商品)。 这是发生的事的一个例子。

图片
示例类别

目前,我们的目录中只有205个类别:女装,男装,女鞋,男鞋,箱包,新生儿衣服。 链接提供了我们分类器的完整版本。

用于处理商店电子目录的索引器或模块


为了将来搜索相似的产品,我们需要建立一个广泛的基础来寻找我们想要的产品。 根据我们的经验,搜索相似图像的质量直接取决于搜索库的大小,搜索库的大小至少应超过100K,最好超过1M。 如果在数据库中添加1-2个小型在线商店,则很可能不会仅仅因为在80%的情况下目录中没有真正想要的商品而获得令人印象深刻的结果。

因此,要创建一个大型的图像数据库,您需要处理各种在线商店的目录,此过程包括以下内容:

  • 首先,您需要找到在线商店的XML提要,通常可以在Internet上免费获得它们,也可以通过商店本身的要求找到它们,也可以在诸如Admitad之类的各种聚合器中找到它们。
  • 提要由一个特殊程序处理(解析)-爬虫程序,它从提要中下载所有图像,然后将它们放在硬盘驱动器上(更确切地说是在服务器所连接的网络存储上),并在数据库中写入有关商品的所有元信息;
  • 然后启动另一个过程-索引器,该索引器为每个图像计算二进制的128维特征向量。 您可以将搜寻器和索引器组合到一个模块或程序中,但是从历史上看,我们已经开发出它们是不同的过程。 这主要是由于以下事实:我们最初为分布在大量机器上的每个图像计算描述符(哈希),因为这是一个非常耗费资源的过程。 如果仅使用神经网络,那么第一台带有GPU的机器就足够了;
  • 将二进制向量写入数据库,完成所有过程,瞧-您的产品数据库已准备就绪,可以进行进一步搜索;
  • 但是仍然有一个小技巧:由于所有商店的内部都有不同的类别,其中的类别不同,因此您需要将数据库中包含的所有Feed的类别与商品检测器(更准确地说是分类器)的类别进行比较,我们将其称为映射过程。 这是一个手动例程,但非常有用,在此期间,操作员手动编辑常规XML文件,会将数据库中的提要类别与检测器类别进行比较。 结果如下:

图片
类别映射文件的示例:catalog-classifier

检测与分类


为了找到与我们的眼睛在照片中所见相似的东西,我们需要首先检测到这种“东西”(即,定位并选择对象)。 我们在创建检测器方面已经走了很长的路要走,从训练完全无法完成此任务的OpenCV级联开始,到以基于ResNet神经网络的R-FCN和分类器的检测和分类的现代技术结束。

作为用于训练和测试的数据(所谓的训练和测试样本),我们从互联网上拍摄了各种图像:

  • 在Google / Yandex图片上搜索;
  • 第三方标记数据集;
  • 社交网络;
  • 时尚杂志网站;
  • 网上商店的衣服,鞋子,箱包。

标记是使用samopisny工具执行的,标记的结果是图像集和* .seg文件集,它们存储对象的坐标和类的标签。 平均每个类别标记100至200张图像,在205个类别中的图像总数为65,000。

准备好训练样本和测试样本后,我们仔细检查了标记,将所有图像提供给了另一位操作员。 这使我们能够滤除大量严重影响神经网络(即检测器和分类器)训练质量的错误。 然后,我们开始使用标准工具训练神经网络,并在几天之内“一天之内”“起飞”神经网络的下一个快照。 平均而言,在Titan X GPU上检测器和分类器对65,000张图像的数据量的训练时间约为3天。

必须以某种方式检查现成的神经网络的质量,也就是说,评估该网络的当前版本是否比以前的版本好了多少。 我们如何做到的:

  • 测试样本包含12,000张图像,并按照与培训完全相同的方式进行布局;
  • 我们编写了一个小工具,可以通过检测器运行整个测试样本,并编译了这种类型的表格(可在此处找到表格的完整版本);
  • 将该表添加到Excel的新选项卡上,并手动或使用内置Excel公式与上一个表进行比较;
  • 在输出处,我们分别获得针对每个类别的整个系统中TPR / FPR检测器和分类器的一般指标。

图片
关于检测器和分类器质量的报告表示例

相似图片搜索模块


在检测到照片中的衣柜物品后,我们启动搜索引擎查找类似图像,这是它的工作方式:

  • 对于所有切出的图像片段(检测到的货物),神经网络的128位二进制特征向量在形状和颜色(它们来自哪里,请参见下文)中进行计算;
  • 在索引阶段为数据库中存储的所有商品图像计算的相同向量已经加载到计算机RAM中(由于要搜索相似的向量,因此有必要进行大量搜索和成对比较,因此我们将整个数据库立即加载到内存中,这使我们可以增加搜索速度是数十倍,而大约10万种产品的基本存储空间不超过2-3 GB。
  • 该类别的搜索系数来自界面或硬编码属性,例如,在“服饰”类别中,我们在颜色上搜索的形状多于形状(例如,从8到2的颜色形状搜索),而在“高跟鞋”类别中,一对一的形式颜色,因为形式和颜色在这里同等重要;
  • 此外,在考虑系数的情况下,将输入图像中的农作物(片段)矢量与数据库中的图像成对进行比较(比较矢量之间的汉明距离);
  • 结果,从数据库中为每个切割产品片段形成了一系列相似的产品,并为每个产品分配了权重(根据一个简单的公式,考虑到归一化,因此所有权重都在0到1的范围内),以便输出到界面以及进一步输出排序
  • 通过Web-JSON-API在界面中显示一系列相似的产品。

如下训练用于形成形状和颜色的神经网络矢量的神经网络。

  1. 为了训练神经网络的形状,我们拍摄所有标记的图像,根据标记切出片段,然后根据类别将它们分配到文件夹中:也就是说,所有毛衣在一个文件夹中,所有T恤衫在另一个文件夹中,所有高跟鞋在第三文件夹中,依此类推。 d。 接下来,我们根据该样本训练普通分类器。 因此,我们对神经网络“解释”了我们对物体形状的理解。
  2. 为了训练颜色的神经网络,我们拍摄所有标记的图像,根据标记切出片段,然后根据颜色将它们分配到文件夹中:即将所有的T恤,鞋子,袋子等放入“绿色”文件夹中。 绿色(因此,任何绿色的对象通常都聚集在一个文件夹中),在“条带化”文件夹中,我们将所有内容放在条带中,在“红白”文件夹中,所有红白色物品。 接下来,我们为这些类训练一个单独的分类器,就好像“解释”神经网络对事物颜色的理解一样。

图片
通过颜色标记图像以获得颜色的神经网络矢量的示例。

有趣的是,这种技术即使在复杂的背景下也能正常工作,也就是说,当沿着碎片(遮罩)沿轮廓线(遮罩)清晰地切出物体碎片时,而是沿标记所定义的矩形框切出物体时,效果很好。

寻找相似特征的方法是基于以这种方式从神经网络提取二进制特征向量的:倒数第二层的输出被获取,压缩,归一化和二值化。 在我们的工作中,我们压缩为128位向量。 您可以做一些不同的操作,例如,如Yahoo的文章“ 深度学习二进制哈希代码以快速检索图像 ”所述,但是所有算法的本质是相同的-通过比较神经网络在各层中运行的属性来搜索与图像相似的图像。

最初,作为搜索相似图像的技术,我们使用基于某些数学算法(更精确地计算)的哈希或图像描述符,例如Sobel运算符(或轮廓哈希),SIFT算法(或奇异点),绘制直方图或比较图像中的角度数。 这项技术行之有效,或多或少地取得了理智的结果,但是与基于神经网络分配的属性搜索相似图像的技术相比,哈希没有任何可比性。 如果您尝试用2个词来解释差异,则基于散列的图像比较算法是一种“计算器”,其配置为使用某些公式比较图像,并且可以连续工作。 使用来自神经网络的特征进行的比较是“人工智能”,由人训练以某种方式解决特定问题。 您可以举这样一个粗略的例子:如果您寻找黑白条纹的哈希毛衣,那么您很可能会发现所有黑白东西都类似。 如果您使用神经网络进行搜索,则:

  • 在最初的地方,您会发现所有带有黑白条纹的毛衣,
  • 然后所有的黑白毛衣
  • 然后是所有的条纹毛衣。

JSON-API,方便与任何设备和服务进行交互


我们创建了一个简单方便的WEB-JSON-API,用于将我们的系统与任何设备和系统进行通信,这当然不是任何创新,而是一个很好的强大开发标准。

Web界面或用于查看结果的移动应用程序


为了直观地检查结果以及向客户展示系统,我们开发了简单的界面:


在项目中犯的错误


  • 最初,有必要更清晰地定义任务,并且基于该任务选择要布局的照片。 如果您需要搜索UGC(用户生成的内容)照片-这是一种情况和布局示例。 如果需要从有光泽的杂志中搜索照片,则情况有所不同;如果需要在一个大物体位于白色背景上的位置进行照片搜索,则这是一个单独的故事,并且是一个完全不同的示例。 我们将它们全部混合在一起,这影响了检测器和分类器的质量。
  • 在照片中,您应该始终标记所有对象,至少出于至少某种程度上适合您的任务的事实,例如,当选择类似的衣柜选择时,您必须立即标记出所有配件(珠子,眼镜,手镯等),头部帽子等 因为现在我们有了一个庞大的培训课程,所以要添加另一个类别,我们需要重新分发所有照片,这是一项非常繁琐的工作。
  • 检测最有可能是通过屏蔽网络来完成的,向Mask-CNN的过渡以及基于现代Detectron的解决方案是系统开发的领域之一。
  • 最好立即决定如何确定类似图像的选择质量-有两种方法:“肉眼观察”,这是最简单,最便宜的方法,第二种是“科学”方法,当您从“专家”收集数据时(人,我正在测试您的相似搜索算法),并根据这些数据形成一个测试样本和一个专门用于搜索相似图像的目录。 从理论上讲,此方法很好,(对于您自己和对于客户)看起来很有说服力,但是在实践中,它的实现很困难并且非常昂贵。

结论和进一步的发展计划


该技术已经准备就绪且适合使用,现在它作为推荐服务在在线商店中的一位客户中运行。 同样,最近,我们着手在另一个行业中开发类似的系统(也就是说,我们现在正在与其他类型的商品一起工作)。

从近期计划:将网络转移到Mask-CNN,并对图像进行重新标记和重新标记,以提高检测器和分类器的质量。

总而言之,我想说的是,根据我们的感觉,这种技术和一般的神经网络能够解决大脑每天遇到的多达80%的复杂且高度智能的任务。 唯一的问题是,谁是第一个实施这种技术并将人从日常工作中解放出来的人,从而释放了他的创造力和发展空间,我们认为这是人的最高宗旨!

参考文献


Source: https://habr.com/ru/post/zh-CN438542/


All Articles