Це насправді досить просто. Ви можете програмно виявляти тони шкіри - а у порнозображень, як правило, багато шкіри. Це створить помилкові позитиви, але якщо це проблема, ви можете передавати такі виявлені зображення за допомогою фактичного модерації. Це не тільки значно скорочує роботу для модераторів, але й дає безліч безкоштовних порно. Це безпрограшно.
#!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 чистих зображень. Це досить високий хибний позитивний показник, але сценарій має на меті бути досить обережним і може бути додатково налаштований. Він працює на світлих, темних та азіатських тонах шкіри.
Основні слабкі сторони з помилковими позитивами - коричневі предмети, такі як пісок та дерево, і, звичайно, він не знає різниці між "неслухняною" та "приємною" плоттю (як знімки обличчя).
Слабкістю з помилковими негативами можуть бути зображення без сильно оголеної плоті (як шкіряна пов'язка), пофарбована або татуйована шкіра, зображення B&W тощо.
вихідний код та зразки зображень