Etiquetado de datos de segmentación semántica y entrenamiento de modelos con Amazon SageMaker

Nodo de origen: 1551223

En visión por computadora, la segmentación semántica es la tarea de clasificar cada píxel en una imagen con una clase de un conjunto conocido de etiquetas, de modo que los píxeles con la misma etiqueta comparten ciertas características. Genera una máscara de segmentación de las imágenes de entrada. Por ejemplo, las siguientes imágenes muestran una máscara de segmentación del cat etiqueta.

En noviembre 2018, Amazon SageMaker anunció el lanzamiento del algoritmo de segmentación semántica SageMaker. Con este algoritmo, puede entrenar sus modelos con un conjunto de datos público o con su propio conjunto de datos. Los conjuntos de datos de segmentación de imágenes populares incluyen el conjunto de datos de objetos comunes en contexto (COCO) y las clases de objetos visuales PASCAL (PASCAL VOC), pero las clases de sus etiquetas son limitadas y es posible que desee entrenar un modelo en objetos de destino que no están incluidos en el conjuntos de datos públicos. En este caso, puede utilizar Verdad fundamental de Amazon SageMaker para etiquetar su propio conjunto de datos.

En esta publicación, demuestro las siguientes soluciones:

  • Uso de Ground Truth para etiquetar un conjunto de datos de segmentación semántica
  • Transformar los resultados de Ground Truth al formato de entrada requerido para el algoritmo de segmentación semántica integrado de SageMaker
  • Uso del algoritmo de segmentación semántica para entrenar un modelo y realizar inferencias

Etiquetado de datos de segmentación semántica

Para construir un modelo de aprendizaje automático para la segmentación semántica, necesitamos etiquetar un conjunto de datos a nivel de píxel. Ground Truth le da la opción de usar anotadores humanos a través de Amazon Mechanical Turk, proveedores externos o su propia mano de obra privada. Para obtener más información sobre la fuerza laboral, consulte Crear y administrar la fuerza laboral. Si no desea administrar la fuerza laboral de etiquetado por su cuenta, Amazon SageMaker Tierra Verdad Plus es otra excelente opción como un nuevo servicio de etiquetado de datos llave en mano que le permite crear rápidamente conjuntos de datos de entrenamiento de alta calidad y reduce los costos hasta en un 40 %. Para esta publicación, le muestro cómo etiquetar manualmente el conjunto de datos con la función de segmento automático de Ground Truth y el etiquetado de colaboración colectiva con una fuerza laboral de Mechanical Turk.

Etiquetado manual con Ground Truth

En diciembre de 2019, Ground Truth agregó una función de segmento automático a la interfaz de usuario de etiquetado de segmentación semántica para aumentar el rendimiento del etiquetado y mejorar la precisión. Para obtener más información, consulte Segmentación automática de objetos al realizar el etiquetado de segmentación semántica con Amazon SageMaker Ground Truth. Con esta nueva función, puede acelerar su proceso de etiquetado en tareas de segmentación. En lugar de dibujar un polígono bien ajustado o usar la herramienta de pincel para capturar un objeto en una imagen, solo dibuja cuatro puntos: en los puntos más arriba, más abajo, más a la izquierda y más a la derecha del objeto. Ground Truth toma estos cuatro puntos como entrada y utiliza el algoritmo Deep Extreme Cut (DEXTR) para producir una máscara ajustada alrededor del objeto. Para ver un tutorial sobre el uso de Ground Truth para el etiquetado de segmentación semántica de imágenes, consulte Segmentación semántica de imágenes. El siguiente es un ejemplo de cómo la herramienta de segmentación automática genera una máscara de segmentación automáticamente después de elegir los cuatro puntos extremos de un objeto.

Etiquetado de crowdsourcing con una fuerza laboral de Mechanical Turk

