Implementar una solución de seguimiento de múltiples objetos en un conjunto de datos personalizado con Amazon SageMaker.

Implement a multi-object tracking solution on a custom dataset using Amazon SageMaker.

La demanda de seguimiento de múltiples objetos (MOT, por sus siglas en inglés) en el análisis de video ha aumentado significativamente en muchas industrias, como los deportes en vivo, la fabricación y el monitoreo de tráfico. Por ejemplo, en los deportes en vivo, MOT puede rastrear jugadores de fútbol en tiempo real para analizar el rendimiento físico, como la velocidad en tiempo real y la distancia recorrida.

Desde su introducción en 2021, ByteTrack sigue siendo uno de los métodos con mejor rendimiento en diversos conjuntos de datos de referencia, entre los últimos desarrollos de modelos en la aplicación MOT. En ByteTrack, el autor propuso un método de asociación de datos simple, efectivo y genérico (denominado BYTE) para la coincidencia de cuadros de detección y seguimiento. En lugar de mantener solo los cuadros de detección con puntajes altos, también mantiene los cuadros de detección con puntajes bajos, lo que puede ayudar a recuperar los seguimientos no coincidentes con estos cuadros de detección de baja puntuación cuando se produce ocultamiento, desenfoque de movimiento o cambio de tamaño. La estrategia de asociación BYTE también se puede usar en otros rastreadores basados en Re-ID, como FairMOT. Los experimentos mostraron mejoras en comparación con los algoritmos de seguimiento vanilla. Por ejemplo, FairMOT logró una mejora del 1,3% en MOTA (FairMOT: Sobre la equidad de la detección y la reidentificación en el seguimiento de múltiples objetos), que es una de las principales métricas en la tarea MOT cuando se aplica BYTE en la asociación de datos.

En la publicación Entrenar y implementar un modelo FairMOT con Amazon SageMaker, demostramos cómo entrenar y implementar un modelo FairMOT con Amazon SageMaker en los conjuntos de datos del desafío MOT. Al aplicar una solución MOT en casos del mundo real, es necesario entrenar o ajustar finamente un modelo MOT en un conjunto de datos personalizado. Con Amazon SageMaker Ground Truth, puede crear etiquetas de manera efectiva en su propio conjunto de datos de video.

Continuando con la publicación anterior, hemos agregado las siguientes contribuciones y modificaciones:

  • Generar etiquetas para un conjunto de datos de video personalizado utilizando Ground Truth
  • Preprocesar la etiqueta generada por Ground Truth para ser compatible con ByteTrack y otras soluciones MOT
  • Entrenar el algoritmo ByteTrack con un trabajo de entrenamiento de SageMaker (con la opción de extender un contenedor preconstruido)
  • Implementar el modelo entrenado con varias opciones de implementación, incluida la inferencia asincrónica

También proporcionamos el ejemplo de código en GitHub, que utiliza SageMaker para etiquetar, construir, entrenar e inferir.

SageMaker es un servicio completamente administrado que proporciona a cada desarrollador y científico de datos la capacidad de preparar, construir, entrenar e implementar modelos de aprendizaje automático (ML) rápidamente. SageMaker proporciona varios algoritmos y contenedores de imagen incorporados que puede utilizar para acelerar el entrenamiento e implementación de modelos de ML. Además, los algoritmos personalizados, como ByteTrack, también pueden ser compatibles a través de imágenes de contenedor Docker personalizadas. Para obtener más información sobre cómo decidir el nivel correcto de participación con contenedores, consulte el uso de contenedores Docker con SageMaker.

SageMaker proporciona muchas opciones para la implementación de modelos, como la inferencia en tiempo real, la inferencia sin servidor y la inferencia asincrónica. En esta publicación, mostramos cómo implementar un modelo de seguimiento con diferentes opciones de implementación, para que pueda elegir el método de implementación adecuado en su propio caso de uso.

Resumen de la solución

Nuestra solución consta de los siguientes pasos de alto nivel:

  1. Etiquetar el conjunto de datos para el seguimiento, con un cuadro delimitador en cada objeto (por ejemplo, peatón, automóvil, etc.). Configurar los recursos para el desarrollo y la ejecución del código de ML.
  2. Entrenar un modelo ByteTrack y ajustar los hiperparámetros en un conjunto de datos personalizado.
  3. Implementar el modelo ByteTrack entrenado con diferentes opciones de implementación según su caso de uso: procesamiento en tiempo real, asincrónico o predicción por lotes.

El siguiente diagrama ilustra la arquitectura en cada paso.

Requisitos previos

