在软件中显示太多“皮肤”检测
image-processing
5
0

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

参考资料:
Stack Overflow
收藏
评论
共 9 个回答
高赞 时间 活跃

我想说您的答案在于将任务众包 。这几乎总是工作,而且往往很好地进行缩放。

它不必涉及使某些用户成为“管理员”并获得不同的权限-只需在每个图像附近启用“不适当的”链接并保持计数即可。

收藏
评论

请参阅由ECCV发表的Fleck / Forsyth的开创性论文“ 寻找裸体的人 ”。 (高级)。

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

收藏
评论

我将从统计学的角度来解决这个问题。获取一堆您认为安全的照片,以及一堆您认为不安全的照片(这将使您度过愉快的一天),并查看它们的共同点。分析它们的颜色范围和饱和度,看看是否可以挑出所有顽皮照片和很少有安全照片所具有的特征。

收藏
评论

当然,对于第一个发布某人的脸部特写(或手,脚,或其他什么东西)的用户而言,这将失败。最终,所有这些形式的自动检查都将失败,直到计算机进行对象识别的方式发生真正的范式转变为止。

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

收藏
评论

我知道Flickr或Picasa都已实现此功能。我相信该例程称为FleshFinder。

有关执行此操作的体系结构的提示:

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

如果需要,可以使用普通的System.Drawing东西,但是如果确实需要处理大量图像,则最好使用本机代码和高性能图形库,并从服务中调用例程。

如果有足够的资源,请在后台处理图像并标记可编辑的可疑图像,这样可以减少要检查的图像数量,而不会使上传带有肤色房子的人烦恼。

收藏
评论

我怀疑是否有任何现成的软件可以确定用户是否上传了顽皮的图片。最好的选择是让用户使用图片旁边的按钮将图片标记为“仅限成人”。 (澄清:我的意思是用户不是上传图片的用户,类似于在StackOverflow上如何将帖子标记为令人反感。)

另外,请考虑以下尝试,以尝试在专用产品中进行相同的操作: http : //www.dansdata.com/pornsweeper.htm

当然,今天的StackOverflow播客中的链接被盗了。

收藏
评论

最好的选择是处理HSV颜色空间中的图像(rgb-hsv转换请参见此处 )。在所有种族之间,皮肤的颜色几乎相同,只是饱和度发生了变化。通过处理HSV中的图像,您可以简单地搜索皮肤的颜色。

您可以通过简单地计算颜色范围内的像素数来执行此操作,或者可以执行围绕像素的区域增长以计算颜色区域的大小。

编辑:要处理颗粒状图像,您可能需要先对图像执行中值过滤 ,然后减少颜色数量以首先对图像进行分割,您将不得不处理大量预先设置的设置。对已分类(成人或不成人)的图像进行分类,并查看其值如何获得令人满意的检测水平。

编辑:这是一些应该做简单计数的代码(未经测试,它是一些代码从此处和rgb到此处的 hsl的快速混搭)

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);
收藏
评论

从理论/算法的角度来看有趣的问题。解决该问题的一种方法是标记包含较大肤色区域的图像(如Trull所述)。

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

收藏
评论

我们甚至无法编写过滤器来准确地检测博客文章中的肮脏单词,而您的老板要求使用色情检测器? 杂技!

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号