
Software reconocimiento Facial
#1
Posted 18 November 2013 - 09:51 PM
Me interesa investigar sobre este tema y sobre la posibilidad de crear una aplicacion hecha con delphi.
La idea es poder manipular las imagenes de un video y poder primero identificar las caras y luego compararlo con una base de datos e identificar a la persona.
Se que esto no es algo sencillo y lo que ahora busco es la opinion de ustede sobre la conveniencia de hacerlo con delphi.
#2
Posted 19 November 2013 - 01:01 AM
http://delphimagic.b...con-delphi.html
Por otro lado, aqui puedes encontrar información:
White Papers sobre reconocimiento facial
http://www.face-rec....resting-papers/
Documento de Zhao y otros
http://nichol.as/pap...ture Survey.pdf
Espero que te sirva
Saludos
#3
Posted 19 November 2013 - 05:53 AM
El documento de Zaho et al si bien es bastante abarcativo, solamente es una manera introductoria y una recopilación a modo de presentación de las alternativas más estudiadas. En el se habla de forma breve e introductoria, pero no en profundidad ni a detalles, sobre Eigenface, FisherFace y redes neuronales. Menciona a otros pero no los expone.
Para adentrarte, la manera más sencilla, una técnica pionera y ha demostrado ser lo suficiente precisa y que puede escalarse (es decir, que puede añadirse un muestreo cada vez más grandes) es EigenFace. Sobre el tema recomiendo que leas el Paper de Turk y Pentland. Si tienes filoso el álgebra lineal no te supondrá problemas.
Existen bibliotecas que ya te hacen todo el trabajito, algunas comerciales (la mayoría) y otras Open Source, pero si no tienes ni idea de a como va el proceso de nada te va servir. Será como ir a los palos de ciego.
Como se trata de video se dete analizar fotograma por fotograma, o bien complementar Eigenface con alguna técnica orientada a video. Eigenface se basa en imágenes y no en secuencia (video) bajo un esquema 2D.
Hoy en día las aplicaciones comerciales combinan variadas técnicas, en lo que es 3D si bien hay grandes avances todavía le falta pulir un poco más para llegar a una fialidad más alta.
Sea cual fuese el método que uses, deberás buscar en inglés. En español la documentación es prácticamente nula.
O quien sabe, si le preguntas a la reinita que gobierna mi paisito sobre SIBIOS capaz que te dice que técnicas han implementado. Asi es, tenemos oficialmente al día de hoy (en realidad desde hace 1 año) el sistema de cibervigilancia y de reconocimiento facial más intrusivo del mundo. Es un sistema que combina no sólo información biométrica que es alimentado por cámaras ubicadas en varios puntos del país (principalmente Buenos Aires), además se registra otra información sencible como ser pertencencia política, cargo o trabajo; se cruza con información de seguridad social, la de AFIP (el organismo público que regula la situación Fiscal de cada uno).
La excuza es que es para nuestra seguridad. Nos vigilan que hacemos, hacia donde vamos, llevan registro de donde estuvimos, nuestros propios movimientos... todo sin necesidad de pedir una orden judicial. Se ha invertido el principio de inocencia: "Culpable hasta que se demuestre lo contrario".
Más que nada te quiero advertir de posibles limitaciones legales de implementar un sistema con estas características, sobre todo en el contexto y ambiente en el que pretendes implementarlo. Por ejemplo si es para poder llevar un control interno a modo de seguridad... al estilo de las películas de acción en donde para pasar a un salón de acceso restringido es válido su uso. Pero ni bien lo pretendes llevar hacia afuera y de vigilancia pública las cosas son muy diferentes. Recomiendo que te acesores con un abogado, mientras tanto puedes leer un artículo en inglés que expone la situación legal de estos sistemas bajo una óptica crítica según la ley de USA (aunque bien que se puede extrapolar a cualquier legislación): Your face is a not code bar.
Saludos,
#4
Posted 20 November 2013 - 08:30 PM
Voy a leer un poco sobre lo que me has indicado y la verdad es que se ve mas complicado de lo que pensaba. El reconocimiento facial puede tener usos muy interesantes y parece una preocupacion muy extendida entre los gobiernos del mundo.
Bueno me toca leer mucho para poder ser por lo menos un Delphiusito.

