Exponer Modelo de clasificación Mediante Tensorflow y FastAPI

Sergio Rubiano
5 min readApr 26, 2021

Si te dedicas al aprendizaje automático sabrás que una de las cosas más importantes es exponer tus modelos a los usuarios.

Muchas personas que se dedican ML no suben sus algoritmos a producción, ignoran la segunda parte, despliegue. ¿Pero en el mundo real de que sirve entrenar un modelo de AA si no pueden usarlo las demás personas?

En esta ocasión veremos un ejemplo de un clasificador de flores, abarcaremos desde exportar el modelo hasta exponer nuestro servicio por medio de FastAPI.

Etapas

  1. Entrenar Modelo Deep Learning.

2. Exportar Modelo.

3. Exponer servicio por medio de FastAPI.

Podrán encontrar el código y funcionalidades en el siguiente repositorio https://github.com/sergio2526/Tensorflow-Image-FastAPI

1. Entrenar Modelo.

Por fines prácticos no abarcaremos de como entrenar el modelo, pero si desea conocer más sobre como entrenar un modelo de clasificación con TensorFlow, puede visitar la documentación. https://www.tensorflow.org/datasets/catalog/tf_flowers

2. Exportar Modelo.

Luego de entrenar nuestro modelo de clasificación, lo más adecuado es exportarlo en formato Tensorflow keras (H5) o en el formato de Tensorflow (PB)

En este caso lo guardamos en modelo Tensorflow Keras.

Guardé el modelo en una carpeta de Google Drive para que lo pueda descargar y utilizar.

https://drive.google.com/drive/folders/1yaqnMGa-mu14NKTxoqsTgnESF3GJ5pra?usp=sharing

El modelo pesa alrededor de 968 MB, por lo tanto descárguelo y guárdelo en su ordenador o máquina virtual.

3. Exponer servicio por medio de FastAPI.

A continuación, se explica la estructura del proyecto.

|App
|___ |uploads
| |_____ Images
|
|___ main.py
|___ model.py
|
|requirements.txt
  • En la carpeta App tendremos una sub carpeta denominada uploads, en la cual se van a guardar todas las imágenes que los usuarios le pasen al modelo, de esta manera tendremos un control sobre cuantas imágenes diferentes le han pasado al modelo.
  • El archivo model.py tendrá la ruta donde se encuentra guardado nuestro modelo en formato .H5
  • El archivo main.py expondrá el aplicativo vía POST para hacer la predicción.
  • Las dependencias se encuentran en el archivo requirements.txt

requirements.txt

Librerías que se van a utilizar con sus respectivas versiones.

Crear un entorno virtual e instalar las librerías, podría instalarlas una por una o todas mediante pip install -r requirements.txt

model.py

Agregamos una función que haga referencia a la dirección donde guardamos nuestro archivo flowers.h5, en la variable loaded_model cargamos el modelo guardado mediante save_model

main.py

Importamos las librerías con sus respectivos módulos.

Importamos nuestro archivo model.py e importamos su método loadModelH5.

Creamos 3 variables constantes.

  • UPLOAD_FOLDER = Guardar la ruta de la capeta en la que se guardaran las imágenes cargadas por el usuario.
  • CLASSES = Son las clases de etiquetas que se desean predecir, se cuenta con 5 clases.
  • ALLOWED_EXTENSIONS = El usuario solo podrá cargar imágenes en el formato dado, si desea puede agregar otro formato a la lista.

Método get, que retorna mensaje de bienvenida si todo está marchando bien.

Creamos un método post donde se va a enviar la solicitud en su respectiva ruta /model/predict.

Para subir varias imágenes al mismo tiempo, declaramos una lista de UploadFile

Se validan las imágenes recibidas en su respectivo formato y la guardamos en la carpeta Upload/Images

Las imágenes entrantes pueden llegar a tener tamaños muy grandes, por ejemplo, 1024*1024 o 500 * 500, etc. Para que nuestro modelo generalicé bien, debemos aplicar transformación a cada imagen entrante, en este caso será 224 * 224 y escala entre 0 a 1, la escala es importante para tener valores en la misma dimensión.

Se llama al método .predictmodelo de keras (H5) para la respectiva predicción, igualmente, le pasamos los index de nuestras 5 clases.

Finalmente, retornamos una lista del archivo JSON con las predicciones de las imágenes cargadas por el usuario.

Ejecutamos nuestra aplicación en la consola

uvicorn app.main:app --reload

Si observamos un estado 200, esto nos indicara que todo está funcionando correcto, ahora nos dirigimos a un navegador web y colocamos http://127.0.0.1:8000/docs.

Nuestro método POST recibe 3 clases de flores, en este caso, agregamos Sunflower, Rosa, Daisy.

Se observa que predijo bien las clases y con una probabilidad muy alta de que sea la clase correcta.

Por último, revisamos la carpeta Upload/Images y vemos las imágenes cargadas anteriormente guardadas en el directorio.

¡Muy bien! Ya tenemos una prueba funcional para mostrarle a nuestros usuarios y recibir retroalimentación, sin embargo quiero dar algunas recomendaciones.

Recomendaciones.

  • El servicio no se expuso para hacer predicciones por lotes, es decir, que si recibimos más de una cantidad de imágenes el servicio se va a demorar, esto se debe a que debe pasar por cada imagen y hacer la predicción una por una y no por lotes o en paralelo, es un problema cuando queremos predecir muchas imágenes.
  • Para mejorar el rendimiento, puede desplegar este mismo procedimiento en una máquina virtual, de esta manera será rápido y podrá disponer de más recursos.

Muchas gracias por llegar al final de este blog, comenta si te gusto o compártelo con algún colega. 🤗

¿Está listo para ir más lejos? 🚀

--

--