Cómo crear una aplicación de clasificación / reconocimiento de imágenes

Contenidos

Este post fue hecho público como parte del Blogatón de ciencia de datos.

Introducción

793797-best-image-recognition-apis-e1587080882739-2831707

Aplicaciones

  1. Acreditación facial – Las cámaras de los teléfonos usan el acreditación facial para desbloquear el teléfono. Los sistemas de acreditación facial podrían implementarse en las puertas de entrada de los edificios de oficinas.
  2. Clasificación de imágenes – Se utiliza para distinguir entre varios conjuntos de imágenes. Industrias como el automóvil, el comercio minorista, los juegos, etc. lo usan para múltiples propósitos.
  3. Acreditación de imagen Las compañías de seguridad usan el acreditación de imágenes para detectar varias cosas en las maletas en los aeropuertos, escáneres de imágenes, etc.

Pasos para crear la aplicación

  • Obtener los datos
  • Preparación de datos
  • Modelado de datos
  • Diseñar la interfaz de usuario
  • Integrar la interfaz de usuario y el modelado

Obtener los datos

Los datos estarían en forma de imágenes, dicho de otra forma, fotografías. Las imágenes son una matriz de píxeles. Se requerirían imágenes en un número mayor para construir toda la aplicación de extremo a extremo. Los datos estarán disponibles dentro de la propia organización o deberán obtenerse de Internet abierta. Dependiendo del tipo de aplicación, el tipo de datos que se requieren variará. Si se trata de una aplicación de acreditación facial, inclusive podemos crear datos a través de la recopilación de imágenes de varias personas. Si las imágenes se van a obtener de Internet abierto, podemos raspar las imágenes de la web.

Las imágenes capturadas deben ser de alta resolución y pueden estar ligeramente distorsionadas. Puede haber cierta cantidad de ruido presente en las imágenes para que el algoritmo pueda categorizar las imágenes correctamente.

Ejemplo de web scraping de imágenes en una página web –

from selenium import webdriver

options = webdriver.ChromeOptions()
options.add_argument('--ignore-certificate-errors')
options.add_argument("--test-type")
options.binary_location = "/usr/bin/chromium"
driver = webdriver.Chrome(chrome_options=options)

driver.get('https://imgur.com/')

images = driver.find_elements_by_tag_name('img')
for image in images:
    print(image.get_attribute('src'))

driver.close()

Preparación de datos

  • Es necesario cambiar el tamaño de las imágenes para que todas las imágenes tengan el mismo tamaño
  • Las imágenes pueden ser nítidas con una resolución alta, así como un poco borrosas y ruidosas.
  • Las operaciones de transformación como traslación, rotación y escala deben aplicarse para que las imágenes capturadas estén presentes en todos los ángulos.
  • Las imágenes pueden distorsionarse o cortarse para que se generalicen bien.
  • Introducir ruido en las imágenes si no está presente
  • Una distribución uniforme del número de imágenes debe presentarse en cada una de las clases.

– Autor de Sapiens

Código para cambiar el tamaño de una imagen

img = cv2.imread('/home/img/python.png', cv2.IMREAD_UNCHANGED)
print('Original Dimensions : ',img.shape)
scale_percent = 60
width = int(img.shape[1] * scale_percent / 100)
height = int(img.shape[0] * scale_percent / 100)
dim = (width, height)
# resize image
resized = cv2.resize(img, dim, interpolation = cv2.INTER_AREA)

Modelado de datos

Una vez que se hayan obtenido todas las imágenes, colóquelas en la carpeta adecuada para cada una de las clases. Asegúrese de que haya una distribución adecuada de imágenes para el entrenamiento, la validación y los conjuntos de datos de prueba. Para la clasificación y el acreditación de imágenes tendremos que usar redes neuronales. La arquitectura de red neuronal convolucional se adapta mejor a las imágenes cuando trabajan con matrices.

