Detectar una cara determinada en una base de datos de imágenes faciales

110

Estoy trabajando en un pequeño proyecto que involucra las caras de los usuarios de Twitter a través de sus imágenes de perfil.

Un problema con el que me he encontrado es que después de filtrar todas las imágenes, excepto las fotos de retratos claros, un porcentaje pequeño pero significativo de usuarios de Twitter usa una imagen de Justin Bieber como imagen de perfil.

Para filtrarlos, ¿cómo puedo saber programáticamente si una imagen es la de Justin Bieber?

ʞɔıu
fuente
17
¿Cuál es tu plataforma de desarrollo? Esto se puede hacer fácilmente en .NET porque es superior a todos los demás entornos de programación. Simplemente llame a la función Page.EradicateBieber (). Microsoft previó esta necesidad y gentilmente nos la proporcionó de manera inmediata en .NET 4.5. (Aquellos de ustedes en versiones anteriores tendrán que esperar.) (Eso es, por supuesto, todo irónico.)
32
Creo que puedo afirmar con seguridad que SO no necesita una [justin-bieber]etiqueta.
skaffman
2
Puedo afirmar con seguridad que las personas gastan más votos a favor en los comentarios y esta pregunta que la opción de cierre (la que merece los votos).
20
Un filtro de audio de Justin Bieber también sería bueno

Respuestas:

49

Una mejor idea podría ser eliminar todas las imágenes que aparecen en el feed de más de un usuario, sin necesidad de reconocimiento.

PPPPPP
fuente
2
Sí, quizás establezca un umbral de 2-4 posibles duplicaciones (para manejar el caso del nuevo bebé) antes de rechazar una foto. Depende de lo que vayas a hacer con las fotos, supongo.
Mark Bessey
3
Solución simple y elegante. +1.
Robert Harvey
13
La gente podría usar diferentes imágenes de la misma persona.
Rebecca Chernoff
(+1) en Rebecca y (-1) @ PPPPPP: Esto simplemente cambia el problema.
steffen
44
Podrían, pero en la mayoría de los casos van a elegir entre un grupo relativamente pequeño de imágenes, por lo que probablemente todavía funcione. Malditos casos extremos, por lo que sabes, mi foto es de mi tío de todos modos.
naught101
16

Tengo la sensación de que http://www.tineye.com/commercial_api puede ser la solución aquí. Simplemente arroje la imagen de perfil de Twitter a Tineye, vea si devuelve imágenes (y URL asociadas) que puedan identificarse claramente (o puntuarse automáticamente usando una lógica simple de conteo de palabras) como relacionadas con (o de) ese pequeño saco de * *.

Simples!

Benjamin Howarth
fuente
1
Google anunció recientemente la búsqueda de imágenes: youtube.com/watch?v=t99BfDnBZcI No sé si todavía tiene una API, pero esa puede ser una alternativa.
petrichor
11

Dado que solo puede filtrar a aquellos que son fotos de retratos claros, supongo que tiene algún método de generación de características para transformar las imágenes en bruto en características que son útiles para el aprendizaje automático. Si eso es cierto, podría intentar entrenar un algoritmo de clasificación (hay muchos de ellos: redes neuronales, etc.) alimentando el algoritmo con un montón de fotos Bieber conocidas, así como un montón de no Biebers conocidos. Una vez que haya entrenado el modelo, podría usarse para predecir si una nueva imagen es Bieber o no.

Este tipo de técnica de aprendizaje supervisado requiere que tengas datos donde sepas la respuesta correcta (Bieber o no), pero probablemente se puedan encontrar en una búsqueda de imágenes de Google. También requiere que tenga el tipo correcto de características, y no sé lo suficiente sobre el procesamiento de imágenes o su algoritmo para saber si eso es un inconveniente importante.

Michael McGowan
fuente
2
Desafortunadamente, el paso de generación de características es tanto el más difícil como el más importante :(.
steffen
@steffen Hay alguna sugerencia de que el OP está jugando con las caras, así que tenga un generador de descriptores.
@mpq: No dudo que, sin embargo, si el OP no tiene una característica por píxel, entonces tiene que encontrar un nivel de agregación significativo. No voté en contra, solo quería señalar la complejidad que subyace a esta respuesta (que, por supuesto, es correcta).
steffen
1
Correcto, el paso de generación de características es la parte difícil. Supuse que OP podría hacer esto ya que él ya tiene algún mecanismo para procesar las imágenes. Incluso si lo hace, aunque podrían ser características útiles para detectar cara / no cara en lugar de Bieber / no Bieber ... realmente depende de las características.
Michael McGowan
7

Podrías usar un método como eigenfaces, http://en.wikipedia.org/wiki/Eigenface . A continuación se detalla el procedimiento, así como enlaces a diferentes implementaciones.

http://www.pages.drexel.edu/~sis26/Eigenface%20Tutorial.htm

A partir de aquí, es común usar esto en un enfoque de clasificación, entrenar un modelo y luego predecir casos. Puede hacer esto entrenando a un grupo de celebridades conocidas y si predice una cara de Twitter como una en su modelo entrenado de celebridades, elimínela. Similar a este http://blog.cordiner.net/2010/12/02/eigenfaces-face-recognition-matlab/

Esto sufre constantes enmiendas. Pronto habrá un nuevo Justin Bieber que no estará en su modelo entrenado, por lo que no puede predecirlo. También hay un caso como Whitney Houston, puede que nunca hayas pensado en agregarla antes, pero puede ser una imagen común por respeto y admiración durante unas semanas. Sin embargo, no tendrá la desventaja de las fotos de bebés como se mencionó anteriormente. Para superar estos problemas, podría utilizar más un enfoque de agrupamiento jerárquico. Al eliminar los primeros conjuntos de grupos que están muy cerca si alcanzan un cierto nivel de soporte, su primer grupo tiene 15 elementos antes de construir un segundo. Ahora no tiene que preocuparse por quién está en su modelo de entrenamiento, pero caerá en el tema de las fotos del bebé.

darrelkj
fuente
3

Debe poner un algoritmo para detectar a qué persona se refiere esa imagen. Puede construir un modelo basado en diferentes retratos de personalidad famosa y usar clasificadores para asegurarse de que esta imagen se refiera a una de las imágenes de su base de datos. Debe usar un determinado clasificador basado en diferentes parámetros que le gustan a la cara, como la distancia entre los ojos u otros parámetros para aumentar la precisión de su modelo. También hay análisis de piel. Lo más importante es construir un buen clasificador. Este método puede ser vulnerable.

Pero también hay un muy buen proyecto trabajando en reconocimiento facial http://opencv-code.com/Opencv_Face_Detection

404Dreamer_ML
fuente
1
AFAIK OpenCV y el sitio vinculado solo implementan la detección de rostros (¿en la imagen hay un rostro humano?), Que es solo un primer paso hacia el reconocimiento de rostros (¿de quién es el rostro?)
f3lix
2

Podrías probar hashing sensible a la localidad .

Xodarap
fuente
1
El KNN simple no es muy bueno para las caras. Se ha demostrado que las caras se encuentran en una variedad no lineal de 25 imágenes de las imágenes.
bayerj