什么是以编程方式检测色情图片的最佳方法?

120
Akismet在检测垃圾评论方面表现出色。但是如今,评论并不是唯一的垃圾形式。如果我想要像Akismet这样的东西自动检测社交网络网站上的色情图片,该怎么办?该网站允许用户上传他们的照片、头像等。
已经有一些基于图像的搜索引擎和面部识别技术可用,因此我认为这并不是什么高深技术,应该可以做到。然而,我对它的工作原理以及如果我想从头开始开发它应该怎么做一无所知。
我该如何开始?
是否有任何开源项目正在进行中?

82
我认为这听起来比火箭科学还要难!我们已经有很多火箭,但据我所知,没有这样的“色情检测器” :) - GaZ
4
LOL。现在已经有人脸识别技术了,但是还没有生殖和乳房识别技术。真不幸。 - Jon Limjap
11
色情内容是与地域相关的问题。此外,我确信有许多图片并没有显示生殖器或裸体,但在某些地方仍然被认为是相当露骨的。(再次强调-在某些地方)。听起来需要一个高级人工智能来完成,而不是简单的算法。 - Noam Gal
2
我刚刚偶然发现了这个实用工具,让我想起了这个帖子。不知道它是否有效?http://proofpronto.com/porn-detection-stick-by-paraben.html - Martin Smith
1
@jm666,如果这个问题对你来说很严重,并且你认为这个领域的技术水平在过去两年里有所提高,那么为什么不在被引用的重复问题上设置赏金呢?这样你就可以吸引一些关注,也许会得到一些答案。 - Michael Petrotta
显示剩余4条评论
25个回答

89

实际上这相当容易。你可以编程检测肤色 - 色情图片往往有很多皮肤。这将产生错误的正面结果,但如果这是一个问题,你可以通过实际审核来处理这些图片。这不仅极大地减轻了审核员的工作量,而且还给你带来了大量免费的色情内容。这是双赢。

#!python    
import os, glob
from PIL import Image

def get_skin_ratio(im):
    im = im.crop((int(im.size[0]*0.2), int(im.size[1]*0.2), im.size[0]-int(im.size[0]*0.2), im.size[1]-int(im.size[1]*0.2)))
    skin = sum([count for count, rgb in im.getcolors(im.size[0]*im.size[1]) if rgb[0]>60 and rgb[1]<(rgb[0]*0.85) and rgb[2]<(rgb[0]*0.7) and rgb[1]>(rgb[0]*0.4) and rgb[2]>(rgb[0]*0.2)])
    return float(skin)/float(im.size[0]*im.size[1])

for image_dir in ('porn','clean'):
    for image_file in glob.glob(os.path.join(image_dir,"*.jpg")):
        skin_percent = get_skin_ratio(Image.open(image_file)) * 100
        if skin_percent>30:
            print "PORN {0} has {1:.0f}% skin".format(image_file, skin_percent)
        else:
            print "CLEAN {0} has {1:.0f}% skin".format(image_file, skin_percent)

这段代码测量了图像中心的肤色。我测试了20张相对温和的“色情”图片和20张完全无辜的图片。它标记出了100%的“色情”图片和20张干净图片中的4张。虽然误报率相当高,但该脚本旨在非常谨慎,可以进一步调整。它适用于浅色、深色和亚洲人的肤色。

其主要误报弱点是棕色物体(如沙子和木材),当然,它也不知道“淘气”和“漂亮”的皮肤有什么区别(比如人脸照片)。

假阴性的弱点将是没有暴露太多肉体的图片(如皮革束缚)、涂画或纹身的皮肤、黑白图像等。

源代码和示例图像


你能否发布你的20行Python概念验证代码?(-1) - bobobobo
还不错,+1。有趣的是,常规表面(如地毯或冰箱表面)的图像显示出具有高量的皮肤。 - bobobobo
6
提示:样本图片中没有实际裸露。 - Luc
这也将把木材视为皮肤。因为它们具有完全相同的颜色,但不同的质地。更不用说肖像画了。 - Maarten

69

这篇文章写于2000年,不确定色情检测技术的现状是否有所进步,但我表示怀疑。

http://www.dansdata.com/pornsweeper.htm

对于有色彩的图片,PORNsweeper似乎可以区分人物图片与非人物图片,但是较难区分脏乱的人物图片和干净的人物图片。使用默认的中等敏感度时,如果人力资源部门发送了会计部新同事的照片,你有大约50%的机会获得它。如果你的姐姐给你发她六个月大孩子的照片,也有类似的可能被拦截。

应该指出一些有趣的错误,例如把《蒙娜丽莎》称为色情图片,如果这些错误代表了软件的行为方式,那么当它确实出现这种错误时,取笑它就显得愚蠢了。但是PORNsweeper只在一个方面符合其声明的规格——检测实际的色情图片。它在检测干净图片方面表现不好。而且我不会惊讶于在不久的将来没有在这个领域取得重大进展。


当然,自那时以来,色情检测已经取得了很大进展。在对象识别/图像分类/计算机视觉方面已经有了许多突破。对我来说,2000年感觉就像是石器时代。 - Maarten

45

