Isso é realmente razoavelmente fácil. Você pode detectar programaticamente tons de pele - e as imagens pornôs tendem a ter muita pele. Isso criará falsos positivos, mas se esse for um problema, você pode transmitir imagens detectadas por moderação real. Isso não apenas reduz bastante o trabalho dos moderadores, mas também oferece muita pornografia gratuita. É ganha-ganha.
#!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)
Este código mede os tons de pele no centro da imagem. Eu testei em 20 imagens "pornográficas" relativamente mansos e em 20 imagens completamente inocentes. Ele sinaliza 100% da "pornografia" e 4 das 20 imagens limpas. Essa é uma taxa de falsos positivos bastante alta, mas o script tem o objetivo de ser bastante cauteloso e pode ser ajustado ainda mais. Funciona em tons de pele claros, escuros e asiáticos.
Suas principais fraquezas com falsos positivos são objetos marrons como areia e madeira e, é claro, não sabe a diferença entre carne "malcriada" e "agradável" (como tiros no rosto).
Fraqueza com falsos negativos seria imagens sem muita carne exposta (como couro), pele pintada ou tatuada, imagens em preto e branco etc.
código fonte e imagens de exemplo