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

时间:2009-04-03 09:39:52

标签: spam-prevention

Akismet在检测垃圾评论方面做得非常出色。但是评论现在并不是垃圾邮件的唯一形式。如果我想要像akismet这样的东西在社交网站上自动检测色情图片,允许用户上传他们的照片,头像等,该怎么办?

已经有一些基于图像的搜索引擎以及面部识别的东西可用,所以我假设它不是火箭科学,它可以做到。但是,我不清楚这些东西是如何工作的,如果我想从头开始开发它我应该如何去做。

我该如何开始?

是否有任何开源项目正在进行中?

25 个答案:

答案 0 :(得分: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个。这是一个非常高的误报率,但剧本旨在相当谨慎,可以进一步调整。它适用于浅色,深色和亚洲肤色。

假阳性的主要弱点是沙子和木头等棕色物体,当然它不知道“顽皮”和“漂亮”肉体之间的区别(如面部镜头)。

假阴性的弱点是没有太多暴露肉体(如皮革束缚),涂漆或纹身皮肤,B&amp; W图像等的图像。

source code and sample images

答案 1 :(得分:69)

这是2000年写的,不确定色情检测的最新技术是否先进,但我对此表示怀疑。

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

  只要图片是彩色的,PORNsweeper似乎有能力区分人物照片和非人物照片。它在区分人们的干净图片和干净图片方面不太成功。

     

使用默认的中等敏感度,如果人力资源在账户中发送新章的图片,那么你有大约50%的机会获得它。如果你的妹妹给你发了她六个月大的照片,那么同样可能会被拘留。

     

如果他们能够代表软件的行为,那么指出有趣的错误,例如调用蒙娜丽莎色情片,这是公平的。如果制造商承认他们的算法图像识别器会在15%的时间内丢球,那么当它确实是愚蠢的时候取笑它。

     

但PORNsweeper似乎只能在一个部门达到规定的规格 - 检测实际色情内容。 在检测色情片方面有点中等,但在检测干净的照片方面却很糟糕。如果在不久的将来这个领域没有重大飞跃,我不会感到惊讶。

答案 2 :(得分:45)

我宁愿让用户报告不良图片。图像识别开发可能需要花费太多的精力和时间,并且不会像人眼一样精确。外包这种审核工作要便宜得多。

看看:Amazon Mechanical Turk

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

答案 3 :(得分:22)

答案 4 :(得分:15)

BOOM!这是包含算法的whitepaper

有谁知道从哪里获取java(或任何语言)实现的源代码?

那会摇滚。

一种称为WISE的算法具有98%的准确率,但误报率为14%。所以你要做的就是让用户标记2%的漏报,理想情况是如果有一定数量的用户标记它就自动删除,并让版主查看14%的误报。

答案 5 :(得分:9)

Nude.js基于来自De La Salle大学的Rigan Ap-apid的whitepaper

答案 6 :(得分:8)

有一种软件可以检测出色情的可能性,但这不是一门精确的科学,因为计算机无法识别图片上的实际内容(图片只是网格上一大堆没有任何意义的值)。你可以通过举例来教电脑什么是色情片,什么不是。这样做的缺点是它只能识别这些或类似的图像。

鉴于色情片的重复性,如果你训练系统的误报很少,你就有很好的机会。例如,如果你用裸体人员训练系统,它可能会将“几乎”裸体人物的海滩图片标记为色情图片。

类似的软件是最近推出的facebook软件。它只专注于面孔。主要原则是一样的。

从技术上讲,您可以实现某种利用贝叶斯过滤的特征检测器。如果它是一个简单的探测器,或者只是计算当前图像与一组已保存的色情图像的相似度,则特征检测器可能会寻找像肉色像素百分比这样的特征。

这当然不仅限于色情片,它实际上更像是一个角落案例。我认为更常见的是试图在图像中找到其他东西的系统; - )

答案 7 :(得分:5)

台湾国立成功大学的一名研究生于2004年对该课题进行了研究。他在检测从互联网上下载的裸照时,成功率达89.79%。以下是他的论文的链接:The Study on Naked People Image Detection Based on Skin Color
它是中文的,因此如果您无法阅读,您可能需要翻译。

答案 8 :(得分:5)

答案非常简单:可以肯定地说,在接下来的二十年里,这是不可能的。在此之前,我们可能会得到很好的翻译工具。我最后一次检查时,AI人员正在努力在两张从略微改变的角度拍摄的照片上识别同一辆车。看看他们一起获得足够好的OCR或语音识别需要多长时间。这些是识别问题,可以从字典中受益匪浅,并且尽管有数百万人的月份,但仍远未拥有完全可靠的解决方案。

话虽如此,你可以简单地添加一个“攻击性”?链接在用户生成的竞争旁边,并有一个mod交叉检查传入的投诉。

编辑:

我忘记了一件事:如果您要实施某种过滤器,您将需要一个可靠的过滤器。如果你的解决方案是50%正确,4000个拥有体面图像的用户中的2000个将被阻止。期待愤怒。

答案 9 :(得分:4)

添加攻击性链接并存储违规图像的md5(或其他哈希),以便将来自动标记。

如果有人拥有图像md5的大型公共数据库以及作为Web服务运行的描述性标记,那会有多酷?很多色情片不是原创作品(因为现在拥有它的人,可能不会制作它)而流行的图像往往漂浮在不同的地方,所以这可能真的有所作为。

答案 10 :(得分:4)

简短回答:使用主持人;)

答案很长:我不认为有这个原因的项目是什么色情片?只有腿,完全裸露,侏儒等。它的主观性。

答案 11 :(得分:2)

如果你真的有时间和金钱:

一种方法是通过1)编写图像检测算法来查找对象是否为人。这可以通过对图像进行位掩码来检索它的“轮廓”并查看轮廓是否适合人体轮廓来完成。

2)数据挖掘了大量的色情图片,并使用C4算法或粒子群优化等数据挖掘技术来学习检测与色情图片相匹配的图案。

这将要求您确定人体的裸体轮廓如何以数字化格式显示(这可以通过OCR图像识别算法的相同方式实现)。

希望你玩得开心! : - )

答案 12 :(得分:2)

在我看来,主要的障碍是定义一个“色情图片”。如果你可以轻松定义它,你可能会写一些可行的东西。但即便是人类也无法就色情内容达成一致。该应用程序将如何知道?用户审核可能是您最好的选择。

答案 13 :(得分:1)

我能想到的两个选项(尽管它们都不是以编程方式检测色情内容):

  1. 阻止所有上传的图片,直到您的某个管理员查看过它们为止。没有理由为什么这需要很长时间:你可以写一些软件,每秒显示10张图像,几乎就像电影一样 - 即使在这个速度下,人类也很容易发现潜在的色情图像。然后你在这个软件中回放并仔细看看。
  2. 添加通常的“将此图片标记为不当”选项。

答案 14 :(得分:1)

BrightCloud web service API非常适合这一点。这是一个用于进行网站查找的REST API。它包含一个非常大且非常准确的网络过滤数据库,其中一个类别是成人,已经确定了超过1000万个色情网站!

答案 15 :(得分:1)

我听说过使用非常简单但非常有效的算法的工具。该算法计算了具有接近某些预定“皮肤”颜色的颜色值的像素的相对量。如果该数量高于某个预定义值,则图像被认为是色情/色情内容。当然,该算法会给特写脸部照片和许多其他事物带来假阳性结果 由于您正在撰写关于社交网络的文章,因此会有很多“正常”的照片,其上有大量的肤色,因此您不应该使用此算法来拒绝所有具有正面结果的图片。但是你可以使用它为版主提供一些帮助,例如标记这些图片的优先级较高,所以如果主持人想要查看一些新的图片中的色情内容,他可以从这些图片开始。

答案 16 :(得分:1)

这个看起来很有希望。基本上它们检测皮肤(通过识别面部进行校准)并确定“皮肤路径”(即测量皮肤像素与面部皮肤像素/皮肤像素的比例)。这有不错的表现。 http://www.prip.tuwien.ac.at/people/julian/skin-detection

答案 17 :(得分:1)

检测色情图片仍然是一项非常理论化的人工智能任务。

通过添加按钮/链接“报告垃圾邮件/滥用行为”来收集集体力量和人类智能。或聘请几位主持人来完成这项工作。

P.S。真的很惊讶有多少人提出问题,假设软件和算法都是强大的,甚至没有考虑是否可以做到他们想要的东西。他们是那些对硬件,低级编程以及所有“魔术背后”都不了解的新型程序员的代表吗?

P.S。 #2。我还记得,在某些情况下,当人们自己无法决定图片是色情片还是艺术片时,会发生这种情况。即使在法院规定之后,也有一半的人会认为这个决定是错误的。这种类型的最后一个愚蠢的情况是最近一个维基百科页面在英国被禁止,因为CD封面图像有一些裸露。

答案 18 :(得分:1)

我见过一个网络过滤应用程序,它做了色情图片过滤,抱歉我记不清了名字。它很容易出现误报,但大部分时间它都在工作。

我认为主要技巧是检测“图片上有太多皮肤:”

答案 19 :(得分:0)

  

今天我不会再进一步​​尝试   定义我的材料种类   明白要接受它   简写说明[“hard-core   色情“];也许我可以   永远不会成功地做到   所以。但是当我看到它时我就知道了   这部电影涉及到这一点   情况不是那样。

- United States Supreme Court Justice Potter Stewart, 1964

答案 20 :(得分:0)

你可以在网上找到很多关于这个主题的whitepapers

答案 21 :(得分:0)

这不是火箭科学。不再。它与人脸识别非常相似。我认为处理它的最简单方法是使用机器学习。由于我们处理图像,我可以指向神经网络,因为这些似乎是图像的首选。您将需要培训数据。您可以在互联网上找到大量的训练数据,但您必须将图像裁剪为您希望算法检测的特定部分。当然,您必须将问题分解为您想要检测的不同身体部位,并为每个部位创建训练数据,这就是事情变得有趣的地方。

就像上面提到的那样,它无法100%完成。会出现这种算法失败的情况。实际精确度将取决于您的训练数据,神经元网络的结构以及您将如何选择聚类训练数据(阴茎,阴道,乳房等,以及其组合)。在任何情况下,我都非常有信心,这可以通过高精度实现明确的色情图像。

答案 22 :(得分:0)

这是一个裸露探测器。我没试过。这是我能找到的唯一一个OSS。

https://code.google.com/p/nudetech

答案 23 :(得分:0)

查看文件名和任何属性。即使有20%的顽皮图像也没有足够的信息来检测,但是一个简单的关键字黑名单至少会检测带有描述性标签或元数据的图像。编写成功率20%的20分钟并不是一件坏事,尤其是作为一个预先屏幕,在你将其余部分传递给主持人进行评判之前,它至少可以抓住一些简单的屏幕。

另一个有用的技巧是相反的,保持图像源的白名单允许不经过审核或检查。如果您的大多数图像来自已知的安全上传器或来源,您可以绑定它们。

答案 24 :(得分:-1)

对于现在的知识,你无法做到这一点100%(我想说1-5%可能是合理的)。你会得到更好的结果(比那些1-5%)只是检查性别相关词的图像名称:)。

@SO Troll:是的。