#5
Posted 20 November 2013 - 11:25 PM
Tranqui, no soy asesor de la reinita... ¡Ni quiero, ni pretendo, serlo! Estoy absolutamente en contra de las políticas disparatadas de esa mujer. Estoy en contra del Peronismo y sus diversas mutaciones menemistas, dualdistas, kirchneristas, cristinistas, macristas, sciolistas, y las futuras que vengan.
Expuse eso justamente para darte un puntapié que no se suele considerar: el legal. Deberías analizarlo en base a la legislación de tu país para determinar posibles limitaciones técnicas-operativas. Nunca está de más estudiarlo desde el lado legal; sobre todo si tu idea es hacer del proyecto una propuesta comercial.
Debido a que no estoy en condiciones de publicar mi trabajo y algunas fuentes (y para peor... no tengo mi equipo a mano como para hecharle una mirada) me es difícil encaminarte más.
Puedo comentarte que para comenzar Eigenface es la mejor alternativa, y es quizá la más sencilla de encarar.
Buscando en la red sobre Eigenface Turk y Pentland seguro llegarás al paper original. Es la fuente más directa al tema ya que ellos son los que han propuesto el tema y lo estudiaron. Muchos estudios se basan en ellos... vendría a ser "La Cara Oculta" de lo que es el reconocimiento facial.
Se puede rastrear alguna que otra fuente en español, aunque no demasiado completa. Lo seguro es ir por fuentes en inglés.
De todo el procedimiento que involucra Eigenface el más crítico es obtener los autovectores y autovalores (o también conocidos como vectores propios y valores propios) de la matriz simétrica. Hay bibliotecas científicas que pueden ayudarte en esta etapa, aunque debo señalar que no necesariamente todas van a coincidir en sus resultados... Puede que los autovectores te parezcan desordenados, o cambiados de signo. Esto no quiere decir que esté mal. Simplemente se trata de una particularidad del álgebra lineal. Resulta ser que no necesariamente los autovectores son "únicos", lo fundamental es que los autovalores si estén bien.
También depende del algoritmo utilizado, la precisión y cantidad de iteraciones realizadas.
Quizá la vía más rápida para calcular el auto-sistema (o mejor conocido en su variante inglesa: eingen-system) es mediante Factorización QR pero en los últimos años se le ha estado llamándole la atención de que no tiene la mejor precisión.
En mucha literatura relacionada con Eigenface y PCA (el subalgoritmo/método estadístico que explota Eigenface) se habla del Algoritmo de Jacobi para autovalores y autovectores de matrices simétricas (OJO: no lo confundas con el algoritmo de Jacobi para sistemas lineales). La ventaja que tiene este algoritmo es que ofrece precisión y puede llegar a convergencia numérica si existe (QR no ofrece esta garantía de convergencia). Lo malo del algoritmo: no es lo más rápido.
El algoritmo de Jacobi data de hace años y se dejó en el olvido. Recién se le quitó el polvo encima y se lo ha resucitado al aprovechar el poder de las máquinas. Y cobró más relevancia cuando se hicieron análisis de precisión. Se lo ha vuelto a estudiar, se lo ha mejorado e incluso hasta existe una variante que aprovecha la computación paralela o distribuída (con QR no se puede hace esto) para acelerar enormemente los cálculos. Y hasta se ha creado hardware específicamente diseñado para esto.
Yo me fui a por Jacobi puesto que su código es relativamente sencillo de encarar, y estudiar. Descontando la versión paralela ya que esta si es más complicada, hay dos formas de estudiarlo e implementarlo:
1) Jacobi cíclico: que itera sobre todos los elementos de la matriz en orden (por filas o por columnas) y termina cuando llega a convergencia o se han acabado las iteraciones
2) Jacobi con búsqueda: que en lugar de iterar uno a uno, va buscando el máximo elemento dentro de la matriz para reducirlo.
La 2) es más rápida ya que se ha demostrado que por esta vía se llega más pronto a una convergencia. El defecto que tiene es que implica un poco más de código (el que permite la búsqueda) y si no se implementa bien llegará a resultados parciales. Esto me ha pasado a mi.
Lo que lleva a confusiones es justamente la ambiguedad con que tratan los términos rotación e iteración. Una iteración implica [(NxN)-N]/2 rotaciones, siendo N el orden de la matriz. Hay bibliotecas que cuentan rotaciones, y otras cuentan iteraciones. Y como dije: hay algunas que dejan cálculos a media.
Cuando se utiliza el algoritmo por búsqueda es justamente en donde más atención hay que ponerle. Cuando se inicia una nueva iteración, se deben buscar los nuevos [(NxN)-N]/2 máximos a fin de hacer sus debidas rotaciones (naturalmente, en orden de mayor a menor). Hay implementaciones que interrumpen el algoritmo cuando ya no hay un máximo según convergencia; lo que en principio resulta natural, pero... esto puede llevar a que se deje de lado la mitad de los cálculos.
Por ejemplo, para una matriz 4x4 debiera de haber 6 rotaciones. Si el algoritmo para la 3ra búsqueda de máximo (es decir, el 3er máximo y por tanto 3ra rotación) detecta que ya no hay más asume que se desprecia las 4 rotaciones restantes y se ha dejado descolgado los efectos acumulativos. ¡De todas formas algo se ha alterado en las 2 rotaciones anteriores y no podemos dejar de lado sus efectos!
El punto es que cada rotación (i,j) altera nuevos elementos en la matriz, y el que no se rote en la totalidad de la matriz lleva a que de desprecie nuevos elementos, cuando ya de todas formas en las rotaciones anteriores, algo ha cambiado y en la misma magnitud estos deben ser llevados al resto aún cuando sus variaciones sean ínfimas.
Esto puede parecer poca cosa, pero he visto que más adelante puede ser una pesadilla.
Lo cierto es que el algoritmo SI o SI debe de iterar en búsqueda de la totalidad de los máximos o no debe interrumpir el ciclo de la iteración de forma brusca.
¿Cuál es la clave? En que SIEMPRE hay [(NxN)-N]/2 máximos... si no lo ha detectado es que el algoritmo falla. El algoritmo debe si o si recorrer toda la matriz triangular superior.
Esto hace que ya sea que se itere uno a uno, o se emplee la búsqueda, debe respetarse la iteración completa. Es decir: si al final de la iteración (y de todas las rotaciones implicadas) se detecta que aún no se ha entrado en convergencia, se de inicio a una nueva iteración y de nuevo ir elemento a elemento, o bien, buscando en orden de mayor a menor los máximos a fin de reducirlos UNO a UNO.
También la otra pata del problema es que es posible anular una rotación si el elemento a anular (el j-ésimo máximo) ya de por si es muy pequeño a comparación a un valor de tolerancia y con lo cual no alteraría demasiado a los resultados finales. Es legal hacerlo, ya que ayuda a mejorar la rapidez. Lo que está mal es no volver a explorar en búsquedas de nuevos máximos por los cálculos anteriores ¡que es justamente el problema!
Por ello es que al final yo me decanté por la manera tradicional: cíclico. Tuve dificultades con la otra variante.
¿Porqué pongo tanto énfasis en esto? Porque en base a los autovalores y autovectores (sobre estos fundamentalmente) se desprenden TODO. Si no tienes debidamente calculados los autovectores lo que sigue no sirve.
Dependiendo de la biblioteca que uses, obtendrás los resultados en cierto orden. Hay algunas que los entregan ya ordenados de mayor a menor (lo que te será muy bueno para después) pero otras lo presentan según los cálculos e iteraciones efectuadas. Y también las hay que a modo de cierta aceleración invierten (postivo->negativo, o vicerversa) los autovectores ya que eso les permite reducir algunas comparaciones. No te asustes... lo importante es que obtengas los autovalores correspondientes. Por ejemplo, supongamos que tienes a modo de prueba un ejercicio de un libro y te dice que los autovalores son 3, 7 y 2. Si tu implementación o la biblioteca te los presenta como 7,2,3 está bien. En este caso los autovectores para cada uno van a variar (posiblemente cambiados de signo en algunas posiciones solamente).
Para comprobar que está todo en orden lo que se debe hacer es efectuar A*Vi = V*Li siendo A la matriz original, V el autovector i-esimo y L el autovalor i-esimo. Si se cumple la igualdad para todas las tuplas {L, V} es que algoritmo hace las cosas bien.
A efectos de perfomance, sobre todo al momento, de hacer un reconocimiento facial, lo ideal es disponer de las autocaras en orden. De este modo no se necesita la totalidad de autocaras sino las primeras K mayores. A prueba de ensayo y error es posible determinar el valor de K que ofrece mejor precisión. Esto ayuda muchísimo las cosas... piensa que por ejemplo que si base de datos de personas es de 500 personas, el disponer de las autocaras ordenadas según los autovalores de mayor a menor, te evitará tener que hacer las reconstrucciones sobre estas 500 sino de un pequeñisimo grupo, unas 10 por ejemplo.
Si tu bilbioteca de cálculo de autovalores y autovectores no ofrece ordenación te canto la posta: utiliza SelectionSort.
Sobre lo demás, sin recurrir a mis archivos no me animo a dar tips que te sean de apoyo. Hay un punto que puede llevar a confusión cuando se lee el trabajo de Turk y Pentland: cuando entender que se trata de un producto interno o punto-punto y cuando de una multiplicación de matriz. Si no le prestas atención al trabajo es posible que te hagas unos líos que ni te imaginas. El último tip que te puedo dar a modo de guía: busca un paper (pdf) que explica eigenface con código en Matlab, su autor es Sezin Kaymak. Este paper me ayudó muchísimo a comprender efectivamente como eran las operaciones matriciales... cuando era un producto interno y cuando una multiplicación. Su brillante código es toda una pieza de arte y hace mucho más digerible la teoría de Turk. Me ha servido de guía para llegar a mi propia implementación (anque mi modelo es más abarcativo que eso ya que efectua los procesos siguientes que involucran a un sistema completo).
Un sistema de reconocimiento se puede separar en 3 etapas:
1) Entrenamiento
2) Prueba
3) Reconocimiento propiamente dicho.
Las fuentes explican el paso 1, el 2do lo expresan a medias, y el 3ro se lo expresa junto al paso 1 que es muy similar. Y cuando te pongas a ver en profundidad lo entenderás porqué.
Entrenamiento:
El primer paso consiste en recolectar un conjunto de imagen que servirá de entrenamiento, se arma la matriz A y con esta una simétrica L, se obtienen las autocaras U (que se calculan previamente en base a los autovectores V de L) y se obtiene la matriz de pesos W.
Prueba:
Esto es a puro ensayo y error, mucho de arte.
Se trata de ir probando varios valores de umbrales según las matrices de distancias que esté en el rango del {min, max}. Y se va recolectando para cada cara de entrenamiento sus estadísticas: falsos rechazos, falsos aciertos, aciertos, no reconocido contra cada cara (es decir, un todo contra todos). Con esto se determina el porcentaje de acierto. Generalmente se busca llegar a un valor de umbral que mejor se aproxime al EET, que no es más que buscar que la tasa de aciertos y deshaciertos sea la misma.
Esta etapa es la más tediosa puesto que no hay un método que diga en cómo elegir o calcular umbral. Como he dicho es arte.
El objetivo es calibrar el sistema, y en base a lo que diga el umbral es que se hace en el paso 3.
Reconocimiento:
Para cada cara a reconocer se obtiene su proyección en base a las K autocaras elegidas, esta proyección se resume en un conjunto de puntos Wi que forman un vector de características.
Luego a este vector se le calcula la distancia respecto a la matriz de distancias obtenido en el entrenamiento.
Se dice que hay un reconocimiento con la n-esima persona cuando la distancia n-esima es menor que el umbral n-esimo fijado para dicha persona.
Hay dos métricas de distancias que se destacan en las fuentes:
1) Euclideana
2) Mahnalobis (o algo así... son más de las 2am y no recuerdo bien)
Según algunos papers se obtiene mejores resultados con la 2da, pero hay fuentes que solo utilizan la 1ra y aseguran que es suficiente. Deberás comprobar resultados a ver con cual te da mejores precisiones. No hay un definitivo consenso al respecto. El trabajo original de Turk está inspirado en la euclideana y es posible que a fin de respetar el trabajo se queden en esta.
Tu verás, o lo puedes dejar a modo de configuración.
Como ves, hay muchas variables que hacen a la precisión y al buen rendimiento del sistema. Ten por seguro que te será por ratos un buen reto, un dolor de cabeza pero en cuanto ves resultados satisfactorios lo amarás como si fuera tu hijo.
Con todo esto creo que ya te lo he regalado

