我正在构建一个 ASP.NET 网站,用户可以在其中上传自己的照片。每天可能会上传数千张照片。我的老板问过几次的一件事是,我们是否有任何方法可以检测是否有任何照片显示过多的“皮肤”,并在编辑做出最终决定之前自动将这些标记为“仅限成人”。
14 回答
Your best bet is to deal with the image in the HSV colour space (see here for rgb - hsv conversion). The colour of skin is pretty much the same between all races, its just the saturation that changes. By dealing with the image in HSV you can simply search for the colour of skin.
You might do this by simply counting the number of pixel within a colour range, or you could perform region growing around pixel to calculate the size of the areas the colour.
Edit: for dealing with grainy images, you might want to perform a median filter on the image first, and then reduce the number of colours to segment the image first, you will have to play around with the settings on a large set of pre-classifed (adult or not) images and see how the values behave to get a satisfactory level of detection.
EDIT: Heres some code that should do a simple count (not tested it, its a quick mashup of some code from here and rgb to 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);
当然,对于第一个发布某人脸部(或手、脚或诸如此类)特写的用户来说,这将失败。最终,所有这些形式的自动审查都将失败,直到计算机进行对象识别的方式发生真正的范式转变。
我并不是说你不应该尝试它。但我想指出这些问题。不要指望完美(甚至是好的)解决方案。它不存在。
我怀疑是否存在任何现成的软件可以确定用户是否上传了顽皮的图片。最好的办法是让用户使用图片旁边的按钮将图片标记为“仅限成人”。(澄清:我指的是上传图片的用户以外的用户——类似于在 StackOverflow 上如何将帖子标记为攻击性。)
另外,请考虑对在专用产品中尝试做同样事情的评论:http ://www.dansdata.com/pornsweeper.htm 。
链接从今天的 StackOverflow 播客中被盗,当然 :)。
我们甚至无法编写过滤器来准确检测博客文章中的脏字,而您的老板却要一个色情检测器?笨蛋!
I would say your answer lies in crowdsourcing the task. This almost always works and tends to scale very well.
It doesn't have to involve making some users into "admins" and coming up with different permissions - it can be as simple as to enable an "inappropriate" link near each image and keeping a count.
请参阅Fleck/Forsyth 在 ECCV 上发表的开创性论文“ Finding Naked People ”。(先进的)。
从理论/算法的角度来看,有趣的问题。解决该问题的一种方法是标记包含大肤色区域的图像(如 Trull 所解释的)。
然而,显示的皮肤数量并不是一个令人反感的图像的决定因素,而是显示皮肤的位置。也许您可以使用面部检测(搜索算法)来优化结果——确定皮肤区域相对于面部有多大,以及它们是否属于面部(可能低于面部多远)。
我会从统计的角度来解决这个问题。获取一堆你认为安全的图片和一堆你不认为安全的图片(这将使研究变得有趣),看看它们有什么共同点。分析它们的颜色范围和饱和度,看看你是否能找出所有顽皮照片的特征,而安全照片中很少有。
我知道 Flickr 或 Picasa 已经实现了这一点。我相信这个例程被称为 FleshFinder。
关于这样做的架构的提示:
将此作为独立于 ASP.NET 管道的 Windows 服务运行,而不是实时分析图像,而是创建一个新图像队列,这些图像被上传以供服务处理。
如果需要,您可以使用普通的 System.Drawing 东西,但如果您确实需要处理大量图像,最好使用本机代码和高性能图形库并从您的服务中 P/invoke 例程。
由于资源可用,在后台处理图像并标记可疑以供编辑审查的图像,这应该会显着减少要审查的图像数量,同时不会惹恼上传肤色房屋图片的人。
Perhaps the Porn Breath Test would be helpful - as reported on Slashdot.
Rigan Ap-apid在 WorldComp '08 上就这个问题空间发表了一篇论文。据称该文件在这里,但服务器对我来说超时了。我参加了论文的介绍,他介绍了类似的系统及其有效性以及他自己的方法。你可以直接联系他。
I'm afraid I can't help point you in the right direction, but I do remember reading about this being done before. It was in the context of people complaining about baby pictures being caught and flagged mistakenly. If nothing else, I can give you the hope that you don't have to invent the wheel all by yourself... Someone else has been down this road!
Dolores Labs的CrowdSifter可能会为您解决问题。我一直在阅读他们的博客,因为他们似乎喜欢统计数据和众包并且喜欢谈论它。他们使用亚马逊的机械土耳其人进行大量处理,并且知道如何处理结果以从事物中获得正确的答案。至少看看他们的博客,看看一些很酷的统计实验。
正如上面提到的比尔(和克雷格的谷歌报价)统计方法可以非常有效。
您可能想要研究的两种方法是:
- 神经网络
- 多变量分析 (MVA)
MVA 方法是获取可接受图片和不可接受图片的“代表性样本”。X 数据将是每张图片的字节数组,Y 将由您指定为 1 表示不可接受,0 表示可接受。使用此数据创建 PLS 模型。针对模型运行新数据,看看它对 Y 的预测效果如何。
而不是这种二元方法,您可以有多个 Y(例如 0=可接受,1=泳装/内衣,2=色情)
要构建模型,您可以查看开源软件或有许多可用的商业软件包(尽管它们通常不便宜)
因为即使是最好的统计方法也不是完美的,包括用户反馈的想法可能是一个好主意。
祝你好运(在最坏的情况下,你会花时间收集顽皮的图片作为一项经批准和付费的活动!)