Febrero de 2019

Volumen 34, número 2

[Aprendizaje automático]

Aprendizaje automático en dispositivos perimetrales: integración de Azure ML y Azure IoT Edge

Por Ted Way | Febrero de 2019

El perímetro se define como cualquier plataforma de proceso que no está en la nube. Puede abarcar desde Azure Stack (un clúster de máquinas que actúa como miniAzure) hasta un eficaz servidor de puerta de enlace o un dispositivo más pequeño, como un Raspberry Pi o sensor. Actualmente, hasta los refrigeradores y otros dispositivos tienen suficiente capacidad de procesamiento para ser considerados dispositivos perimetrales. Ahora, el desafío consiste en aplicar inteligencia artificial (IA) y aprendizaje automático (ML) a los datos que no llegan a la nube por motivos de soberanía de datos, privacidad, ancho de banda u otros problemas.

James McCaffrey publicó el excelente artículo Machine Learning con dispositivos IoT en Edge (msdn.com/magazine/mt847186) en el número de julio de 2018 de MSDN Magazine sobre el entrenamiento de modelos de ML y el uso de Microsoft Embedded Learning Library (ELL) para implementar un modelo optimizado en pequeños dispositivos perimetrales. En este artículo, nos centramos en servicios y herramientas empresariales para entrenar el modelo, gestionarlo e incluirlo en un contenedor con Azure Machine Learning. Con Azure IoT Edge, aprenderá a configurar una canalización de datos utilizando el modelo e implementándolo en el dispositivo perimetral. Le guiaremos a través de un ejemplo donde se puede usar el servicio Custom Vision para entrenar un modelo que se implementa con Azure IoT Edge. Las iteraciones del modelo se pueden registrar con Azure ML.

Escenario del leopardo de las nieves

Snow Leopard Trust (snowleopard.org) se dedica a "comprender mejor al amenazado leopardo de las nieves y a proteger al felino en colaboración con las comunidades que comparten su hábitat". Para hacerlo, instalan cámaras en una zona de 500 kilómetros cuadrados para hacer un seguimiento de los leopardos de las nieves del área. Las cámaras se implementan y, a continuación, se recopilan los datos de la cámara tras un tiempo determinado. Estas cámaras se activan con el movimiento, lo que puede provocar algunas sorpresas, como aquella vez, hace años, en que los desarrolladores revelaron un rollo de película y descubrieron que solo contenía fotos de un árbol balanceándose con el viento.

Las cámaras digitales permiten capturar más imágenes, pero incluso en ese caso, solo el 5 por ciento de las imágenes contienen leopardos de las nieves. Un investigador humano puede tardar más de 200 horas en cribar las imágenes para identificar las que contienen leopardos de las nieves. Un uso mucho mejor del tiempo de un investigador sería entrenar un algoritmo de ML para identificar leopardos de las nieves.

Se dice que los algoritmos de ML "aprenden", en lugar de programarse explícitamente. Por ejemplo, si crea una aplicación para predecir el precio de una casa en función de factores como el número de dormitorios, metros cuadrados y otros factores, podría programarla explícitamente agregando reglas o buscando en alguna base de datos que ya tenga la respuesta. Si el usuario escribe un número de dormitorios entre dos y cuatro, y la casa tiene un determinado número de metros cuadrados, devolvería un precio determinado.

En lugar de programar esa respuesta, podría utilizar una ecuación muy simple, como la siguiente:

y = w1*x1 + w2*x2 + b

En este ejemplo, x1 es el número de dormitorios y x2, el de metros cuadrados. En función de los datos en que tiene el último precio de venta de varias casas, puede "entrenar" el modelo buscando los valores de w1, w2 y b que mejor se adapten a los datos. Después del entrenamiento, el modelo de ML es estático; es decir, si le da la misma entrada dos veces, responderá con el mismo resultado cada vez. Sin embargo, podría seguir desarrollando el algoritmo entrenándolo con datos nuevos y actualizándolo, lo que, básicamente, consiste en buscar valores nuevos para w1, w2 y b.

El aprendizaje profundo es un subconjunto de ML. En lugar de una ecuación lineal simple como la que acabamos de describir, utilizamos redes neuronales artificiales o redes neurales profundas (DNN) que se componen de muchas de neuronas o nodos en muchos niveles. El objetivo es imitar el funcionamiento de nuestro cerebro. Cada neurona realiza un cálculo basado en datos, como partes de las imágenes y, si el resultado alcanza un umbral determinado, se activa la neurona.

