Rotulagem de dados de segmentação semântica e treinamento de modelos usando o Amazon SageMaker

Nó Fonte: 1551223

Na visão computacional, a segmentação semântica é a tarefa de classificar cada pixel em uma imagem com uma classe de um conjunto conhecido de rótulos, de modo que os pixels com o mesmo rótulo compartilhem certas características. Gera uma máscara de segmentação das imagens de entrada. Por exemplo, as imagens a seguir mostram uma máscara de segmentação do cat rótulo.

Em Novembro de 2018, Amazon Sage Maker anunciou o lançamento do algoritmo de segmentação semântica SageMaker. Com esse algoritmo, você pode treinar seus modelos com um conjunto de dados público ou seu próprio conjunto de dados. Conjuntos de dados de segmentação de imagens populares incluem o conjunto de dados Common Objects in Context (COCO) e PASCAL Visual Object Classes (PASCAL VOC), mas as classes de seus rótulos são limitadas e você pode querer treinar um modelo em objetos de destino que não estão incluídos no conjuntos de dados públicos. Neste caso, você pode usar Verdade no solo do Amazon SageMaker para rotular seu próprio conjunto de dados.

Neste post, demonstro as seguintes soluções:

  • Usando o Ground Truth para rotular um conjunto de dados de segmentação semântica
  • Transformando os resultados do Ground Truth para o formato de entrada necessário para o algoritmo de segmentação semântica integrado do SageMaker
  • Usando o algoritmo de segmentação semântica para treinar um modelo e realizar inferência

Rotulagem de dados de segmentação semântica

Para construir um modelo de aprendizado de máquina para segmentação semântica, precisamos rotular um conjunto de dados no nível de pixel. O Ground Truth oferece a opção de usar anotadores humanos por meio de Amazon Mechanical Turk, fornecedores terceirizados ou sua própria força de trabalho privada. Para saber mais sobre a força de trabalho, consulte Criar e gerenciar forças de trabalho. Se você não quiser gerenciar a força de trabalho de rotulagem por conta própria, Amazon SageMaker Ground Truth Plus é outra ótima opção como um novo serviço de rotulagem de dados pronto para uso que permite criar conjuntos de dados de treinamento de alta qualidade rapidamente e reduz os custos em até 40%. Para esta postagem, mostro como rotular manualmente o conjunto de dados com o recurso de segmentação automática do Ground Truth e rotulagem de crowdsource com uma força de trabalho Mechanical Turk.

Rotulagem manual com Ground Truth

Em dezembro de 2019, o Ground Truth adicionou um recurso de segmentação automática à interface do usuário de rotulagem de segmentação semântica para aumentar a taxa de transferência de rotulagem e melhorar a precisão. Para obter mais informações, consulte Objetos de segmentação automática ao executar rotulagem de segmentação semântica com o Amazon SageMaker Ground Truth. Com este novo recurso, você pode acelerar seu processo de rotulagem em tarefas de segmentação. Em vez de desenhar um polígono bem ajustado ou usar a ferramenta pincel para capturar um objeto em uma imagem, você desenha apenas quatro pontos: nos pontos superior, inferior, esquerdo e direito do objeto. O Ground Truth usa esses quatro pontos como entrada e usa o algoritmo Deep Extreme Cut (DEXTR) para produzir uma máscara bem ajustada ao redor do objeto. Para um tutorial usando o Ground Truth para rotulagem de segmentação semântica de imagem, consulte Segmentação Semântica de Imagem. Veja a seguir um exemplo de como a ferramenta de segmentação automática gera uma máscara de segmentação automaticamente depois que você escolhe os quatro pontos extremos de um objeto.

Rotulagem de crowdsourcing com uma força de trabalho Mechanical Turk

Se você tiver um grande conjunto de dados e não quiser rotular manualmente centenas ou milhares de imagens, poderá usar o Mechanical Turk, que fornece uma força de trabalho humana escalável sob demanda para concluir trabalhos que os humanos podem fazer melhor do que os computadores. O software Mechanical Turk formaliza ofertas de trabalho para milhares de trabalhadores dispostos a fazer um trabalho fragmentado conforme sua conveniência. O software também recupera o trabalho realizado e o compila para você, o solicitante, que paga aos trabalhadores pelo trabalho satisfatório (somente). Para começar com o Mechanical Turk, consulte Introdução ao Amazon Mechanical Turk.

Criar um trabalho de rotulagem

