domingo, 23 de julio de 2017

Modulo 4 Alpha Blending y sus usos



Module 4.1 Alpha Blending
Table of Contents
Alpha Blending
Alpha Blending in OpenCV
Efficient Alpha Blending using OpenCV (C++)
Runtime Comparison

En este módulo, se explica que el canal alpha, es el cuarto canal de algunas imágenes, y que se puede usar para mezclar dos imágenes para insertar un motivo frontal sobre un fondo, usando la formula  
  donde F es el Frente (“Foreground”) y B es el “Background” Fondo, y alpha es el valor del canal alpha, cuyo valor al dividirlo por 255, se encuentra en el siguiente rango: 
Alpha = 1, significa que obtenemos el pixel del frente, cuando alpha = 0 obtenemos el pixel del fondo, con los valores de alpha intermedios obtenemos una mezcla ponderada del frente y el fondo.
También se presenta un programa de exploración más rápido para hacer la mezcla, lo que representa un ahorro de tiempo de cómputo en imágenes muy grandes.

Module 4.2 Warping a Triangle
Table of Contents
Linear vs Nonlinear Image Warping
Linear Transform ( a.k.a Affine Transform )
Warp a Triangle
Warp Triangle Code & Tutorial

En este módulo, se describen las diferencias entre las transformaciones lineales y las no-lineales, Se explica cómo transformar un triangulo. Este procedimiento se usara con bastante profusión en los módulos siguientes pues se suele dividir la imagen en triángulos y se transforman uno a uno. Básicamente es lo siguiente:
Se carga una imagen y se la convierte a CV_32FC3 en el rango (0,1) y se conocen las coordenadas de los triángulos de origen y transformado. Se pasan estos datos a la función warpTriangle, en la cual se hallan los rectángulos envolventes de los triángulos y la posición de sus vértices en referencia a la esquina superior izquierda de los rectángulos (origen) en el formato “Point”, Se halla y se aplica la transformación afín. Como estamos interesados en los puntos interiores del triangulo, creamos una máscara triangular de puntos blancos sobre una imagen de puntos negros. Multiplicamos la imagen con la máscara para hacer “Alpha  blending”.

Module 4.3 Delaunay Triangulation and Voronoi Diagrams
Table of Content
Delaunay Triangulation and Voronoi Diagram
What is Delaunay Triangulation?
What is a Voronoi Diagram ?
Delaunay Triangulation Code & Tutorial
Delaunay Triangulation Animation Code & Tutorial
References and Further Reading
En este módulo, se explica cómo dividir el plano en triángulos en cuyos vértices están por ejemplo los puntos de referencia obtenidos de Dlib.  La triangulación Delaunay, se basa en que los círculos circunscritos de los triángulos obtenidos no contienen vértices en su interior. Hay muchos algoritmos para hallar la triangulación, el más simple es elegir un triangulo y revisar si el circulo circunscrito carece de vértices internos, si falla se quita un vértice y se incorpora otro. Hay una partición dual de Delaunay, que se conoce como el diagrama de Voronoi que divide el espacio de forma que las líneas limitantes son equidistantes de los puntos vecinos.
En OpenCV existe la clase “Subdiv2D” que calcula esta partición. Se muestra el programa Delaunay.cpp que lo utiliza, al que se le da como entrada una lista de coordenadas de puntos y devuelve un archivo con ternas de los índices que forman cada triangulo.
El programa carga las coordenadas de los puntos y halla su rectángulo envolvente, construye una instancia de la clase Subdiv2D para ese rectángulo. Inserta los puntos en esa instancia. Por último escribe los triángulos Delaunay en el archivo de salida.

Module 4.4 Face Averaging
Table of Contents
Face Averaging
History of Face Averaging
Attractiveness of Average Faces
Similarity Transform
How to create an average face using OpenCV ?
Step 1 : Facial Feature Detection
Step 2 : Coordinate Transformation
Step 3 : Face Alignment
Calculate Mean Face Points
Calculate Delaunay Triangulation
Warp Triangles
Step 4 : Face Averaging
Face Averaging Code and Tutorial
Some more examples on Face Averaging
Making a Face Symmetric
References and Further Reading