Y no me extiendo más porque ya son casi las 2am y pasadas.
Lo que si te recomiendo es que si no tienes filosa el álgebra primero la repases. Tu sabes que yo soy mucho más del tipo analítico y teórico por lo que pongo mucho valor en comprender justamente el que se hace, en que consiste y el porqué se hace como se hace y funciona.
Si no logras encontrar las palabras como para explicarselo a una abuela y sin llegar a tecnicismos es porque no la captaste.
De nada sirve utilizar herramientas sin tener algo visto o sin saberlas usarlas, en esto se requiere de documentación.
Saludos,
PD: me pregunto si te has leido semejante testamento.
#6
Posted 21 November 2013 - 03:12 AM
Si no logras encontrar las palabras como para explicarselo a una abuela y sin llegar a tecnicismos es porque no la captaste.
Una cosa: ¿Tu abuela sabe lo que es un autovector de una matriz? Felicitala de mi parte!
#7
Posted 21 November 2013 - 07:12 AM
Hay bibliotecas de todo tipo Sergio. Las hay algunas que si te encapsulan todo el trabajo, pero si uno no se hace una idea de la documentación y entiende todo el proceso (la teoría) dará lo mismo que lo haga a los pelos. Había visto una biblioteca que la verdad pintaba muy buen... tenía un buen framework, y la documentación que la acompañaba era muy completa.Yo sí que me lo he leido entero, ando dandole vueltas a ciertas ideas al respecto y quería saber en donde me metía... no suena tan mal pero esperaba que las librerías te "masticaran" más el trabajo sucio, la verdad.
Si no logras encontrar las palabras como para explicarselo a una abuela y sin llegar a tecnicismos es porque no la captaste.
Una cosa: ¿Tu abuela sabe lo que es un autovector de una matriz? Felicitala de mi parte!
El punto es que la mayoría de las bibliotecas tienen métodos como ProyectFace(), GenerateEigenFace(), CompareFace(), etc.
Es decir el grado de abstracción sigue dependiendo fuertemente del conocimiento previo. Asumen que efectivamente el desarrollador entiende del tema.
Y si la idea es que lo agarre alguien de cero es una condición limitante.
Y hay otras en que su pobre documentación no te dice nada y si no tiene código fuente no te haces una idea de lo que está pasando.
Hay frameworks que ya te encapsulan muy bien toda la etapa del PCA, que a su vez utilizan otros subframeworks dedicados. Como también he visto que están apareciendo "mini frameworks" desarrollados por particulares que ofrecen sus trabajos como guía y ejemplos para que uno se haga el propio pero que no están completos; generalmente son de universitarios curiosos.
Hay de todo en el mundo del señor....
Lo que si voy a recalcalar: Yo he comentado en lo que es Eigenface. Hay otras bibliotecas que aplican otras alternativas, la que ofrece ELKurgan se basa en la extracción de características que es otra técnica y no es de las mejores, según las fuentes que yo he consultado.
Los sistemas comerciales avanzados (en 2D) aplican todo el proceso bien estudiado:
1) se valen de la extracción de características para determinar si la imagen capturada corresponde a un rostro. En pocas líneas, se intenta explorar la imagen para determinar la presencia de ojos, bocas, narices. Hay variadas técnicas que la complementan a esta como ser funciones de iluminación que consideran la forma y color específicos de un ojo, boca, y hasta consideran los tonos de piel esperados.
2) Seguidamente se trabaja con EigenFace/FisherFace para realizar el trabajo.
3) Se compara este resultado con otros algoritmos, más recientes, como ser Análisis Discrimante (o algo así, no recuerdo bien el nombre).
Yo hice mi propio framework, por seguridad y ante la duda de posible violación de uso de licencias, limitaciones comerciales y/o académicas.
A lo que me refiero con lo de explicarle a la abuela es que se logre entender adecuadamente al tema como para explicarlo de forma simple sin tener que recurrir a una tediosa presentación y abstracta llena de formulerío.
Y quizá mi abuela no entienda lo que es un autovector pero si le digo que el procedimiento lo que hace es formar un album de fotos con imágenes de diferentes rostros que parecen deformados a simple vista pero si uno los mira en conjunto a cierta distancia se parece a la foto de alguien de la familia. Si le digo ahora que asocio a cada persona una lista de valores que me indican cuan aproximados (los famosos pesos) está de cada imagen deformada, haciendo analogía como si se tratase de la cercanía o lejanía a la que veríamos esa foto.
Entonces le digo que lo que hago es superponer a todas esas fotos a esas distancias, una de la otra, de modo que las vieramos de frente se asemeja al rostro de dicha persona que queremos identificar.
El truco del proceso es calcular las distancias (los pesos, autovalor) y las fotos fantasmales (los autovectores). Eso si es duro, lo admito. Pero si se puede lograr con el suficiente grado de abstracción y salvando ciertos detalles de explicar entonces es que ya estás en condiciones de que no te parezca tan chino y una cosa de magia el porqué funciona esta técnica.
A mi padre o a mi hermano que algo entienden de matemáticas basta con decirles que lo que hago es generar a una cara como combinación lineal del resto... una simple suma ponderada me permite reconstruir una imagen. Si luego esa imagen reconstruída es muy aproximada (en el mejor caso identica) a la de mi muestreo original (el conjunto de entrenamiento) entonces es que hemos encontrado un caso positivo.
¿Se ilustra la idea?
Saludos,
#8
Posted 25 November 2013 - 06:23 AM
Si sigo al final con la idea que tengo (en Android en principio, pero bueno, existen librerias como OpenCV portadas) ya te contaré, pero de momento es una "idea loca" de las tantas que cruzan las mentes!