在软件中显示太多“皮肤”检测

时间:2008-11-04 20:48:34

标签: asp.net image-processing

我正在构建一个ASP.NET网站,用户可以上传自己的照片。每天可能会有数千张照片上传。我的老板曾经问过一件事,就是我们有什么方法可以检测出任何照片是否显示出太多“皮肤”并在编辑做出最终决定之前自动将其标记为“仅限成人”。

14 个答案:

答案 0 :(得分:37)

最好的办法是处理HSV色彩空间中的图像(有关rgb - hsv转换,请参阅here)。所有种族之间的皮肤颜色几乎相同,只是变化的饱和度。通过处理HSV中的图像,您可以简单地搜索皮肤的颜色。

您可以通过简单计算颜色范围内的像素数来实现此目的,或者您可以perform region围绕像素生长以计算颜色区域的大小。

编辑:为了处理颗粒状图像,您可能希望首先在图像上执行median filter,然后减少颜色数量以首先分割图像,您必须使用上的设置进行操作大量预分类(成人或非成像)图像,并查看值如何表现以获得令人满意的检测水平。

编辑:下面是一些应该进行简单计数的代码(没有经过测试,它是here和rgb到hsl here的一些代码的快速混搭)

Bitmap b = new Bitmap(_image);
BitmapData bData = b.LockBits(new Rectangle(0, 0, _image.Width, _image.Height), ImageLockMode.ReadWrite, b.PixelFormat);
byte bitsPerPixel = GetBitsPerPixel(bData.PixelFormat);
byte* scan0 = (byte*)bData.Scan0.ToPointer();

int count;

for (int i = 0; i < bData.Height; ++i)
{
    for (int j = 0; j < bData.Width; ++j)
    {
        byte* data = scan0 + i * bData.Stride + j * bitsPerPixel / 8;

        byte r = data[2];
        byte g = data[1];
        byte b = data[0];

        byte max = (byte)Math.Max(r, Math.Max(g, b));
        byte min = (byte)Math.Min(r, Math.Min(g, b));

        int h;

        if(max == min)
            h = 0;
        else if(r > g && r > b)
            h = (60 * ((g - b) / (max - min))) % 360;
        else if (g > r && g > b)
            h = 60 * ((b - r)/max - min) + 120;
        else if (b > r && b > g)
            h = 60 * ((r - g) / max - min) + 240;


        if(h > _lowerThresh && h < _upperThresh)
            count++;
    }
}
b.UnlockBits(bData);

答案 1 :(得分:34)

当然,对于发布某人脸部特写(或手,脚或其他)的第一个用户,这将失败。最终,所有这些形式的自动审查都会失败,直到计算机进行对象识别的方式出现真正的范式转换。

我并不是说你不应该尝试它;但我想指出这些问题。不要指望完美(甚至是好)的解决方案。它不存在。

答案 2 :(得分:21)

我怀疑是否存在可以确定用户是否上传顽皮图片的现成软件。您最好的选择是让用户使用图片旁边的按钮将图像标记为“仅限成人”。 (澄清:我的意思是除了上传图片的用户之外的用户 - 类似于在StackOverflow上如何标记帖子的攻击性。)

此外,请考虑对在专用产品中尝试做同样事情的审核:http://www.dansdata.com/pornsweeper.htm

从今天的StackOverflow播客中窃取的链接,当然:)。

答案 3 :(得分:15)

我们甚至无法在博客文章中编写能够准确检测脏词的过滤器,而且您的老板要求使用色情检测器? CLBUTTIC!

答案 4 :(得分:11)

我想说你的答案在于众包这项任务。这几乎总是有效并且倾向于很好地扩展非常

它不必涉及使某些用户进入“管理员”并提出不同的权限 - 它可以简单到在每个图像附近启用“不适当”链接并保持计数。

答案 5 :(得分:6)

见Fleck / Forsyth在ECCV上发表的开篇论文“寻找裸体人”。 (高级)。

http://www.cs.hmc.edu/~fleck/naked.html

答案 6 :(得分:5)

来自理论/算法立场的有趣问题。解决该问题的一种方法是标记包含大的肤色区域的图像(如Trull所解释的)。

但是,显示的皮肤数量不是图像的决定因素,而是显示的皮肤的位置。也许您可以使用面部检测(搜索算法)来细化结果 - 确定皮肤区域相对于面部的大小,以及它们是否属于面部(可能在它下面多远)。

答案 7 :(得分:3)

我知道Flickr或Picasa已经实现了这一点。我相信这个例程叫做FleshFinder。

关于这样做的架构的提示:

将其作为与ASP.NET管道分开的Windows服务运行,而不是实时分析图像,创建一个新图像队列,上传供服务使用。

如果需要,您可以使用正常的System.Drawing内容,但如果您真的需要处理大量图像,最好使用本机代码和高性能图形库,并从您的P / Inv调用例程服务。

由于资源可用,在后台处理图像并标记可能让编辑审阅的图像,这应该会减少要显着查看的图像数量,同时不会让上传肤色房屋图片的人烦恼。

答案 8 :(得分:3)

我会从统计角度来解决问题。获得一堆你认为安全的图片,以及一些你没有的图片(这将是一个有趣的研究日),并看看他们有什么共同点。分析它们的颜色范围和饱和度,看看你是否可以挑选出所有顽皮照片的特征,以及很少有安全照片的特征。

答案 9 :(得分:1)

也许Porn Breath Test会有所帮助 - 正如Slashdot报道的那样。

答案 10 :(得分:1)

Rigan Ap-apid在WorldComp '08上就这个问题空间发表了一篇论文。据称这篇论文是here,但是服务器对我来说是超时的。我参加了论文的介绍,他介绍了可比较的系统及其有效性以及他自己的方法。你可以直接和他联系。

答案 11 :(得分:0)

我担心我无法帮助你指明正确的方向,但我确实记得以前读过这件事。正是在这种情况下,人们抱怨婴儿照片被误捕并被标记。如果不出意外,我可以给你一个希望,你不必自己发明轮子......其他人一直走在这条路上!

答案 12 :(得分:0)

CrowdSifterDolores Labs可能会为您解决问题。我一直在阅读他们的博客,因为他们似乎喜欢统计和众包,并喜欢谈论它。他们使用亚马逊的机械土耳其人进行大量处理,并知道如何处理结果以获得正确的答案。看看他们的博客至少看一些很酷的统计实验。

答案 13 :(得分:0)

如上所述Bill(和Craig的谷歌引用)统计方法可以非常有效。

您可能想要研究的两种方法是:

  • 神经网络
  • 多变量分析(MVA)

MVA方法是获得可接受图片和不可接受图片的“代表性样本”。 X数据将是来自每个图片的字节数组,Y将由您分配为1表示不可接受,0表示可接受。使用此数据创建PLS模型。针对模型运行新数据,看看它预测Y的效果如何。

而不是这种二元方法你可以有多个Y(例如0 =可接受,1 =泳衣/内衣,2 =色情)

要构建模型,您可以查看开源软件,或者有许多可用的商业软件包(虽然它们通常不便宜)

因为即使是最好的统计方法也不完美,包含用户反馈的想法也许是一个好主意。

祝你好运(最糟糕的情况是你花时间收集顽皮的照片作为批准和付费的活动!)