Antes de comenzar, complete los siguientes requisitos previos:

  1. Cree una cuenta de AWS o use una cuenta de AWS existente.
  2. Recomendamos ejecutar el código fuente en la región us-east-1.
  3. Asegúrese de tener un mínimo de una instancia GPU (por ejemplo, ml.p3.2xlarge para entrenamiento de GPU único, o ml.p3.16xlarge) para el trabajo de entrenamiento distribuido. También se admiten otros tipos de instancias GPU, con diversas diferencias de rendimiento.
  4. Asegúrese de tener un mínimo de una instancia GPU (por ejemplo, ml.p3.2xlarge) para el punto de enrutamiento de inferencia.
  5. Asegúrese de tener un mínimo de una instancia GPU (por ejemplo, ml.p3.2xlarge) para ejecutar la predicción por lotes con trabajos de procesamiento.

Si es la primera vez que ejecuta los servicios de SageMaker en los tipos de instancia mencionados, es posible que tenga que solicitar un aumento de cuota para las instancias requeridas.

Configurar los recursos

Después de completar todos los requisitos previos, estará listo para implementar la solución.

  1. Cree una instancia de bloc de notas de SageMaker. Para esta tarea, recomendamos utilizar el tipo de instancia ml.t3.medium. Mientras se ejecuta el código, utilizamos docker build para extender la imagen de entrenamiento de SageMaker con el código ByteTrack (el comando docker build se ejecutará localmente dentro del entorno de la instancia de bloc de notas). Por lo tanto, recomendamos aumentar el tamaño del volumen a 100 GB (el tamaño del volumen predeterminado es de 5 GB) desde las opciones de configuración avanzada. Para su rol de Identidad y Acceso de AWS (IAM), elija un rol existente o cree un nuevo rol y adjunte las políticas AmazonS3FullAccess, AmazonSNSFullAccess, AmazonSageMakerFullAccess y AmazonElasticContainerRegistryPublicFullAccess al rol.
  2. Clone el repositorio de GitHub en la carpeta /home/ec2-user/SageMaker en la instancia de bloc de notas que haya creado.
  3. Cree un nuevo bucket de Amazon Simple Storage Service (Amazon S3) o utilice un bucket existente.

Etiquetar el conjunto de datos

En el bloc de notas data-preparation.ipynb, descargamos un archivo de video de prueba MOT16 y dividimos el archivo de video en pequeños archivos de video con 200 fotogramas. Luego, cargamos esos archivos de video en el bucket de S3 como fuente de datos para la etiquetación.

Para etiquetar el conjunto de datos para la tarea de MOT, consulte la sección Getting started. Cuando se complete el trabajo de etiquetado, podemos acceder al siguiente directorio de anotación en la ubicación de salida del trabajo en el bucket de S3.

El directorio manifests debe contener una carpeta output si terminamos de etiquetar todos los archivos. Podemos ver el archivo output.manifest en la carpeta output. Este archivo de manifiesto contiene información sobre el seguimiento de video y las etiquetas que se pueden utilizar más adelante para entrenar y probar un modelo.

Entrenar un modelo ByteTrack y ajustar los hiperparámetros en el conjunto de datos personalizado

Para entrenar su modelo ByteTrack, utilizamos el bloc de notas bytetrack-training.ipynb. El bloc de notas consta de los siguientes pasos:

  1. Inicialice la configuración de SageMaker.
  2. Realice el preprocesamiento de datos.
  3. Construya y publique la imagen del contenedor.
  4. Defina un trabajo de entrenamiento.
  5. Inicie el trabajo de entrenamiento.
  6. Ajuste los hiperparámetros.

Especialmente en el preprocesamiento de datos, necesitamos convertir el conjunto de datos etiquetado con el formato de salida de Ground Truth al conjunto de datos de formato MOT17, y convertir el conjunto de datos de formato MOT17 a un conjunto de datos de formato MSCOCO (como se muestra en la siguiente figura) para que podamos entrenar un modelo YOLOX en el conjunto de datos personalizado. Debido a que mantenemos tanto el conjunto de datos de formato MOT como el conjunto de datos de formato MSCOCO, puede entrenar otros algoritmos de MOT sin separar la detección y el seguimiento en el conjunto de datos de formato MOT. Puede cambiar fácilmente el detector a otros algoritmos como YOLO7 para utilizar su algoritmo de detección de objetos existente.

Implementar el modelo ByteTrack entrenado

Después de entrenar el modelo YOLOX, implementamos el modelo entrenado para la inferencia. SageMaker proporciona varias opciones para la implementación del modelo, como la inferencia en tiempo real, la inferencia asincrónica, la inferencia sin servidor y la inferencia por lotes. En nuestras publicaciones, utilizamos el código de ejemplo para la inferencia en tiempo real, la inferencia asincrónica y la inferencia por lotes. Puede elegir el código adecuado de estas opciones según sus propios requisitos empresariales.