En este módulo, se propone un método para hallar una imagen de una cara promedio a partir de un conjunto de imágenes de caras. Lo primero que se plantea es normalizar las imágenes de los rostros que se van a promediar de forma que coincidan algunos puntos de referencia hallados mediante Dlib. Para ello:
1.- Detectar las características faciales con Dlib.
2.- Transformamos las imágenes de forma que los extremos de los ojos coincidan con los puntos (180,200), (420,200) en una imagen de 600x600. (El tercer punto se escoge para que forme un triangulo equilátero con los anteriores.
3.- usaremos los 68 puntos para dividir las imágenes en regiones triangulares. Y alinear estas regiones antes de promediar los valores de los pixeles. Calculamos la media de la posición de cada punto de referencia de las caras. Calculamos una triangulación Delaunay que nos permite descomponer la imagen en triángulos. Transformamos los triángulos para que coincidan con la cara promedio.
Por último, se enseña cómo hacer una imagen simétrica a partir de una imagen y su especular.


Module 4.5 Face Morphing
Table of Contents
Face Morphing
Face Morphing step by step
Step 1 : Find Point Correspondences using Facial Landmark Detection
Step 2 : Coordinate Transformation
Step 3 : Delaunay Triangulation
Step 4 : Warping images and alpha blending
We are now in a position to intelligently blend the two images. As mentioned before, the
amount of blending will be controlled by a parameter .
Create a morph using the following steps.
Face Morphing Code & Tutorial
Face Morphing Challenges
References and Further Reading

En este módulo, se enseña la técnica de “Morphing” para cambiar una técnica o forma en otra sin saltos, está muy emparentada al promedio de Caras. La mezcla de las imágenes está gobernada por el parámetro alpha.
Para conseguir resultados aceptables debemos encontrar la correspondencia entre los puntos de las dos imágenes y pasar de una coordenada a otra también gobernada por alpha.
Los pasos a seguir:
  1. Encontrar los puntos correspondientes usando la Detección de los puntos de referencia.
  2. Normalizar las caras y llevarlas a la misma referencia, igual que el caso de promediar.
  3. Triangulación Delaunay.
  4. Transformar las imágenes y mezcla alpha.
  
Module 4.6 Blink and Drowsiness Detection
Table of Contents
Overview 2
Approach 2
Step 1 : Find the eye region using Dlib Facial Landmark Detector 3
Step 2 : Find the area enclosed by the eyelids 3
Step 3 : Check the status of the eye (Open / Closed) 4
Step 4 : Decision on blink and drowsiness using a Finite State Machine 4
Blink Detection and Drowsy Driver Code and Tutorial 6
References and Further Readings 19

En este módulo, se implementa un programa para detectar los pestañeos (guiños) y el cierre de los ojos para prevenir el adormilamiento  al volante.
El método propuesto, usa la biblioteca Dlib para encontrar la región del ojo, a partir de los puntos de referencia obtenidos se calcula la superficie encerrada por las pestañas del ojo. A partir de esta superficie se determina si el ojo está abierto o cerrado. Para evitar una decisión prematura, se implementa una “Maquina de Estado Finita” que determina si es pestañeo normal o adormilamiento.

Module 4.7 Bug Eyes
Table of Contents
Overview
Bug Eyes
Radial Distortion
Step 1 : Get the eye patch using DLib Facial Landmark detection
Step 2 : Apply radial Distortion to the eye patch
Step 3 : Interpolate the points using remap function in OpenCV
Bug Eyes Code and Tutorial
References and Further reading

En este módulo, se aplica una distorsión radial a los ojos. Para ello se usa un mapeado donde se alteran las coordenadas de los puntos en función de k*cos(PI*r) con r en el intervalo (-0,5:0,5) y los valores de k determinan el tipo de distorsión: k<0 Barrel (Barril) o k>0 Pincushion.

Module 4.8 Head Pose Estimation
Face Pose Estimation
Introduction
What is pose estimation?
How to mathematically represent camera motion ?
What do you need for pose estimation ?
How do pose estimation algorithms work ?
Direct Linear Transform
Levenberg-Marquardt Optimization
OpenCV solvePnP
OpenCV solvePnPRansac
OpenCV POSIT
OpenCV Pose Estimation Code
References and Further Reading

En este módulo, se trata de conseguir la “POSE” de un objeto, que es su orientación relativa y posición con respecto a la cámara o viceversa de la cámara con respecto al objeto.
Este problema, se conoce como “PNP”==”Perspectiva-n-Puntos” en la jerga de visión artificial.
La “POSE” de un objeto 3D queda determinada con seis números, tres para la translación y tres para la rotación.
¿Que información se necesita para calcularlo?
1.- Las coordenadas 2D de unos pocos puntos (usamos 6 de Dlib)
2.- La locación 3D de los mismos puntos usando uno como origen.
3.- Los parámetros intrínsecos de la cámara.
Esto genera unas ecuaciones lineales que se resuelven usando un método llamado Transformación Lineal Directa (DLT) en OpenCV las funciones solvePnP y solvePnPRansac pueden ser usadas para estimar la “POSE”.

domingo, 16 de julio de 2017

Module 3 Assignment



Module 3
Assignment

Table of Contents
Train custom Facial Landmark Detector model                               2
Improve Facial Landmarks Stabilization                                          3
Use OpenCV’s face detector                                                             3

Assignment 3-1
1. Train custom Facial Landmark Detector model
Train a facial landmark detector model with 21 points or with any number of points you desire.



Example output for 21-points facial landmark detector model.
I don’t want to be original, so I will do it exactly as they asked, and in the same position.
Procedure:
I will read _bv70.txt files as input, pick then 21 landmarks and save them as _bv21.txt, one file for each image.
I modified the code generate33Points.py and save it as generate21Points.py. This program outputs two files sets in the directory  facial_landmark_data>datasets>afw
Aaaa_bv21.txt
……………………..
Yyyy_bv21.txt
Each one has 42 numbers for 21 coordinates of 21 landmarks.
I run      python  drawRectLandmarks.py   d:\cv4faces\facial_landmark_data\   21
With that I revised image  output files “original”, “mirror”
I run     python  createTrainTextXml.py   d:\cv4faces\facial_landmark_data\   21
I run     python   trainFLD.py    d:\cv4faces\facial_landmark_data\   21
It run for 50 minutes and output on the consola
Training accuracy:  8.2868806
Testing accuracy: 11.15939011140127
And the file shape_predictor_21_face_landmarks.dat
I got these images with the program facialLandmarkDetector.cpp modified.


21 landmarks on Hillary-Clinton and 21 landmarks on Clinton-Hillary.


21 landmarks on Donald-Trump and 21 landmarks on Trump-Donald.

2. Improve Facial Landmarks Stabilization
Try to improve the code on facial landmark stabilization. Can you make the landmarks more stable?
Hint : Some landmarks are more unstable than others. Can we treat them differently?

3. Use OpenCV’s face detector
Use OpenCV instead of Dlib for face detection and pass this as an input to facial landmark detection. Do you see a difference in accuracy and performance of face detection + landmark detection code?










The rectangles of the faces detected are different in size and in the position output from  the face detector of Dlib, and the OpenCV face detectors Haar and Lbp.
Dlib seems to be more precise, in the family photo I got “false positives” for Haar and Lbp. In the boy photo I got “false positives” with Lbp.
I detected small differences in position of landmarks in some images, as they depend on the rectangle passed to Dlib. (for example in Hillary lips).

Next week more on this course.

domingo, 9 de julio de 2017

Modulo 3 Deteccion de puntos de referencia, aplicaciones y uso.






Module 3.1 Facial Landmark Detection Applications & Usage
Table of Content
1. Facial Landmark Detection
2 Applications of Landmark Detection
2.1.1 Facial feature detection improves face recognition
1.1.2 Head pose estimation
1.1.3 Face Morphing
1.1.4 Face Averaging
1.1.5 Face Swap
1.1.6 Virtual Makeover
1.1.7 Blink & Drowsy Driver Detection
1.1.8 Face Filters
2. Dlibs 68-Points Model
3. Applying Facial Landmark Detection
2.1 Facial Landmark Detection Code & Tutorial
2.2 Displaying Writing Facial Landmarks to Disk
2.3 Writing Facial Landmarks to Disk
References and Further Reading

En este módulo, se explica lo que se conoce como “facial landmark”, que podríamos definir como unos hitos o puntos de referencia en la cara de cada persona como son los extremos de los ojos, la punta de la nariz, las comisuras de los labios. Una vez detectados estos puntos tienen aplicación para mejorar el reconocimiento de rostros, estimar la posición espacial de la cabeza, hacer la transformación de un rostro en otro, lo que se conoce como “morphing”, el promedio de los rasgos de varias caras, el intercambio de rostros, maquillaje virtual, detección de pestañeo y de que un conductor se duerme al volante, filtros para rostros como, bigote, barba y/o peluca postizos, accesorios como gafas, piercing etc.
Se presenta el modelo “Dlib” que genera una salida de 68 puntos de referencia que se pueden desplegar sobre la imagen de la persona, guardar en disco etc.

Module 3.2 How to Speed Up Facial Landmark Detection
Table of Content
1. How to speed up facial landmark detector
1.1. Compile Dlib in Release Mode with Optimizations turned on
1.1.1. Using CMAKE
1.1.2. Using Visual Studios
1.1.3. Using Qt
1.2. Speed Up Face Detection
1.2.1. Resize Frame
1.2.2. Skip frame
1.3. Optimizing Display
1.3.1. Resize Frame
1.3.2. Custom Face Renderer
1.4. Results
2 Speed Up Code & Tutorial
References and Further Readings
En este módulo, se explican métodos para aumentar la velocidad del detector de referencias faciales. Los cambios que más nos aportan son:
1.- Compilar Dlib en el modo “reléase”.
2.- Reducir el tamaño de los fotogramas.
3.- Saltar algunos fotogramas.
Para optimizar el desplegado de los puntos de referencia.
1.- Reducir el tamaño de los fotogramas.
2.- Usar un “render” hecho especialmente para desplegar los resultados.


Module 3.3 Stabilizing Landmark Points in Videos
Topics Covered
How to stabilize landmark points in a video
1. Moving average : A simple solution
2. Kalman Filtering
3. Optical Flow
3.1 What is Optical Flow?
3.2 Brightness Constancy Assumption
4. Lucas-Kanade Optical Flow
5. Handling Large Motion
5.1 What are Image Pyramids?
Combining Detection and Tracking
Stabilizing landmarks using OpenCV
References and Further readings


En este módulo, se explica cómo estabilizar los puntos de referencia en los videos. Para ello, consideramos cuatro variables:
1.- La ubicación de un punto de referencia en el fotograma actual.
2.- La ubicación del mismo punto de referencia en el fotograma anterior.
3.- La intensidad de los pixeles en una pequeña ventana alrededor del punto de referencia en el fotograma actual.
4.- La intensidad de los pixeles en una pequeña ventana alrededor del punto de referencia en el fotograma anterior.
Los métodos para calcular la nueva ubicación de reemplazo de los puntos de referencia son:
1.- Promedio móvil, que puede ser simple o ponderado.
2.- Filtrado Kalman.
3.- Flujo óptico, que no es otro que el vector velocidad de un punto. Si se calcula para todos los puntos del fotograma, se le llama “flujo óptico denso”, si solo se consideran algunos puntos, se llama “flujo óptico disperso”.


Module 3.4  Machine Learning, Algorithms Basics
Table of Contents
1. Supervised vs Unsupervised Learning Algorithms
2. Classification vs. Regression Problems
3. Decision Trees
3.1 Classification Trees
3.2 Regression Trees
3.3 What does it mean to train a decision tree?
3.4 The Pros and Cons of using Decision trees
4. Ensemble Methods in Machine Learning
4.1 Bagging
4.2 Boosting
4.3 Gradient Boosting
5. References and Further Reading

En este módulo, se pretende dar unas nociones básicas de aprendizaje automatico, la jerga que utiliza y los algoritmos básicos.
La distinción entre el aprendizaje supervisado y sin supervisión está en que las imágenes pueden estar etiquetadas o no.
Los problemas de clasificación etiquetan las imágenes según la clase a la que pertenecen (ejemplo hombre, mujer)
Los problemas de regresión dan como resultado un valor de una variable continua, por ejemplo la edad de la persona en la imagen.
Arboles de decisión, en cada nodo hay una pregunta y la respuesta te dirige hacia el nodo siguiente, la respuesta final está en los nodos de las hojas del árbol.
Entrenar un árbol de decisión quiere decir encontrar que característica dividir en cada nodo y que umbral usar.
Conjunto de clasificadores (Ensemble Learning)
“Bagging” Construir nuevos conjuntos de entrenamiento usando “bootstrap”:
muestreo con reemplazo de las instancias.

“Boosting”
Comenzar con un modelo (simple) entrenado sobre todos los datos: h0
–En cada iteración i, entrenar hi dando (gradualmente) mayor importancia a los datos mal clasificados por las iteraciones anteriores.
–Terminar al conseguir cierto cubrimiento, o luego de un número de iteraciones.
–Clasificar nuevas instancias usando una votación ponderada (p.ej.) de todos los clasificadores construidos.


Module 3.5 Theory of Facial Landmark Detection
Table of Contents
Facial Landmark Detection : Theory
Dlibs Facial Landmark Detector
Data
Cascade of Regressors
Learning a Regressor
What is inside the black box?
Features used in landmark detection
Choosing the node split
References and Further Reading


En este módulo,  se presenta la detección de los puntos de referencia faciales, la teoría detrás del detector Dlib de puntos de referencia faciales.
Se explica el método de cascada de regresores, donde se puede pensar de cada uno de los regresores como una caja negra con las siguientes entradas y salidas.
Entrada
1.- Forma estimada en uso.
2.- La imagen de la cara de entrada.
Salida
1.- El cambio en el estimado actual que producirá una forma estimada mas refinada (un mejor estimado de la localización de los puntos de referencia).
Cada regresor es una colección de regresores débiles y cada regresor débil es un árbol de decisión. Cada regresor rt es entrenado usando un “gradient boosting” lo que significa que un regresor débil en la secuencia aprende a predecir y por tanto a corregir el error por el regresor en el paso anterior.
Las características usadas en la detección de puntos de referencia son las diferencias entre dos pixeles elegidos aleatoriamente en la cara. La ubicación de los pixeles son definidas con respecto al promedio de la forma usando todas las imágenes en el conjunto de entrenamiento.


Module 3.6 How to Train a Custom Facial Landmark Detector
Table of Content
Introduction
Train 70-points Facial Landmarks
Data
Visualize Annotations
Train-Test Data Preparation
Training
Train 33-points Facial Landmarks
Data
Visualize Annotations
Train-Test Data Preparation
Training
References and Further Reading

En este modulo, se ofrece una dirección en Google drive donde se encuentran los archivos con las imágenes y las anotaciones de las etiquetas sobre la posición de los puntos de referencia facial en conjuntos de 70 puntos y de 33 puntos, también hay programas para visualizar los datos y entrenar el detector.

Assigments
This week there isn’t any assignment. On the other hand I am off the track because I am waiting to get my 64 bits computer, after that I will try to install at least the basic stuff: Visual Studio 15, Cmake, Anaconda and Dlib. If the computer is operating successfully all that software I will be on track again to try some of the concepts in module 3.
While I was waiting for my computer, I found this web page on “face landmarks” https://www.faceplusplus.com/landmarks/#demo  , it is online and you can upload an image and they process the image and return the landmark drawing points on your image and the landmark coordinates in a JSON file that you can copy and convert easily to a .yml file that my actual 32 bits OpenCV ver 2.4.10 can read. I wrote some lines of code that read this .yml file and draws some lines joining the landmark points the way I liked in the nose and other features.
Here I show you some of the images from the program output.







I hope that with Dlib, we will get landmark points fitting tighter than the previous ones.
I’ll be back next Sunday with something else.