Je suis de la construction d'une ASP.NET site web où les utilisateurs peuvent télécharger des photos d'eux-mêmes. Il pourrait y avoir des milliers de photos téléchargées chaque jour. Une chose que mon patron a demandé un peu de temps si il n'y a aucune façon nous avons pu détecter si les photos montrent trop de "peau" et de déplacer automatiquement le drapeau comme des "Adultes Seulement" avant de les éditeurs de prendre la décision finale.
Réponses
Trop de publicités?Votre meilleur pari est de traiter l'image dans l'espace de couleur HSV (voir ici pour le rvb - vhs conversion). La couleur de la peau est à peu près la même entre toutes les races, c'est juste la saturation des changements. En traitant avec l'image dans le HSV vous pouvez simplement rechercher la couleur de la peau.
Vous pouvez le faire tout simplement en comptant le nombre de pixels dans une gamme de couleurs, ou vous pouvez effectuer région qui se développe autour de pixels à calculer la taille des zones de couleur.
Edit: pour composer avec le grain des images, vous pouvez effectuer un filtre médian sur l'image d'abord, puis de réduire le nombre de couleurs pour le segment de l'image tout d'abord, vous aurez à jouer avec les paramètres sur un grand ensemble de pré-classifed (adultes ou non) d'images et de voir comment les valeurs se comporter pour obtenir un niveau satisfaisant de détection.
EDIT: Voici un code qui devrait faire un simple count (pas testé, c'est un rapide mashup de code à partir d' ici et rvb pour hsl ici)
Bitmap b = new Bitmap(_image);
BitmapData bData = b.LockBits(new Rectangle(0, 0, _image.Width, _image.Height), ImageLockMode.ReadWrite, b.PixelFormat);
byte bitsPerPixel = GetBitsPerPixel(bData.PixelFormat);
byte* scan0 = (byte*)bData.Scan0.ToPointer();
int count;
for (int i = 0; i < bData.Height; ++i)
{
for (int j = 0; j < bData.Width; ++j)
{
byte* data = scan0 + i * bData.Stride + j * bitsPerPixel / 8;
byte r = data[2];
byte g = data[1];
byte b = data[0];
byte max = (byte)Math.Max(r, Math.Max(g, b));
byte min = (byte)Math.Min(r, Math.Min(g, b));
int h;
if(max == min)
h = 0;
else if(r > g && r > b)
h = (60 * ((g - b) / (max - min))) % 360;
else if (g > r && g > b)
h = 60 * ((b - r)/max - min) + 120;
else if (b > r && b > g)
h = 60 * ((r - g) / max - min) + 240;
if(h > _lowerThresh && h < _upperThresh)
count++;
}
}
b.UnlockBits(bData);
Bien sûr, cela ne fonctionne pas pour le premier utilisateur qui poste un gros plan le visage de quelqu'un (ou à la main, ou le pied, ou que sais-je encore). En fin de compte, toutes ces formes de traitement automatisé de la censure va échouer jusqu'à ce qu'il y a un vrai changement de paradigme dans la façon dont les ordinateurs font de la reconnaissance de l'objet.
Je ne dis pas que vous ne devriez pas essayer néanmoins; je ne veux point de ces problèmes. Ne vous attendez pas parfait (ou même bonne) solution. Il n'existe pas.
Je doute qu'il existe hors-the-shelf logiciel qui permet de déterminer si l'utilisateur télécharge un vilain image. Votre meilleur pari est de permettre aux utilisateurs de signaler des images comme des "Adultes Seulement" avec un bouton à côté de l'image. (Précision: je veux dire les utilisateurs autres que celui qui a téléchargé l'image, semblable à la façon dont les postes peuvent être marquées à l'offensive ici sur StackOverflow.)
Pensez également à cet examen d'une tentative de faire la même chose dans un produit dédié: http://www.dansdata.com/pornsweeper.htm.
Lien de vol à partir d'aujourd'hui, StackOverflow podcast, bien sûr :).
Nous ne pouvons même pas écrire des filtres qui permettent de détecter des mots sales avec précision dans les messages du blog, et votre patron demande un porno détecteur? CLBUTTIC!
Je dirais que votre réponse se trouve dans le crowdsourcing de la tâche. Il s'agit presque toujours des travaux et tend à échelle très bien.
Il n'a pas à impliquer la prise de certains utilisateurs dans des "admins" et venir avec des autorisations différentes - il peut être aussi simple que de permettre à un "inapproprié" lien de proximité de chaque image et la tenue d'un comte.