A continuación, esta entrada se introduce en la siguiente capa. Por ejemplo, supongamos que tenemos una imagen de un número escrito a mano, y tenemos dos neuronas. La primera neurona observa la mitad superior de la imagen y la segunda, la parte inferior. Si la primera neurona ve un círculo, se activa. Si la parte inferior ve una línea vertical, se activa. Para el número ocho, se activaría la primera neurona, pero no la segunda. Sin embargo, para el número nueve, se activaría la primera neurona y también la segunda. A continuación, puede tomar esa información y concluir que se trata del número nueve.

Azure Components

Antes de seguir avanzando, es importante ser consciente de los componentes de las pilas de Azure y ML. Éstos son:

Servicio Custom Vision: este servicio forma parte de la plataforma Cognitive Services y le permite entrenar un modelo de IA fácilmente mediante la carga de imágenes y su etiquetado manual. El modelo se puede exportar a muchas plataformas, como iOS (CoreML), ONNX o TensorFlow, y se guarda en el formato .pb, en función de los búferes de protocolo o protobufs. Google describe los búferes de protocolo como su "mecanismo independiente del lenguaje, independiente de la plataforma y extensible para serializar datos estructurados. Piense en XML, pero más pequeño, rápido y sencillo" (developers.google.com/protocol-buffers).

Azure Machine Learning: este servicio es una plataforma como servicio en la nube de ciencia de datos y de un extremo a otro que puede utilizar para desarrollar e implementar modelos de ML. Con Azure Machine Learning Service, puede hacer el seguimiento de sus modelos a medida que los compila, entrena, implementa y administra. Todo con la gran escala que proporciona la nube.

Azure IoT Hub e IoT Edge: Azure IoT Hub se utiliza para conectar, supervisar y controlar miles de millones de activos de Internet de las cosas (IoT). Azure IoT Edge es una plataforma que se administra de forma remota desde IoT Hub. Permite el análisis de datos en los dispositivos, en lugar de en la nube, al mover partes de la carga de trabajo al perímetro. Los dispositivos pueden dedicar menos tiempo a enviar mensajes a la nube, y pueden reaccionar de una forma autónoma y rápida a los cambios.

Con estos componentes, Snow Leopard Trust puede implementar 30 cámaras activadas por movimiento, cada una conectada a PC relativamente económicos. Vamos a usar Azure IoT Edge para implementar el modelo del leopardo de las nieves en un equipo que simule uno de los dispositivos.

Clasificación de imágenes en el perímetro

A continuación, recorreremos los pasos implicados en el aprovisionamiento de los recursos de Azure necesarios y para compilar la solución. Proporcionaremos más detalles sobre lo que se aprovisiona y lo que sucede en el código en la sección siguiente. Para empezar, necesitará:

• Una suscripción a Azure. ¿No tiene ninguna? Cree una cuenta gratuita en azure.microsoft.com/free.

• Visual Studio Code (code.visualstudio.com).

• VM Linux Ubuntu 16.04 x64 para que actúe como dispositivo IoT Edge.

• Recursos de Azure, como un área de trabajo de Azure Machine Learning, una instancia de Azure IoT Hub y una cuenta de CustomVision.ai.

• Ejemplo de implementación de modelo en aka.ms/visedge.

La creación de un área de trabajo de Azure ML también crea una cuenta de almacenamiento y Azure Container Registry, que se puede usar para almacenar las imágenes de Docker para implementarlas en dispositivos IoT Edge. Para empezar, descargue e instale herramientas de VS Code para IA de (aka.ms/vscodetoolsforai). Después de la instalación, haga clic en el símbolo de Azure en la barra de actividad de VS Code de la izquierda.

Ahora instale el SDK de Azure ML. Para hacerlo, abra la paleta de comandos mediante Ctrl + Mayús + P y escriba “Install Azure ML SDK” (Instalar SDK de Azure ML). En la ventana de terminal integrada, especifique el intérprete de Python que se usará o pulse Entrar para usar el intérprete de Python predeterminado.

A continuación, cree un área de trabajo de Azure ML y haga clic en el icono de Azure en la barra de actividad de Visual Studio Code. Aparece la barra lateral de Azure: Machine Learning. A continuación, haga clic con el botón derecho en la suscripción a Azure y seleccione Crear área de trabajo. En la lista que aparece, seleccione un grupo de recursos existente de la lista o cree uno nuevo mediante el asistente en la paleta de comandos. En este ejemplo, usamos “iot-camera-group”.

Ahora, en el campo, escriba un nombre único y claro para la nueva área de trabajo. Presione ENTRAR y se creará la nueva área de trabajo. Aparece en el árbol situado bajo el nombre de la suscripción.

