El blog de Machine Learning

Cómo entrenar a una Máquina para reconocer los números escritos a mano en una imagen (o cualquier otra cosa para el caso)

handwritten numbers

Reconociendo números escritos a mano

En esta publicación, explicaré cómo usar el Aprendizaje automático para construir un programa que pueda reconocer los números escritos a mano. También explicaré qué otras aplicaciones podría tener para usted y su negocio. Dicho esto, no entraré en los detalles de implementación, ni en las matemáticas de cómo funciona esto, el post simplemente explicará la idea general detrás de este principio.

 

Para una máquina, reconocer algo en una imagen no es una tarea fácil.
Las máquinas son bastante estúpidas y no pueden entender las imágenes. Solo pueden comprender la existencia o la ausencia de píxeles. Por lo tanto, tenemos que poner todo en términos que puedan entender si queremos que hagan una tarea tan simple ...

 

excuse me robot

Analizando imágenes pixel por pixel

Si usamos imágenes de 20x20 píxeles, cada una tendrá un total de 400 píxeles ... Y si están en blanco y negro, cada píxel tendrá un nivel de gris, yendo de 0 (completamente blanco) a 100 (completamente negro) .
Cada una de las imágenes en mi dataset de entrenamiento puede ser representada por una serie de 400 números, cada uno con valores que van de 0 a 100.

pixel reading

Si reemplazamos la imagen con todos los valores numéricos de sus píxeles, podremos enviarlos a la máquina y aplicar algunas matemáticas para entrenar nuestra red neuronal.

 

Toma 400 entradas para dar 1 salida

Usaremos el aprendizaje supervisado con una red neuronal que podrá clasificar cualquier imagen dada. Si no has leído mi blog sobre qué son las redes neuronales, léelo aquí.
La idea es crear un modelo matemático que tome 400 entradas (valores de píxel) y calcular la influencia (peso) que tiene cada valor en el resultado.
En este punto, nuestro modelo de Aprendizaje automático se vería así:

 

simple neural network

Por el momento, solo tenemos un ejemplo, por lo que nuestro modelo no podrá ser muy preciso al calcular la importancia de cada píxel de lo que representa el número 3 en una imagen determinada ... Por eso es muy importante tener muchos datos.
Esto nos permitirá alimentar nuestro modelo con más ejemplos de entrenamiento y diferentes variaciones del mismo número 3.

 

Handwritten 3s

 

Si tenemos suficientes ejemplos de cómo se escribe el número "3", podemos alimentarlos a nuestro modelo y podremos calcular el impacto (ponderación) que tuvo cada nivel de píxel de negrura al hacer que esa imagen en particular sea un número 3.

 

El conjunto de datos para entrenar el modelo

Para entrenar un programa para reconocer números escritos a mano, primero debemos comenzar proporcionándole muchos ejemplos. Afortunadamente existe la base de datos MNIST de dígitos escritos a mano. Fue subida a la web por un grupo de personas muy altruistas a quienes no podemos agradecer lo suficiente! Este conjunto de datos contiene 60 mil imágenes manuscritas en blanco y negro, cada una de 20x20 píxeles.
Cuando se traza en un software matemático como Octave (ámpliamente utilizado en machine learning), se ven algo como esto.

 

octave handwritten numbers

Redes neuronales multicapa

En mi publicación sobre redes neuronales, expliqué el concepto de redes neuronales multicapa con entradas ocultas.
Si ya leíste mi publicación, debes saber que los modelos lineales no siempre se ajustan a tus datos, por lo que es importante tener capas ocultas.
Lo que esto significa concretamente, es que nuestras 400 entradas generarán un número dado de entradas "ocultas" y que éstas serán las que finalmente decidan la salida de mi modelo.
Nuestro modelo de Machine Learning ahora se ve así:

neural network

Cada una de las líneas que interconectan las entradas se llama "pesos" o "parámetros".
El objetivo del machine learning es utilizar los ejemplos de entrenamiento para calcular los "parámetros" que mejor predicen si una imagen completamente nueva es un número 3 o no.

 

Clasificación "Uno contra todos"

