我们如何在Cloud Mail.ru中进行地标识别,以及为什么



随着带有高质量相机的手机的问世,我们开始制作越来越多的照片和视频,这些照片和视频充满了我们生活中令人难忘的瞬间。 我们中许多人的照片档案可以追溯到几十年前,其中包含成千上万张图片,这使它们越来越难以浏览。 只要记住几年前才花了多长时间找到感兴趣的图片。

Mail.ru Cloud的目标之一是提供最便捷的方法来访问和搜索您自己的照片和视频档案。 为此,我们Mail.ru计算机视觉团队已经创建并实现了用于智能图像处理的系统:按对象,按场景,按面部等进行搜索。 另一项引人注目的技术是地标识别。 今天,我将告诉您我们如何使用深度学习将其变为现实。

想象一下这种情况:您从度假回来时带着大量照片。 与您的朋友交谈,要求您显示一张值得一看的地方的图片,例如宫殿,城堡,金字塔,寺庙,湖泊,瀑布,山脉等。 您急着滚动图库文件夹,试图找到一个确实不错的文件夹。 最有可能的是,它在数百张图像中丢失了,您说稍后再显示。

我们通过对相册中的用户照片进行分组来解决此问题。 这使您只需单击几下即可找到所需的图片。 现在,我们有了按面孔,按对象和按场景以及按地标编译的专辑。

具有地标的照片是必不可少的,因为它们经常捕捉我们生活中的亮点(例如旅途)。 这些可以是具有某些建筑的图片或背景为荒野的图片。 这就是为什么我们寻求定位此类图像并使它们易于用户使用的原因。

地标识别的特点


这里有一个细微的差别:不仅要教一个模型并使它立即识别地标,还存在许多挑战。

首先,我们不能清楚地分辨出什么是真正的“地标”。 我们无法说出建筑物为何是地标,而建筑物旁的却不是。 它不是一个形式化的概念,这使得陈述识别任务变得更加复杂。

其次,地标的多样性令人难以置信。 这些可以是具有历史或文化价值的建筑物,例如寺庙,宫殿或城堡。 或者,这些可能是各种各样的古迹。 或自然特征:湖泊,峡谷,瀑布等。 同样,只有一个模型应该能够找到所有这些地标。

第三,具有地标的图像极少。 根据我们的估计,它们仅占用户照片的1-3%。 这就是为什么我们不能在识别上犯错误,因为如果我们向某人展示没有地标的照片,那将是显而易见的,并且会引起不良反应。 相反,或者想象一下,您向从未去过美国的人展示了纽约感兴趣的图片。 因此,识别模型应具有较低的FPR(误报率​​)。

第四,大约50%甚至更多的用户通常禁用地理数据保存。 我们需要考虑到这一点,仅使用图像本身来标识位置。 如今,大多数能够以某种方式处理地标的服务都使用来自图像属性的地理数据。 但是,我们的最初要求更加严格。

现在,让我向您展示一些示例。

这是三个相似的物件,法国的三个哥特式大教堂。 左边是亚眠大教堂,中间是兰斯大教堂,右边是巴黎圣母院。



即使是人类,也需要一些时间仔细观察,才能发现它们是不同的大教堂,但是引擎应该能够做到相同,甚至比人类更快。

这是另一个挑战:这里的三张照片都以巴黎圣母院的不同角度拍摄。 这些照片有很大的不同,但是仍然需要对其进行识别和检索。



自然特征与建筑完全不同。 左边是以色列的凯撒利亚,右边是慕尼黑的Englischer Garten。



这些照片很少给模型提供线索。

我们的方法


我们的方法完全基于深度卷积神经网络。 我们选择的培训策略是所谓的课程学习,即分几步学习。 为了在没有可用地理数据的情况下实现更高的效率,我们做了一个具体的推断。 让我详细介绍每个步骤。

资料集


数据是机器学习的动力。 首先,我们必须汇总数据集来教授该模型。

我们将世界分为4个区域,每个区域都用于学习过程中的特定步骤。 然后,我们选择了每个地区的国家/地区,为每个国家/地区选择了城市列表,并收集了一组照片。 以下是一些示例。



