在OkCupid上评估感知图像哈希值188bet金宝搏官网

在Ok188bet金宝搏官网Cupid上,我们有时会遇到重复使用我们以前见过的照片的用户和机器人。虽然有时我们可以简单地检查一张照片之前是否被看过(和禁止),但我们经常会遇到这样的情况,一张被禁止的照片被轻微地篡改过——所以准确的比较是不起作用的。即使图像上的一个微小的变化也会完全破坏精确的匹配。这是我们多年前就发现的问题,我们用一个简单的感知哈希函数解决了部分问题。然而,这些年来,我们已经熟悉了现行制度的缺陷。一旦我们让照片成为新用户的需求,对更强大方法的需求就会放大。

有几种方法可以解决这个问题,但最常用的方法是使用感知散列。对于外行人来说,哈希通常是(根据万能的上帝)维基百科)“可用于将任意大小的数据映射到固定大小的数据的函数”,例如将图像转换为表示该图像的位串。

传统上,这意味着加密散列(例如MD5,SHA-256),其中输入的最轻微的变化将产生输出的剧烈变化。但是,为了我们的目的,我们几乎希望对相反的相反 - 输入的略微变化(如,移位或旋转图像,稍差)应该没有在输出中没有变化。这是感知图像哈希的想法进来的地方。

最终,感知图像哈希旨在很大程度上不变的在其产出上使投入略有变化,同时产生少量(即可控)产出。有了这些功能,我们应该能够检查上传到网站上的照片是否就是那张稍微做了改动的照片,以避开精确的图像检查。

这篇文章的其余部分详细探讨了适合这种格式的四种不同的感知哈希算法,在哪些转换中它们不能保持不变,以及哪些总体性能更好。虽然我们已经有了一个感知散列系统,但现在是时候升级了!

评估

在这篇博文的剩余部分,我们将讨论感知图像哈希函数,它取任意图像并生成固定大小的位串。这就允许我们使用汉明距离在我们的评估中位于比特串之间。理论上,感知哈希可以产生图像的密集表示(即浮子的载体),但是使得比较更复杂。

我们在这里评估了两个主要的东西:

  1. 图像转换(或攻击),即攻击者将适用于图像的哪种转换,以便尝试欺骗检测系统
  2. 感知哈希功能准确性

该评估的目的是确定感知哈希在完全不同的图像对和图像对之间的分化,这只是图像及其变换版本。

评价概述

我们将其设置为衡量两种情况下的距离:

  1. 正面案例 - 图像之间的距离和这些图像的变换版本
  2. 负格-不同的原始图像之间的距离

我们在网站上使用大约10k图像的样本,以平衡在合理的时间和统计学意义中完成此操作,并且从该样本中我们在这些图像上运行了10个每种情况的试验。对于否定案例,我们实际上样本1K图像对(并获得哈希距离),而对于肯定案例,我们只需评估大量的转换和它们的距离,然后将它们样为1K示例。这使我们有一种可靠的每个度量是 - 尽管通常我们没有观察到大量显着的变化。

这里需要补充的一件重要的事情是,这些图片是经过刻意过滤的,以确保它们都不是来自垃圾邮件发送者,以防止重复使用的垃圾照片被视为不同的图像对。此外,我们采取额外的步骤删除任何非唯一的照片(通过比较它们的精确散列)。

转变

我们确定了五种典型的图像转换,在处理垃圾邮件发送者时,我们勤奋、不知疲倦的审核团队最常看到这五种转换。

  • 旋转(绕原点)
  • 庄稼
  • 伽马校正
  • 添加边框(或反向裁剪)
  • 盐和胡椒噪音

每个转换都有一个参数来控制操作的强度,例如旋转多少度。为了简化分析,我们为每个参数指定了三个桶:温和、中等和极端。每当应用转换时,指定了桶,参数均匀地从该桶中采样(参见上面的表格)。在大多数这些分析中,每个转换/桶都计算三次,因为更多的数据总是更好。

但是等着镜子......对于每个转换应用,我们翻转一个隐喻硬币并在其垂直轴上镜像变换的图像。我们跳过水平轴,因为它刚刚在野外看起来不是很多 - 一个人可能会想象倒置图片是一个非常明显的垃圾邮件。

感知哈希函数

由于他们在所提供的参考文献中详细说明,我们不会太多进入这篇文章中的每个感知哈希函数的细节。为简单起见,我们有限于评估四个常见的感知哈希职能:

这里使用的实现都是由Johannes Buchner出色而方便的Python提供的ImageHash图书馆

常规的汉明距离

由于每个哈希函数都将图像减少到位字符串,因此我们使用汉明距离来比较它们。这几乎是一种奇特的方式,说我们只是测量每个哈希之间有多少位不同。