Para crear una instancia de IoT Hub, abrimos VS Code y hacemos clic en el botón Extensiones del panel izquierdo (Control + Mayús + X). Busque "Azure IoT Toolkit" e instale la extensión. Necesitará un equipo Linux que actúe como dispositivo perimetral. Puede usar una VM en un equipo, en Azure o en cualquier otro sitio donde tenga acceso.

Para empezar, haga clic en el botón Explorador de la barra de actividades de la izquierda y busque la entrada Azure IoT Hub Devices (Dispositivos Azure IoT Hub). Haga clic en Más acciones (tres puntos) y seleccione Create IoT Hub (Crear instancia de IoT Hub).

Ahora elija una suscripción y, a continuación, elija el grupo de recursos ("iot-camera-group") anterior o cree uno nuevo. A continuación, elija una región y un nivel. Puede usar el nivel F1 gratuito, pero si ya existe una instancia de IoT Hub de nivel F1, tendrá que crear un nivel S1. Por último, asigne un nombre a la instancia de IoT Hub; por ejemplo, “iot-camera-hub”.

Es el momento de registrar un dispositivo IoT Edge agregando una entrada a IoT Hub. Esto generará una cadena de conexión que deberá escribir en el dispositivo IoT Edge (en este caso, la VM Linux) para poder conectarse a IoT Hub.

Para ello, en primer lugar, haga clic en el menú Más acciones (tres puntos) en Azure IoT Hub Devices (Dispositivos Azure IoT Hub) y elija Crear dispositivo IoT Edge. No haga clic en Crear dispositivo. A continuación, escriba un nombre para el dispositivo perimetral, como camera-pc-01. Por último, copie el valor de connectionString en la entrada que acaba de crear. Necesitará escribirla en el dispositivo perimetral.

En el futuro, puede hacer clic en Azure IoT Hub Devices (Dispositivos de Azure IoT Hub) y, a continuación, en Select IoT Hub (Seleccionar instancia de IoT Hub). Tendrá que iniciar sesión en Azure, elegir la suscripción en que aprovisionó la instancia de IoT Hub y, a continuación, seleccionar su instancia de IoT Hub, pero puede ver todas las cadenas de conexión asociadas con los dispositivos.

Configurar un dispositivo IoT Edge

Para simular un dispositivo perimetral, lo más sencillo es usar una VM preconfigurada (aka.ms/edgevm). Cuando se inicia la VM, instala el entorno en tiempo de ejecución de Azure IoT Edge más reciente y las dependencias. Después de aprovisionar la VM, inicie sesión en ella y ejecute este comando en la línea de comandos con la cadena de conexión para el dispositivo que registró con IoT Edge (la cadena de conexión es el valor de connectionString que copió anteriormente):

/etc/iotedge/configedge.sh "<your_iothub_edge_connection_string>"

Si quiere configurar su propia VM de Ubuntu 16.04 x64 como dispositivo perimetral, consulte esta información: aka.ms/edgevm.

Solución de clasificación de imágenes

Ahora es el momento de compilar la solución de clasificación de imágenes. Clone el ejemplo de GIT (aka.ms/visedge). Usaremos el equipo Linux x64 como máquina perimetral. Estos son los pasos que corresponden:

• Actualice el archivo .env con los valores para el registro de contenedor y asegúrese de que el motor de Docker tenga acceso a él.

• Cambie el nombre del archivo deployment.template.json a deployment.template.RPI.json.

• Cambie el nombre del archivo deployment.template.test-amd64.json a deployment.template.json.

• Para crear toda la solución, haga clic con el botón derecho del mouse en el archivo deployment.template.json y seleccione Build IoT Edge Solution (Compilar solución de IoT Edge). Esto puede tardar unos minutos, especialmente la compilación de numpy y pillow.

• Implemente la solución en el dispositivo. Para hacerlo, haga clic con el botón derecho del mouse en el archivo config/deployment.json, seleccione Create Deployment for IoT Edge device (Crear implementación para dispositivo IoT Edge) y elija el dispositivo de destino.

• Supervise los mensajes que se envían a la nube haciendo clic con el botón derecho en el dispositivo desde la extensión de IoT Edge de VS Code y seleccione Iniciar supervisión del mensaje D2C.

Para la versión x64 de la solución, estos pasos implementan dos módulos:

Captura de cámara: esto captura la secuencia de vídeo de una cámara USB y envía los fotogramas al módulo de clasificación de imágenes. El resultado se envía a edgeHub, que puede transmitirlo como mensaje a IoT Hub.

Custom Vision: este servicio web se ejecuta localmente a través de HTTP, toma una imagen y la clasifica. Se creó utilizando el sitio web de Custom Vision (customvision.ai). El modelo de la solución clasifica si una imagen contiene una manzana o una banana.