首先,我们试图使我们的模型从获得的数据库中学习。 结果很差。 我们的分析表明,数据很脏。 太多的噪音干扰了每个地标的识别。 我们该怎么办? 手动查看所有大批量数据将非常昂贵,麻烦且不明智。 因此,我们设计了一种自动清理数据库的过程,该过程只在一个步骤中使用了手动处理:我们为每个地标选择了3至5张参考照片,这些照片肯定以或多或少合适的角度显示了所需的对象。 它之所以足够快,是因为与整个数据库相比,此类参考数据的数量很少。 然后基于深度卷积神经网络进行自动清洗。

接下来,我将使用术语“嵌入”,其含义如下。 我们有一个卷积神经网络。 我们训练它对对象进行分类,然后切断最后一个分类层,拾取一些图像,通过网络对其进行分析,并在输出处获得数值矢量。 这就是我所说的嵌入。

正如我之前说过的,我们将学习过程分为几个步骤,分别与数据库的各个部分相对应。 因此,首先,我们采用上一步的神经网络或初始化网络。

我们具有地标的参考照片,通过网络对其进行处理并获得多个嵌入。 现在我们可以进行数据清理了。 我们从地标数据集中获取所有图片,并由网络进行处理。 我们获得一些嵌入,并确定每个嵌入到参考嵌入的距离。 然后,我们确定平均距离,如果超过平均距离(该阈值是算法的参数),则将该对象视为非地标。 如果平均距离小于阈值,则保留照片。



结果,我们有了一个数据库,其中包含来自70个国家/地区的500多个城市的11000多个地标,超过230万张照片。 请记住,照片的主要部分根本没有地标。 我们需要以某种方式将其告知我们的模型。 因此,我们向数据库中添加了90万张没有地标的照片,并使用结果数据集训练了模型。

我们引入了离线测试来衡量学习质量。 考虑到地标仅出现在所有照片的1-3%中,我们手动编辑了一组290张确实显示地标的照片。 这些照片非常多样且复杂,具有从不同角度拍摄的大量物体,从而使模型的测试尽可能困难。 按照相同的模式,我们选择了11千张没有地标的照片,这些照片也相当复杂,并且我们尝试在数据库中找到看起来很像地标的对象。

为了评估学习质量,我们使用带有和不带有界标的照片来衡量模型的准确性。 这是我们的两个主要指标。

现有方法


文献中关于地标识别的信息相对较少。 大多数解决方案基于本地功能。 主要思想是我们有一些查询图片和来自数据库的图片。 找到并匹配局部特征(关键点)。 如果匹配数目足够大,则可以得出结论,我们找到了一个里程碑。

当前,最好的方法是Google提供的DELF(深度本地特征),它将本地特征与深度学习相结合。 通过由卷积网络处理输入图像,我们获得了一些DELF特征。



地标识别如何工作? 我们有一堆照片和一个输入图像,我们想知道它是否显示地标。 通过运行所有照片的DELF网络,可以获得数据库和输入图像的相应功能。 然后,我们通过最近邻方法执行搜索,并在输出中获得具有特征的候选图像。 我们使用几何验证来匹配特征:如果成功,我们得出的结论是图片显示了地标。

卷积神经网络


预培训对于深度学习至关重要。 因此,我们使用了一个场景数据库来预先训练我们的神经网络。 为什么这样呢? 场景是包含大量其他对象的多个对象。 地标是场景的一个实例。 通过使用这样的数据库对模型进行预训练,我们可以为它提供一些低级特征的概念,然后可以对其进行概括以成功实现地标识别。

我们使用残差网络家族的神经网络作为模型。 这种网络的关键区别在于,它们使用的剩余块包括跳过连接,该跳过连接允许信号通过权重跳过层并自由通过。 这样的架构使得可以训练高质量的深度网络并控制消失的梯度效果,这对于训练至关重要。

我们的模型是Wide ResNet-50-2,这是ResNet-50的版本,内部瓶颈块中的卷积数量翻了一番。



