bediger4000 / nudedetectorphp
有时可以检测到包含裸露的图片
Requires
- php: ^5.3.3 || ^7.0
This package is not auto-updated.
Last update: 2024-09-20 18:39:15 UTC
README
PHP 实现Rigan Ap-Apid的“裸露检测算法”
裸露检测算法承诺提供一种算法,用于确定图像是否包含裸露内容。这是一个 PHP 实现。
选择
Ap-Apid的论文并没有像实现者可能希望的那样严格地指定算法。
实现者可以决定使用4连通性或8连通性来确定皮肤颜色像素的“连通区域”。我使用了维基百科上的两遍遍历算法,并使用4连通性。
Ap-Apid的算法依赖于连接的皮肤颜色像素的“三个最大区域”。这里的“最大”只是指像素数量最多,还是考虑了一个区域内非皮肤颜色像素的块?如果你有多个区域的尺寸(无论以何种方式度量)相等,你是如何决定3个最大的?
算法要求找到“三个最大皮肤区域中最左、最上、最右、最下的皮肤像素。使用这些点作为边界多边形的顶点。”
哪个“最左”?如果皮肤颜色区域的左边界像素在图像的左侧,那么很多像素都是“最左的”。你是选择顶部、底部还是中间最左的?同样的问题也适用于每个区域的其他3个“x最”像素。
论文没有定义“边界多边形”,我把它理解为围绕三个最大皮肤颜色区域的十二个点(最上、最左、最下和最右)的凸包。但也许Ap-Apid的意思不同,可能是一个不规则的多边形,甚至可能是凹多边形。
示例用法
#!/usr/bin/env php
<?php
include("NudeDetector.php");
$detector = new NudeDetector(null, 'YCbCr'); # 'HSV' for alternate skin-color-detection
foreach ($argv as $idx => $filename) {
if ($idx == 0) continue;
$detector->set_file_name($filename);
if ($detector->is_nude()) {
// Deal with $filename as ritually unclean.
} else {
// $filename probably doesn't contain nudity
}
}
注意,你可以使用set_file_name()
方法,然后使用is_nude()
方法,而不必创建新的NudeDetector
实例。
示例程序
示例程序展示了Class NudeDetectorPhp
的一些功能,这些功能超出了简单示例的范围。它们还允许你在裸露判断的中间步骤进行检查。
Checker.php imagefile [imagefile ...]
检查每个图像文件是否包含裸露内容,使用HSV和YCbCr皮肤颜色模型。打印出为什么一个图像不符合“包含裸露内容”的原因。
skin_map.php imagefile prefix
为HSV和YCbCr皮肤颜色模型各自创建一个GIF文件。这些GIF文件是纯黑白的,原始图像文件中每个皮肤颜色的像素在GIF文件中都被着色为黑色,其他像素则着色为白色。GIF文件的名字为prefixHSV.gif
和prefixYCbCr.gif
。
通过例如使用feh
图像查看器在两个图像之间切换,你可以了解NudeDetectorPHP中两种皮肤颜色模型在决定皮肤颜色像素时的差异。
region_colors.php imagefile outputfile
创建一个GIF格式的输出文件,原始图像中每个皮肤颜色像素的连通区域在输出图像中以不同的颜色表示。
bounding_polygon.php imagefile outputfile
创建一个GIF格式的输出文件,其中包含Ap-Apid算法的“边界多边形”裁剪皮肤颜色像素。
生成假裸露
fake_nude.php x y imagefile
生成一个宽为x
像素,高为y
像素的JPEG格式图片文件。这张图片不包含任何裸露内容。事实上,它生成的“肤色”通常甚至不在生物学的范畴内,但Checker.php
会始终将其标记为包含裸露内容。哈哈!
示例假裸照
它的表现如何?
在我个人的评估中,表现并不好。它几乎总是将肖像和头像识别为“裸露”。它被自然颜色、沙子、木头、岩石或土壤甚至叶子所迷惑。这是肤色检测的缺陷,但Ap-Apid确实指定了HSV肤色测试。
总的来说,我甚至不能将其描述为“过于谨慎”(许多误报)或“过于下流”(许多漏报)。
其他实现
最广为人知的Rigan Ap-Apid算法实现是nude.js。我没有将nude.js
翻译成PHP,而是从头开始根据Ap-Apid的论文实现了该算法。