El módulo de captura de cámara puede enviar mensajes a edgeHub mediante el SDK de Azure IoT Edge. Puede crear sus propios módulos como contenedores de Docker y usar el SDK para comunicarse con edgeHub.

Para el servicio personalizado de Custom Vision, puede trabajar con el modelo existente de la solución o ir a customvision.ai y entrenar su propio modelo. Para crear el clasificador del leopardo de las nieves, cargue imágenes de leopardos de las niveles en el servicio Custom Vision. También puede cargar imágenes de otros animales que puede encontrar en el hábitat del leopardo de las nieves. Simplemente, etiquete las imágenes y haga clic en el botón Tren para entrenar el modelo. Los archivos de modelo y etiqueta se exportan como archivos .pb y .txt, respectivamente, que puede usar para sustituir lo que aparece en la solución.

Custom Vision usa el aprendizaje de transferencia, que usa una red neuronal profunda existente y extrae características de la imagen. A continuación, entrena un clasificador con los datos (en este caso, las imágenes que cargó y las etiquetas que les asignó).

Para ilustrar la el aprendizaje por transferencia, imagine que quiere entrenar a un perro rastreador de bombas; por ejemplo, un pastor alemán. Si entrena a un pastor alemán de 2 años, no sabrá nada de bombas. Tiene la "infraestructura" para detectar bombas: su eficaz sentido olfativo. Para empezar a entrenar a su pastor alemán, puede hacer que huela una bomba y decirle que es una bomba. A continuación, puede presentarle otro olor, como el de una flor, y explicarle que no es una bomba. Repita este paso para varios tipos de bombas y otros aromas y, después de algunos meses y un montón de pienso, tendrá un perro rastreador de bombas. Entrenar a un pastor alemán no es tan difícil. Lo difícil es hacer un pastor alemán.

Los DNN, como ResNet 50, Inception v3, YOLO y VGG son, básicamente, pastores alemanes. Son modelos complejos de inteligencia artificial que usan una imagen y extraen características de ella, del mismo modo que un pastor alemán extrae señales de un aroma. Del mismo modo que el número de dormitorios y los metros cuadrados de una casa son características que se pueden usar para predecir un precio, las características extraídas se envían a un clasificador. Este clasificador es lo que necesita entrenar. Después hará la predicción de si un leopardo de las nieves está en la imagen o no. El clasificador puede ser una regresión logística sencilla, una máquina de vectores de soporte o cualquier otro clasificador. La belleza del aprendizaje de transferencia es la extracción de características con la DNN, que da como resultado características útiles que se pueden utilizar para clasificar las imágenes de manera muy precisa.

La figura 1 proporciona el código para tomar una imagen y predecir qué contiene mediante el modelo de IA.

Figura 1 Código de predicción

from urllib.request import urlopen

import tensorflow as tf

from PIL import Image
import numpy as np
# import scipy
# from scipy import misc
import sys
import os  

filename = 'model.pb'
labels_filename = 'labels.txt'

network_input_size = 227
mean_values_b_g_r = (0,0,0)

size = (256, 256)
output_layer = 'loss:0'
input_node = 'Placeholder:0'

graph_def = tf.GraphDef()
labels = []

def initialize():
  print('Loading model...',end=''),
  with tf.gfile.FastGFile(filename, 'rb') as f:
    graph_def.ParseFromString(f.read())
    tf.import_graph_def(graph_def, name='')
  print('Success!')
  print('Loading labels...', end='')
  with open(labels_filename, 'rt') as lf:
    for l in lf:
      l = l[:-1]
      labels.append(l)
  print(len(labels), 'found. Success!')
  
def crop_center(img,cropx,cropy):
  y,x,z = img.shape
  startx = x//2-(cropx//2)
  starty = y//2-(cropy//2)
  print('crop_center: ', x, 'x', y, 'to', cropx, 'x', cropy)
  return img[starty:starty+cropy,startx:startx+cropx]

def predict_url(imageUrl):
  print('Predicting from url: ',imageUrl)
  with urlopen(imageUrl) as testImage:
    # image = scipy.misc.imread(testImage)
    image = Image.open(testImage)
    return predict_image(image)