网络性能很好。 我们使用场景数据库对其进行了测试,结果如下:

型号
前1错误
前5错误
ResNet-50
46.1%
15.7%
ResNet-200
42.6%
12.9%
SE-ResNext-101
42%
12.1%
WRN-50-2(快速!)
41.8%
11.8%

Wide ResNet的运行速度几乎是ResNet-200的两倍。 毕竟,运行速度对于生产至关重要。 考虑到所有这些因素,我们选择Wide ResNet-50-2作为主要的神经网络。

培训课程


我们需要损失函数来训练我们的网络。 我们决定使用度量学习方法进行选择:对神经网络进行训练,以使同一类别的项目聚集到一个群集中,而将不同类别的群集尽可能地隔开。 对于地标,我们使用中心损失将一类元素拉向某个中心。 这种方法的一个重要特征是它不需要负采样,这在以后的时代变得相当困难。



请记住,我们有n个地标类和另外一个不使用中心损失的“非地标”类。 我们暗示地标是一个相同的对象,并且具有结构,因此确定其中心是有意义的。 至于非地标,它可以指代任何东西,因此没有必要为其确定中心。

然后,我们将所有这些放在一起,就有了我们的培训模型。 它包括三个主要部分:

  • 使用场景数据库预先训练的Wide ResNet 50-2卷积神经网络;
  • 嵌入部分包括完全连接的层和批处理规范层;
  • 分类器是一个完全连接的层,后面是由Softmax损耗和Center损耗组成的一对。



您还记得,我们的数据库按地区分为4个部分。 我们在课程学习范例中使用这4个部分。 我们有一个当前的数据集,在学习的每个阶段,我们都会增加世界的另一部分,以获得用于训练的新数据集。

该模型包括三个部分,我们在训练过程中对每个部分使用特定的学习率。 网络必须具备此功能,才能从我们添加的新数据集部分中学习地标,并记住已学习的数据。 许多实验证明这种方法是最有效的。

因此,我们已经训练了模型。 现在我们需要意识到它是如何工作的。 让我们使用类激活图来查找神经网络最容易反应的图像部分。 下图显示了第一行中的输入图像,第二行中显示了我们在上一步中训练的网络中覆盖有课程激活图的相同图像。



热图显示网络更多地关注图像的哪些部分。 如类激活图所示,我们的神经网络已成功学习了地标的概念。

推论


现在,我们需要以某种方式使用这些知识来完成任务。 由于我们已使用中心损失进行训练,因此在推断的情况下,确定地标的质心似乎也很合逻辑。

为此,我们从训练集中获取了一些具有里程碑意义的图像,例如圣彼得堡的青铜骑士。 然后我们对它们进行网络处理,获得嵌入,取平均值,并得出质心。



但是,这里有一个问题:每个地标派生多少个质心才有意义? 最初,似乎很清楚且合乎逻辑地说:一个质心。 事实并非如此。 我们最初也决定制作一个质心,而且效果还不错。 那为什么要几个质心呢?

首先,我们拥有的数据不是那么干净。 尽管我们清理了数据集,但仅删除了明显的浪费数据。 但是,仍然可能存在图像没有明显浪费但对结果产生不利影响的情况。

例如,我在圣彼得堡有一个地标类的冬宫。 我想为此得出一个质心。 但是,其数据集包含一些带有皇宫广场和总部大楼拱门的照片,因为这些对象彼此靠近。 如果要为所有图像确定质心,则结果将不太稳定。 我们需要做的是以某种方式对它们从神经网络中得到的嵌入进行聚类,仅获取处理冬宫的质心,然后使用所得数据求平均值。



其次,照片可能是从不同角度拍摄的。

这是布鲁日钟楼所举例说明的这种行为。 为此已经导出了两个质心。 在图像的第一行中,有那些更靠近第一个质心的照片,而在第二行中,有那些更靠近第二个质心的照片。



第一个质心处理的是更多在布鲁日近距离拍摄的“宏伟”照片。 第二个质心处理从特定街道远距离拍摄的照片。

