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
- El usuario escoge una imagen.
- La imagen es almacenada en la base de datos Cloudant.
- Una Cloud Function es disparada cuando hay una nueva imagen en la base de datos.
- Una Cloud Function obtiene la imagen y ysa Watson Visual Recognition para procesar la imagen.
- La Cloud Function guarda el resultada (tags con scores) del Visual Recognition en la base de datos.
- El usuario puede ver los nuevos tags o clases en la imagen que subio.
- 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.
- 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.
-
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.
Este repositorio cubre los videos del 7 y 8 del siguiente listado
Descarga o clona el repositorio py-serverless-image-recognition
localmente. En una terminal, ejecuta:
$ git clone https://github.com/libardolara/py-serverless-image-recognition
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 deCLOUDANT_USERNAME
yCLOUDANT_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 llamadatags
.
Modifica el archivo
local.env
si planeas usar nombres de bases de datos diferentes.
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 deWATSON_VISUAL_APIKEY
- Copia el mismo API Key en el archivo
actions/params.json
Escoge un mentodo de despliegue
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ónupdate-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
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
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
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.