Si tiene un gran conjunto de datos y no desea etiquetar manualmente cientos o miles de imágenes usted mismo, puede usar Mechanical Turk, que proporciona una fuerza laboral humana escalable y bajo demanda para completar trabajos que los humanos pueden hacer mejor que las computadoras. El software de Mechanical Turk formaliza las ofertas de trabajo a los miles de trabajadores dispuestos a realizar un trabajo fragmentado a su conveniencia. El software también recupera el trabajo realizado y lo compila para usted, el solicitante, quien paga a los trabajadores por un trabajo satisfactorio (únicamente). Para comenzar con Mechanical Turk, consulte Introducción a Amazon Mechanical Turk.

Crear un trabajo de etiquetado

El siguiente es un ejemplo de un trabajo de etiquetado de Mechanical Turk para un conjunto de datos de tortugas marinas. El conjunto de datos de tortugas marinas es de la competencia Kaggle. Detección de rostros de tortugas marinas, y seleccioné 300 imágenes del conjunto de datos con fines de demostración. La tortuga marina no es una clase común en los conjuntos de datos públicos, por lo que puede representar una situación que requiere el etiquetado de un conjunto de datos masivo.

  1. En la consola de SageMaker, elija Etiquetado de trabajos en el panel de navegación.
  2. Elige Crear trabajo de etiquetado.
  3. Introduzca un nombre para su trabajo.
  4. Configuración de datos de entrada, seleccione Configuración de datos automatizada.
    Esto genera un manifiesto de datos de entrada.
  5. Ubicación de S3 para conjuntos de datos de entrada, ingrese la ruta para el conjunto de datos.
  6. Categoría de tarea, escoger Imagen.
  7. Selección de tareas, seleccione Segmentación semántica.
  8. Tipos de trabajadores, seleccione Amazon Mechanical Turk.
  9. Configure sus ajustes para el tiempo de espera de la tarea, el tiempo de vencimiento de la tarea y el precio por tarea.
  10. Agregue una etiqueta (para esta publicación, sea turtle), y proporcionar instrucciones de etiquetado.
  11. Elige Crear.

Después de configurar el trabajo de etiquetado, puede comprobar el progreso del etiquetado en la consola de SageMaker. Cuando está marcado como completo, puede elegir el trabajo para verificar los resultados y usarlos para los siguientes pasos.

Transformación de conjuntos de datos

Después de obtener el resultado de Ground Truth, puede usar los algoritmos integrados de SageMaker para entrenar un modelo en este conjunto de datos. Primero, debe preparar el conjunto de datos etiquetado como la interfaz de entrada solicitada para el algoritmo de segmentación semántica de SageMaker.

Canales de datos de entrada solicitados

La segmentación semántica de SageMaker espera que su conjunto de datos de entrenamiento se almacene en Servicio de almacenamiento simple de Amazon (Amazon S3). Se espera que el conjunto de datos en Amazon S3 se presente en dos canales, uno para train y uno para validation, utilizando cuatro directorios, dos para imágenes y dos para anotaciones. Se espera que las anotaciones sean imágenes PNG sin comprimir. El conjunto de datos también puede tener un mapa de etiquetas que describa cómo se establecen las asignaciones de anotaciones. Si no, el algoritmo usa un valor predeterminado. Para la inferencia, un punto final acepta imágenes con un image/jpeg tipo de contenido. La siguiente es la estructura requerida de los canales de datos:

s3://bucket_name |- train | - image1.jpg | - image2.jpg |- validation | - image3.jpg | - image4.jpg |- train_annotation | - image1.png | - image2.png |- validation_annotation | - image3.png | - image4.png |- label_map | - train_label_map.json | - validation_label_map.json

Cada imagen JPG en los directorios de tren y validación tiene una imagen de etiqueta PNG correspondiente con el mismo nombre en el train_annotation y validation_annotation directorios. Esta convención de nomenclatura ayuda al algoritmo a asociar una etiqueta con su imagen correspondiente durante el entrenamiento. El tren, train_annotation, validación y validation_annotation Los canales son obligatorios. Las anotaciones son imágenes PNG de un solo canal. El formato funciona siempre que los metadatos (modos) en la imagen ayuden al algoritmo a leer las imágenes de anotación en un número entero sin signo de 8 bits de un solo canal.

