Construye y entrena modelos de visión por computadora para detectar posiciones de autos en imágenes utilizando Amazon SageMaker y Amazon Rekognition

Construye y entrena modelos de visión por computadora para detectar autos en imágenes usando Amazon SageMaker y Amazon Rekognition.

La visión por computadora (CV) es una de las aplicaciones más comunes del aprendizaje automático (ML) y el aprendizaje profundo. Los casos de uso van desde los autos autónomos, moderación de contenido en plataformas de redes sociales, detección de cáncer y detección automática de defectos. Amazon Rekognition es un servicio totalmente administrado que puede realizar tareas de CV como detección de objetos, detección de segmentos de video, moderación de contenido y más para extraer información de los datos sin necesidad de experiencia previa en ML. En algunos casos, puede ser necesario una solución personalizada junto con el servicio para resolver un problema muy específico.

En esta publicación, abordamos áreas donde se puede aplicar CV a casos de uso donde la pose de los objetos, su posición y orientación son importantes. Un caso de uso de este tipo sería aplicaciones móviles orientadas al cliente donde se requiere cargar una imagen. Puede ser por razones de cumplimiento o para proporcionar una experiencia de usuario consistente y mejorar la participación. Por ejemplo, en plataformas de compras en línea, el ángulo en el que se muestran los productos en las imágenes afecta la tasa de compra de este producto. Un caso de este tipo es detectar la posición de un automóvil. Demostramos cómo puede combinar soluciones de ML conocidas con postprocesamiento para abordar este problema en la nube de AWS.

Utilizamos modelos de aprendizaje profundo para resolver este problema. Entrenar algoritmos de ML para la estimación de poses requiere mucha experiencia y datos de entrenamiento personalizados. Ambos requisitos son difíciles y costosos de obtener. Por lo tanto, presentamos dos opciones: una que no requiere ninguna experiencia en ML y utiliza Amazon Rekognition, y otra que utiliza Amazon SageMaker para entrenar e implementar un modelo de ML personalizado. En la primera opción, utilizamos Amazon Rekognition para detectar las ruedas del automóvil. Luego inferimos la orientación del automóvil a partir de las posiciones de las ruedas utilizando un sistema basado en reglas. En la segunda opción, detectamos las ruedas y otras partes del automóvil utilizando el modelo Detectron. Estos se utilizan nuevamente para inferir la posición del automóvil con código basado en reglas. La segunda opción requiere experiencia en ML pero también es más personalizable. Se puede utilizar para un posterior procesamiento en la imagen, por ejemplo, para recortar todo el automóvil. Ambas opciones se pueden entrenar en conjuntos de datos de acceso público. Finalmente, mostramos cómo puede integrar esta solución de detección de poses de automóviles en su aplicación web existente utilizando servicios como Amazon API Gateway y AWS Amplify.

Descripción general de la solución

El siguiente diagrama ilustra la arquitectura de la solución.

La solución consta de una aplicación web simulada en Amplify donde un usuario puede cargar una imagen e invocar el modelo de Amazon Rekognition o el modelo personalizado de Detectron para detectar la posición del automóvil. Para cada opción, alojamos una función de AWS Lambda detrás de una API Gateway que se expone a nuestra aplicación simulada. Configuramos nuestra función Lambda para que se ejecute con el modelo Detectron entrenado en SageMaker o Amazon Rekognition.

Requisitos previos

Para este tutorial, debe tener los siguientes requisitos previos:

  • Una cuenta de AWS.
  • Un usuario de AWS Identity and Access Management (IAM) con los permisos para implementar y aprovisionar la infraestructura, por ejemplo, PowerUserAccess (tenga en cuenta que los permisos deberían ser restringidos aún más para una aplicación lista para producción y dependen de posibles integraciones con otros servicios).
  • Docker en su entorno de desarrollo (máquina local o una instancia de cuaderno SageMaker desde donde está implementando la solución).
  • El AWS Cloud Development Kit (AWS CDK) instalado. Puede instalarlo utilizando npm como se explica en nuestro repositorio de GitHub.

Crear una aplicación serverless usando Amazon Rekognition

Nuestra primera opción demuestra cómo puede detectar las orientaciones de los automóviles en las imágenes utilizando Amazon Rekognition. La idea es utilizar Amazon Rekognition para detectar la ubicación del automóvil y sus ruedas y luego realizar un postprocesamiento para derivar la orientación del automóvil a partir de esta información. Toda la solución se implementa utilizando Lambda como se muestra en el repositorio de GitHub. Esta carpeta contiene dos archivos principales: un archivo Dockerfile que define la imagen de Docker que se ejecutará en nuestra función Lambda, y el archivo app.py, que será el punto de entrada principal de la función Lambda:

def lambda_handler(event, context):
    body_bytes = json.loads(event["body"])["image"].split(",")[-1]
    body_bytes = base64.b64decode(body_bytes)

    rek = boto3.client('rekognition')
    response = rek.detect_labels(Image={'Bytes': body_bytes}, MinConfidence=80)
    
    angle, img = label_image(img_string=body_bytes, response=response)

    buffered = BytesIO()
    img.save(buffered, format="JPEG")
    img_str = "data:image/jpeg;base64," + base64.b64encode(buffered.getvalue()).decode('utf-8')

La función Lambda espera un evento que contenga una cabecera y un cuerpo, donde el cuerpo debería ser la imagen que se necesita etiquetar como objeto decodificado en base64. Dada la imagen, se invoca la función detect_labels de Amazon Rekognition desde la función Lambda utilizando Boto3. La función devuelve una o más etiquetas para cada objeto en la imagen y detalles del cuadro delimitador para todas las etiquetas de objetos detectados como parte de la respuesta, junto con otra información como la confianza de la etiqueta asignada, las etiquetas ancestrales de la etiqueta detectada, posibles alias para la etiqueta y las categorías a las que pertenece la etiqueta detectada. Con base en las etiquetas devueltas por Amazon Rekognition, ejecutamos la función label_image, que calcula el ángulo del automóvil a partir de las ruedas detectadas de la siguiente manera:

n_wheels = len(wheel_instances)

wheel_centers = [np.array(_extract_bb_coords(wheel, img)).mean(axis=0)
for wheel in wheel_instances]

wheel_center_comb = list(combinations(wheel_centers, 2))
vecs = [(k, pair[0] - pair[1]) for k,pair in enumerate(wheel_center_comb)]
vecs = sorted(vecs, key = lambda vec: np.linalg.norm(vec[1]))

vec_rel = vecs[1] if n_wheels == 3 else vecs[0]
angle = math.degrees(math.atan(vec_rel[1][1]/vec_rel[1][0]))

wheel_centers_rel = [tuple(wheel.tolist()) for wheel in
wheel_center_comb[vec_rel[0]]]

Tenga en cuenta que la aplicación requiere que solo haya un automóvil presente en la imagen y devuelve un error si no es así. Sin embargo, el posprocesamiento se puede adaptar para proporcionar descripciones de orientación más detalladas, cubrir varios automóviles o calcular la orientación de objetos más complejos.

Mejorar la detección de ruedas

Para mejorar aún más la precisión de la detección de ruedas, puede utilizar Amazon Rekognition Custom Labels. Similar a la afinación fina utilizando SageMaker para entrenar e implementar un modelo de ML personalizado, puede proporcionar sus propios datos etiquetados para que Amazon Rekognition pueda producir un modelo de análisis de imágenes personalizado en solo unas pocas horas. Con Rekognition Custom Labels, solo necesita un pequeño conjunto de imágenes de entrenamiento específicas para su caso de uso, en este caso imágenes de automóviles con ángulos específicos, porque utiliza las capacidades existentes en Amazon Rekognition de entrenarse con decenas de millones de imágenes en muchas categorías. Rekognition Custom Labels se puede integrar con solo unos pocos clics y pequeñas adaptaciones a la función Lambda que usamos para la solución estándar de Amazon Rekognition.

Entrenar un modelo utilizando un trabajo de entrenamiento de SageMaker

En nuestra segunda opción, entrenamos un modelo de aprendizaje profundo personalizado en SageMaker. Utilizamos el framework Detectron2 para la segmentación de las partes del automóvil. Estos segmentos se utilizan luego para inferir la posición del automóvil.

El framework Detectron2 es una biblioteca que proporciona algoritmos de detección y segmentación de última generación. Detectron proporciona una variedad de modelos Mask R-CNN que fueron entrenados en el famoso conjunto de datos COCO (Objetos comunes en contexto). Para construir nuestro modelo de detección de objetos de automóviles, utilizamos transfer learning para ajustar finamente un modelo Mask R-CNN pre-entrenado en el conjunto de datos de segmentación de partes del automóvil. Este conjunto de datos nos permite entrenar un modelo que puede detectar ruedas pero también otras partes del automóvil. Esta información adicional se puede utilizar posteriormente en los cálculos del ángulo del automóvil en relación con la imagen.

El conjunto de datos contiene datos anotados de partes de automóviles que se utilizarán para tareas de detección de objetos y segmentación semántica: aproximadamente 500 imágenes de sedanes, camionetas y vehículos utilitarios deportivos (SUV), tomadas en múltiples vistas (frontal, trasera y lateral). Cada imagen está anotada con 18 máscaras de instancia y cuadros delimitadores que representan las diferentes partes de un automóvil, como ruedas, espejos, luces y vidrio frontal y trasero. Modificamos las anotaciones base de las ruedas de modo que cada rueda se considere un objeto individual en lugar de considerar todas las ruedas disponibles en la imagen como un solo objeto.

