Generación de dataset para problema de visión computarizada

Erik Ibarra
Inteligencia Artificial ITESM CQ
7 min readFeb 11, 2017

En esta ocasión, se presenta el primer paso que se realizó para resolver el problema de la conversión de imágenes de señas del lenguaje de señas mexicano a sus respectivas letras del alfabeto, con la excepción de las letras J, K y Ñ debido a que su representación es un gesto o una sucesión de imágenes y no una imagen estática. Este problema se intenta resolver con el propósito de incluir a personas con problemas auditivos y de habla a tener otras formas de interactuar con las computadoras, así como concientizar a las personas que no tienen estas dificultades e incluso crear métodos de enseñanza para mejorar la comunicación entre estas personas. Otro de los objetivos de realizar este proyecto y esta serie de posts, y el principal en mi opinión, es el de introducirme a estos temas de machine learning y visión computarizada de una manera práctica y al mismo tiempo fomentar el conocimiento y el interés por estas áreas en mi escuela y en países de habla hispana en general. Debido a que el enfoque para resolver este problema es desde el área de machine learning se necesita una gran cantidad de datos para poder aprender de ellos y al ser una solución que incluye al área de visión computarizada, la mayoría de estos datos son imágenes de las representaciones de las letras por manos y el resto de los datos son las etiquetas o clasificaciones de estas imágenes, en este caso la letra que se representa. Es por esto que el primer paso para resolver este problema es la obtención de estos datos.

Para iniciar con el proceso de la obtención del dataset, el primer paso es adquirir la mayor cantidad de imágenes posibles relacionadas a la problemática. Al haber estudiado el problema previamente, se comprendió que la mejor manera de abordar el problema, al menos inicialmente, era conseguir imágenes de las señas donde la mano sea fácilmente distinguible en la imagen y la forma de la seña que se está interpretando sea clara. Esto con el propósito de eliminar ruido en las imágenes y poder obtener la posición de la mano con mayor facilidad y así permitirnos normalizar los datos.

Se realizó un script con la capacidad de obtener lotes de 300 imágenes similares en un periodo de tiempo corto de alrededor de 2 minutos por lote, dado que se cumplen las características previamente mencionadas. Estas características se conseguían en ambientes controlados donde la luz no tuviera variación y el fondo de la imagen sea distinguible del color de la mano. Al ejecutar el script se presentan 3 pantallas una con la imagen sin modificar obtenida de la cámara web de la computadora, otra con la misma imagen pasada por distintos filtros que son controlados por los deslizadores que se encuentran en esa ventana y la tercera muestra la forma de la letra que se espera que se pose con la mano.

Ejecucion del script de captura

Estos deslizadores controlan los parámetros de la máscara que se encuentra en el espacio de color HSV, los cuales hacen referencia a los valores mínimos y máximos de Matiz, Saturación y Valor (Hue, Saturation and Value) que se requieren para que esa parte de la imagen sea aceptada por la máscara. El modelo HSV es usado comúnmente para la detección de colores en imágenes debido a su estructura donde la tonalidad solo recae en un valor y no en la combinación de 3 como es el caso de RGB. En este esquema Matiz se refiere a la tonalidad de color que puede estar representada por un valor numérico en un rango del 0 al 255 pasando por todos los colores, saturación se refiere a la intensidad del color que puede ir en el mismo rango desde una intensidad gris a el color puro en su máxima intensidad, y por último, el valor se refiere a la amplitud de luz en ese píxel en un rango de desde el negro hasta el blanco o al color puro si la saturación es elevada. Una vez que se seleccionaron los valores indicados para filtrar los colores y la mano se distinga en la máscara, se continua por la obtención de las imágenes tratando de asimilar la seña que se muestra en la tercera ventana del programa. Cada imagen es tomada solo si se cumplen las condiciones del filtro y si se encuentra un bulto en la máscara, en este caso la mano. A continuación se explica el proceso de filtrado y sus condiciones.