Salida del trabajo de etiquetado de Ground Truth

Los resultados generados a partir del trabajo de etiquetado de Ground Truth tienen la siguiente estructura de carpetas:

s3://turtle2022/labelturtles/ |- activelearning |- annotation-tool |- annotations | - consolidated-annotation | - consolidation-request | - consolidation-response | - output | -0_2022-02-10T17:40:03.294994.png | -0_2022-02-10T17:41:04.530266.png | - intermediate | - worker-response |- intermediate |- manifests | - output | - output.manifest

Las máscaras de segmentación se guardan en s3://turtle2022/labelturtles/annotations/consolidated-annotation/output. Cada imagen de anotación es un archivo .png que lleva el nombre del índice de la imagen de origen y la hora en que se completó el etiquetado de esta imagen. Por ejemplo, las siguientes son la imagen de origen (Imagen_1.jpg) y su máscara de segmentación generada por la fuerza laboral de Mechanical Turk (0_2022-02-10T17:41:04.724225.png). Tenga en cuenta que el índice de la máscara es diferente al número en el nombre de la imagen de origen.

El manifiesto de salida del trabajo de etiquetado está en el /manifests/output/output.manifest expediente. Es un archivo JSON y cada línea registra una asignación entre la imagen de origen y su etiqueta y otros metadatos. La siguiente línea JSON registra una asignación entre la imagen de origen que se muestra y su anotación:

{"source-ref":"s3://turtle2022/Image_1.jpg","labelturtles-ref":"s3://turtle2022/labelturtles/annotations/consolidated-annotation/output/0_2022-02-10T17:41:04.724225.png","labelturtles-ref-metadata":{"internal-color-map":{"0":{"class-name":"BACKGROUND","hex-color":"#ffffff","confidence":0.25988},"1":{"class-name":"Turtle","hex-color":"#2ca02c","confidence":0.25988}},"type":"groundtruth/semantic-segmentation","human-annotated":"yes","creation-date":"2022-02-10T17:41:04.801793","job-name":"labeling-job/labelturtles"}}

La imagen de origen se llama Image_1.jpg y el nombre de la anotación es 0_2022-02-10T17:41: 04.724225.png. Para preparar los datos como los formatos de canal de datos necesarios del algoritmo de segmentación semántica de SageMaker, debemos cambiar el nombre de la anotación para que tenga el mismo nombre que las imágenes JPG de origen. Y también necesitamos dividir el conjunto de datos en train y validation directorios para las imágenes de origen y las anotaciones.

Transforme la salida de un trabajo de etiquetado de Ground Truth al formato de entrada solicitado

