我正在构建一个ASP.NET网站,用户可以上传自己的照片。每天可能会有数千张照片上传。我的老板曾经问过一件事,就是我们有什么方法可以检测出任何照片是否显示出太多“皮肤”并在编辑做出最终决定之前自动将其标记为“仅限成人”。
答案 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上发表的开篇论文“寻找裸体人”。 (高级)。
答案 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)
答案 13 :(得分:0)
如上所述Bill(和Craig的谷歌引用)统计方法可以非常有效。
您可能想要研究的两种方法是:
MVA方法是获得可接受图片和不可接受图片的“代表性样本”。 X数据将是来自每个图片的字节数组,Y将由您分配为1表示不可接受,0表示可接受。使用此数据创建PLS模型。针对模型运行新数据,看看它预测Y的效果如何。
而不是这种二元方法你可以有多个Y(例如0 =可接受,1 =泳衣/内衣,2 =色情)
要构建模型,您可以查看开源软件,或者有许多可用的商业软件包(虽然它们通常不便宜)
因为即使是最好的统计方法也不完美,包含用户反馈的想法也许是一个好主意。
祝你好运(最糟糕的情况是你花时间收集顽皮的照片作为批准和付费的活动!)