Un programa que predice si un número es un 3 o no, es completamente inútil. Lo que necesitamos es programa que sea capaz de distinguir cualquier imagen nueva y adivinar correctamente de qué número se trata.
Concretamente, lo que tenemos que hacer es entrenar 10 modelos matemáticos diferentes.
De esta manera la red neuronal se vería más o menos así.

neural network multi classification

Nuestro modelo de Aprendizaje automático podrá tomar cualquier imagen nueva, aplicar los pesos de aprendizaje (parámetros) que encontremos durante el entrenamiento y nos dará las 10 probabilidades diferentes de que encaje en cada modelo.
Por ejemplo, una imagen puede tener:

  • 10% de posibilidades de ser un 0
  • 15% de posibilidades de ser un 1
  • 86% de posibilidades de ser un 2
  • etc

Lo que haremos es simplemente recoger la probabilidad más alta y hacer nuestra predicción basada en esa información.
Eso es todo lo que hay que hacer :-)

smart guy

¿Por qué pasar por todo este problema?

¿Por qué pasar por todos estos problemas para hacer que una máquina sea capaz de lograr una tarea tan simple que un ser humano puede hacer en menos de un segundo?
Bueno, podrías pagarle a un humano el salario mínimo para hacer esto, pero hay una cantidad finita de números que una persona puede reconocer. Por otro lado, una máquina puede tener la responsabilidad de repetir la misma tarea aburrida miles de millones de veces, sin descanso ni vacaciones. La máquina nunca se aburrirá, pedirá un aumento ni faltará al trabajo...

 

smile robot

¿Hay alguna aplicación para esto?

Podrías entrenar a un modelo para entender las letras. Aquí hay un par de ejemplos de lo que se puede lograr escaneando una imagen con texto escrito a mano:

  • Las compañías de transporte pueden entender la dirección manuscrita en los paquetes
  • Los documentos se pueden escanear para obtener versiones digitales de los mismos
  • Los vendedores pueden escanear tarjetas de negocios
  • Los ciegos podían "escuchar" textos escritos
  • etc

Yendo más allá de los números y el texto

Los números y las letras son solo invenciones humanas. El potencial de entrenar una máquina para distinguir patrones en las imágenes se puede aplicar a prácticamente cualquier cosa en el mundo. Una aplicación creativa de esto es la conducción autónoma.

 

autonomous driving

En este caso específico, la idea es colocar una cámara en un automóvil y tomar imágenes de la carretera cada segundo. Al entrenar el modelo, para cada imagen dada, la "respuesta" correcta será la posición del timón en ese momento preciso.
Si el timón se puede dirigir en 180 grados, entrenaremos 180 modelos para que la red neuronal pueda predecir la mejor posición del timón para cualquier nueva imagen dada que aparezca en la cámara y reaccionar en consecuencia. Esta es en realidad una de las primeras ideas detrás de la conducción autónoma.

 

¡Podemos entrenar una máquina para reconocer cualquier cosa!

Bien, entonces seamos creativos aquí:

  1. ¿Y si entrenaramos un modelo a reconocer mis productos?
  2. ¿Qué pasa si entrenamos un modelo para reconocer las caras de mis clientes VIP cuando ingresan a mi tienda?
  3. ¿Te imaginas crear un modelo capaz de clasificar y clasificar piezas en una línea de manufactura?
  4. ¿Qué tal enseñar a las cámaras policiales que reconozcan las caras de las personas desaparecidas en la calle?

Con suficientes datos de entrenamiento, podemos tomar cualquier cosa en una imagen (o un video) y enseñarle a una Máquina cómo reconocerla.
Las posibilidades son infinitas y el único límite es nuestra imaginación.

mind blow

 

¡MLab, los especialistas en Machine Learning a tu servicio!

Si el machine learning te inspira y crees que te gustaría implementar un caso de uso en tu organización, por favor contáctanosSomos independientes de los proveedores y recomendaremos e integraremos la tecnología que se adapte mejor a sus necesidades. Si las tecnologías disponibles no satisfacen tus necesidades, siempre podemos capacitar a un modelo personalizado adaptado a tu proyecto.

Redes neuronales