Detección de objetos con Custom Vision usando el SDK de Python

Hace unos meses me encuentro trabajando con Deep Learning, Machine Learning y Artificial Intelligence pero muchas veces nos encontramos con muchas errores, código de no funciona….

Pero para esta ocasión quiero presentar como identificar rostros con Custom Vision de Microsoft.

Lo primero que debemos crear una cuenta de microsoft e iniciar sesión en customvision.ai y creamos nuestro primer proyecto.

Para mi proyecto Faces (Rostros), subiré 15 fotografías, y voy a etiquetar mi rostro como luiscordero29

Imágenes que se subirán
Imágenes subida al proyecto
Proceso de etiquetado

Luego de etiquetar las quince fotos con una etiqueta, procedemos con el entrenamiento, es claro que mientras mayor número de fotografías y de entrenamientos es mucho mayor la predicción

Instalando el SDK para Custom Vision

Podemos iniciar con leer la documentación que nos ofrece azure en el siguiente enlace

Primero que debemos realizar es instalar el paquete con el siguiente comando:

pip install azure-cognitiveservices-vision-customvision
from azure.cognitiveservices.vision.customvision.prediction import CustomVisionPredictionClient

ENDPOINT = "https://southcentralus.api.cognitive.microsoft.com"

# Replace with a valid key
training_key = "training_key"
prediction_key = "prediction_key"

# Now there is a trained endpoint that can be used to make a prediction

predictor = CustomVisionPredictionClient(prediction_key, endpoint=ENDPOINT)

# Open the sample image and get back the prediction results.
with open("Fotografia Analizar", mode="rb") as test_data:
    results = predictor.predict_image('project_id', test_data, 'iteration_id')

# Display the results.
for prediction in results.predictions:
    print ("\t" + prediction.tag_name + ": {0:.2f}%".format(prediction.probability * 100), prediction.bounding_box.left, prediction.bounding_box.top, prediction.bounding_box.width, prediction.bounding_box.height)

Obteniendo como resultado la siguiente salida al ejecutar nuestro archivo faces.py

python faces.py
luiscordero29: 1.19% 0.4612691 0.100096926 0.0437537134 0.06146711
luiscordero29: 1.17% 0.0029208 0.2442033 0.0203421414 0.150048465
luiscordero29: 5.23% 0.296908379 0.0 0.168052793 0.117952444
luiscordero29: 14.25% 0.386456251 0.2811187 0.250787377 0.373322546
luiscordero29: 1.60% 0.837739646 0.7586932 0.16225034 0.241296768
luiscordero29: 1.94% 0.6277162 0.4777733 0.3722738 0.5222167
luiscordero29: 3.14% 0.7016874 0.008826613 0.2897535 0.390693456
luiscordero29: 92.11% 0.148248985 0.11506848 0.28540206 0.4230575
luiscordero29: 1.10% 0.3848536 0.541901052 0.437771916 0.440925777

En el resultado podemos observar el nombre de la etiqueta identificada, el porcentaje de aproximación y el porcentaje donde se encuentra ubicado. La imagen la cual realizamos el predicción fue la siguiente:

Para que nuestro código funcione necesitaremos los siguiente datos:

  • training_key
  • prediction_key
  • project_id
  • iteration_id
  • Fotografiá a analizar

En la configuración de nuestra cuenta podremos encontrar el training_key y prediction_key

Al seleccionar el proyecto y entrar en la configuración del mismo podemos encontrar el project_id

En la sección de Performance disponemos de una opción Prediction URL donde encontraremos el dato interaction_id al final de la primera casilla

En este punto tenemos todos los datos para poder correr nuestro código con python, pero no solo podemos obtener una predicción de la imagen que nos encontramos, sino que vamos a dibujar un rectángulo en nuestra imagen de la predicción

from azure.cognitiveservices.vision.customvision.prediction import CustomVisionPredictionClient
import numpy as np
import cv2

ENDPOINT = "https://southcentralus.api.cognitive.microsoft.com"

# Replace with a valid key
training_key = "6a60d11135e44xxxxxxx"
prediction_key = "7747c107f78xxxxxxx"

# Now there is a trained endpoint that can be used to make a prediction

predictor = CustomVisionPredictionClient(prediction_key, endpoint=ENDPOINT)

image_name = 'luiscordero29_17.jpg'
image  = cv2.imread(image_name)
height, width = image.shape[:2]
# Open the sample image and get back the prediction results.
with open(image_name, mode="rb") as test_data:
    results = predictor.predict_image('8cc2c6fd-xxxxxx', test_data, '3fb80330-xxxxxxx')

# Display the results.
for prediction in results.predictions:
    print ("\t" + prediction.tag_name + ": {0:.2f}%".format(prediction.probability * 100), prediction.bounding_box.left, prediction.bounding_box.top, prediction.bounding_box.width, prediction.bounding_box.height)
    left = int(prediction.bounding_box.left * width)
    top = int(prediction.bounding_box.top * height)
    right = int(prediction.bounding_box.width * width) + left
    bottom = int(prediction.bounding_box.height * height) + top
    image = cv2.rectangle(
            image,
            (left, top),
            (right, bottom),
            (6,6,255),
            3)
cv2.imwrite('luiscordero29_17_reactangle.jpg', image)

Tenemos esta salida

Si limitamos dibujar solo las predicciones que tenga mayor al 80%

from azure.cognitiveservices.vision.customvision.prediction import CustomVisionPredictionClient
import numpy as np
import cv2

ENDPOINT = "https://southcentralus.api.cognitive.microsoft.com"

# Replace with a valid key
training_key = "6a60d11135xxxxxx"
prediction_key = "7747c107xxxxxx"

# Now there is a trained endpoint that can be used to make a prediction

predictor = CustomVisionPredictionClient(prediction_key, endpoint=ENDPOINT)

image_name = 'luiscordero29_17.jpg'
image  = cv2.imread(image_name)
height, width = image.shape[:2]
# Open the sample image and get back the prediction results.
with open(image_name, mode="rb") as test_data:
    results = predictor.predict_image('8cc2c6fd-xxxxxx', test_data, '3fb80330-xxxxxx')

# Display the results.
for prediction in results.predictions:
    print ("\t" + prediction.tag_name + ": {0:.2f}%".format(prediction.probability * 100), prediction.bounding_box.left, prediction.bounding_box.top, prediction.bounding_box.width, prediction.bounding_box.height)
    porcentaje = prediction.probability * 100
    if porcentaje >= 80:
        left = int(prediction.bounding_box.left * width)
        top = int(prediction.bounding_box.top * height)
        right = int(prediction.bounding_box.width * width) + left
        bottom = int(prediction.bounding_box.height * height) + top
        image = cv2.rectangle(
                image,
                (left, top),
                (right, bottom),
                (6,6,255),
                3)
cv2.imwrite('luiscordero29_17_reactangle.jpg', image)

Tenemos la salida de nuestra imagen

Conclusión

Con la herramienta Custom Vision podemos crear modelos de forma muy intuitiva y consultar la detección de objetos de nuestro entrenamiento por medio del SDK para ser procesadas en nuestra aplicación.

Esta herramienta nos permite dar un resultado rápido mientras aprendemos a utilizar Tensorflow ó Pythor