Leyendo números escritos a mano con YOLOv3 – Primeros intentos

YOLOv3 es un modelo de detección de objetos en imágenes desarrollado por Joseph Redmon. Mencionó el nombre del autor por que resulta ser alguien bastante peculiar. Los resultados de YOLOv3 fueron publicados en un pre-print subido a arxiv, y está escrito en un tono que va entre alardeo, bromas, y  la seriedad académica. Su CV tiene Ponys.

Este modelo supera en rapidez a otros modelos que son mucho más complicados y pesados. Afortunadamente encontré una versión en tensorflow para usarla con mi instalación usando mi GPU :D.  Ya hace rato que he querido usar mi GPU para algo y ya que no tengo tiempo para videojuegos, terminé usándola para probar este modelo (de hecho este uso fue la principal razón por la que conseguí esta computadora).

YOLOv3 tiene de primero una red neuronal profunda llamada darknet, que se dedica a extraer características de  las imágenes que se le meten. La salida de esto son 1000 features, que son luego alimentadas a otros módulos más complejos que de hecho no puedo explicar en este pequeño y descuidado post. Al final este modelo hace regresiones para estimar la posición y el tamaño de las cajas que podrían contener objetos reconocidos por la red neuronal junto a su nivel de confianza. Pero los detalles están en las publicaciones de Redmon. El modelo es bastante exitoso para encontrar humanos, carros, animales, y otras cosas. Hay varios modelos pre-entrenados sobre los datos de COCO (un dataset hecho para entrenar modelos de detección de objetos) para hacer pruebas rápidas.

Se me ocurrió utilizar este modelo para detectar números escritos a mano en los formularios de las elecciones de Guatemala del 2019.

 

 

Digitar estas actas es un reto inmenso ya que tienen muchos tachones, manchas por el  escaneo, mala caligrafía, y en especial, que son 21 mil X 4, esto es, más de 84 mil actas. El Tribunal Supermo Electoral de Guatemala fracasó gravemente al tener un sistema deficiente para el ingreso de estas actas y esto ha creado una atmósfera de caos por las sospechas de fraude electoral. Luego de que muchas personas han revisado algunas pocas actas, se ha visto que el TSE sí es incompetente, pero que no hay un fraude a gran escala, es decir que los errores que se hallaron tienen una explicación simple y que no afectan a la  mayoría de los resultados. Claro que nunca sabremos si eso en realidad es así. Entonces, cualquier ayuda para digitar estas actas es un aporte. En mi ingenuidad tecnológica, he apostado por probar YOLOv3 para intentar digitar estas actas. Ese es el objetivo, aunque, claro, es algo imposible de alcanzar. Quienes han trabajado con Machine Learning saben que aunque hay un gran positivismo cientifista y también bastante optimismo alrededor de estas tecnologías, usualmente tienen fallos. Lo más importante a la hora de desarrollar un proyecto de ML es tener datos.  No sólo tener datos, porque estas imágenes de las actas están disponibles, pero para poder entrenar el modelo, necesitamos que un conjunto de estos datos estén procesados, de modo que el modelo pueda aprender a partir de esos casos ya procesados.  Esto se conoce como machine learning supervisado.

Ok, tenemos que la mayoría de actas del TSE están ingresadas, así que sí tenemos datos anotados, pero el problema es que el modelo YOLO se entrena no sólo con las categorías de los objetos reconocidos sino que con su posición en las imágenes. Este es el mayor reto. Hacer que el modelo busque los números en la imagen de la acta escaneada. Los scans pueden salir movidos, lo números a veces son pequeños, grandes, están movidos, tienen tachones y correcciones, etc. Entonces no es tan sencillo.

Entonces decidí alimentar al modelo con fake data que generé utilizando los datos del MNIST.  En un cuadro en blanco, puse imágenes del MNIST al azar en diferentes tamaños. Los datos para entrenar tienen el recuadro de esos números y el número que el modelo debe detectar.

 

Tras horas de aprendizaje, esto funciona bastante bien sobre datos falsos:

Pero al pasar este modelo sobre una de las actas, no tuve mucho éxito. El problema es que las actas tienen muchísimo ruido, entre manchas, letras, firmas y tachones, el modelo es incapaz de detectar todos los números automáticamente, y detecta números que no lo son.

La idea de todo esto era justamente no tener que estar seleccionando las áreas con números, sino que el modelo mismo se encargue de extraer los números escritos a mano. Esto demuestra que esto es algo factible, pero que necesitamos datos reales anotados. La fake data tiene sus límites cuando se enfrenta con datos reales. También hay problemas con el estilo de los números que se encuentran en las actas y los números que están contenidos en MNIST. En especial la manera en que escriben los 7s y los 1s.

También probé generar datos con ruido, utilizando 6 fondos distintos con manchones, letras y firmas extraidos de las actas, pero el resultado no fue mejor.

El repositorio está aquí. Los próximos pasos son obtener datos anotados, y cruzar los dedos para que eso sea suficiente. Entrar en ML es cada vez más sencillo, pero lograr avances y resultados perfectos es difícil tanto por la carencia de datos anotados como por la complejidad del desarrollo de nuevos algoritmos de ML.