Reconocimiento de Patrones
Introducción
Con un paradigma convencional de programación en ingeniería del software, el objetivo del programador es modelar matemáticamente (con distintos grados de formalismo) el problema en cuestión y posteriormente formular una solución (programa) mediante un algoritmo codificado que tenga una serie de propiedades que permitan resolver dicho problema. En este sentido, el diseño de la red tiene menos que ver con cuestiones como los flujos de datos y la detección de condiciones, y más que ver con cuestiones tales como la selección del modelo de red, la de las variables a incorporar y el pre procesamiento de la información que formará el conjunto de entrenamiento. Asimismo, el proceso por el que los parámetros de la red se adecuan a la resolución de cada problema no se denomina genéricamente programación sino que se suele denominar entrenamiento neuronal.
La mayoría de los científicos coinciden en que una RNA es muy diferente en términos de estructura de un cerebro animal. Al igual que el cerebro, una RNA se compone de un conjunto masivamente paralelo de unidades de proceso muy simples y es en las conexiones entre estas unidades donde reside la inteligencia de la red. Sin embargo, en términos de escala, un cerebro es muchísimo mayor que cualquier RNA creada hasta la actualidad, y las neuronas artificiales también son más simples que su contrapartida animal. Biológicamente, un cerebro aprende mediante la reorganización de las conexiones sinápticas entre las neuronas que lo componen. De la misma manera, las RNA tienen un gran número de procesadores virtuales interconectados que de forma simplificada simulan la funcionalidad de las neuronas biológicas. En esta simulación, la reorganización de las conexiones sinápticas biológicas se modela mediante un mecanismo de pesos, que son ajustados durante la fase de aprendizaje. En una RNA entrenada, el conjunto de los pesos determina el conocimiento de esa RNA y tiene la propiedad de resolver el problema para el que la RNA ha sido entrenada.
Las redes neuronales artificiales (RNA) tienen muchas ventajas debido a que están basadas en la estructura del sistema nervioso, principalmente el cerebro.
- Aprendizaje: Las RNA tienen la habilidad de aprender mediante una etapa que se llama etapa de aprendizaje. Esta consiste en proporcionar a la RNA datos como entrada a su vez que se le indica cuál es la salida (respuesta) esperada.
- Auto organización: Una RNA crea su propia representación de la información en su interior, descargando al usuario de esto.
- Tolerancia a fallos: Debido a que una RNA almacena la información de forma redundante, ésta puede seguir respondiendo de manera aceptable aun si se daña parcialmente.
- Flexibilidad: Una RNA puede manejar cambios no importantes en la información de entrada, como señales con ruido u otros cambios en la entrada (por ejemplo si la información de entrada es la imagen de un objeto, la respuesta correspondiente no sufre cambios si la imagen cambia un poco su brillo o el objeto cambia ligeramente).
- Tiempo real: La estructura de una RNA es paralela, por lo cual si esto es implementado con computadoras o en dispositivos electrónicos especiales, se pueden obtener respuestas en tiempo real.
Objetivo
Con esta practica queremos conocer las implementaciones del reconocimiento de patrones mediante la aplicación de las redes neuronales en herramientas de software con entrenamiento de perceptrones que ayuden a las personas en sus deficiencias genéticas o accidentales con la finalidad de avanzar tecnológicamente. Nos proporciona herramientas para nuestra formación profesional, y la manera en que podemos plantearnos soluciones a problemas complejos que nos encontremos en el camino de nuestras labores cotidianas como desarrolladores o dueños de empresas enfocadas a dar soluciones de software enfocado a estas habilidades medicas
Justificación
La elaboración de la presente práctica es para conocer la funcionalidad de los perceptrones y como podemos entrenarlos para un objetivo especifico o bien para determinadas acciones dentro de un todo. Nos ayuda a entender como funcionan las cosas en la vida real y como estas observaciones gracias a grandes investigadores han ido saliendo a la luz con ayuda de las diferentes ciencias aplicadas para poder darle al ser humano una visión mas amplia de su entorno mediante un espacio virtual
Bajo ese precepto la practica que implementamos ocupa realizar una cadena de "neuronas" artificiales para el reconocimiento de patrones, y que pretende retroalimentar lo anteriormente mencionado sobre la red neuronal y una de sus posibles aplicaciones
La clase Main
int main(int argc, const char *argv[]) { Mat frame; CvCapture* capture; //aqui indicamos las validaciones para dar por enterado cuando tenemos errores en la identificación if(!fc.load(fcn)) { std::cout << "Error cargando cascada de clasificacion..." << std::endl; return -1; } //o bien pasamos los valores que la camara esta tomando en ese momento para que nuestras neuronas capture = cvCaptureFromCAM(-1);//artificiales puedan posteriormente reconocer este patron de valores if(capture) { //mismos que se tendran en el archivo xml, y podran compararse posteriormente, si el while(true) {//individuo volviera a pasar frente a la camara la proxima ocasión, las neuronas podran frame = cvQueryFrame(capture);//recordar los valores de los rasgos de las caras que pasaron //frente a la camara de manera que sera mas factible poder resolver mas rapidamente el reconocimiento if(!frame.empty())//facial de la persona reconocida. reconoceme(frame); else { std::cout << "Error al capturar video..." << std::endl;//error de salida en el caso de tener algun break;//inconveniente para almacenar o guardar la informacion de la cara de la persona. } int q = waitKey(10);//simplemente al terminar podremos presionar la tecla q o Q para salir if((char)q == 'q' || (char)q == 'Q')//segun sea el caso, por lo que es bastante simple el break;// manejo de este programa. } } return 0; }
La clase reconoceme es donde ocurre toda la lógica neuronal
void reconoceme(Mat frame) { Mat frame_gray;// en este punto generamos un marco de trabajo std::vector<Rect> faces;//utilizando vectores para ello, es decir indicara en un cuadro la cara //localizada en el marco de la camara manejada como una matriz cvtColor(frame, frame_gray, CV_BGR2GRAY);//de esta manera es mas simple localizar rasgos especificos equalizeHist(frame_gray, frame_gray);//de las personas localizadas en el rango de percepcion de la fc.detectMultiScale(frame_gray, faces, 1.1, 2, 0, Size(80, 80));//camara, razón por la que se ajustan // los parametros para que nuestras neuronas artificiales no cometan errores, o bien estos sean minimos for(int i = 0; i < faces.size(); i++) { //aqui el programa podra determinar si tiene en frente uno Mat faceROI = frame_gray(faces[i]);// o mas caras de personas en el rango visual de la camara Point pt1(faces[i].x, faces[i].y);//por lo que podra implementar el reconocimiento de las personas Point pt2(faces[i].x + faces[i].width, faces[i].y + faces[i].height);//alrededor de la camara, lo hará rectangle(frame, pt1, pt2, Scalar(0, 0, 0), 10, 8, 0);// tantas veces como le sean necesarias } Point salir(5, 35); putText(frame, "Presiona 'Q' para salir...", salir, 1, 1.5, Scalar(0, 0, 0), 2, 8, 0); imshow(title, frame); }
Finalmente nuestra base de información, es decir, las "neuronas", aquí es de donde son llamadas para realizar la interpretación enviada por la cámara y llamada por la clase reconoceme para implementar los análisis de lo observado
string title = "Deteccion de patrones practicando con redes neuronales"; String fcn = "reconoceme.xml";//hacemos referencia a un documento xml el cual contiene CascadeClassifier fc;//cada una de las "neuronas"
Resultados

A la izquierda ejemplo localizado en la red, a la derecha foto de lo que se implemento. Detalles de resolución y diseño es lo que aplicaría en el caso de querer mejorar el diseño de la interfaz gráfica.
Vídeo Generado para visualizar la aplicación de el reconocimiento facial
Bibliografía Consultada
- C. Aldrich and J. S. J. van Deventer.Comparison of different artificial neural nets for the detection and location of gross errors in process systems. Industrial & Engineering Chemistry Research, 34(1):216-224,1995.
- C. M. Bishop. Neural Networks for Pattern Recognition. Oxford University Press, USA, 1995.
- C. M. Bishop. Pattern recognition and machine learning. Springer, 2006 (Online service).
- G. J. Bowden, G. C. Dandy, and H. R. Maier. Data transformation for neural network models in water resources applications. Journal of Hydroinformatics, 5(4):245-258, 2003.
- M. Brown and C. Harris. Neurofuzzy adaptive modelling and control Prentice Hall, 1995.
- J. A. Freeman and D. M. Skapura. Neural Networks: Algorithms, Applications, and Programming Techniques. Addison-Wesley, 1991.
- J. R. Hilera and V. J. Martinez. Redes neuronales artificiales. Fundamentos, modelos y aplicaciones. Addison-Wesley Iberoamericana S.A, Madrid, 1995.
- J. C. Hoskins and D. M. Himmelblau. Process control via artificial neural networks and reinforcement learning. Computers & chemical engineering, 16(4):241-251, 1992.
Imágenes de http://en.wikipedia.org/wiki/
Imágenes personales incluidas en el reporte generadas por captura de pantalla, para poder obtener lo que se observa en el preciso momento de la rutina del programa.
Información de "neuronas artificiales" con ayuda de Ibarra Cano