Debido a que SageMaker batch transform requiere que los datos estén particionados y almacenados en Amazon S3 como entrada y las invocaciones se envían a los puntos finales de inferencia de manera concurrente, no cumple con los requisitos en tareas de seguimiento de objetos donde los objetivos deben enviarse de manera secuencial. Por lo tanto, no utilizamos los trabajos de transformación por lotes de SageMaker para ejecutar la inferencia por lotes. En este ejemplo, usamos los trabajos de procesamiento de SageMaker para realizar la inferencia por lotes.

La siguiente tabla resume la configuración para nuestros trabajos de inferencia:

Tipo de inferencia Carga útil Tiempo de procesamiento Auto escalado
En tiempo real Hasta 6 MB Hasta 1 minuto El recuento mínimo de instancias es 1 o superior
Asíncrono Hasta 1 GB Hasta 15 minutos El recuento mínimo de instancias puede ser cero
Por lotes (con trabajo de procesamiento) Sin límite Sin límite No soportado

Implementar un punto de enrutamiento de inferencia en tiempo real

Para implementar un punto de enrutamiento de inferencia en tiempo real, podemos ejecutar el cuaderno bytetrack-inference-yolox.ipynb. Separamos la inferencia de ByteTrack en detección y seguimiento de objetos. En el punto final de inferencia, solo ejecutamos el modelo YOLOX para la detección de objetos. En el cuaderno, creamos un objeto de seguimiento, recibimos el resultado de la detección de objetos del punto final de inferencia y actualizamos los seguidores.

Usamos SageMaker PyTorchModel SDK para crear e implementar un modelo ByteTrack de la siguiente manera:

from sagemaker.pytorch.model import PyTorchModel
 
pytorch_model = PyTorchModel(
    model_data=s3_model_uri,
    role=role,
    source_dir="sagemaker-serving/code",
    entry_point="inference.py",
    framework_version="1.7.1",
    py_version="py3",
)
 
endpoint_name =<endpint name>
pytorch_model.deploy(
    initial_instance_count=1,
    instance_type="ml.p3.2xlarge",
    endpoint_name=endpoint_name
)

Después de implementar el modelo en un punto final con éxito, podemos invocar el punto final de inferencia con el siguiente fragmento de código:

with open(f"datasets/frame_{frame_id}.png", "rb") as f:
    payload = f.read()

response = sm_runtime.invoke_endpoint(
    EndpointName=endpoint_name, ContentType="application/x-image", Body=payload
)
outputs = json.loads(response["Body"].read().decode())

Ejecutamos la tarea de seguimiento en el lado del cliente después de aceptar el resultado de detección del punto final (ver el siguiente código). Al dibujar los resultados de seguimiento en cada fotograma y guardarlos como un video de seguimiento, puede confirmar el resultado de seguimiento en el video de seguimiento.

aspect_ratio_thresh = 1.6
min_box_area = 10
tracker = BYTETracker(
        frame_rate=30,
        track_thresh=0.5,
        track_buffer=30,
        mot20=False,
        match_thresh=0.8
    )

online_targets = tracker.update(torch.as_tensor(outputs[0]), [height, width], (800, 1440))
online_tlwhs = []
online_ids = []
online_scores = []
for t in online_targets:
    tlwh = t.tlwh
    tid = t.track_id
    vertical = tlwh[2] / tlwh[3] > aspect_ratio_thresh
    if tlwh[2] * tlwh[3] > min_box_area and not vertical:
        online_tlwhs.append(tlwh)
        online_ids.append(tid)
        online_scores.append(t.score)
        results.append(
            f"{frame_id},{tid},{tlwh[0]:.2f},{tlwh[1]:.2f},{tlwh[2]:.2f},{tlwh[3]:.2f},{t.score:.2f},-1,-1,-1\n"
        )
online_im = plot_tracking(
    frame, online_tlwhs, online_ids, frame_id=frame_id + 1, fps=1. / timer.average_time
)

Implementar un punto de conexión de inferencia asíncrona

La inferencia asíncrona de SageMaker es la opción ideal para solicitudes con tamaños de carga útil grandes (hasta 1 GB), tiempos de procesamiento largos (hasta 1 hora) y requisitos de latencia casi en tiempo real. Para tareas MOT, es común que un archivo de video supere los 6 MB, que es el límite de carga útil de un punto de conexión en tiempo real. Por lo tanto, implementamos un punto de conexión de inferencia asíncrona. Consulte Inferencia asíncrona para obtener más detalles sobre cómo implementar un punto de conexión asíncrono. Podemos reutilizar el modelo creado para el punto de conexión en tiempo real; para esta publicación, agregamos un proceso de seguimiento al script de inferencia para que podamos obtener el resultado final de seguimiento directamente para el video de entrada.