我更愿意允许用户报告不良图片。图像识别开发需要太多的时间和精力,并且准确性也不如人眼。外包这项审核工作成本更低。

请看:亚马逊机械土耳其

"亚马逊机械土耳其(MTurk)是亚马逊网络服务套件之一,是一个众包市场,使计算机程序协调使用人类智能执行计算机无法完成的任务。"


4
可能存在一个市场,需要一个像亚马逊机械土耳其式网站的平台,但专门针对这种主题。 :) - Rich
6
Amazon Mechanical Turk可能是需要花钱的。考虑到这个主题,您或许会认为有一种聪明的商业模式可以让您免费完成这项工作。 - Ankur
1
我认为这是一种相当不道德的方法。 - Noon Silk
2
@Ankur 哈哈!好主意。我要去nic.com看看PornOrNot.com还有没有被注册。 - Pekka
9
为什么您觉得这种做法是不道德的? - Mazatec
显示剩余3条评论


15

BOOM! 这里是包含算法的白皮书(点击此处)。

有人知道哪里可以获取Java(或任何语言)实现的源代码吗?

那太棒了。

一种名为WISE的算法具有98%的准确率,但14%的假阳性率。因此您需要让用户标记2%的假阴性,并自动删除一定数量的用户标记后,由管理员查看14%的假阳性。


你找到了算法,这真是太棒了。源代码通常留作练习。毕竟,我们没有指定任何特定的编程语言,不是吗? - Ian

9

Nude.js 是基于来自德拉萨尔大学的 Rigan Ap-apid 的 白皮书 开发而成。


Nude.js现在也可以扫描视频,不仅限于图像。 - geeknik

8
有一种软件可以检测色情的可能性,但这并不是一门确切的科学,因为计算机无法识别图片上实际的内容(图片只是一组没有意义的网格值)。你只能通过示例来教计算机什么是色情和什么不是。这种方法的缺点是它只能识别这些或类似的图像。
鉴于色情的重复性质,如果您用少量的误报训练系统,您就有很大的机会成功。例如,如果您用裸体人的图片训练系统,它可能会把海滩上“几乎”裸体的人的照片也标记为色情。
类似的软件是最近推出的 Facebook 软件,它只是专门针对脸部的。其主要原理是相同的。
从技术上讲,您需要实现某种特征检测器,利用贝叶斯过滤器。特征检测器可以查找像肉色像素百分比这样的特征,如果它是一个简单的检测器,或者只是计算当前图像与一组保存的色情图像之间的相似度。
当然,这不仅限于色情,它实际上更多地是一个极端案例。我认为更常见的是试图在图像中找到其他东西的系统;-)

1
为什么人们会对这个答案进行负评? - Patrick Cornelissen
因为它不包含任何算法、配方或参考资料,所以请仅翻译文本内容。 - Ian
7
那么,向提问者解释他想要实现的事情并不真正可行,不是一个有效的答案。伙计,你可以更加放松一点... - Patrick Cornelissen
它还发表了一个错误的声明:“计算机无法识别图片上实际的内容”。 - Daveth3Cat
因为它们无法做到。你只能学习检测特定的图像,而且你拥有的正负样本数据库越大,效果就越好,但总体上来说,你永远不会得到一个像人类一样准确的解决方案,所以最终你会得到大量的误报和漏报。 - Patrick Cornelissen

5

2004年,来自台湾国立成功大学的一位研究生对此进行了研究。他能够以89.79%的成功率检测从互联网下载的裸体图片。以下是他的论文链接:基于肤色的裸体人像图像检测研究
如果您无法阅读,请使用翻译工具。


5
答案很简单:可以毫不夸张地说,在接下来的20年内,这几乎是不可能实现的。在那之前,我们可能会得到好的翻译工具。上次我检查时,人工智能专家们正在努力识别从稍微改变角度的两张照片上拍摄的同一辆汽车。看看他们花了多长时间才能将良好的OCR或语音识别技术结合在一起。这些都是需要字典帮助的识别问题,尽管投入了数百万人月,但仍远未完全可靠。

话虽如此,您可以简单地在用户生成的内容旁边添加一个“冒犯?”链接,并让管理员交叉检查收到的投诉。

编辑:

我忘记了一件事:如果您要实施某种过滤器,您需要一个可靠的过滤器。如果您的解决方案只有50%正确率,那么将会有2000个出现像样图片的用户被阻止。预计会引起公愤。


4
短答案:使用调解员 ;)
长答案:我认为没有这样的项目,因为什么是色情?只有腿、全裸、侏儒等。这是主观的。

3
最佳的程序化检测色情图片的方法是什么?程序化意味着使用计算机程序进行检测。 - Agusti-N
5
我知道这个问题,但正如我所说,没有100%准确的色情屏蔽器,因为色情是主观的。主观无法与代码相关联。有人认为仅仅是裸露,而另一些人认为那就是色情。更好的解决方案是添加一个“举报图像”的按钮,和Koistya Navin .NET的想法相同。 - RvdK
1
“Midgets etc.”?天啊,这是什么毫无关联的话题,蝙蝠侠。 - Doug McClean
有这样一种东西叫做侏儒色情片。 - Chris Sherlock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接