Para transformar la salida, complete los siguientes pasos:

  1. Descargue todos los archivos del trabajo de etiquetado de Amazon S3 a un directorio local:
    !aws s3 cp s3://turtle2022/ Seaturtles --recursive

  2. Lea el archivo de manifiesto y cambie los nombres de la anotación a los mismos nombres que las imágenes de origen:
    import os
    import re label_job='labelturtles'
    manifest_path=dir_name+'/'+label_job+'/'+'manifests/output/output.manifest' file = open(manifest_path, "r") txt=file.readlines()
    output_path=dir_name+'/'+label_job+'/'+'annotations/consolidated-annotation/output'
    S3_name='turtle2022/'
    im_list=[]
    for i in range(len(txt)): string = txt[i] try: im_name = re.search(S3_name+'(.+)'+'.jpg', string).group(1) print(im_name) im_png=im_name+'.png' im_list.append(im_name) annotation_name = re.search('output/(.+?)"', string).group(1) os.rename(annotation_name, im_png) except AttributeError: pass

  3. Dividir los conjuntos de datos de tren y validación:
    import numpy as np
    from random import sample # Prints list of random items of given length
    train_num=len(im_list)*0.8
    test_num=len(im_list)*0.2
    train_name=sample(im_list,int(train_num))
    test_name = list(set(im_list) - set(train_name))

  4. Cree un directorio en el formato requerido para los canales de datos del algoritmo de segmentación semántica:
    os.chdir('./semantic_segmentation_pascalvoc_2022-01-11')
    os.mkdir('train')
    os.mkdir('validation')
    os.mkdir('train_annotation')
    os.mkdir('validation_annotation')

  5. Mueva las imágenes de tren y validación y sus anotaciones a los directorios creados.
    1. Para las imágenes, utilice el siguiente código:
      for i in range(len(train_name)): train_im=train_name[i]+'.jpg' train_im_path=dir_name+'/'+train_im train_new_path='train/'+train_im shutil.move(train_im_path,train_new_path) train_annotation=train_name[i]+'.png' train_annotation_path=dir_name+'/labelturtles/annotations/consolidated-annotation/output/'+train_annotation train_annotation_new_path='train_annotation/'+train_annotation shutil.move(train_annotation_path,train_annotation_new_path)

    2. Para las anotaciones, utilice el siguiente código:
      for i in range(len(test_name)): val_im=test_name[i]+'.jpg' val_im_path=dir_name+'/'+val_im val_new_path='validation/'+val_im shutil.move(val_im_path,val_new_path) val_annotation=test_name[i]+'.png' val_annotation_path=dir_name+'/labelturtles/annotations/consolidated-annotation/output/'+val_annotation val_annotation_new_path='validation_annotationT/'+val_annotation shutil.move(val_annotation_path,val_annotation_new_path)

  6. Cargue los conjuntos de datos de capacitación y validación y sus conjuntos de datos de anotación en Amazon S3:
    !aws s3 cp train s3://turtle2022/train/ --recursive
    !aws s3 cp train_annotation s3://turtle2022/train_annotation/ --recursive
    !aws s3 cp validation s3://turtle2022/validation/ --recursive
    !aws s3 cp validation_annotation s3://turtle2022/validation_annotation/ --recursive

Entrenamiento del modelo de segmentación semántica de SageMaker

En esta sección, repasamos los pasos para entrenar su modelo de segmentación semántica.

Siga el cuaderno de muestra y configure canales de datos

Puede seguir las instrucciones en El algoritmo de segmentación semántica ya está disponible en Amazon SageMaker para implementar el algoritmo de segmentación semántica en su conjunto de datos etiquetado. esta muestra cuaderno muestra un ejemplo de extremo a extremo que presenta el algoritmo. En el cuaderno, aprenderá a entrenar y alojar un modelo de segmentación semántica utilizando la red totalmente convolucional (FCN) algoritmo usando el Conjunto de datos de VOC de Pascal para entrenamiento. Debido a que no planeo entrenar un modelo a partir del conjunto de datos VOC de Pascal, omití el Paso 3 (preparación de datos) en este cuaderno. En cambio, creé directamente train_channel, train_annotation_channe, validation_channely validation_annotation_channel usando las ubicaciones de S3 donde almacené mis imágenes y anotaciones:

Train_channel=’s3://turtle2022/train’
train_annotation_channel=’s3://turtle2022/train_annotation’
validation_channel=’s3://turtle2022/validation’
validation_annotation_channel=’s3://turtle2022/validation_annotation’

Ajuste los hiperparámetros para su propio conjunto de datos en el estimador de SageMaker