Veja a seguir um exemplo de um trabalho de rotulagem Mechanical Turk para um conjunto de dados de tartarugas marinhas. O conjunto de dados de tartarugas marinhas é da competição Kaggle Detecção de rosto de tartaruga marinha, e selecionei 300 imagens do conjunto de dados para fins de demonstração. Tartaruga marinha não é uma classe comum em conjuntos de dados públicos, portanto, pode representar uma situação que requer rotular um conjunto de dados massivo.

  1. No console SageMaker, escolha Trabalhos de rotulagem no painel de navegação.
  2. Escolha Criar trabalho de rotulagem.
  3. Digite um nome para o seu trabalho.
  4. Escolha Configuração de dados de entrada, selecione Configuração de dados automatizada.
    Isso gera um manifesto de dados de entrada.
  5. Escolha Localização do S3 para conjuntos de dados de entrada, insira o caminho para o conjunto de dados.
  6. Escolha Categoria da tarefa, escolha Imagem.
  7. Escolha Seleção de tarefas, selecione Segmentação semântica.
  8. Escolha Tipos de trabalhadores, selecione Amazon Mechanical Turk.
  9. Defina suas configurações para tempo limite da tarefa, tempo de expiração da tarefa e preço por tarefa.
  10. Adicione um marcador (para esta postagem, sea turtle) e fornecer instruções de rotulagem.
  11. Escolha Crie.

Depois de configurar o trabalho de rotulagem, você pode verificar o andamento da rotulagem no console do SageMaker. Quando estiver marcado como concluído, você poderá escolher o trabalho para verificar os resultados e usá-los para as próximas etapas.

Transformação do conjunto de dados

Depois de obter a saída do Ground Truth, você pode usar os algoritmos integrados do SageMaker para treinar um modelo nesse conjunto de dados. Primeiro, você precisa preparar o conjunto de dados rotulado como a interface de entrada solicitada para o algoritmo de segmentação semântica do SageMaker.

Canais de dados de entrada solicitados

A segmentação semântica do SageMaker espera que seu conjunto de dados de treinamento seja armazenado em Serviço de armazenamento simples da Amazon (Amazônia S3). Espera-se que o conjunto de dados no Amazon S3 seja apresentado em dois canais, um para train e um para validation, usando quatro diretórios, dois para imagens e dois para anotações. Espera-se que as anotações sejam imagens PNG não compactadas. O conjunto de dados também pode ter um mapa de rótulos que descreve como os mapeamentos de anotação são estabelecidos. Caso contrário, o algoritmo usa um padrão. Para inferência, um endpoint aceita imagens com um image/jpeg tipo de conteúdo. A seguir está a estrutura necessária dos canais de dados:

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 imagem JPG nos diretórios de trem e validação tem uma imagem de rótulo PNG correspondente com o mesmo nome no train_annotation e validation_annotation diretórios. Essa convenção de nomenclatura ajuda o algoritmo a associar um rótulo à imagem correspondente durante o treinamento. O trem, train_annotation, validação e validation_annotation canais são obrigatórios. As anotações são imagens PNG de canal único. O formato funciona desde que os metadados (modos) na imagem ajudem o algoritmo a ler as imagens de anotação em um inteiro sem sinal de 8 bits de canal único.

Saída do trabalho de rotulagem do Ground Truth

As saídas geradas do trabalho de rotulagem do Ground Truth têm a seguinte estrutura de pastas:

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

As máscaras de segmentação são salvas em s3://turtle2022/labelturtles/annotations/consolidated-annotation/output. Cada imagem de anotação é um arquivo .png com o nome do índice da imagem de origem e a hora em que a rotulagem da imagem foi concluída. Por exemplo, a seguir estão a imagem de origem (Image_1.jpg) e sua máscara de segmentação gerada pela força de trabalho do Mechanical Turk (0_2022-02-10T17:41:04.724225.png). Observe que o índice da máscara é diferente do número no nome da imagem de origem.

O manifesto de saída do trabalho de rotulagem está no /manifests/output/output.manifest Arquivo. É um arquivo JSON e cada linha registra um mapeamento entre a imagem de origem e seu rótulo e outros metadados. A seguinte linha JSON registra um mapeamento entre a imagem de origem mostrada e sua anotação:

{"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"}}

A imagem de origem é chamada Image_1.jpg e o nome da anotação é 0_2022-02-10T17:41: 04.724225.png. Para preparar os dados como os formatos de canal de dados necessários do algoritmo de segmentação semântica SageMaker, precisamos alterar o nome da anotação para que tenha o mesmo nome das imagens JPG de origem. E também precisamos dividir o conjunto de dados em train e validation diretórios para imagens de origem e as anotações.

Transforme a saída de um trabalho de rotulagem do Ground Truth para o formato de entrada solicitado

