Reconocimiento de imágenes desmitificado

Nada en el aprendizaje automático cautiva la imaginación tanto como la capacidad de reconocer imágenes. La identificación de imágenes debe connotar "inteligencia", ¿verdad? Desmitifiquemos.

La capacidad de "ver", cuando se trata de software, comienza con la capacidad de clasificar. La clasificación es la coincidencia de patrones con datos. Las imágenes son datos en forma de matrices bidimensionales.

El reconocimiento de imágenes está clasificando los datos en un depósito entre muchos. Este es un trabajo útil: puede clasificar una imagen completa o cosas dentro de una imagen.

Una de las aplicaciones clásicas y bastante útiles para la clasificación de imágenes es el reconocimiento óptico de caracteres (OCR): pasar de imágenes de lenguaje escrito a texto estructurado .

Esto se puede hacer para cualquier alfabeto y una amplia variedad de estilos de escritura.

Pasos del proceso

Crearemos código para reconocer dígitos numéricos en imágenes y mostraremos cómo funciona. Esto tomará 3 pasos:

  1. recopilar y organizar datos para trabajar (85% del esfuerzo)
  2. construir y probar un modelo predictivo (10% del esfuerzo)
  3. utilizar el modelo para reconocer imágenes (5% del esfuerzo)

La preparación de los datos es, con mucho, la mayor parte de nuestro trabajo, esto es cierto para la mayoría de los trabajos de ciencia de datos . ¡Hay una razón por la que se llama ciencia de DATOS!

La construcción de nuestro modelo predictivo y su uso para predecir valores es todo matemático . Estamos usando software para iterar a través de datos, para forjar iterativamente "pesos" dentro de ecuaciones matemáticas y para trabajar con estructuras de datos. El software no es “inteligente”, trabaja con ecuaciones matemáticas para hacer el trabajo de conocimiento estrecho, en este caso: reconocer imágenes de dígitos.

En la práctica, la mayoría de lo que la gente llama "IA" es en realidad software que realiza trabajo de conocimiento.

Nuestro modelo predictivo y datos

Usaremos uno de los modelos predictivos más simples: la regresión de “k vecinos más cercanos” o “kNN”, publicado por primera vez por E. Fix, JL Hodges en 1952.

Una explicación simple de este algoritmo está aquí y un video de sus matemáticas aquí. Y también aquí para aquellos que quieran construir el algoritmo desde cero.

Así es como funciona: imagina un gráfico de puntos de datos y círculos que capturan k puntos, con cada valor de k validado con tus datos.

El error de validación para k en sus datos tiene un mínimo que se puede determinar.

Dado el "mejor" valor de k, puede clasificar otros puntos con cierta precisión.

Usaremos el algoritmo kNN de scikit learn para evitar construir las matemáticas nosotros mismos. Convenientemente, esta biblioteca también nos proporcionará nuestros datos de imágenes.

Vamos a empezar.

El código está aquí, estamos usando iPython notebook, que es una forma productiva de trabajar en proyectos de ciencia de datos. La sintaxis del código es Python y nuestro ejemplo está tomado de sk-learn.

Comience importando las bibliotecas necesarias:

A continuación organizamos nuestros datos:

training images: 1527, test images: 269

Puede manipular la fracción y tener más o menos datos de prueba, veremos en breve cómo esto afecta la precisión de nuestro modelo.

A estas alturas probablemente se esté preguntando: ¿cómo están organizadas las imágenes de dígitos? Son matrices de valores, uno para cada píxel en una imagen de 8x8. Inspeccionemos uno.

# one-dimension[ 0. 1. 13. 16. 15. 5. 0. 0. 0. 4. 16. 7. 14. 12. 0. 0. 0. 3. 12. 2. 11. 10. 0. 0. 0. 0. 0. 0. 14. 8. 0. 0. 0. 0. 0. 3. 16. 4. 0. 0. 0. 0. 1. 11. 13. 0. 0. 0. 0. 0. 9. 16. 14. 16. 7. 0. 0. 1. 16. 16. 15. 12. 5. 0.]
# two-dimensions[[ 0. 1. 13. 16. 15. 5. 0. 0.] [ 0. 4. 16. 7. 14. 12. 0. 0.] [ 0. 3. 12. 2. 11. 10. 0. 0.] [ 0. 0. 0. 0. 14. 8. 0. 0.] [ 0. 0. 0. 3. 16. 4. 0. 0.] [ 0. 0. 1. 11. 13. 0. 0. 0.] [ 0. 0. 9. 16. 14. 16. 7. 0.] [ 0. 1. 16. 16. 15. 12. 5. 0.]]

Los mismos datos de imagen se muestran como una matriz plana (unidimensional) y nuevamente como una matriz de 8x8 en una matriz (bidimensional). Piense en cada fila de la imagen como una matriz de 8 píxeles, hay 8 filas. Podríamos ignorar la escala de grises (los valores) y trabajar con ceros y unos, eso simplificaría un poco las matemáticas.

Podemos 'trazar' esto para ver esta matriz en su forma 'pixelada'.

¿Qué dígito es este? Preguntémosle a nuestro modelo, pero primero necesitamos construirlo.

KNN score: 0.951852

Contra nuestros datos de prueba, nuestro modelo de vecino más cercano tuvo una puntuación de precisión del 95%, nada mal. Regrese y cambie el valor de la 'fracción' para ver cómo esto afecta la puntuación.

array([2])

El modelo predice que la matriz que se muestra arriba es un ' 2 ', que parece correcto.

Probemos algunos más, recuerde que estos son dígitos de nuestros datos de prueba , no usamos estas imágenes para construir nuestro modelo (muy importante).

No está mal.

Podemos crear un dígito ficticio y ver qué piensa nuestro modelo al respecto.

Si tuviéramos una colección de imágenes de dígitos sin sentido, podríamos agregarlas a nuestro entrenamiento con una etiqueta no numérica, solo otra clasificación.

Entonces, ¿cómo funciona el reconocimiento de imágenes?

  • Los datos de la imagen están organizados : entrenamiento y prueba, con etiquetas (X, y)

Los datos de entrenamiento se mantienen separados de los datos de prueba, lo que también significa que eliminamos duplicados (o casi duplicados) entre ellos.

  • un modelo se construye utilizando uno de varios modelos matemáticos (kNN, regresión logística, red neuronal convolucional, etc.)

Which type of model you choose depends on your data and the type and complexity of the classification work.

  • new data is put into the model to generate a prediction

This is lighting fast: the result of a single mathematical calculation.

If you have a collection of pictures with and without cats, you can build a model to classify if a picture contains a cat. Notice you need training images that are devoid of any cats for this to work.

Of course you can apply multiple models to a picture and identify several things.

Large Data

A significant challenge in all of this is the size of each image since 8x8 is not a reasonable image size for anything but small digits, it’s not uncommon to be dealing with 500x500 pixel images, or larger. That’s 250,000 pixels per image, so 10,000 images of training means doing math on 2.5Billion values to build a model. And the math isn’t just addition or multiplication: we’re multiplying matrices, multiplying by floating-point weights, calculating derivatives. This is why processing power (and memory) is key in certain machine learning applications.

There are strategies to deal with this image size problem:

  • use hardware graphic processor units (GPUs) to speed up the math
  • reduce images to smaller dimensions, without losing clarity
  • reduce colors to gray-scale and gradients (you can still see the cat)
  • look at sections of an image to find what you’re looking for

The good news is once a model is built, no matter how laborious that was, the prediction is fast. Image processing is used in applications ranging from facial recognition to OCR to self-driving cars.

Now you understand the basics of how this works.