Utilizamos Amazon Simple Storage Service (Amazon S3) para almacenar el conjunto de datos utilizado para entrenar el modelo Detectron junto con los artefactos del modelo entrenado. Además, el contenedor Docker que se ejecuta en la función Lambda se almacena en Amazon Elastic Container Registry (Amazon ECR). El contenedor Docker en la función Lambda es necesario para incluir las bibliotecas y dependencias requeridas para ejecutar el código. Alternativamente, podríamos usar capas Lambda, pero está limitado a un tamaño de implementación descomprimido de 250 MB y se pueden agregar un máximo de cinco capas a una función Lambda.

Nuestra solución se basa en SageMaker: ampliamos los contenedores Docker preconstruidos de SageMaker para PyTorch para ejecutar nuestro código de entrenamiento personalizado en PyTorch. A continuación, utilizamos el SDK de Python de SageMaker para envolver la imagen de entrenamiento en un estimador de SageMaker PyTorch, como se muestra en los siguientes fragmentos de código:

d2_estimator = Estimador(
        image_uri=training_image_uri,
        role=role,
        sagemaker_session=sm_session,
        instance_count=1,
        instance_type=training_instance,
        output_path=f"s3://{session_bucket}/{prefix_model}",
        base_job_name=f"detectron2")

d2_estimator.fit({
            "training": training_channel,
            "validation": validation_channel,
        },
        wait=True)

Finalmente, comenzamos el trabajo de entrenamiento llamando a la función fit() en el estimador de PyTorch creado. Cuando el entrenamiento haya terminado, el artefacto del modelo entrenado se almacenará en el bucket de la sesión en Amazon S3 para ser utilizado en el pipeline de inferencia.

Implementar el modelo utilizando SageMaker y pipelines de inferencia

También utilizamos SageMaker para alojar el punto de entrada de inferencia que ejecuta nuestro modelo personalizado de Detectron. La infraestructura completa utilizada para implementar nuestra solución se proporciona utilizando AWS CDK. Podemos alojar nuestro modelo personalizado a través de un punto de entrada en tiempo real de SageMaker llamando a deploy en el estimador de PyTorch. Esta es la segunda vez que ampliamos un contenedor preconstruido de SageMaker PyTorch para incluir PyTorch Detectron. Lo usamos para ejecutar el script de inferencia y alojar nuestro modelo entrenado de PyTorch de la siguiente manera:

modelo = PyTorchModel(
        name="d2-sku110k-model",
        model_data=d2_estimator.model_data,
        role=role,
        sagemaker_session=sm_session,
        entry_point="predict.py",
        source_dir="src",
        image_uri=serve_image_uri,
        framework_version="1.6.0")

    predictor = modelo.deploy(
        initial_instance_count=1,
        instance_type="ml.g4dn.xlarge",
        endpoint_name="detectron-endpoint",
        serializer=sagemaker.serializers.JSONSerializer(),
        deserializer=sagemaker.deserializers.JSONDeserializer(),
        wait=True)

Tenga en cuenta que utilizamos una GPU ml.g4dn.xlarge para la implementación porque es la GPU más pequeña disponible y es suficiente para esta demostración. Se deben configurar dos componentes en nuestro script de inferencia: la carga del modelo y el servicio del modelo. La función model_fn() se utiliza para cargar el modelo entrenado que forma parte del contenedor Docker alojado y también se puede encontrar en Amazon S3 y devuelve un objeto de modelo que se puede utilizar para el servicio del modelo de la siguiente manera:

def model_fn(model_dir: str) -> DefaultPredictor:
  
    for p_file in Path(model_dir).iterdir():
        if p_file.suffix == ".pth":
            path_model = p_file
        
    cfg = get_cfg()
    cfg.MODEL.WEIGHTS = str(path_model)

    return DefaultPredictor(cfg)

La función predict_fn() realiza la predicción y devuelve el resultado. Además de utilizar nuestro modelo entrenado, utilizamos una versión preentrenada del modelo Mask R-CNN entrenado en el conjunto de datos COCO para extraer el automóvil principal en la imagen. Este es un paso adicional de postprocesamiento para lidiar con imágenes donde existe más de un automóvil. Vea el siguiente código:

def predict_fn(input_img: np.ndarray, predictor: DefaultPredictor) -> Mapping:
    
    pretrained_predictor = _get_pretraind_model()
    car_mask = get_main_car_mask(pretrained_predictor, input_img)
    outputs = predictor(input_img)
    fmt_out = {
        "image_height": input_object.shape[0],
        "image_width": input_object.shape[1],
        "pred_boxes": outputs["instances"].pred_boxes.tensor.tolist(),
        "scores": outputs["instances"].scores.tolist(),
        "pred_classes": outputs["instances"].pred_classes.tolist(),
        "car_mask": car_mask.tolist()
    }
    return fmt_out

Similar a la solución de Amazon Rekognition, las cajas delimitadoras predichas para la clase wheel se filtran de las salidas de detección y se suministran al módulo de postprocesamiento para evaluar la posición del automóvil en relación con la salida.

Finalmente, también mejoramos el postprocesamiento para la solución de Detectron. También utiliza los segmentos de diferentes partes del automóvil para inferir la solución. Por ejemplo, cada vez que se detecta un parachoques delantero, pero no un parachoques trasero, se asume que tenemos una vista frontal del automóvil y se calcula el ángulo correspondiente.

Conecta tu solución a la aplicación web

Los pasos para conectar los puntos de entrada del modelo a Amplify son los siguientes:

  • Copie el repositorio de la aplicación que creó la pila de AWS CDK, llamado car-angle-detection-website-repo. Asegúrese de buscarlo en la región que utilizó para la implementación.
  • Copie los puntos de entrada de API Gateway para cada una de las funciones Lambda implementadas en el archivo index.html en el repositorio anterior (hay espacios reservados donde debe colocarse el punto de entrada). El siguiente código es un ejemplo de cómo se ve esta sección del archivo .html:
<td align="center" colspan="2">
<select id="endpoint">
<option value="https://ey82aaj8ch.execute-api.eu-central-1.amazonaws.com/prod/">
                Amazon Rekognition</option>
<option value="https://nhq6q88xjg.execute-api.eu-central-1.amazonaws.com/prod/">
                Amazon SageMaker Detectron</option>
</select>
<input class="btn" type="file" id="ImageBrowse" />
<input class="btn btn-primary" type="submit" value="Cargar">
</td>
  • Guarda el archivo HTML y empuja los cambios de código a la rama principal remota.

Esto actualizará el archivo HTML en la implementación. La aplicación ya está lista para usar.

  • Navega hacia la consola de Amplify y localiza el proyecto que creaste.

La URL de la aplicación será visible una vez que se complete la implementación.

  • Navega hacia la URL y diviértete con la interfaz de usuario.

Conclusión

¡Felicidades! Hemos implementado una arquitectura sin servidor completa en la que utilizamos Amazon Rekognition, pero también brindamos la opción de usar su propio modelo personalizado, con este ejemplo disponible en GitHub. Si no tienes experiencia en ML en tu equipo o suficientes datos personalizados para entrenar un modelo, puedes seleccionar la opción que utiliza Amazon Rekognition. Si deseas tener más control sobre tu modelo, personalizarlo aún más y tienes suficientes datos, puedes elegir la solución de SageMaker. Si tienes un equipo de científicos de datos, es posible que también deseen mejorar aún más los modelos y elegir una opción más personalizada y flexible. Puedes colocar la función Lambda y la API Gateway detrás de tu aplicación web utilizando cualquiera de las dos opciones. También puedes utilizar este enfoque para un caso de uso diferente para el cual desees adaptar el código.

La ventaja de esta arquitectura sin servidor es que los bloques de construcción son completamente intercambiables. Las oportunidades son casi ilimitadas. ¡Así que comienza hoy mismo!

Como siempre, AWS agradece tus comentarios. Por favor, envía cualquier comentario o pregunta.

We will continue to update Zepes; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

Inteligencia Artificial

¡Abrocha tu cinturón ¡El Falcon 180B está aquí!

Vamos a sumergirnos en el modelo de lenguaje abierto más grande del mundo.

Inteligencia Artificial

Google AI presenta WeatherBench 2 un marco de aprendizaje automático para evaluar y comparar diversos modelos de pronóstico del tiempo

El aprendizaje automático (ML) se ha utilizado cada vez más en la predicción del tiempo en los últimos años. Ahora qu...

Inteligencia Artificial

Científicos desarrollan una forma más eficiente de transmitir datos entre dispositivos

Los investigadores demostraron un método de menor potencia para transmitir datos a corta distancia mientras se mantie...

Inteligencia Artificial

Descifrando el código del contexto Técnicas de vectorización de palabras en PNL

Te mudaste a una nueva ciudad lejos de tu país, donde casualmente te encontraste con alguien en una cafetería. Una jo...

Inteligencia Artificial

Vínculo de datos de dispositivos portátiles vincula la reducción del sueño y la actividad durante el embarazo con el riesgo de parto prematuro

Los científicos han asociado la falta de sueño y la reducción de la actividad física durante el embarazo con el riesg...