为了比较产生不同大小的位串的哈希函数,我们还对产生的位串的长度进行规范化(假设我们不是在哈希函数之间比较位串,这无论如何都没有多大意义)。例如,当你看到这条线下面的直方图时,请注意距离(即x轴)是从0到1。实际上,这是两个位串之间不同的位与这些位串的长度之比。

指标

我们如何衡量感知哈希函数的质量?我们评估这些函数的主要范例是通过观察距离的分布在特定情况下的正面和负面情况。本质上,我们想要的是在每个情况下距离的分布(或直方图)是相当独立的。有几种方法可以做到这一点,但我们只考虑三个指标:

  • EMD距离(或所有深度学习领域的人神秘地开始称之为沃瑟斯坦距离)。我们想让它变大。
  • 两个直方图的交叉联盟(iou)。我们希望这很小。
  • 最大F1分数在最佳距离阈值处。我们希望这是真正的接近1。

EMD可能是以来的最一致的衡量标准,例如,您有两个是分开的直方图,并且希望将它们与两个直方图进行比较,这也分离但进一步分开。在最佳F1得分和IOU下,这两种情况都已经是最佳的 - 然而EMD将有利于后一种情况。

我们带来F1分数给我们一个阈值,稍后会讨论一下。考虑这一点的最简单方法正在沿X轴滑动该阈值,并找到最佳地分离直方图的阈值。

直方图IOO被提供为额外的比较,并且基本上直接测量每个直方图与另一个直方图重叠。

结果

一般比较

让我们说我们设置它,以便我们评估所有参数桶,所有哈希和所有变换。在这种情况下 - 如果您正在寻找此处快速答案 - 最好的选择根据指标似乎是平均值或小波哈希,每个哈希各自表现得大约相同。

然而,这可以是欺骗 - 并且评估的每个哈希函数的直方图说明了为什么(较少重叠更好)。

作为基准,在使用加密散列时查看散列的分布(在调试此评估时查看这一点非常有帮助)。

在这种情况下,我们可以在这种情况下看到加密散列产生完全重叠的正常分布为中心,其与预期相约为0.5。然后,我会建议解释在这种光线中的所有其他直方图 - 负类应该像这样的分布,理想情况下,正的阶层会完全向左平移。

所以乍一看你可以看到指标为什么有利于小波和平均哈希 - 它很明显,感知和差异哈希都具有更大的负面和正距离的重叠。但是,我们必须考虑实际的应用程序 - 如果我们想找到给定的图片哈希最近的哈希,我们希望尽可能地与误报绝缘。这意味着在我们尝试找到给定图像的最接近匹配的情况下,小波和平均哈希看到的负距离的传播可能会产生更多的假阳性!

因此,我们可以从所有的评估中得出一些主要的发现(例如,最困难的情况),我们看到的是积极的情况:

  • dct_hashdiff_hash.有双极正距离分布,并且显然被我们正在做的事情所迷惑,因为其中一个模式接近预期的随机距离。
  • Wavelet_hash.普通_hash.具有与距离增加的质量较少的长尾距离分布的样子,这意味着较少的转变“混淆”它们。

对于负面情况:

  • dct_hashdiff_hash.两者都在0.5标记附近有紧密的分布,其行为类似于加密散列情况。
  • Wavelet_hash.普通_hash.两者都有分布,而正常,围绕预期随机距离偏心,两个方向都远远差观。I don't have a great answer for why something like this happens, but my best guess is that by capturing the information that they do, they're somehow actually doing a better job of checking a higher level of image similarity (e.g. similar color palettes). This is probably worth investigating further.

基于上述情况,我认为分类是公平的dct_hashdiff_hash.即(相对)高精度、低查全率的感知哈希值Wavelet_hash.普通_hash.作为高召回,低精密散列。

某些哈希有什么变化的转变?

假设我们非常关心负情况距离的分布,想知道我们要做出什么样的牺牲dct_hashdiff_hash.反而。

不变性,镜像

首先,我们可能想要接受我们不能真正处理的是镜像操作,通过比较正的情况下的中值距离,当转换后的图像被镜像时,当它没有被镜像时。

看起来,当转换后的图像没有镜像时,每个散列的表现都明显更好,diff_hash.dct_hash似乎完全被他们的中位数距离接近预期随机距离所愚弄。

有了这个,再加上你只能镜像一个图像一次的事实,我们可以接受缺乏镜像。没有镜像,我们得到的直方图看起来更合理的两个低召回哈希。

镜像删除但下表显示另一个哈希也得到了重大的指标升压 - 但当然,仍然存在负案例分布的问题。

降低香料水平

这里需要考虑的另一件事是这些评估都在所有转换参数存储桶上运行。如果我们假设我们的攻击者都希望旋转超过5度或裁剪的图像,那么怎么办?对镜子过敏?

查看上面的指标!看起来有些人已经实现了完全可分离!!

在这种情况下,我们可以清楚地看到diff_hash.dct_hash显著提高他们的指标。因为这(当然)不会改变负数情况下的距离分布,如果我们只关心温和的转换情况,那么我们可能有一个像样的阈值来处理,而不会产生太多的假阳性!

