domingo, 13 de agosto de 2017

Modulo 7 Clasificacion y deteccion de objetos en imagenes



Module 7.1
Image Classification and Object Detection
Table of Contents
What is Image Classification? 2
What is Object Detection? 3
Classification and Object Detection: A Brief History 3
Anatomy of an Image Classifier 4
Step 1 : Preprocessing and Normalization 4
Step 2 : Feature Extraction 5
Step 3 : Learning Algorithm For Classification 6
Support Vector Machine ( SVM ) 7
SVM Parameter C 8
SVM Parameter Gamma : Non-Linear SVM 9
Training a classifier / detector 11
Data collection 12
Data augmentation 12
Partition dataset 12
Hyperparameter Optimization 13
Hard Negative Mining 13
References and Further Reading 14

En este modulo, se explica lo que es un Algoritmo de Clasificación de Imagen, diciendo que toma una imagen de un tamaño dado y da como salida lo que la imagen contiene, en otras palabras la salida es una etiqueta de la clase (por ejemplo “gato”, “mesa”, etc.)

El algoritmo se entrena con imágenes etiquetadas para que aprenda las diferencias entre las diferentes clases, el algoritmo solo puede comprender los objetos/clases que ha aprendido.

Un Algoritmo de Detección de Objetos, encuentra todas las instancias de un objeto (u objetos) en una imagen. La entrada es una imagen y la salida es un array de rectángulos correspondientes a la localizaciones del objeto que quieres detectar. En todo detector de objetos hay un clasificador de imágenes.

Pasos de un clasificador de imagen:
Paso 1.- Preprocesado y Normalización. Cada caso es específico, se suele restar la media, dividir por la desviación típica, cambiar a otro espacio de color, recorte y cambio de tamaño a un tamaño fijo,  etc.

Paso 2.- Extracción de características. Esto es simplificar la imagen quedándonos solo con la información relevante. Algunas características son muy conocidas en visión artificial como: (Haar), Histograma de Gradientes Orientados (HOG), Transformación de características invariantes de escala (SIFT), Características robustas aceleradas (SURF), etc.
La salida de un proceso de extracción de características es un vector de características de un tamaño dado.

