asp.net - imagesharp - system drawing image asp net core
Mostrando demasiada detección de "piel" en el software (14)
Como se mencionó anteriormente por Bill (y Craig''s google quote) los métodos estadísticos pueden ser altamente efectivos.
Dos enfoques en los que es posible que desee analizar son:
- Redes neuronales
- Análisis de varianza múltiple (MVA)
El enfoque MVA sería obtener una "muestra representativa" de imágenes aceptables y de imágenes inaceptables. Los datos de X serían una matriz de bytes de cada imagen, la Y la asignaría usted como 1 para inaceptable y 0 como aceptable. Crea un modelo PLS usando esta información. Ejecute datos nuevos contra el modelo y vea qué tan bien predice la Y.
En lugar de este enfoque binario podrías tener múltiples Y (por ejemplo, 0 = aceptable, 1 = traje de baño / ropa interior, 2 = pornográfico)
Para construir el modelo, puede ver el software de código abierto o hay una serie de paquetes comerciales disponibles (aunque normalmente no son baratos).
Debido a que incluso los mejores enfoques estadísticos no son perfectos, la idea de incluir también los comentarios de los usuarios sería una buena idea.
¡Buena suerte (y en el peor de los casos, puedes pasar el tiempo recogiendo imágenes traviesas como una actividad aprobada y pagada!)
Estoy construyendo un sitio web ASP.NET donde los usuarios pueden subir fotos de ellos mismos. Podría haber miles de fotos cargadas todos los días. Una cosa que mi jefe me ha preguntado un momento es si hay alguna forma de que podamos detectar si alguna de las fotos muestra demasiada ''apariencia'' y moverla automáticamente como ''Solo Adultos'' antes de que los editores tomen la decisión final.
Diría que tu respuesta está en la colaboración colectiva. Esto casi siempre funciona y tiende a escalar muy bien.
No tiene que implicar que algunos usuarios se conviertan en "administradores" y propongan permisos diferentes; puede ser tan simple como habilitar un enlace "inapropiado" cerca de cada imagen y llevar un conteo.
Dudo que exista algún software listo para usar que pueda determinar si el usuario carga una imagen traviesa. Su mejor opción es permitir que los usuarios marquen las imágenes como "Solo para adultos" con un botón al lado de la imagen. (Aclaración: me refiero a usuarios que no sean el que subió la imagen, de forma similar a como se pueden marcar las publicaciones ofensivas aquí en ).
Además, considere esta revisión de un intento de hacer lo mismo en un producto dedicado: http://www.dansdata.com/pornsweeper.htm .
Enlace robado del podcast de de hoy, por supuesto :).
Interesante pregunta desde un punto de vista teórico / algorítmico. Un enfoque para el problema sería marcar imágenes que contengan grandes regiones de color de piel (como lo explica Trull).
Sin embargo, la cantidad de piel que se muestra no es un factor determinante de una imagen ofensiva, sino más bien la ubicación de la piel que se muestra. Tal vez pueda usar la detección de rostros (buscar algoritmos) para refinar los resultados: determine qué tan grandes son las regiones de la piel en relación con la cara y si pertenecen a la cara (tal vez qué tan lejos están debajo de ella).
Me gustaría abordar el problema desde un punto de vista estadístico. Consigue un montón de imágenes que consideres seguras, y muchas otras que no (lo que te convertirá en un divertido día de investigación), y ve qué tienen en común. Analícelos todos por el rango de color y la saturación para ver si puede elegir las características que tienen todas las fotos traviesas y algunas de las más seguras.
Me temo que no puedo ayudarlo a orientarlo en la dirección correcta, pero sí recuerdo haber leído sobre esto antes. Fue en el contexto de las personas quejándose de imágenes de bebés atrapados y marcados por error. Si nada más, puedo darte la esperanza de que no tienes que inventar la rueda tú solo ... ¡Alguien más ha recorrido este camino!
Ni siquiera podemos escribir filtros que detecten palabras sucias con precisión en publicaciones de blogs, ¿y su jefe está pidiendo un detector de pornografía? CLBUTTIC!
Por supuesto, esto no funcionará para el primer usuario que publique un primer plano de la cara de alguien (o mano, o pie, o lo que sea). En última instancia, todas estas formas de censura automática fallarán hasta que haya un verdadero cambio de paradigma en la forma en que las computadoras reconocen los objetos.
No estoy diciendo que no debas intentarlo no obstante; pero quiero señalar estos problemas. No esperes una solución perfecta (o incluso buena). No existe.
Sé que Flickr o Picasa han implementado esto. Creo que la rutina se llamaba FleshFinder.
Un consejo sobre la arquitectura de hacer esto:
Ejecute esto como un servicio de Windows separado de la canalización de ASP.NET, en lugar de analizar imágenes en tiempo real, cree una cola de nuevas imágenes que se carguen para que el servicio funcione.
Puede usar el System.Drawing normal si lo desea, pero si realmente necesita procesar muchas imágenes, sería mejor usar un código nativo y una biblioteca de gráficos de alto rendimiento y P / invocar la rutina de su servicio.
Como los recursos están disponibles, procesar imágenes en segundo plano y marcar las que son sospechosas para la revisión de los editores, esto debería reducir la cantidad de imágenes para revisar significativamente, sin molestar a las personas que cargan imágenes de casas de color de piel.
Su mejor opción es ocuparse de la imagen en el espacio de color HSV (consulte here conversión rgb - hsv). El color de la piel es prácticamente el mismo en todas las razas, es solo la saturación que cambia. Al tratar con la imagen en HSV, simplemente puede buscar el color de la piel.
Puede hacer esto simplemente contando el número de píxeles dentro de un rango de color, o puede realizar una región que crezca alrededor de un píxel para calcular el tamaño de las áreas del color.
Editar: para tratar con imágenes granuladas, es posible que desee realizar un filtro mediano en la imagen primero, y luego reducir el número de colores para segmentar la imagen primero, tendrá que jugar con la configuración de un gran conjunto de imágenes preimpresas. clasificamos (adultos o no) las imágenes y vemos cómo se comportan los valores para obtener un nivel satisfactorio de detección.
EDITAR: Aquí hay un código que debe hacer un conteo simple (no probado, es una mezcla rápida de algún código de here y rgb a hsl here )
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);
Tal vez la prueba de respiración por pornografía sería útil, como se informó en Slashdot.
Vea el documento seminal " Finding Naked People " de Fleck / Forsyth publicado en ECCV. (Avanzado).
CrowdSifter por Dolores Labs podría hacer el truco para ti. Leo su blog todo el tiempo, ya que parece que les encantan las estadísticas y el crowdsourcing y les gusta hablar de ello. Usan turk mecánico de Amazon para una gran parte de su procesamiento y saben cómo procesar los resultados para obtener las respuestas correctas de las cosas. Echa un vistazo a su blog por lo menos para ver algunos experimentos estadísticos interesantes.
Rigan Ap-apid presentó un documento en WorldComp ''08 sobre este espacio problemático. El papel supuestamente está here , pero el servidor se estaba agotando para mí. Asistí a la presentación del documento y cubrió sistemas comparables y su eficacia, así como su propio enfoque. Puede contactarlo directamente.