/py-serverless-image-recognition

Classify images as soon as you upload them in a database with serverless functions

Primary LanguageJavaScript

Función serverless para clasificar imagenes desde Cloudant

Inspirado en el repositorio Serverless Image Recognition with Cloud Functions

Presentación de Introducción a OpenWhisk - Serverless

La aplicación demuestra una IBM Cloud Functions (basado en Apache OpenWhisk) que obtiene una imagen desde una base de datos en Cloudant y la clasifica a traves de Watson Visual Recognition. El caso de uso demustra como funcionals las acciones con servicios de datos y ejecuta un codigo en respuesta a un evento en Cloudant.

Una función, o acción, es disparada por cambios (en este caso de uso porque se sube un documento) en una base de datos Cloudant. Estos documentos son redirigidos a una acción que envia la imagen a Watson Visual recognition and sube un nuevo documento en Cloudant con los tags producidos por Watson.

Cuando termines este Code Pattern, entenderas como:

  • Crear y desplegar Cloud Functions
  • Disparar Cloud Functions con cambios en Cloudant
  • Usar Watson Visual Recognition con Cloud Functions

Flujo

  1. El usuario escoge una imagen.
  2. La imagen es almacenada en la base de datos Cloudant.
  3. Una Cloud Function es disparada cuando hay una nueva imagen en la base de datos.
  4. Una Cloud Function obtiene la imagen y ysa Watson Visual Recognition para procesar la imagen.
  5. La Cloud Function guarda el resultada (tags con scores) del Visual Recognition en la base de datos.
  6. El usuario puede ver los nuevos tags o clases en la imagen que subio.

Componentes Incluidos

  • IBM Cloud Functions (basado en Apache OpenWhisk): Ejecuta codigo bajo demand en un ambiente serverless y altamente escalable.
  • Cloudant: Una base de datos completamente manejada diseñada para aplicaciones web y mobile modernas que usan documentos como JSON.
  • Watson Visual Recognition: Visual Recognition usa algoritmos de deep learning para identificar escenas, objetos y rostros en una imagen. Pudes crear y entrenar clasificadores customizados para identificar patrones para tus necesidades.

Tecnologias Importantes

  • Watson: Watson en IBM Cloud permite integrar herramientas de AI en tu aplicación y guardar, entrenar y manejar tu data en una nube segura.
  • Serverless: Una plataforma basada en eventos que permite ejecutra codigo como respuesta a un evento.

Prerequisitos

  • IBM Cloud Functions CLI para crear cloud functions desde la terminal. Haz una prueba de una acción ibmcloud wsk action invoke /whisk.system/utils/echo -p message hello --result para que tu ~/.wskprops apunte a la cuenta correcta.

  • Whisk Deploy (wskdeploy) es una herramienta que ayuda a describir y desplegar cualquier componente de OpenWhisk usando un archivo Manifest escirto en YAML. Lo usuaras si deseas hacer el despliege despliegue de todos los recursos de Cloud Functions en una sola linea de comandos. Puedes descargar en releases page y seleccionar el archivo correcto para tu sistema operativo.

  • Instala Python para instalar las dependencias en tu computador. Python >= 3.5

  • Instala Node.js si quiere usar Electron.

Ver los videos

Este repositorio cubre los videos del 7 y 8 del siguiente listado

Paso a Paso

1. Clonar el repo

Descarga o clona el repositorio py-serverless-image-recognition localmente. En una terminal, ejecuta:

$ git clone https://github.com/libardolara/py-serverless-image-recognition

2. Crea los servicio de IBM Cloud

2.1. CloudantDB

Crea el servicio Cloudant escogiendo Use both legacy credentials and IAM para la opción Available authentication method.

  • Crea las credenciales para la instacia y copia el username y password en el archivo local.env en el valor de CLOUDANT_USERNAME y CLOUDANT_PASSWORD.
  • Copia las mismas credenciales del punto anterior en el archivo actions/params.json
  • Lanza la consola web de y crea una base de dato llamada images y otra llamada tags.

Modifica el archivo local.env si planeas usar nombres de bases de datos diferentes.

2.2. Visual Recognition

Crea un servicio de Watson Visual Recognition.

  • Copia el API Key de la seccion de Credentials y pegala en el archivo local.env en el valor de WATSON_VISUAL_APIKEY
  • Copia el mismo API Key en el archivo actions/params.json

