C'est en fait assez facile. Vous pouvez détecter par programme les tons de peau - et les images pornographiques ont tendance à avoir beaucoup de peau. Cela créera de faux positifs, mais si cela pose un problème, vous pouvez transmettre des images ainsi détectées via une modération réelle. Cela réduit non seulement considérablement le travail des modérateurs, mais vous donne également beaucoup de porno gratuit. C'est gagnant-gagnant.
#!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)
Ce code mesure les tons chair au centre de l'image. J'ai testé 20 images "pornos" relativement apprivoisées et 20 images complètement innocentes. Il marque 100% du «porno» et 4 des 20 des images propres. C'est un taux de faux positifs assez élevé, mais le script vise à être assez prudent et pourrait être peaufiné. Il fonctionne sur les peaux claires, foncées et asiatiques.
Ses principales faiblesses avec les faux positifs sont les objets bruns comme le sable et le bois et bien sûr, il ne connaît pas la différence entre la chair "coquine" et "belle" (comme les coups de visage).
Les faiblesses avec les faux négatifs seraient des images sans beaucoup de chair exposée (comme le bondage en cuir), une peau peinte ou tatouée, des images N&B, etc.
code source et exemples d'images