雷诺阅读
扫描关注天津网站建设微信公众账号

扫一扫关注微信

人工智能是如何识别一张黄图的?

雷诺网络2018-01-23 08:56:34雷诺干货

前言

本文尝试用通俗的语言为大家介绍人工智能是如何实现“黄图”的识别的,全文没有复杂的公式和晦涩的术语,适合初级技术人员和有强烈好奇心的读者。如果有兴趣对文章内提及的一些人工智能的基础概念(神经网络,梯度下降,卷积等)深入研究,网上资料已经很多了,可以自行查阅。(注意:由于演示需要,本文可能包含一些尺度较大的图片。)

色情作为人类最基本欲望的体现之一,一直伴随着人类社会的发展而以不同形式展现着。互联网时代的到来也给色情的表现形式带来了巨大的机会,有文章说互联网上的流量有50%都是与色情相关的,我不能证实这个数据的真实性,不过读者可以在日常生活中自行体会。

当然今天我们不讨论色情产业的合理性,只专注于从技术角度研究如何鉴别互联网上的这些数字内容。接下来我结合网易信息安全部门的实践经验来解释如何做到这件事。

鉴黄的历史

在计算机的“远古时代”,其实也就是十几年前吧,我们识别黄图的做法简单粗暴:人工审核。别小看了这个方法,其实针对当时的网络环境(带宽小,产品少,图片数据也少),效果还是很不错的。一天几万的图片量,安排几个人肉眼盯着看,发现有不良的图片人工删掉就好了。

后来,互联网产品普及率高了,网络数据量暴增,一个产品一天出现几百万的图片量也是很正常的情况,这个时候想要靠堆人力去完成审核几乎不可能了。(再说,有多少产品可以支撑得起几百上千审核人员的成本呢)。幸好相应的计算机视觉技术也有进步了,我们用肤色识别算法过滤掉一些没那么多“黄色”内容的图片,剩下的再进入到人工审核,可以大大节约审核量。据统计,经过机器肤色识别过滤后大约只有20%的图片还需要人工审核。

等到移动互联网普及,各种类型的网络数据量暴增,人工审核连20%的数据量也无法承受了,加上视频、直播等业务和数据的爆发式增长,我们迫切需要一个更加有效的方案来解决审核的问题。很自然的,我们也紧跟人工智能的技术热潮开始研发机器学习的鉴黄系统,并且取得了显著成果。

人工智能鉴黄原理

辨别一张图是不是黄图,从机器学习的角度看,本质上是一个分类问题:给定一张图片,让机器判断是不是“黄图”。我们要做的就是研发一个“分类器”,它能根据输入的图片计算出该图片属于“黄图”类别的概率,然后再根据这个概率值输出一个“是”或者“否”的结果。众所周知,电脑擅长的是数学运算,所以我们要把这个“分类器”先抽象成某种数学模型,这样才有可能用电脑来运算。

为了方便理解,我们把数学模型定义为:y=f(x)。即给定图片x,我们要找到一个函数f,通过计算f(x)可以得到这个图片的黄图概率y。很简单吧!理论上这个数学模型可以解决所有的分类问题。好了,那这个看似简单的工作到底应该怎么实现呢?我们按下面的步骤慢慢来:

第一步:给出定义。既然你要教机器分类,自然要有明确的分类标准,如果标准都没有,那机器计算出来的值就没有意义了。很自然的,我们先把露点的图片归类到黄图,再明确一点,就是男性露下体,女性露乳房或者下体的图。不过,多年的实践经验告诉我们只根据是否漏点来判断图片类别是远远不够的。比如这张图:

【介于图片尺度问题,无法公开,大家可以想象一张裸体XXOO但不露点的侧身图】

图1 没露点的色情

它并没有露点,但是很明显不能认为它是一个正常图片。(不考虑政策监管因素,仅从学术研究的角度讲,也应该把这个图片归类到黄图的一种)。反之,也并不是所有露点的图片都是黄图,比如图2:

图2 特殊但合理

然而,意识到这些仅仅是定义工作的开始,在真实世界的数据形态和政策法规的约束下,更多的图片需要被分类,比如图3、图 4 等等:

图3: 此处想象一张低俗但不漏点的图片

图4 泳装

通过上面的例子是为了让大家明白,仅靠“黄图”这样一个笼统的定义是无法满足实际情况的。我们得把一个“二分类问题”演进成更加复杂的“多分类问题”,并且尽量把定义和标准清晰化,这显然是一个庞大和繁杂的工作。我们组建了专门的运营团队对数据和政策法规进行研究,根据实际情况积累了许多的分类定义和标准。

第二步:收集样本。有了定义之后,我们就要根据定义来收集样本数据。幸好我们之前多年的审核工作积累了大量的图片数据,其中有很多经过了人工审核确认是黄图的,所以我们从里面筛选出部分图片作为训练的数据。由于定义的分类数量非常多,我们不得不开发专门的分类标签系统并组建额外的人工标注团队,把训练数据做进一步的筛选。训练数据的质量好坏对效果的影响非常大,所以我们必须很有耐心地投入到训练数据准备的工作中。这个工作消耗了大量的时间和人力成本,并且还一直在持续进行中。由于都是违禁的图片,为了避免二次传播,我们也难以像ImageNet一样通过众包的形式来完成。

第三步:训练模型。回到一开始的数学模型y=f(x),训练模型的目的就是为了得到f。我们通过前面的两步得到了标注好的图片样本集,把标注的结果定义为y*,图片为x,现在我们要想办法找到一个f,可以对样本集中所有的图片计算得到的y跟y*最接近,也就是得到使|y- y*|的值最小的f。我们可以把|y- y*|定义为损失函数。如何找一个函数的最小值在数学界已经有成熟的算法。一般采用梯度下降法去寻找合适的f。

虽然所有图片数据在电脑看来也都是 0 和 1 的二进制数据,比如下图就是前面图 1 的二进制形态的片段。但是直接拿这些 0 和 1 的数据计算,容易导致运算量过大,图片特征提取的效率和准确度都难以保证。

图5 图片的二进制值

如何高效地提取出特征数据来代表图片x是很关键的一步。技术上称之为特征提取。幸好许多前辈科学家已经做了大量的研究,近些年来,基于深度学习的神经网络模型在各种图像识别的比赛中获得了突破性的进展。所以我们选用了CNN(卷积神经网络)、GoogLeNet、ResNet(残差网络)三种深度网络模型结构作为研究的基础。通过这些模型,我们就可以更加高效地把图片数据转变成了可以运算的数学模型,使我们可以更快更好地得到f。

当然实际情况下f是一个非常复杂的函数,为了简化运算,我们把f拆分成了fn(fn-1(fn-2(f…(f2(f0))…)),每一个f可以理解为神经网络的一层,n个f就是n层,这种层层递进的关系就是算法名称中“深度”的由来。理论上我们可以搭建任意深度(层次)的神经网络模型。把f拆分之后,我们用倒推的办法就能得到每一层的f。

文章关键词