3. Desplegar Cloud Functions

Escoge un mentodo de despliegue

Desplegar a través del CLI de IBM Cloud Functions

Una vez completo los calores del archivo local.env, abre una terminal.

  • Inicia sesión en IBM Cloud según la región que desees usando CLI, para ello utiliza uno de los siguientes comandos y sigue las instrucciones:
$ ibmcloud login

Sigue las instrucciones interactivas del CLI

Si deseas cambiar la región puedes usar alguna de los siguientes comandos:

$ ibmcloud login -a https://api.ng.bluemix.net            // US South
$ ibmcloud login -a https://api.us-east.bluemix.net       // US East
$ ibmcloud login -a https://api.eu-gb.bluemix.net         // UK
$ ibmcloud login -a https://api.eu-de.bluemix.net         // Germany
$ ibmcloud login -a https://api.au-syd.bluemix.net        // Sydney

Donde -a indica que se va a seleccionar una región de API específica.

  • Observa el resultado del proceso anterior, tu organización y espacio están vacíos. Para configurar la organización y espacio que deseas usar en Cloud Foundry debes ejecutar el siguiente comando.
$ ibmcloud target -–cf

Selecciona usando los menús, la organización y espacio que deseas utilizar.

Si deseas cambiar de Organización y de espacio puedes usar el comando

$ ibmcloud target -o <organization name> -s <spacename>
  • Posicionate en la raiz
  • Aplica las variables locales sobre tu terminal. (Si usas Windows tendrás que reemplazar cada valor en los comandos que se usaran)
$ source local.env
  • Posicionate en la carpeta /actions
  • Instanciar el Package de Cloudant en tu cuenta. Llamaremos el paquete serverless-python-cloudant-pkg.
$ ibmcloud wsk package bind /whisk.system/cloudant serverless-python-cloudant-pkg -p username $CLOUDANT_USERNAME -p password $CLOUDANT_PASSWORD -p host ${CLOUDANT_USERNAME}.cloudant.com
  • Crear el Trigger que leera el evento de documentos subidos a la base de datos. Llamaremos el Trigger update-trigger
$ ibmcloud wsk trigger create update-trigger --feed serverless-python-cloudant-pkg/changes --param dbname $CLOUDANT_IMAGE_DATABASE
  • Sube la función, o acción, usando el ambiente en IBM Cloud Function python:3.7. Llamaremos la acción update-document
$ ibmcloud wsk action update update-document __main__.py --kind python:3.7 --param-file params.json

Si deseas conocer como usar librerias propias en una acción puedes revisar la documentación

  • Crea una Regla que une la acción y el Trigger. Llamaremos la regla update-trigger-rule
$ ibmcloud wsk rule create update-trigger-rule update-trigger update-document

4. Lanzar Aplicación

Puedes probar la función utilizando una aplicación en Electron contendia en este proyecto.

  • Configura electron/web/scripts/upload.js. Modifica las lineas con las credenciales de Cloudant.
let usernameCloudant = "YOUR_CLOUDANT_USERNAME"
let passwordCloudant = "YOUR_CLOUDANT_PASSWORD"

Ejecuta la aplicación Electron o el HTML.

  • Doble-click /electron/web/index.html

  • (o) Electron:

$ npm install
$ npm start

Ejemplo

sample-output

5. (Opcional) Limpieza

Para borrar los elementos creados de OpenWhisk:

$ ibmcloud wsk package delete serverless-python-cloudant-pkg 
$ ibmcloud wsk trigger delete update-trigger
$ ibmcloud wsk action delete update-document
$ ibmcloud wsk rule delete update-trigger-rule

6. (Opcional) Probar con Aplicación Web

Puedes probar la función utilizando el proyecto desarrollado en el repositorio Aplicacón web con Cloudant

Para esto debes repetir los pasos del numeral 3 y cambiar el valor CLOUDANT_IMAGE_DATABASE en local.env por my_sample_db. Tambien debes cambiar el valor dbname en el archivo actions/params.json por my_sample_db.

Si tienes problemas repitiendo el numeral 3, es necesario que borres todos los elementos creados de OpenWhisk.

  • Una vez hayas repetido el numeral 3, abre tu Aplicacón web con Cloudant y sube una foto.
  • Ve a dashboard de CloudantDB y observa que en la DB tags se creo un nuevo documento con los resultados del visual recognition.