以编程方式检测色情图像的最佳方法是什么?[已关闭]

2022-09-02 22:45:19

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

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

我应该如何开始?

有没有开源项目?


答案 1

这实际上相当容易。您可以以程序方式检测肤色 - 色情图像往往有很多皮肤。这将产生误报,但如果这是一个问题,您可以传递通过实际审核检测到的图像。这不仅大大减少了版主的工作,而且还为您提供了许多免费的色情内容。这是双赢的。

#!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个。这是一个相当高的误报率,但脚本旨在相当谨慎,可以进一步调整。它适用于浅色,深色和亚洲肤色。

它的主要缺点是像沙子和木头这样的棕色物体,当然它不知道“顽皮”和“漂亮”肉(如面部射击)之间的区别。

假阴性图像的弱点是没有太多暴露的肉(如皮革束缚),油漆或纹身的皮肤,黑白图像等。

源代码和示例图像


答案 2

这是在2000年写的,不确定色情检测的艺术水平是否已经进步,但我对此表示怀疑。

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

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

使用默认的中等敏感度,如果人力资源部在“帐户”中发送新小伙子的图片,则您有大约50%的机会获得它。如果你的姐姐给你发了一张她六个月大的照片,同样有可能被拘留。

指出有趣的错误是公平的,比如称蒙娜丽莎为色情片,如果它们代表了软件的行为。如果制造商承认他们的算法图像识别器会在15%的时间内掉球,那么当它这样做时取笑它是愚蠢的。

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


推荐