На самом деле это довольно просто. Вы можете обнаружить программно тона кожи - и порно изображения, как правило, имеет много кожи. Это приведет к ложным срабатываниям, но если это проблема, вы можете передать изображения, обнаруженные таким образом, через фактическую модерацию. Это не только значительно сокращает работу для модераторов, но и дает много свободного порно. Это беспроигрышный вариант.
#!python
import os, glob
from PIL import Image
def get_skin_ratio(im):
im = im.crop((int(im.size[0]*0.2), int(im.size[1]*0.2), im.size[0]-int(im.size[0]*0.2), im.size[1]-int(im.size[1]*0.2)))
skin = sum([count for count, rgb in im.getcolors(im.size[0]*im.size[1]) if rgb[0]>60 and rgb[1]<(rgb[0]*0.85) and rgb[2]<(rgb[0]*0.7) and rgb[1]>(rgb[0]*0.4) and rgb[2]>(rgb[0]*0.2)])
return float(skin)/float(im.size[0]*im.size[1])
for image_dir in ('porn','clean'):
for image_file in glob.glob(os.path.join(image_dir,"*.jpg")):
skin_percent = get_skin_ratio(Image.open(image_file)) * 100
if skin_percent>30:
print "PORN {0} has {1:.0f}% skin".format(image_file, skin_percent)
else:
print "CLEAN {0} has {1:.0f}% skin".format(image_file, skin_percent)
Этот код измеряет оттенки кожи в центре изображения. Я тестировал на 20 относительно ручных «порно» образов и 20 совершенно невинных изображений. Она флаги 100% от «порно» и 4 из 20 чистых изображений. Это довольно высокий процент ложных срабатываний, но сценарий старается быть достаточно осторожным и может быть дополнительно доработан. Подходит для светлых, темных и азиатских тонов кожи.
Его основные недостатки с ложными срабатываниями - коричневые объекты, такие как песок и дерево, и, конечно, он не знает разницы между «непослушной» и «красивой» плотью (например, снимки лица).
Слабостью ложных негативов будут изображения без сильно обнаженной плоти (например, кожаная бондаж), окрашенная или татуированная кожа, черно-белые изображения и т. Д.
исходный код и образцы изображений