Para transformar a saída, conclua as etapas a seguir:

  1. Faça download de todos os arquivos do trabalho de rotulagem do Amazon S3 para um diretório local:
    !aws s3 cp s3://turtle2022/ Seaturtles --recursive

  2. Leia o arquivo de manifesto e altere os nomes da anotação para os mesmos nomes das imagens de origem:
    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. Divida os conjuntos de dados de trem e validação:
    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. Crie um diretório no formato necessário para os canais de dados do algoritmo de segmentação 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. Mova as imagens de trem e validação e suas anotações para os diretórios criados.
    1. Para imagens, use o seguinte 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 anotações, use o seguinte 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. Carregue os conjuntos de dados de treinamento e validação e seus conjuntos de dados de anotação no 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

Treinamento do modelo de segmentação semântica do SageMaker

Nesta seção, percorremos as etapas para treinar seu modelo de segmentação semântica.

Siga o notebook de exemplo e configure os canais de dados

Você pode seguir as instruções em O algoritmo de segmentação semântica já está disponível no Amazon SageMaker para implementar o algoritmo de segmentação semântica em seu conjunto de dados rotulado. Esta amostra caderno mostra um exemplo de ponta a ponta introduzindo o algoritmo. No notebook, você aprende como treinar e hospedar um modelo de segmentação semântica usando a rede totalmente convolucional (FCN) algoritmo usando o Conjunto de dados Pascal VOC para treinamento. Como não pretendo treinar um modelo do conjunto de dados Pascal VOC, ignorei a Etapa 3 (preparação de dados) neste notebook. Em vez disso, criei diretamente train_channel, train_annotation_channe, validation_channel e validation_annotation_channel usando os locais do S3 onde armazenei minhas imagens e anotações:

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 hiperparâmetros para seu próprio conjunto de dados no estimador SageMaker

Eu segui o notebook e criei um objeto estimador do SageMaker (ss_estimator) para treinar meu algoritmo de segmentação. Uma coisa que precisamos personalizar para o novo conjunto de dados está em ss_estimator.set_hyperparameters: precisamos mudar num_classes=21 para num_classes=2 (turtle e background), e também mudei epochs=10 para epochs=30 porque 10 é apenas para fins de demonstração. Em seguida, usei a instância p3.2xlarge para treinamento de modelo definindo instance_type="ml.p3.2xlarge". O treinamento foi concluído em 8 minutos. Ao melhor MIOU (Mean Intersection over Union) de 0.846 é alcançado na época 11 com um pix_acc (a porcentagem de pixels em sua imagem que são classificados corretamente) de 0.925, o que é um resultado muito bom para esse pequeno conjunto de dados.

Resultados de inferência do modelo

Hospedei o modelo em uma instância ml.c5.xlarge de baixo custo:

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")

Por fim, preparei um conjunto de teste de 10 imagens de tartaruga para ver o resultado da inferência do modelo de segmentação treinado:

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()

As imagens a seguir mostram os resultados.

As máscaras de segmentação das tartarugas marinhas parecem precisas e estou feliz com esse resultado treinado em um conjunto de dados de 300 imagens rotulado por trabalhadores da Mechanical Turk. Você também pode explorar outras redes disponíveis, como rede de análise de cena de pirâmide (PSP) or DeepLab-V3 no notebook de amostra com seu conjunto de dados.

limpar

Exclua o endpoint quando terminar com ele para evitar custos contínuos:

ss_predictor.delete_endpoint()

Conclusão

Neste post, mostrei como personalizar a rotulagem de dados de segmentação semântica e o treinamento de modelos usando o SageMaker. Primeiro, você pode configurar um trabalho de rotulagem com a ferramenta de segmentação automática ou usar uma força de trabalho Mechanical Turk (assim como outras opções). Se você tiver mais de 5,000 objetos, também poderá usar a rotulagem de dados automatizada. Em seguida, você transforma as saídas do seu trabalho de rotulagem do Ground Truth para os formatos de entrada necessários para o treinamento de segmentação semântica integrado do SageMaker. Depois disso, você pode usar uma instância de computação acelerada (como p2 ou p3) para treinar um modelo de segmentação semântica com o seguinte caderno e implemente o modelo em uma instância mais econômica (como ml.c5.xlarge). Por fim, você pode revisar os resultados da inferência em seu conjunto de dados de teste com algumas linhas de código.

Comece com a segmentação semântica do SageMaker rotulagem de dados e treinamento de modelo com seu conjunto de dados favorito!


Sobre o autor

Kara Yang é um cientista de dados nos serviços profissionais da AWS. Ela é apaixonada por ajudar os clientes a atingir suas metas de negócios com os serviços de nuvem da AWS. Ela ajudou organizações a criar soluções de ML em vários setores, como manufatura, automotivo, sustentabilidade ambiental e aeroespacial.

Carimbo de hora:

Mais de Aprendizado de máquina da AWS