事实证明,通过为每个地标类推导几个质心,我们可以反思推断出该地标的不同相机角度。

那么,我们如何获得推导质心的那些集合呢? 我们将分层聚类(完整链接)应用于每个地标的数据集。 我们使用它来找到要从其导出质心的有效簇。 有效聚类是指由于聚类而至少包含50张照片的聚类。 其他集群被拒绝。 结果,我们获得了大约20%具有多个质心的地标。

现在进行推断。 它是通过两个步骤获得的:首先,将输入图像输入到我们的卷积神经网络并获得嵌入,然后使用点积将嵌入与质心进行匹配。 如果图像具有地理数据,则将搜索限制为质心,质心是指距图像位置1x1 km平方内的地标。 这样可以进行更准确的搜索,并降低后续匹配的阈值。 如果得出的距离超过算法的阈值,那么我们得出结论,照片的地标具有最大的点积值。 如果较小,则为非地标照片。



假设一张照片具有地标。 如果我们有地理数据,则可以使用它并得出答案。 如果地理数据不可用,那么我们将进行其他检查。 清理数据集时,我们为每个类制作了一组参考图像。 我们可以确定它们的嵌入,然后获得它们到查询图像嵌入的平均距离。 如果超过某个阈值,那么将通过验证,然后我们将引入元数据并得出结果。 重要的是要注意,我们可以对在图像中找到的几个地标运行此过程。



测试结果


我们将模型与DELF进行了比较,为此我们采用了可以在测试中显示最佳性能的参数。 结果几乎相同。

型号
地标
非地标
我们的模型
80%
99%
德尔夫
80.1%
99%

然后,我们将地标分为两种类型:频繁(数据库中有100多张照片),占测试中所有地标的87%;稀有。 我们的模型可以很好地处理频繁的模型:85.3%的精度。 在地标稀少的情况下,我们有46%的数据还算不错,这意味着即使数据很少,我们的方法也能很好地工作。

型式
精密度
占总数
频度
85.3%
87%
稀有
46%
13%

然后,我们使用用户照片进行A / B测试。 结果,云空间购买转换率增加了10%,移动应用程序卸载转换率减少了3%,相册浏览量增加了13%。

让我们将我们的速度与DELF的速度进行比较。 使用GPU,DELF需要7个网络运行,因为它使用7个图像比例,而我们的方法仅使用1。使用CPU,DELF使用最近邻居方法进行更长的搜索,并且进行非常长的几何验证。 最终,我们的方法使用CPU的速度提高了15倍。 我们的方法在两种情况下均显示出较高的速度,这对于生产至关重要。

结果:假期的回忆


在本文的开头,我提到了一种滚动和查找所需地标图片的解决方案。 来了



这是我的云,所有照片都分类为相册。 有专辑“ People”,“ Objects”和“ Attractions”。 在“景点”相册中,地标被分类为按城市分组的相册。 单击Dresdner Zwinger可以打开仅包含该地标照片的相册。



方便的功能:您可以休假,拍摄一些照片并将其存储在云中。 以后,当您希望将它们上传到Instagram或与亲朋好友共享时,您无需搜索和挑选时间太长-只需单击几下即可获得所需的照片。

结论


让我提醒您我们解决方案的主要功能。

  1. 半自动数据库清理。 初始映射需要一些手工工作,然后神经网络将完成其余工作。 这样可以快速清除新数据,并使用它来重新训练模型。
  2. 我们使用深度卷积神经网络和深度度量学习,这使我们能够有效地学习课堂结构。
  3. 我们已将课程学习(即部分培训)用作培训范式。 这种方法对我们非常有帮助。 我们在推论上使用多个质心,从而可以使用更清洁的数据并找到地标的不同视图。

似乎对象识别是一项琐碎的任务。 但是,在探索现实生活中的用户需求时,我们发现了新的挑战,例如地标识别。 这项技术可以使用神经网络向人们讲述世界的新事物。 这是非常令人鼓舞和激励的!

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


All Articles