Debido a que el procesamiento de cada imagen o frame es tardado, el procesamiento se realiza cada determinado número de frames para poder mostrar una imagen fluida de lo que se está captando y mostrar al mismo tiempo el procesamiento sin que se requieran muchos recursos. Una vez que la imagen es captada por la cámara se mantiene una copia de la original y otra pasa por el proceso de convertir el espacio de color de RGB a HSV y se crea la máscara a partir de los valores controlados. Al calcular la máscara de píxeles que se encuentran en ese rango se obtiene una imagen unidimensional de valores booleanos que determinan si el pixel es del color que se está buscando. De estos grupos de booleanos es más sencillo determinar la posición de la mano, debido a que se controló el ambiente es razonable pensar que el grupo que cubre mayor superficie es nuestra mano. Así que obtenemos las dimensiones y la posición del rectángulo que encierra que encierra a ese grupo. Una consideración importante que hay que tomar debido a que queremos normalizar nuestros datos, es que las formas de las señas y las dimensiones del grupo que se crean pueden variar demasiado, es por esto que hacemos un ajuste al rectángulo que encierra dicho grupo y lo volvemos un cuadro de tal manera que la mano quede centrada en la imagen con el resto del cuadro sin color. Dado que se encontró un grupo grande se considera que la mano fue encontrada y el grupo de imágenes pasa a ser almacenado en distintas carpetas dependiendo de su clasificación y siguiendo una secuencia de números dependiente del número de lotes que se han obtenido para esa letra.

Imagen de la mano representada en intensidades de blanco como salida de la terminal. De esta manera se toma en cuenta el mayor grupo de intensidades como la mano.

Las imágenes se almacenan y se clasifican dependiendo del estado en el que se encuentran y para distintas pruebas que se requieran realizar. En caso de no estar presentes, el script genera el sistema de archivos capaz de almacenar ordenadamente las imágenes para una lectura sencilla al momento de querer relacionar las imágenes con su letra. Las clasificaciones son:

  • Imagen Original Con Mano Encontrada
  • Máscara Completa
  • Mascara Con Mano Encontrada
  • Mascara Con Mano Encontrada Reducida a 40x40
  • Mascara Con Mano Encontrada Reducida a 20x20

NOTA: Un error que se cometió en la obtención del dataset que se comparte en este post, es que el script no estaba configurado para almacenar las imágenes originales, el script que se comparte si incluye estas características para la futura creación de datasets.

Con las sesiones que se realizaron para la adquisición de los datos, se obtuvieron un total de 900 imágenes por letra las cuales suman un total de 21600 imagenes para clasificar 24 clases distintas. Algo importante a considerar debido a que la obtención de los datos ocurre en un lapso de tiempo muy corto y sin mucha diferencia entre las imágenes de cada lote, es que durante la captura es bueno generar distintos movimientos y posiciones sin perder la forma de la letra para así poder generar mayor variación dentro de la misma clasificación y que así se pueda aprender a generalizar mejor. Aunque parece una medida decente, se decidió que era mejor crear más datos a partir de los datos que se obtuvieron. Esto se puede lograr realizando transformaciones a las imágenes que ya tenemos ayudándonos, de nuevo, a generar mayor diferencia entre las misma letras. Para esto se generó otro script cuyo propósito es generar una estructura de archivos idéntica a la pasada y por cada imagen que se encuentra en el dataset original se generan 12 imágenes a partir de la original donde se rota 30 grados cada vez y se aplica un ligero efecto de zoom dependiendo de los grados rotados. Esto se realiza para generar variación y eliminar la pérdida de información que se genera al rotar debido a que cada imagen es cuadrada y la mano no es un solo objeto aislado sino que incluye el brazo. Esto nos deja con un total de 259,200 imágenes, un poco más de un cuarto de millón de cuadros distintos para diferenciar entre 24 clasificasificaciones, 10800 ejemplos para aprender la forma general de cada letra representada.

Considero que este es un gran avance para la resolución del problema de la clasificación de las imágenes en el alfabeto, así como en mis conocimientos en el área y en mis capacidades. Tambien me parecio muy satisfactorio el repasar mis aprendizajes de esta manera y así poder compartirlo con ustedes. Comparto también los datasets que genere para que realicen pruebas o experimentos con ellos y de la misma manera les comparto los scripts que realice para la generación de los mismos para que puedan generar datasets para problemas similares, en ese caso no duden en compartir esos datos para seguir creciendo las oportunidades para practicar en temas distintos que les parezcan interesantes a otras personas. Me despido dejandoles los links a los datos y a los scripts.

Datasets:

Scripts (En proceso de refactorizacion):

  • Captura de imagenes con deteccion de objeto de color
  • Transformacion de imagenes

Suerte en sus experimentos!

--

--