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:
- Agrupen juntas a las imágenes de los objetos de la misma clase .
- 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