sábado, 22 de agosto de 2020

Project 2: DoppelGanger Find your Celebrity Look-Alike

 

Project 2: DoppelGanger Find your Celebrity Look-Alike

Here I am learning OpenCV in another course from Dr. Satya Malik, I have to do several projects, today this blog reports on project number 2.

In this project you get a lot of images from celebs in a file celeb_mini.zip, when unzip it, it has 1166 sub-folders and each sub-folder has five images of a celebrity. The names of the sub-folders are numbers, so they give you a file called celeb_mapping.npy, it is a dictionary, with the name (number) of the sub-folder as a key, and you can get the name of the celeb in the photos from that sub-folder. They suggest using the library dlib, so you also get the files shape_predictor_68_face_landmarks.dat to get the landmarks and dlib_face_recognition_resnet_model_v1.dat for the recognition. For the face detector, we are going to use the dlib face detector.

Besides there is a folder with two images inside, the test-images.zip, we have to use these images to find a celebrity look alike to them.

There is this program “enrollDlibFaceRec.py” that enrolls the celeb images in the face predictor de Dlib and the program “testDlibFaceRecImage.py”, to find the celebrity look-alike to the test-image.

What did I do?

I wanted to play with the files in my system, I like to have the control, so I uploaded the notebook “Project2_DoppelGanger_Find_Celebrity_Look_Alike.ipynb” to the lab and run the next notebook code to load and unzip the required files:

 

 

Next, I downloaded the next files from the lab to my pc .

shape_predictor_68_face_landmarks.dat

dlib_face_recognition_resnet_model_v1.dat

celeb_mapping.npy

celeb_mini.zip

test-images.zip

 

Next, I move the files to my python-project2 folder and unzip there next files:

celeb_mini.zip

test-images.zip 

I modified the files “enrollDlibFaceRec.py” and “testDlibFaceRecImage.py”, so these programs could read all the files required when saved in the folder “python-project2”.

My system is four years old; it has a processor Intel(R) Core(TM) i7-6700HQ CPU @ 2.6GHz 2.59 GHz, an Nvidia GEFORCE GTX 960M and 20.0 GB RAM.

It takes 44 minutes to enroll all the faces in the celeb_mini folder and generate a file called “descriptors.npy” of 5.7 MB with the information about the images found in the celeb_mini folder. Besides it saves a file called index.pkl of 62 kB. 

Next I run the “testDlibFaceRecImage.py” with the image “sofia-solares.jpg” with a threshold of 0.5 and I got “unknown”, I modified the threshold to 0.6 and I got the label n00002238 that is the folder for American Singer Selena Gomez. I did the same with the image “shashikant-pedwal.jpg” and I got the label n00000102 that is the folder for Indian Film Actor Amitabh Bachchan. 

Next I left the folder celeb_mini with only two subfolders n00000102 and n00002238, doing that, I can test the changes and degub the code in least than one minute each time, because this way it enrolls only ten images from two folders.

I copied and pasted the python code from the notebook “Project2_DoppelGanger_Find_Celebrity_Look_Alike.ipynb” to a python “.py” script file that I saved to my python-project2 folder with the name Project2_DoppelGanger_Find_Celebrity_Look_Alike.py. 

I copied and pasted the code necessary from the files “enrollDlibFaceRec.py” and “testDlibFaceRecImage.py”, into the script Project2_DoppelGanger_Find_Celebrity_Look_Alike.py.

I changed the input and output details in Project2_DoppelGanger_Find_Celebrity_Look_Alike.py, so it runs as the specifications are asking for. 

Here, I run the program on celeb_mini folder with 1166 sub-folders to get these screen captures:


The project specification give advice to upload the Jupiter notebook to Google colab, so, I uploaded the notebook to colab, insert my code in the right places (# TODO) and run each cell, I debug some lines of code from my python script, and here is a screen capture from Google colab:


First time I have used Google colab, I liked Google colab a lot, it enrolled the 6000 images in less than three minutes Vs 44 minutes in my system, that is 15 times faster.

How does this program work?

I got a Jupiter notebook with some code missing; the project is to write that “TODO” code

Cell 2.- import libraries

Cell 3.- import and setup the matplotlib with some parameters

Cell 4.- Iniciate face detector and download dlib models: shape predictor and face recognizer

# Download dlib models

# Landmark model

# Face recognition model

# Initialize face detector, facial landmarks detector

# and face recognizer

Cell 5.- load the files images to be enrolled and unzip them, the label mapping and the test images to find celebrity look alike.

Cell 6.-assign the string name to the faceDatasetFolder and load the labelMap

Cell 7.- We are going to read all the images from a random celebrity and show the File path and the Celeb Name.

Here we get several images from a random celebrity like this:


Cell 8.- My  code to Enrollment of Celeb Images it’s an excerpt from “enrollDlibFaceRec.py” with little changes

Enrolling a person is done by simply passing a few images of the person through the network to obtain 128 dimensional feature descriptor from the Dlib CNN, corresponding to each image. Given a new image of the same person, we can verify if it is the same person by checking the distance between the enrolled face and the new face in the 128 dimensional space. Remember the goal with the loss function is that images of the same class are clustered together and images of different classes are separated by a large distance using a metric.


# #YOUR CODE HERE

# read subfolders in folder "celeb_mini"

# nameLabelMap is dict with keys as person's name

# and values as integer label assigned to this person

# labels contain integer labels for corresponding image in imagePaths

# Process images one by one

# We will store face descriptors in an ndarray (faceDescriptors)

# and their corresponding labels in dictionary (index)

The printed output of the enrollment process:

2. Testing (The specifications)

Once you have enrolled the celebs, you should be able to use them to find the closest celeb to the given test image using minimum distance rule.

You need to find the embeddings of the test images and compare it with the enrolled celebs to find the look-alike.

Finally, display the celeb along side the input image. Partial code is given.

Cell 9.- Change the parameters of matplolib to get bigger images

Cell 12.- Load the test images and feed the face recognizer to get 128 numbers and make the metric comparative with the enrollments.

# read image(s) from test-images folder

# change test images color space from BGR to RGB compatible con Dlib


# change test images color space from BGR to RGB compatible con Dlib

# Begin to insert my code adapted from “testDlibFaceRecImage.py”

# Set the threshold to 0.6

# the faceDetector gets the images one by one

# Find facial landmarks for each detected face and the face rectangle

# Compute face descriptor using neural network defined in Dlib using facial landmark shape

# Convert face descriptor from Dlib's format to list, then a NumPy array

# Calculate Euclidean distances between face descriptor calculated on face dectected

# in current frame with all the face descriptors we calculated while enrolling faces

# Calculate minimum distance and index of this face

# If minimum distance if less than threshold (0.6)

# find the name of person from index

# else the person in query image is unknown

 # end of my code

 ####################

# Plot the test image

#TODO - display celeb image which looks like the test image instead of the black image. 

 # Create a empty list, append to this list all the images of the celeb int the sub-folder label 

# Read the first image from the list and show it with its name from labelMap

# Here is the output of my program:






martes, 24 de marzo de 2020

Descomposicion de imágenes en lineas


Reconstruccion de imágenes generando codigo G


La idea en este proyecto de programación es obtener a partir de una imagen en blanco y negro monocromática, sin escala de grises, como lo son  las imágenes frecuentes en  los tebeos, dibujadas con tinta china, las coordenadas de los caminos que recorren las líneas, de forma que con esta información y el ancho transversal de las líneas en cada momento, en código G (GBRL de CNC), se pueda generar un dibujo lo más ajustado al original, bien sea trazando las líneas sobre una imagen digital o bien con una maquina de control numérico (CNC) sobre cualquier elemento material como papel, madera en bajorrelieve, cuero etc...

El procedimiento empleado es simple, se identifican las manchas negras a partir una especificación con parámetros como área y ancho, definidos a priori, que las catalogue como no hechas por pincel en un trazo, se guardan las coordenadas de su contorno y se “pinta” el contorno relleno de blanco sobre la imagen digital y desaparecen. Luego se identifican  y separan las líneas, las cuales una vez identificadas se “pintan” de blanco, este procedimiento se repite hasta que han sido identificadas todas las líneas del dibujo.

A modo de comprobación, se rehace el dibujo a partir de la información que hemos generado y guardado en código G. Este dibujo de compara con la imagen original para conocer el grado de desviación con el objetivo.

A modo de ejemplo, apliqué el programa a la siguiente imagen

Dibujo original.

Utilizo el programa para generar el código G correspondiente
Dibujo generado por el ordenador a partir del código G.

Enlace al Video que muestra el proceso de reconstrucción: 
Video del proceso de redibujado.

Diferencia entre el dibujo original y el generado por el ordenador
Los puntos blancos son las diferencias entre ambos dibujos

lunes, 21 de agosto de 2017

Modulo 8 Seguimiento de Objetos



Module 8.1
Introduction to Object Tracking
Table of Contents
What is Object Tracking ? 2
Tracking versus Detection 3
Tracking is faster than Detection 3
Tracking can help when detection fails 4
Tracking preserves identity of objects 4

En este modulo, Se presenta el tema de seguimiento de objetos. Se mencionan de forma sucinta los métodos principales usados para hacer el seguimiento de objetos:
1. Dense Optical flow : Flujo óptico denso
2. Sparse optical flow : Flujo óptico disperso
3. Kalman Filtering : Filtro Kalman
4. Meanshift and Camshift : Meanshift  y  Camshift
5. Single object trackers : Seguimiento de objetos únicos
6. Multiple object track finding algorithms : Algoritmos para encontrar y seguir múltiples objetos.

Comparativa “Seguimiento”  versus  “Detección”
.- El Seguimiento es más rápido que la Detección
.- El Seguimiento puede ayudar cuando falla la Detección.
.- El Seguimiento preserva la identidad de los objetos.

Module 8.2
Kalman Filtering
Table of Contents
Overview 2
What is a Kalman Filter? 3
State Transition Equation 3
Modeling Uncertainties 5
Control Input 6
Uncontrolled uncertainties 6
Measurements 7
Fusing information 8
Summary 10
Code and Tutorial 10
Results 22
References and Further Reading 22

En este modulo, se explica lo que es un filtro Kalman y su funcionamiento como herramienta de seguimiento.

Para hacer el seguimiento, el Filtro Kalman adopta la siguiente estrategia:
1.- Predecir: Hacer predicciones sobre el estado interno del sistema (por ejemplo la posición y la velocidad de un drone) basado en un estado interno previo y cualquier entrada de control (por ejemplo la fuerza de propulsión).
2.- Actualización: Cuando nuevas medidas (por ejemplo información de GPS) sobre parte del estado interno están disponibles, las usa para actualizar la predicción hecha en el paso uno.

La ecuación de transición de estado
La etapa de predecir del filtro de Kalman, supone que no hay aceleración, luego la posición actual es la posición previa mas la velocidad por el tiempo transcurrido. Esto se puede representar matricialmente así:

Modelado de las incertidumbres:
Las incertidumbres se modelan usualmente usando una distribución Gaussiana con una media y una varianza. Eso significa un vector de 6x1 para la media y una matriz de 6x6 para la covarianza.

La entrada de control:
Esta se representa por la llamada matriz de control. Muestra el mecanismo por el cual uk influencia el estado de xk, si uk  fuese el vector aceleración en 3D, la matriz de control seria:
Hay además cosas que están más allá de nuestro control y que afectan al estado del drone. Por ejemplo la navegación del drone podría verse afectada por una racha de viento. Estas incertidumbres son modeladas como un ruido Gaussiano de media cero y con covarianza Qk.
Resumiendo la etapa de predicción del filtro Kalman.
.- Un estado previo donde conocemos posiciones y velocidades.
.- Una entrada de control conocida.
.- Unas incertidumbres aleatorias que modelamos como ruido.
Las ecuaciones de la etapa de predicción del filtro Kalman serán:
Xk = Fkxk-1 + Bkuk
Pk = FkPk-1FkT+Qk

Vamos a tratar ahora de la etapa de actualización basándonos por ejemplo en un GPS.
Sea el vector de posición zk y las incertidumbres las modelamos con la matriz de covarianza Rk. Deberíamos combinar esta información con el estimado logrado en la sección previa. Para ello necesitamos variables compatibles y usamos una matriz de observación (Hk) que hace un mapeado del estado actual al espacio de observación. Así Hkzk  y zk son cantidades que podemos comparar.

Fundiendo la información:
Aquí nos encontramos dos informaciones probabilísticas que tienen diferente media y varianza. Resulta que podemos combinar las dos fuentes de información simplemente multiplicando las dos distribuciones Gaussianas y normalizando para que el área sea uno.
Tenemos:

  1. Prediccion Hkxk con matriz de covarianza HkPkHkT
  2. Medida zk con matriz de covarianza Rk

Podemos combinar las dos fuentes de información de exactamente la misma manera que dijimos antes.
OpenCV, implementa el filtro Kalman como la clase KalmanFilter.

Module 8.3
Object Tracking using
Meanshift and CAMshift
Table of Contents
Overview 2
Object Tracking using Meanshift 2
What is Meanshift? 2
A simple example 2
The equations 3
What about Object tracking 4
What is Histogram Backprojection? 5
Object Tracking using Meanshift in OpenCV 6
Step 1 : Find the histogram of the face region 6
Step 2 : Find Back Projected image 6
Step 3 : Apply Meanshift 6
Meanshift Tracking Code and Tutorial 8
Discussion on performance 14
Object Tracking using CAMshift 15
Object Tracking using CAMshift in OpenCV 16
Improvements over Meanshift 17
CAMshift Tracking Code and Tutorial 17
References and Further Reading 24

En este modulo, se abordan los seguidores de objetos Meanshift y Camshift.
Meanshift es un método no paramétrico para encontrar la moda de un conjunto de puntos, dicho de otra forma, encuentra el máximo de una función de densidad. Su funcionamiento es iterativo, supongamos que tenemos un conjunto de puntos con alguna masa y elegimos un área circular con centro en el punto Pci que los encierra, calculamos el centro de masas de los puntos Pmi, lo normal es que Pci y Pmi sean diferentes, entonces consideramos un nuevo recinto circular con centro desplazado en Pci=Pmi y repetimos el cálculo del centro de masas para los puntos encerrados en el nuevo recinto y así sucesivamente hasta que converja y Pci==pmi.
El parámetro más importante de este algoritmo es el radio del circulo, si es muy pequeño, obtenemos un máximo local y si es muy grande so permite encontrar el máximo verdadero. Un método de cálculo mejorado es uno que da más importancia a los puntos que están más cercanos a x  y disminuyen al apartarse. Esto se consigue con un kernel Gaussiano (KG) o un kernel de Epanechnikov (KE).

¿Cómo se usa esto para el seguimiento de objetos?
1.- Encontrar el histograma del objeto de interés.
2.- Para cada nuevo fotograma, encontrar una imagen de probabilidad (que es similar a una función de densidad). Esta imagen de probabilidad puede ser obtenida mediante la retro proyección del histograma.
3.- Use Meanshift para encontrar el máximo de esta función de densidad acumulativa de imagen de probabilidad.

¿Qué es retro proyección de histograma?
Es una manera de encontrar la similitud entre dos imágenes. Puede ser definido vagamente como un método de re aplicar un histograma pre calculado a una nueva imagen para encontrar la similitud entre la distribución de color de la nueva imagen y el objeto de interés. Digamos que tenemos un histograma del objeto de interés dado por H. Entonces, por cada pixel en la nueva imagen, encuentra el “bin” en H al que él debería pertenecer y crea una imagen nueva con el valor del pixel siendo el valor de conteo del bin.

Seguimiento de objetos usando Meanshift en OpenCV
Paso 1: Encontrar el histograma de la región de la cara.
.- Detectar la cara usando Dlib.
.- Computar el histograma de la región de la cara usando el canal H del espacio de color HSV, usamos la función calcHist() de OpenCV para computarlo y normalizarlo al rango [0,255].
.- Encontrar la imagen retro-proyectada usando la función calcBackProject() de OpenCV
.- Aplicar Meanshift para encontrar el máximo en la imagen retro-proyectada en el vecindario de la nueva posición. Usamos meanShift() de OpenCV.

Seguimiento de objetos usando CAMshift (Continuamente Adaptable Meanshift)
1.- Se especifica la ventana inicial de seguimiento de altura h y ancho w centrada en (xc,yc).
2.- Usar Meanshift para obtener la localización actualizada de (xc,yc) y almacene el momento cero que es la suma de todos los pixeles en la ventana de la imagen retro proyectada.
3.- Mover el centro de la ventana al nuevo centro de masas e incremente el ancho de la ventana y la altura a valores pautados.
4.- Repita los pasos 2 y 3 hasta la convergencia.
Module 8.4
OpenCV Object Tracking API
Table of Contents
OpenCV 3 Tracking API 2
Object Tracking Algorithms 2
BOOSTING Tracker 4
MIL Tracker 4
KCF Tracker 5
TLD Tracker 5
MEDIANFLOW Tracker 6
GOTURN tracker 6
Code and Tutorial 7
Combining Detection and Tracking 11
Reference and Further Reading 12

En este modulo, se da cobertura a la nueva API de seguimiento que viene con OpenCV 3. De hecho 6 “seguidores” diferentes disponibles en OpenCV 3.2.
El principio general de todos es encontrar en el fotograma presente el objeto seguido a partir de los datos de seguimiento obtenidos en fotogramas anteriores. Asia tenemos:
.- Un modelo de movimiento, donde sabemos la localización y la velocidad en fotogramas anteriores y con esos datos podemos predecir donde estará localizado el objeto.
.- Un modelo de apariencia que codifica como luce el modelo, esto puede usarse para buscar en un pequeño entorno de la localización predicha para predecir con más precisión la localización del objeto. Dado que la apariencia de un objeto puede cambiar de forma significativa, en muchos de los “seguidores” modernos, este modelo de apariencia es un “clasificador” que ha sido entrenado “online”.
Veamos los “seguidores” que vienen con OpenCV 3.2:
 1.- Seguidor BOOSTING
Está basado en una versión online de AdaBoost. Este clasificador necesita ser entrenado en tiempo de ejecución con ejemplos positivos y negativos del objeto. El rectángulo envolvente suministrado por el usuario o por otro algoritmo de detección, es tomado como el ejemplo positivo para el objeto y muchos recortes de imagen externos al rectángulo envolvente son tratados como “fondo”. Recibido un fotograma nuevo, se ejecuta el clasificador sobre cada pixel en el vecindario de la localización previa y se guarda la puntuación del clasificador. La nueva localización del objeto es aquella donde la puntuación es máxima, Aportándonos un ejemplo positivo nuevo para el clasificador. Cada nuevo fotograma actualiza el clasificador.
Pros: Ninguno. Trabaja bien pero tiene una década de antigüedad y hay disponible seguidores más avanzados.
Cons: El rendimiento del seguimiento es mediocre y no sabe cuando falla el seguimiento.

2.- Seguidor MIL
Similar al seguidor BOOSTING con la diferencia de que en lugar de solo considerar la localización actual del objeto como un ejemplo positivo, mira en un pequeño entorno alrededor de la localización actual para generar varios ejemplos positivos. Es obvio que estos ejemplos estarán desplazados, pero aquí es donde actúa MIL (Múltiple Instance Learning) Aprendizaje de Instancias Múltiples donde no especificas ejemplos positivos y negativos, sino “bolsas” positivas y negativas y la “bolsa” es etiquetada como positiva si cualquier instancia en la bolsa esta etiquetada como positiva por el clasificador. En caso contrario la “bolsa” es etiquetada como negativa.
Pros: El rendimiento es muy bueno. No tiene tanta deriva como el seguidor BOOSTING y es razonable bajo oclusión parcial. Lo supera el KCF.
Cons: El fallo de seguimiento no es reportado con confianza. No se recupera de la oclusión total.

Seguidor KCF
Significa Filtros de Correlación Kernelizada. Esta construido sobre las ideas de los dos seguidores anteriores. Este seguidor usa el hecho de que múltiples muestras positivas usadas en el seguidor MIL tienen regiones de solapamiento mayores. Este data solapado es aprovechado por este seguidor para hacer un seguimiento más rápido y más preciso al mismo tiempo.
Pros: Precisión y velocidad son mejores que el MIL y reporta el fallo en el seguimiento mejor que BOOSTING y MIL.
Cons: No se recupera de oclusión total.

Seguidor TLD
TLD (Tracking, learning and detection). Como su nombre sugiere, descompone el seguimiento en tres componentes. El seguidor sigue al objeto de fotograma a fotograma. El detector localiza todas las apariencias que han sido observadas hasta el momento y corrige el seguidor si es necesario. El aprendizaje estima los errores del detector y los actualiza para evitar estos errores en el futuro.
Pros: Es el mejor cuando hay oclusión sobre múltiples fotogramas. También hace el mejor seguimiento sobre cambios de escala.
Cons: Muchos falsos positivos haciéndolo casi inusable.

Seguidor MEDIANFLOW
Internamente, este seguidor sigue el objeto en ambas direcciones temporales, hacia adelante y hacia atrás y mide las discrepancias entre estas dos trayectorias. Minimizando ese error “Adelante/Atrás” lo capacita a detectar los fallos de seguimiento y seleccionar trayectorias confiables en secuencias de video. Este seguidor “sabe” cuando ha fallado el seguimiento.
Pros: Excelente reporte de fallo de seguimiento. Trabaja muy bien cuando el movimiento es predecible y no hay oclusión.
Cons: Falla cuando gran movimiento.

Seguidor GOTURN
Es el único de los presentes basado en CNN (Convolutional Neural Network) y también es el único que usa un modelo entrenado “offline” por lo cual es más rápido que otros seguidores. Por la documentación de OpenCV, conocemos que es robusto a cambios de punto de vista, cambios de iluminación, y a las deformaciones. Pero no maneja la oclusión muy bien. Hay un fallo en la implementación actual que hace “CRASH” cuando se usa.

Combinando Detección y Seguimiento
En la implementación actual, no hay manera de actualizar los métodos init para indicarle al seguidor los datos procedentes de un detector. La única manera es empezar un nuevo seguidor usando el método create.

Module 8.5
Object Tracking using Multiple Instance Learning
Table of Contents
Overview 2
Object Tracking using MIL 2
Image representation 2
Motion model 2
Appearance Model 3
Multiple Instance Learning -- In words 3
Training data creation 3
Multiple Instance Learning -- In equations 5
Online Boosting 5
References and Further Reading 6

En este modulo, se habla sobre el seguimiento de objetos usando MIL (Múltiple Instance Learning).
Los métodos tradicionales basados en aprendizaje supervisado entrenan un clasificador discriminativo para separar los objetos del fondo. Al primer fotograma de la secuencia se le dota con el rectángulo envolvente del objeto que será seguido. A continuación, ejemplos positivos y negativos son extraídos de esta ventana del objeto. Errores en la posición de la ventana seleccionada pueden conducir a ejemplos de entrenamiento etiquetados incorrectamente. Si los ejemplos de entrenamiento no son buenos en un montaje de aprendizaje supervisado, el clasificador entrenado no funcionara como es esperado. Más aun, data que este bien “anotada” puede ser costosa de obtener.
Teniendo esto presente. Una aproximación de aprendizaje supervisado débilmente llamado “Múltiple Instance Learning” es usado donde no tenemos confianza plena en los datos de entrenamiento. El sistema propuesto consiste de tres componentes:
  1. Representación de imagen.
  2. Modelo de movimiento.
  3. Modelo de apariencia.

Representación de imagen
Para cada recorte de imagen, características de tipo Haar son computadas lo cual ha sido discutido en gran detalle en el modulo previo. Estas características también son usadas como clasificadores débiles para el algoritmo “en línea” como se discutirá mas tarde.

Modelo de movimiento
Un modelo simplista es usado, donde la localización de la ventana de seguimiento en el tiempo t es igualmente probable que aparezca dentro de un radio s de la localización del seguidor en el tiempo t-1.

Modelo de Apariencia
Un clasificador discriminativo basado en “Múltiple Instance Learning” es usado como modelo de apariencia.

“Múltiple Instance Learning” – En palabras.
En MIL, no especificamos ejemplos positivos y negativos, sino conjuntos positivos y negativos llamados bolsas (“bags”). La colección de imágenes en la bolsa positiva no son ejemplos estrictamente positivos. En su lugar, una bolsa es etiquetada positiva si al menos una imagen en la bolsa es un ejemplo positivo y negativa si todos los ejemplos en la bolsa son negativos.

Creación de datos de entrenamiento

Module 8.6
Tracking Multiple Objects
Table of Contents
Multi-object Tracking 2
Code and Tutorial - MultiTracker 2
References 6

En este modulo, se presenta la implementación de un seguidor de varios objetos por OpenCV. Este seguidor procesa los objetos seguidos independientemente sin ninguna optimización. Un ejemplo de construcción en OpenCV seria:
cv::MultiTraker trackers(algoritmo de seguimiento)
Los algoritmos de seguimiento disponibles son: BOOSTING, MIL, TLD, KCF, MEDIANFLOW.
El algoritmo de seguimiento por defecto es KCF.