Detección de objetos usando Custom Vision SDK y Python

por Anthony
0 Comentario

La visión artificial es una disciplina científica que tiene como objetivo encontrar métodos para adquirir, procesar, analizar y comprender las imágenes del mundo real para producir información numérica o simbólica para que puedan ser entendidos y tratados por un ordenador.

En este post aprenderemos a usar el SDK de Azure Custom Vision junto a Python para la detección de objetos.
Para este ejemplo, he entrenado un modelo de tipo «Object Detection» en Custom Vision. Mi modelo tiene como objetivo detectar si alguien dentro de una imagen tiene colocada una mascarilla o no, para lo cual he creado dos etiquetas: Mascarilla y Sin Mascarilla.

Al ser un modelo solo de fines prácticos solo tiene 3 iteraciones y se compone de 24 imágenes para la etiqueta «Macarilla» y 22 para la etiqueta «Sin Mascarilla».

Para el ejemplo tenemos que crear un nuevo script de python, lo llamaremos customvision.py y luego instalaremos la librería de custom vision en Python, para esto en la consola de comando escribimos:

pip install azure-cognitiveservices-vision-customvision

Una vez instalada la librería la importaremos en nuestro script junto a otras librerías que usaremos, en caso de que no tengas alguna de ellas, tendrás que instalarlas.

from azure.cognitiveservices.vision.customvision.prediction import CustomVisionPredictionClient
from msrest.authentication import ApiKeyCredentials
import cv2
from PIL import Image, ImageDraw, ImageFont
import urllib

Para conectarnos con nuestro servicio de Custom Vision usaremos el siguiente código:

credentials = ApiKeyCredentials(in_headers={"Prediction-key": "<PREDICTION-KEY"})
predictor = CustomVisionPredictionClient("<ENDPOINT>", credentials)

En <PREDICTION-KEY> colocamos el prediction-key que nos proporciona el portal de Custom Vision al publicar una de las iteraciones y el <ENDPOINT> lo encontrarás en los ajustes de tu portal

Ahora, colocamos el siguiente código para colocar la url de la imagen que queramos analizar, descargarla y enviarla a nuestro servicio.

url = "<URL DE LA IMAGEN>" 
#Colocamos el link a la imagen que queremos analizar
urllib.request.urlretrieve(url, "python.png")
 #La guardamos como python.png
imagen=cv2.imread("python.png")
 #Guardamos la imagen dentro de una variable
height, width, channels = imagen.shape
 #Obtenemos sus dimensiones
Resultado = predictor.detect_image_url("<PROJECT-ID>", "<ITERATION-NAME>", url) #Enviamos y obtenemos el resultado de la predicción

En <PROJECT-ID> colocarás el project id que está dentro de los ajustes de tu portal de custom vision y en <ITERATION-NAME> el nombre de la iteración (Ej: Iteration3).
Luego, crearemos algunas variables que nos servirán más adelante para darle formato al texto con el mostraremos los resultados en una imagen.

font                   = cv2.FONT_HERSHEY_SIMPLEX
 #Tipo de letra
fontScale              = 0.7
 
fontColor              = (0,0,255)
lineType               = 2

Como siguiente paso, usaremos un ciclo for para recorrer los resultados de la predicción y con un if comprobaremos su probabilidad para luego imprimir los resultados en una imagen.

for prediction in Resultado.predictions:
    if prediction.probability > 0.4:
 #Escogemos los resultados que tengan una predicción del más del 40%, pero la puedes cambiar a conveniencia.
        bbox = prediction.bounding_box
 #Obtenemos los datos de las posiciones donde se encontraron los resultados.
        tag = prediction.tag_name
 #Obtenemos el nombre de la etiqueta.
        #Multiplicamos la probabilidad por 100 y la cambiamos a tipo entero para obtener un porcentaje múltiplo de 10.
        probabilidad= int(prediction.probability * 100)
 
#Dibujamos un rectángulo para mostrar los resultados multiplicando las dimensiones de la predicción por las dimensiones de la imagen original y le asignamos el color verde.
        result_image = cv2.rectangle(imagen, (int(bbox.left * width), int(bbox.top * height)), (int((bbox.left + bbox.width) * width), int((bbox.top + bbox.height) * height)), (0, 255, 0), 3)
#En una variable obtenemos la posición donde estará el texto de la etiqueta.
        bottomLeftCornerOfText = (int(bbox.left*width),int(((bbox.top*height)+(bbox.height*height))))
#Colocamos el texto en la imagen final
        cv2.putText(result_image,str(probabilidad)+"% "+tag,
        bottomLeftCornerOfText, 
        font, 
        fontScale,
        fontColor,
        lineType)
#Guardamos la imagen como result.png
        cv2.imwrite('result.png', result_image)

Finalmente, mostramos la imagen del resultado de la predicción.

cv2.imshow('Resultado',result_image)
 #Imprimimos la imagen
cv2.waitKey(0) #Se cerrará cuando presionemos una tecla.

Comprobamos que no es del todo complicado usar el SDK de Custom Vision e implementarlo en nuestro código de Python, existe documentación de como hacerlo con otros lenguajes y tipos de modelos en: Docs Microsoft

Espero que te haya sido útil y si tienes algún problema o duda, sientete libre de escribirme en redes sociales:
Facebook: https://www.facebook.com/SoyAnthonyQ/
Twitter: https://twitter.com/soyanthonyq
Correo: [email protected]

Repositorio: https://github.com/AnthonyQuiranza/CustomVisionSDK

You may also like

Deja un comentario