为了简洁,我们将专注于diff_hash.讨论这个问题,因为我发现dct_hash类似的行为。下面是轻度病例的距离直方图比较。

阈值

我们可以通过优化F1分数来使用给我们的距离阈值来为我们提供截止(对于我们需要的应用程序),使得其距离低于阈值的任何图像对被认为是相同的,并且任何上面都是a不同的图像。

如果我们看看温和的案例,我们会注意到有哈希哈希近乎完美的F-1分数。这显然只能适用于轻度案例,但我们必须使用哪些转型牺牲来使用这个门槛?这一切都是转变吗?或者我们只是对一些更极端的转变失去了不变性,而不是全部?

我们来看看这个diff_hash.:当我们取阈值时,我们只看温和的变换参数,我们最终将其余的变换作为不同的图像对处理的正数情况的百分比是多少?

显然,大多数时间我们旋转超过15度,它完全崩溃(下面的示例) - 可以说是可以将下降到少于85%的图像的相同。它在中壳中没有伟大,其中旋转为6至15度!

我们看了一下不同哈希的失败机会普通_hash.Wavelet_hash.在同一个地方失败,但到目前为止 - 思考80%而不是96%的时间。

下面是一个快速的例子,以说明使用Alice的图片的30度旋转看起来像是我们的支持者的主管。

爱丽丝和OkCupid的188bet金宝搏官网关系就像汤姆和MySpace的关系。

无论如何需要多长时间?

总体上最慢的是小波哈希,其中剩下的时间几乎在相同的时间内计时。

简单说明一下——通常最慢的步骤之一是将图像调整到大多数感知哈希所使用的小哈希大小。这看起来奇怪,但它是有意义的,其他操作通常是在一个小(通过现代计算机标准)16 x16数组,因此,即使是那些时间复杂度高的转换可以没有时间,而即使是优化调整必须与一个大得多的图像。这也可以解释每个哈希所需时间的差异,因为我们事先没有将图像调整为固定大小。

尽管如此,每个哈希都很快,所以它不是太多问题,特别是当它可以从任何类型的图像上载都异步完成时。

其他的笔记

我们调查了一些在这里没有生成自己的部分的其他东西,所以这是一些快速指出:

  • 增加比特束长度(或散列尺寸)导致大多数感知散列的结果显着越来越糟糕,可能是因为它只是捕获了太多细节。
  • 对于小波哈希,我尝试了一堆不同的图像尺度和小波策略,除了使用Daubechies小波而不是Haar小波之外,它们都没有在度量上产生任何显著的差异——后者的表现明显更差。

结论与未来工作

我们从中得到的主要结论是,并不是只有一个哈希算法可以处理我们需要的所有事情。很可能我们将不得不明智地组合多个感知散列来得到一个可行的解决方案。然而,这些哈希值的计算成本都很低(我认为还可以进一步优化),这意味着为每张图像计算多个哈希值可能是构建图像相似性引擎的可行基础。

例如,可以使用低精度散列作为初始检查,然后是高精度散列,以分离可能需要从绝对相同图像的审查的情况。

一些思考未来工作:

  • 有一吨new有趣的值得考虑的哈希值。
  • 有相当多的方法来转换我们在野外看到的图像(例如添加标题,叠加在其他图像的透明度,压缩伪影),应该进行评估。
  • 哈希之间的行为是相似的,这确实有点奇怪。那里可能发生了一些有意义的事情值得研究。
  • 如上所述,评估/设计一个浇注体系结构
  • 我们可以研究给定图像对的哪些特征导致低精度哈希值不可靠/给它们一个较低的距离,并使用它来确定给定图像对的哪个算法的哈希距离是可信的。
  • 训练卷积网络以嵌入图像的端到端方法,使正负情况下的距离能够很好地分离,这可能是一种很酷的新型hyperbeast方法。这将具有额外的优势,即能够处理您在训练时能够想到的任何转换。

188bet金宝搏官网Okcupid正在招聘点击这里了解更多

最初出版https://tech.188bet金宝搏官网okcupid.com2017年5月31日。

188bet金宝搏官网Okcupid Tech Blog.

从每天连接数百万人的工程团队阅读故事

中等的是一个开放的平台,有1.7亿读者来这里寻找有洞察力和动态思维。在这里,专家和未被发现的声音一样深入任何话题的核心,并带来新的想法浮出水面。了解更多

跟随对你来说重要的作者、出版物和主题,你会在你的主页和收件箱中看到他们。探索

如果你有故事要讲,有知识要分享,有观点要分享,欢迎回家。在任何话题上发表你的想法都是简单而免费的。开一个博客

获取Medium应用程序

一个按钮,称“在App Store上下载”,如果点击它将导致您到iOS App Store
一个“打开,谷歌播放”的按钮,如果你点击它,就会进入谷歌播放商店