Seguí el cuaderno y creé un objeto estimador de SageMaker (ss_estimator) para entrenar mi algoritmo de segmentación. Una cosa que necesitamos personalizar para el nuevo conjunto de datos está en ss_estimator.set_hyperparameters: tenemos que cambiar num_classes=21 a num_classes=2 (turtle y background), y también cambié epochs=10 a epochs=30 porque 10 es solo para fines de demostración. Luego usé la instancia p3.2xlarge para el entrenamiento del modelo configurando instance_type="ml.p3.2xlarge". El entrenamiento se completó en 8 minutos. Lo mejor MIOU (Intersección media sobre la unión) de 0.846 se logra en la época 11 con un pix_acc (el porcentaje de píxeles en su imagen que se clasifican correctamente) de 0.925, que es un resultado bastante bueno para este pequeño conjunto de datos.

Resultados de la inferencia del modelo

Alojé el modelo en una instancia ml.c5.xlarge de bajo costo:

training_job_name = 'ss-notebook-demo-2022-02-12-03-37-27-151'
ss_estimator = sagemaker.estimator.Estimator.attach(training_job_name)
ss_predictor = ss_estimator.deploy(initial_instance_count=1, instance_type="ml.c5.xlarge")

Finalmente, preparé un conjunto de prueba de 10 imágenes de tortugas para ver el resultado de la inferencia del modelo de segmentación entrenado:

import os path = "testturtle/"
img_path_list=[]
files = os.listdir(path) for file in files: if file.endswith(('.jpg', '.png', 'jpeg')): img_path = path + file img_path_list.append(img_path) colnum=5
fig, axs = plt.subplots(2, colnum, figsize=(20, 10)) for i in range(len(img_path_list)): print(img_path_list[i]) img = mpimg.imread(img_path_list[i]) with open(img_path_list[i], "rb") as imfile: imbytes = imfile.read() cls_mask = ss_predictor.predict(imbytes) axs[int(i/colnum),i%colnum].imshow(img, cmap='gray') axs[int(i/colnum),i%colnum].imshow(np.ma.masked_equal(cls_mask,0), cmap='jet', alpha=0.8) plt.show()

Las siguientes imágenes muestran los resultados.

Las máscaras de segmentación de las tortugas marinas parecen precisas y estoy contento con este resultado entrenado en un conjunto de datos de 300 imágenes etiquetado por trabajadores de Mechanical Turk. También puede explorar otras redes disponibles como red de análisis de escena piramidal (PSP) or DeepLab-V3 en el cuaderno de muestra con su conjunto de datos.

Limpiar

Elimine el punto final cuando haya terminado con él para evitar incurrir en costos continuos:

ss_predictor.delete_endpoint()

Conclusión

En esta publicación, mostré cómo personalizar el etiquetado de datos de segmentación semántica y el entrenamiento de modelos con SageMaker. En primer lugar, puede configurar un trabajo de etiquetado con la herramienta de segmentación automática o utilizar una mano de obra de Mechanical Turk (así como otras opciones). Si tiene más de 5,000 objetos, también puede utilizar el etiquetado de datos automatizado. Luego, transforma los resultados de su trabajo de etiquetado de Ground Truth en los formatos de entrada requeridos para el entrenamiento de segmentación semántica integrado de SageMaker. Después de eso, puede usar una instancia informática acelerada (como p2 o p3) para entrenar un modelo de segmentación semántica con lo siguiente cuaderno e implemente el modelo en una instancia más rentable (como ml.c5.xlarge). Por último, puede revisar los resultados de la inferencia en su conjunto de datos de prueba con unas pocas líneas de código.

Comience con la segmentación semántica de SageMaker etiquetado de datos y entrenamiento modelo con su conjunto de datos favorito!


Sobre la autora

kara yang es científico de datos en los servicios profesionales de AWS. Le apasiona ayudar a los clientes a lograr sus objetivos comerciales con los servicios en la nube de AWS. Ha ayudado a las organizaciones a crear soluciones de aprendizaje automático en múltiples industrias, como la fabricación, la automoción, la sostenibilidad medioambiental y la industria aeroespacial.

Sello de tiempo:

Mas de Aprendizaje automático de AWS