Para usar scripts relacionados con ByteTrack en el punto de conexión, necesitamos poner el script de seguimiento y el modelo en la misma carpeta y comprimir la carpeta como el archivo model.tar.gz, y luego cargarlo en el bucket S3 para la creación del modelo. El siguiente diagrama muestra la estructura de model.tar.gz.

Necesitamos establecer explícitamente el tamaño de la solicitud, el tamaño de respuesta y el tiempo de espera de respuesta como variables de entorno, como se muestra en el siguiente código. El nombre de la variable de entorno varía según el marco de trabajo. Para obtener más detalles, consulte Crear un punto de conexión de inferencia asíncrona.

pytorch_model = PyTorchModel(
    model_data=s3_model_uri,
    role=role,
    entry_point="inference.py",
    framework_version="1.7.1",
    sagemaker_session=sm_session,
    py_version="py3",
    env={
        'TS_MAX_REQUEST_SIZE': '1000000000', #default max request size is 6 Mb for torchserve, need to update it to support the 1GB input payload
        'TS_MAX_RESPONSE_SIZE': '1000000000',
        'TS_DEFAULT_RESPONSE_TIMEOUT': '900' # max timeout is 15mins (900 seconds)
    }
)

pytorch_model.create(
    instance_type="ml.p3.2xlarge",
)

Al invocar el punto de conexión asíncrono, en lugar de enviar la carga útil en la solicitud, enviamos la URL de Amazon S3 del video de entrada. Cuando la inferencia del modelo termine de procesar el video, los resultados se guardarán en la ruta de salida de S3. Podemos configurar los temas de Amazon Simple Notification Service (Amazon SNS) para que cuando los resultados estén listos, podamos recibir un mensaje de SNS como una notificación.

Ejecutar la inferencia por lotes con SageMaker processing

Para archivos de video mayores de 1 GB, utilizamos un trabajo de procesamiento de SageMaker para realizar la inferencia por lotes. Definimos un contenedor personalizado de Docker para ejecutar un trabajo de procesamiento de SageMaker (consulte el siguiente código). Dibujamos el resultado de seguimiento en el video de entrada. Puede encontrar el video de resultado en el bucket de S3 definido por s3_output.

from sagemaker.processing import ProcessingInput, ProcessingOutput
script_processor.run(
    code='./container-batch-inference/predict.py',
    inputs=[
        ProcessingInput(source=s3_input, destination="/opt/ml/processing/input"),
        ProcessingInput(source=s3_model_uri, destination="/opt/ml/processing/model"),
    ], 
    outputs=[
        ProcessingOutput(source='/opt/ml/processing/output', destination=s3_output),
    ]
)

Limpieza

Para evitar costos innecesarios, elimine los recursos que creó como parte de esta solución, incluido el punto de conexión de inferencia.

Conclusión

Esta publicación demostró cómo implementar una solución de seguimiento de múltiples objetos en un conjunto de datos personalizado utilizando uno de los algoritmos más avanzados en SageMaker. También demostramos tres opciones de implementación en SageMaker para que pueda elegir la opción óptima para su propio escenario empresarial. Si el caso de uso requiere baja latencia y necesita implementar un modelo en un dispositivo periférico, puede implementar la solución MOT en el borde con AWS Panorama.

Para obtener más información, consulte Multi Object Tracking utilizando YOLOX + BYTE-TRACK y análisis de datos.

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

Por qué tus canalizaciones de datos necesitan un control de retroalimentación en bucle cerrado

A medida que los equipos de datos se expanden en la nube, los equipos de plataforma de datos deben asegurarse de que ...

Inteligencia Artificial

Simplificando la integración y la automatización el CTO de Boomi comparte su visión para los desarrolladores

Plataformas de integración democratizadas y gobernadas, aprovechando la inteligencia artificial y la automatización p...

Inteligencia Artificial

Reduciendo las alucinaciones de IA con la generación aumentada por recuperación

Esta técnica recién ideada muestra promesa en incrementar el conocimiento de LLMs al permitir que las indicaciones se...

Inteligencia Artificial

Ciencia de datos del entretenimiento Streaming vs. Cine

En mi próximo artículo sobre data science en el campo del entretenimiento en Toward Data Science, me refiero a cómo s...

Inteligencia Artificial

Una guía para principiantes para comprender el rendimiento de las pruebas A/B a través de simulaciones de Monte Carlo

Este tutorial explora cómo las covariables influyen en la precisión de las pruebas A/B en un experimento aleatorizado...

Inteligencia Artificial

Conoce Jupyter AI Desatando el poder de la inteligencia artificial en los cuadernos de Jupyter

En un avance innovador en inteligencia artificial y codificación, Project Jupyter presenta una adición revolucionaria...