Las redes neuronales convolucionales disponen diferentes capas que ayudan en las operaciones matemáticas que se realizan en las imágenes. Las capas incluyen la capa de convolución, la capa de agrupación, la capa de normalización por lotes, las funciones de activación y las capas totalmente conectadas. El aprendizaje de transferencia le brinda la capacidad de usar las arquitecturas de modelo de red previamente entrenadas que funcionan bien con las imágenes de conjuntos de datos estándar. Por lo tanto empiece por escribir su propia red, pero observará que las redes previamente entrenadas le darán un rendimiento mucho mejor.

Comience con algunos de los modelos básicos previamente entrenados como:

  • VGG16
  • Comienzo
  • Xception
  • MobileNet
  • ResNet50

Puede utilizar las bibliotecas de Tensorflow o Keras para utilizar estos modelos que disponen sus implementaciones dentro de la biblioteca. Esto le facilitará cambiar los parámetros de las diferentes capas de la arquitectura. Puede evitar el ajuste de hiperparámetros para impulsar el rendimiento. Mientras entrena los modelos, asegúrese de guardar los valores de los coeficientes o los pesos de los modelos. Estos valores que guarde se pueden utilizar para predecir las imágenes futuras que proporcionará a su aplicación.

Código de modelo VGG16

image_size=224
from keras.applications import VGG16
from keras import models
from keras import layers
from keras import optimizers
#Load the VGG model
vgg_conv = VGG16(weights="imagenet", include_top=False, input_shape=(224, 224, 3))
for layer in vgg_conv.layers[:-4]:
    layer.trainable = False
for layer in vgg_conv.layers:
    print(layer, layer.trainable)
model = models.Sequential()
# Add the vgg convolutional base model
model.add(vgg_conv)
# Add new layers
model.add(layers.Flatten())
model.add(layers.Dense(1024, activation='relu'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(29, activation='softmax'))
# Show a summary of the model. Check the number of trainable parameters
model.summary()

La biblioteca de Keras le brinda una manera fácil de guardar los coeficientes del modelo usando:

model.save('filename.h5')

Diseñar la interfaz de usuario

Una vez que el modelo está listo para utilizar, debe trabajar en la interfaz de usuario. Si está diseñando una aplicación de Android, puede diseñar la interfaz de usuario con la ayuda de Kotlin o Flutter. La interfaz de usuario debe ser fácil de leer e interpretar. Debe diseñarse de tal manera que cumpla con el fin principal de la aplicación.

Si se va a diseñar una aplicación web, Flask o Django podrían usarse para el mismo propósito. La GUI podría diseñarse usando bibliotecas de Python como Tkinter, etc.

Integrar la interfaz de usuario y el modelado

Para las aplicaciones de Android, Flutter le posibilita integrar sus modelos de clasificación con la ayuda de una biblioteca llamada Tensorflow Lite. La implementación de tensorflow lite solo necesita dos archivos para la clasificación de la imagen, dicho de otra forma, el archivo de texto de etiquetas de clase y el archivo de coeficientes o pesos del modelo. Una vez que estos dos archivos se colocan en la estructura de carpetas, la aplicación de Android estará completa y lista para ser probada. El widget de la cámara que se crea con Flutter se puede usar para tomar la imagen de entrada.

Código para incluir los dos archivos –

loadModel() async {
  await Tflite.loadModel(
    model: "assets/model_unquant.tflite",
    labels: "assets/labels.txt",
  );
}

Aquí, el archivo .tflite es el archivo de coeficientes que se crea a partir del modelo y tags.txt son los nombres de las clases de imágenes separados por una nueva línea. Incruste esto en la estructura de Android.

Para las aplicaciones web, Flask le posibilita integrar la biblioteca de Tensorflow y le posibilita utilizar los pesos del modelo para hacer el tipo correcto de predicción en la imagen de entrada.

Siguiendo este procedimiento, paso a paso, podrá construir su propio modelo de clasificación de inmediato.

Suscribite a nuestro Newsletter

No te enviaremos correo SPAM. Lo odiamos tanto como tú.