def predict_image(image):
  print('Predicting image')
  tf.reset_default_graph()
  tf.import_graph_def(graph_def, name='')
  
  with tf.Session() as sess:
    prob_tensor = sess.graph.get_tensor_by_name(output_layer)

    # w = image.shape[0]
    # h = image.shape[1]
    w, h = image.size
    print('Image size',w,'x',h)

    # scaling
    if w > h:
      new_size = (int((float(size[1]) / h) * w), size[1], 3)
    else:
      new_size = (size[0], int((float(size[0]) / w) * h), 3)

    # resize
    if  not (new_size[0] == w and new_size[0] == h):
      print('Resizing to', new_size[0],'x',new_size[1])
      #augmented_image = scipy.misc.imresize(image, new_size)
      augmented_image = np.asarray(image.resize((new_size[0], new_size[1])))
    else:
      augmented_image = np.asarray(image)

    # crop center
    try:
      augmented_image = crop_center(augmented_image, network_input_size, 
        network_input_size)
    except:
      return 'error: crop_center'

    augmented_image = augmented_image.astype(float)

    # RGB -> BGR
    red, green, blue = tf.split(axis=2, num_or_size_splits=3, value=augmented_image)

    image_normalized = tf.concat(axis=2, values=[
      blue - mean_values_b_g_r[0],
      green - mean_values_b_g_r[1],
      red - mean_values_b_g_r[2],
    ])

    image_normalized = image_normalized.eval()
    image_normalized = np.expand_dims(image_normalized, axis=0)

    predictions, = sess.run(prob_tensor, {input_node: image_normalized})

    result = []
    idx = 0
    for p in predictions:
      truncated_probablity = np.float64(round(p,8))
      if (truncated_probablity > 1e-8):
        result.append({'Tag': labels[idx], 'Probability': truncated_probablity })
      idx += 1
    print('Results: ', str(result))
    return result

Azure Machine Learning

Puede usar Custom Vision para crear el modelo de IA, pero ¿qué pasa si quiere entrenar varios modelos o colaborar con un equipo de científicos de datos? Faltan las exigencias del desarrollo de software, especialmente en lo que respecta al control de código fuente, en el flujo de trabajo de ciencia de datos. Azure ML reúne todo esto con la preparación de datos, experimentación, administración de modelos y operacionalización.

Para este ejemplo, si hace varios experimentos con Custom Vision, puede registrar el modelo .pb y otros archivos para poder hacer su seguimiento. Este es el código:

from azureml.core.model import Model
model = Model.register(model_path = "custom-vision-model/",
                       model_name = "model.pb",
                       tags = {"area": "vision", "type": "classification", 
                         "version": "1.0"},
                       description = "Snow leopard classification model",
                       workspace = ws)

Si quiere ver todos los modelos que ha registrado, escriba este código:

models = Model.list(workspace=ws)
for m in models:
  print("Name:", m.name,"\tVersion:", m.version, "\tDescription:", 
  m.description, m.tags)

Si quiere entrenar sus propios modelos, consulte los cuadernos de ejemplo de Azure Machine Learning (github.com/Azure/MachineLearningNotebooks). Puede entrenar su modelo, registrarlo y crear imágenes de Docker con el modelo. Las imágenes de Docker se pueden implementar en la nube en una instancia de contenedor de Azure o en Azure Kubernetes Service. La API de REST se expone en el contenedor al que se llama al puntuar datos. La imagen de Docker también contiene el SDK de Azure IoT Edge, que intercambia mensajes con el agente de IoT Edge que se ejecuta en el dispositivo perimetral. Esto le permite crear el contenedor e implementarlo en la nube o perímetro.

Resumen

Hay una gran cantidad de componentes al compilar una solución empresarial, empezando por Custom Vision para entrenar el modelo, Azure ML para administrar el modelo (y para entrenar otros tipos de modelos) y Azure IoT Edge para implementar los modelos. Para configurar estos servicios, se necesita más tiempo de actividad, pero se beneficiará de las ventajas de entrenar fácilmente nuevos modelos y actualizarlos en varios dispositivos perimetrales.


Ted Wa es administrador de programas sénior en el equipo de Azure ML y trabaja para acelerar la IA en la nube y el perímetro en hardware especializado. El tema central de su doctorado de la Universidad de Michigan fue un "corrector ortográfico para radiólogos", un sistema de diagnóstico asistido por ordenador para calcular la malignidad de los exámenes de TAC torácicos.

Emmanuel Bertrand es director de programas sénior en el equipo de Azure IoT Edge, donde ayuda a facilitar la implementación de módulos de IoT mediante Azure Marketplace. Bertrand se unió a Microsoft como experto en la experiencia del cliente y el usuario y, antes de eso, había digitalizado los procesos de varias empresas industriales mediante herramientas tradicionales.

Gracias a los siguientes expertos técnicos por revisar este artículo: Rakesh Kelkar, Chipalo Street


Comente este artículo en el foro de MSDN Magazine