Paso 3.- Algoritmo de aprendizaje para la clasificación. Estos algoritmos toman el vector de características del paso 2 como entrada y dan como salida una etiqueta de la clase (por ejemplo, “gato” o “el fondo”.

Antes de que el algoritmo de clasificación pueda hacer su magia, necesitamos entrenarlo mostrándole miles de ejemplos de gatos y fondos. Diferentes algoritmos aprenden de forma diferente, pero el principio general es que los algoritmos de aprendizaje tratan a los vectores de características como puntos en un espacio de más dimensiones y tratan de encontrar planos/superficies que particionan el espacio de más dimensiones.

Maquinas de vector de soporte (SVM-Support Vector Machine) son un conjunto de algoritmos de aprendizaje supervisado. Durante el entrenamiento, nosotros le pasamos al algoritmo las coordenadas, que son los valores de las características y también la clase a la que pertenece. El algoritmo calcula el hiperplano que mejor separa las clases que le hemos enseñado en ese espacio multidimensional. El margen se controla por medio de un parámetro C. Cuando C es bajo la holgura es alta y hay un gran número de clasificaciones erróneas, cuando C es grande la holgura es pequeña y el hiperplano trata de clasificar más ejemplos correctamente.

En otras palabras, un algoritmo basado en SVM construye un modelo capaz de predecir si un punto nuevo (cuya categoría desconocemos) pertenece a una categoría o a la otra.

Entrenando un clasificador/detector:

Colección de la data:
Se recogen miles de imágenes de un tamaño fijo donde aparezca el objeto a entrenar. Este conjunto de imágenes es llamado frecuentemente el conjunto positivo.
Se recogen miles de imágenes del mismo tamaño fijo y se forma el conjunto negativo.
La combinación de los conjuntos positivo y negativo es nuestro conjunto de data.

Ampliación de la data:
Manipulamos la data actual para aumentar el tamaño del conjunto de entrenamiento obteniendo nuevas imágenes mediante diferentes métodos.

Geométricos: Por ejemplo si se recoge data para la detección de caras, la imagen especular de la cara es también una imagen valida. A veces es posible rotarlas para obtener nuevas imágenes.

Fotométricos: A veces tiene sentido aplicar transformaciones de color a las imágenes en el conjunto de entrenamiento para aumentar su tamaño.

Partición del conjunto de datos:
Repartimos la data en tres conjuntos de forma aleatoria.

1.- Conjunto de entrenamiento: usualmente el 60% de la data, entendido 60% del conjunto positivo y 60% del conjunto negativo.

2.- Conjunto de validación: esta porción es usada para comprobar el rendimiento del modelo entrenado ante el cambio de diferentes parámetros, usualmente el 20% del total. A veces se le llama Dev set.

3.- Test set: Sirve para evaluar y informar del rendimiento del modelo. Usualmente 20% de la data.
Optimización de Hiperparametros. Se cambian los hiperparametros de entrenamiento y se corre una prueba sobre el conjunto de validación en un proceso retroalimentado.

La minería de los negativos es dura. Son imágenes que no contienen el objeto de entrenamiento y es un conjunto más grande que el set positivo. Se eligen aleatoriamente y pueden hacer que haya falsos positivos en sus imágenes.

Module 7.2
Image Classification using HOG + SVM
Table of Contents
What is a Feature Descriptor 2
Histogram of Oriented Gradients 2
How to calculate Histogram of Oriented Gradients ? 3
Step 1 : Preprocessing & Normalization 3
Step 2 : Calculate the Gradient Images 4
Step 3 : Calculate Histogram of Gradients in 8×8 cells 5
Step 4 : 16×16 Block Normalization 9
Step 5 : Calculate the HOG feature vector 10
Visualizing Histogram of Oriented Gradients 11
HOG Descriptor in OpenCV 11
Training a HOG based Classifier for Eye Glasses 13
References and Further Reading 23



En este modulo, nos adentramos en los detalles del descriptor de caracteristicas (HOG) Histograma de Gradientes Orientados. A continuación usaremos el descriptor HOG con la Maquina de Vector de Soporte (SVM) para construir un clasificador.

¿Qué es un Descriptor de Características?
Un descriptor de características es una representación de una imagen o un parche de imagen que simplifica la imagen extrayendo la información útil para tareas como reconocimiento de imagen y detección de objetos cuando se pasa dicho vector a un algoritmo de clasificación como SVM, descartando la información inútil. La salida de un descriptor de características, suele ser un vector de características de una longitud determinada. Para una imagen de entrada de 64x128x3, el vector de características HOG tiene 3780 componentes.

¿Que clase de características son útiles para las tareas de clasificación? Aquellas que:
  1. Agrupen juntas  a las imágenes de los objetos de la misma clase .
  2. Las imágenes de objetos de clases diferentes deberían estar alejadas.

En el descriptor de características HOG, la distribución (histogramas) de las direcciones de los gradientes (Gradientes Orientados) son usadas como características.

¿Como calcular el descriptor de características HOG?
Paso 1: Pre procesado y Normalización
Los parches tendrán una relación 1:2 y se adaptan al parche normalizado de 64x128, los parches recorren la imagen a diferentes escalas.
Paso 2: Calcular los gradientes de las imágenes, (modulo y Angulo).
Paso 3: Calcular el Histograma de los gradientes en celdas de 8x8 pixeles.
El histograma es un vector de 9 “bins” correspondiendo a los ángulos 0, 20, 40, 60,..,160. En los bins se acumulan los valores de los gradientes con el Angulo entre los límites del bin, repartiendo el valor proporcionalmente al Angulo real.
Ejemplo: Angulo 165, magnitud 85. Repartimos así:
En 160,  85* (180-165)/(180-160) == > contribuye con  63,75 al bin 160
En 180==0,  85*(165-160)/(180-160) == > contribuye con  21,25 al bin 0==bin 180
Se suman las contribuciones de todos los pixeles en una celda de 8x8 lo que crea un histograma de 9 “bins”. (el eje y representa 0 grados)
Paso 4: Normalización en bloques de 16x16
Significa tomando un bloque de 16x16 concatenar 4 histogramas de 9x1 de (8x8) para formar un vector de 36x1 al que dividiremos por el modulo y umbral izamos los valores resultantes a un umbral predeterminado, por ejemplo 0,8.
Paso 5: Calcular el vector de características HOG
Los bloques de vectores de 36x1 son concatenados en un vector gigante de 3780 dimensiones (36x(8-1)x(16-1)).

El HOG, se suele visualizar, ploteando los histogramas  normalizados (9x1)de cada celda (8x8) y se refleja la dirección dominante del histograma.

OpenCV implementa HOG usando la clase HOGDescriptor.
Como ejemplo, se entrena un clasificador basado en HOG para “presencia de gafas”

Module 7.3
Object Detection using HOG + SVM
Table of Contents
Object Detection 2
Scale space search 3
Location search 3
Classifying an patch 5
Grouping Rectangles ( non-maximum Suppression ) 5
HOG + SVM based Object Detection using OpenCV 6
How to load a trained SVM model 6
Usage of hog.detectMultiScale 7
How to train HOG + SVM Pedestrian Detector 9
How to run HOG + SVM Pedestrian Detector 19
Hard Negative Mining 23
En este modulo, se explica cómo usar un descriptor de características HOG con un clasificador SVM para detección de objetos. La idea central de un detector de objetos es simplemente aplicar el clasificador a diferentes parches de imagen de la imagen total.

Al detectar un objeto, tratamos de encontrar la localización del objeto en la imagen, por ello tengamos en cuenta:

1.- Localización: El objeto que tratamos de detectar puede aparecer en cualquier localización en una imagen.
2.- Escala: El tamaño del objeto puede ser cualquiera.
3.- Rotación: El objeto puede estar torcido, puede ser necesario rotarlo.
4.- Detecciones múltiples: Un mismo objeto puede ser detectado varias veces.

Búsqueda en la escala del espacio
Detectar objetos a múltiples escalas es equivalente a redimensionar la imagen y usar el detector de tamaño fijado sobre la imagen redimensionada. Así los detectores de objetos crean una pirámide de imágenes internamente que necesita dos parámetros:
1.- Niveles: El numero de niveles en la pirámide, un valor típico es 64.
2.- Escala: Cuanto se redimensiona la imagen entre dos niveles de la pirámide. Un valor de 1,05 es típico.

Búsqueda de la localización:
Realizamos una búsqueda de ventana deslizante para la localización del objeto en cada imagen en la pirámide. El tamaño de la ventana es fijo, diferentes tamaños del objeto en la imagen será detectados en imágenes a diferente escala.
El numero de localizaciones de búsqueda (posiciones de la ventana deslizante) es proporcional al cuadrado de la escala usada.

Supresión de no-máximum
Cuando se detectan múltiples rectángulos para un mismo objeto. Agrupar estos rectángulos se conoce como Supresión de no-máximum. 

En OpenCV, el método HOG::groupRectangles hace un agrupamiento (Clustering) y un filtrado de los rectángulos, removiendo los mas pequeños del interior de otros más grandes.

Module 7.4
Object Detection using Haar Cascades
Table of Contents
Overview 2
Face Detection in OpenCV 2
Code and Tutorial - Face Detection 3
Code and Tutorial - Face and Smile Detection 6
Face Detection Theory 9
What are Haar Features? 10
What is an Integral Image? 11
Feature Selection using Adaboost 12
Cascade of Classifiers 12
How to train Haar Cascade based Detector 13
Step 1: Dataset Structure 16
Step 2: Create Samples 17
Step 3: Train Cascade Classifier 17
References and Further Reading 18

En este modulo, se presenta un ejemplo de detección de caras y uno de detección de sonrisas usando las funciones suministradas en OpenCV implementando un detector basado en cascadas de Haar. A continuación se explica el procedimiento general:

La imagen es dividida en subventanas y son computadas muchas características de tipo Haar usando el algoritmo Adaboost. Entonces cada subventana es comprobada por la presencia o ausencia de caras usando una cascada de clasificadores. El algoritmo de detección usa una cascada de clasificadores la cual usa características de tipo Haar. Por eso también se le conoce como un detector basado en cascadas Haar. Vamos a explicar estos conceptos:

Las características Haar se basan en elementos rectangulares divididos en (2,3 ó 4) regiones de color blanco y negro. El valor de la característica para cada elemento, se obtiene sumando el valor de todos los pixeles en las regiones negras y restándole el valor de todos los pixeles en las regiones blancas. Estas características son computadas en diferentes localizaciones y a diferentes escalas. Este cálculo es de proporciones inmensas, por ello, se necesitan métodos que simplifiquen los cálculos. Uno de estos métodos son las integrales de imagen.

Una integral de imagen, II(x,y), se calcula sustituyendo cada pixel con la suma de todos los pixeles que tienen coordenadas menores que las del pixel presente (x,y). Es un procedimiento que se hace una sola vez para cada imagen y hay algoritmos que la calculan de forma recursiva eficientemente. La ventaja está en que la suma de todos los pixeles de una región rectangular(ESI=(a,b),EID=(c,d)) , se halla a partir de la suma de la integrales de imagen en sus Esquinas Superior Izquierda ESI(a,b) e Inferior Derecha EID(c,d) menos las regiones cruzadas, es decir la suma de los pixeles en una región es igual a II(c,d)+II(a,b)-II(c,b)-II(a,d).

Selección de características útiles usando Adaboost. Adaboost es un algoritmo de selección de características que hace que solo sea necesario calcular un subconjunto de las características, es decir las características importantes que nos ayudan con nuestra labor de clasificación, dando unos clasificadores “débiles”, después Adaboost hace una combinación lineal con ellos para darnos un clasificador final “fuerte”. De esta manera, el entrenamiento de cada uno de los clasificadores “débiles” no es pesado computacionalmente (dado que ellos trabajan con solo un subconjunto de las características), y tenemos en cuenta todas las características al combinar todos los clasificadores “débiles”  en un clasificador “fuerte” que nos dice si en la subventana esta la imagen de una cara o no.

Nos queda un problema, habíamos elegido una subventana de un tamaño particular, pero una cara puede estar presente en diferentes tamaños, esto es lo que llamamos escalas múltiples, deberíamos entonces volver al origen de coordenadas y cambiar el tamaño de la subventana a uno ligeramente mayor y continuar el proceso de exploración de nuevo sobre toda la imagen, esto es enorme. Viene al rescate el concepto de clasificadores en cascada.

Clasificadores en cascada, Dos ideas, la primera es que todas las subventanas no contendrán caras, y la segunda es que si bien es cierto que un clasificador no puede decirnos de forma rápida si en una subventana hay una cara, si puede, sin embargo, decirnos cuando no hay una cara de una forma muy rápida. Entonces los clasificadores entrenados usando Adaboost, se disponen en cascada de la forma siguiente, para una posición de la subventana, si el clasificador nos dice que puede haber una cara, pasamos a probar con el siguiente clasificador y si este nos dijera que no hay cara, dejamos de comprobar esa posición y pasamos a la posición siguiente sin necesidad de probar todos los clasificadores restantes para esa posición. Entonces los primeros clasificadores son muy simples y se hacen más complejos progresivamente aumentando el número de características evaluadas en las capas más profundas de la cascada. (Como ejemplo el primero evalúa una característica, el ultimo evalúa 6000 características).

A continuación, pasamos a explicar cómo entrenar un detector basado en Cascadas Haar.
OpenCV, trae dos utilidades para entrenar “clasificadores Cascada”: “opencv_createsamples” que aumenta la data para el entrenamiento rotando y desplazando las imágenes originales.
opencv_traincascade” que entrena la cascada sobre la data de entrenamiento producida por opencv_createsample usando las características Haar, LBP o HOG.

Estas dos utilidades utilizan un montón de argumentos para afinar la salida.

Paso 1: Estructura de datos
El conjunto de datos tiene una estructura expresada en los siguientes directorios y archivos:
positive_images : ejemplos positivos
negative_images : ejemplos negativos
positives.txt : lista de archivos en el directorio positive_images
negatives.txt : lista de archivos en el directorio negative_images
samples : los archivos creados por opencv_createsamples van aquí
createsamples.pl : “guion” de utilidad para ejecutar opencv_createsamples sobre todas las imágenes.
mergevec.py : intercala los archivos de vector generados por opencv_createsamples un único archivo de vector.

Paso 2: Crear muestras
Opencv_createsamples genera muestras para una imagen a la vez. Así que hemos escrito un “guion” que ejecutara esta utilidad sobre todas las imágenes positivas y negativas.

Paso 3: Entrenar el clasificador Cascada.


Module 7.5
Local Binary Patterns
Table of Contents
Local Binary Pattern 2
LBP Histograms 3
Comparing LBP Histograms 4
Code and Tutorial for Profile Face Detector 4
References and Further Reading 6

En este modulo, se presenta un descriptor de características llamado LBP (Local Binary Pattern) el cual tiene un costo computacional muy bajo.

Se obtiene comparando un pixel con su entorno en direcciones separadas regularmente y asignando un “cero” o un “uno” al resultado de esa comparación según esa dirección. Luego según un criterio consistente para todas las imágenes que procesemos, a partir de una dirección en sentido CW o CCW anotamos ordenadamente los ceros y unos obtenidos, consiguiendo así una expresión binaria a la cual se le hace corresponder un numero entero, así si el radio del entorno es 1,5 y separamos las direcciones 45º, estamos hablando de los ocho pixeles que rodean al pixel considerado, en este caso, puede el LBP puede tomar valores desde 0 a 255 y podemos encontrar el histograma considerando todos los LPB de la imagen. Se ha demostrado (por investigaciones) que no todos los valores LBP tienen igual importancia y que solo aquellos llamados “LBP uniformes” son importantes, y son aquellos que tienen menos de dos “transiciones de bit”, el numero de “bins” del histograma, se puede disminuir de 255 a 58. Se considera el recorrido circular.

A efectos de usarlo para comparar características de varias imágenes, es mas conveniente dividir la imagen en n rectángulos y comparar los histogramas de los rectángulos correspondientes, manteniendo así la relación espacial. OpenCV usa para ello la comparación “CHI” cuadrado.

No hay comentarios:

Publicar un comentario