Exercício – Carregar dados

Concluído

Agora é hora de carregar as imagens que usaremos para treinar o modelo de machine learning. Você pode carregar as imagens de duas maneiras:

  • No portal de Visão Personalizada, selecione, carregue e marque as imagens.
  • Em uma ferramenta como o Jupyter Notebook, use as imagens incluídas no SDK da Visão Personalizada.

Quando você tem uma grande quantidade de dados, classes de imagem e marcas para carregar, é mais rápido usar o SDK da Visão Personalizada. Mas você também pode escolher uma das opções descritas nas próximas seções. Conclua as etapas para carregar as imagens no conjunto de dados como achar melhor.

Opção 1: usar o portal Visão Personalizada para carregar e marcar imagens

As imagens devem ser carregadas e marcadas individualmente por cada subpasta. Para este exercício, talvez você queira carregar imagens em apenas quatro ou cinco das subpastas, dependendo da velocidade de carregamento. Ao treinar um módulo de machine learning, exemplos adicionais e variados produzirão melhores resultados.

  1. Crie um projeto no portal da Visão Personalizada:

    1. Acesse https://www.customvision.ai/projects e faça login. Selecione Novo projeto.

    2. Em Criar projeto:

      1. Em Nome, insira um nome de projeto de sua escolha.

      2. Em Descrição, insira uma breve descrição do modelo.

      3. Em Grupo de recursos, selecione o grupo criado no portal do Azure.

      4. Em Tipos de projeto, selecione Classificação.

      5. Em Tipos de Classificação, selecione Multiclasse (marca única por imagem).

      6. Em Domínios, selecione Geral.

      7. Selecione Criar projeto.

        Captura de tela mostrando como criar um novo recurso no portal da Visão Personalizada.

    Observação

    Se você quiser exportar o modelo para implantar em um dispositivo móvel ou no TensorFlow.js ou na IoT, em Domínios, selecione uma opção de modelo compacto. Essa opção pode ser alterada nas configurações após a criação do projeto.

  2. Adicione imagens e marcas a uma espécie de pássaro:

    1. Em seu projeto da Visão Personalizada, selecione Adicionar imagens.

      Captura de tela realçando o botão Adicionar imagens em um projeto da Visão Personalizada.

    2. Em Abrir, acesse a pasta birds-photo em que você extraiu os arquivos de imagens do arquivo zip do conjunto de arquivos.

    3. Abra uma pasta de espécies de pássaros.

    4. Pressione CTRL+A para selecionar todas as imagens na pasta de espécies e clique em Abrir.

      Captura de tela mostrando a seleção de todas as imagens em uma pasta de espécies.

    5. Em Carregar imagem, adicione uma descrição em Minhas Marcas para indicar as espécies de pássaros mostradas nas fotos.

    6. Selecione Carregar <número> arquivos.

      Captura de tela mostrando como adicionar uma descrição de marca às fotos carregadas na Visão Personalizada.

  3. Repita a etapa anterior para carregar as fotos em cada pasta de espécies do conjunto de dados baixado.

Opção 2: Usar o SDK de Visão Personalizada para carregar e marcar imagens

O SDK da Visão Personalizada está disponível nas seguintes linguagens: Python, .NET, Node.js, Go e Java. Usaremos o Python. Se você ainda não tem o Python instalado, recomendamos que você o obtenha instalando o Anaconda. Você obtém o Python quando baixa o Anaconda.

Se preferir baixar o código do GitHub, você poderá clonar o repositório usando o seguinte comando:

git clone https://github.com/MicrosoftDocs/mslearn-cv-classify-bird-species.git

Siga estas etapas para criar o ambiente virtual e colar o código no ambiente:

  1. Abra o IDE de sua escolha. Em seguida, execute o seguinte comando para importar o pacote:

    !pip install azure-cognitiveservices-vision-customvision
    
  2. Importe os pacotes necessários para executar o script:

    from azure.cognitiveservices.vision.customvision.training import CustomVisionTrainingClient
    from azure.cognitiveservices.vision.customvision.training.models import ImageFileCreateEntry
    from azure.cognitiveservices.vision.customvision.training.models import ImageFileCreateBatch
    from msrest.authentication import ApiKeyCredentials 
    import numpy as np
    
  3. Agora, use o seguinte código para criar o projeto da Visão Personalizada. Antes de executar o código, substitua os espaços reservados <endpoint> e <key> pelos valores de seu recurso de Visão Personalizada.

    Como obter os valores de recurso da Visão Personalizada:

    1. No portal do Azure, acesse o recurso de Visão Personalizada.

    2. No menu de recursos, em Gerenciamento de Recursos, selecione Chaves e Ponto de extremidade.

    3. Copie o valor da caixa de Ponto de extremidade. No código, substitua o espaço reservado <endpoint> por esse valor.

    4. Em CHAVE 1, selecione o ícone de cópia da chave. No código, substitua o espaço reservado <key> por esse valor.

      Captura de tela realçando os valores do ponto de extremidade e da chave de um recurso de Visão Personalizada no portal do Azure.

    Seu código será parecido com o do seguinte exemplo:

    ENDPOINT = "<endpoint>"
    
    # Replace with a valid key
    training_key = "<key>"
    credentials = ApiKeyCredentials(in_headers={"Training-key": training_key})
    publish_iteration_name = "classifyBirdModel"
    
    trainer = CustomVisionTrainingClient(ENDPOINT, credentials)
    
    # Create a new project
    print ("Creating project...")
    project = trainer.create_project("Bird Classification")
    
    print("Project created!")
    
  4. Descompacte o arquivo bird-photos.zip baixado no mesmo diretório em que você salvou o arquivo do Jupyter Notebook. Adicione o seguinte código para mudar para o diretório das fotos de pássaros em seu projeto.

    # Change to the directory for the bird photos
    import os
    os.chdir('./bird-photos/custom-photos')
    

    Aviso

    Execute o código nessa célula apenas uma vez. Se você tentar executar a célula mais de uma vez sem também reiniciar o kernel do Python, a execução da célula falhará.

  5. Adicione o seguinte código para obter a lista de marcas de tipo de pássaro. As marcas são criadas com base nos nomes das pastas no diretório photos/custom-photos:

    # Create a tag list from folders in bird directory
    tags = [name for name in os.listdir('.') if os.path.isdir(name)]
    print(tags)
    
  6. A seguir, criamos três funções que chamaremos em um loop de for:

    • A função createTag cria uma marca de classe no projeto de Visão Personalizada.
    • A função createImageList usa o nome e a ID da marca para criar uma lista de imagens.
    • A função image_list carrega imagens em lotes por meio da lista.

    Como criar as três funções:

    1. No arquivo do Jupyter Notebook, adicione o código de função createTag. Essa função cria uma marca de nome da imagem no projeto de Visão Personalizada.

      tag_id = createTag(tag)
      print(f"tag creation done with tag id {tag_id}")
      image_list = createImageList(tag, tag_id)
      print("image_list created with length " + str(len(image_list)))
      
      # Break list into lists of 25 and upload in batches
      for i in range(0, len(image_list), 25):
          batch = ImageFileCreateBatch(images=image_list[i:i + 25])
          print(f'Upload started for batch {i} total items {len(image_list)} for tag {tag}...')
          uploadImageList(batch)
          print(f"Batch {i} Image upload completed. Total uploaded {len(image_list)} for tag {tag}")
      
    2. Em seguida, adicione o código à função createImageList. Essa função usa dois parâmetros: um nome de tag da lista de nomes de pastas e o tag_id da marca que criamos no projeto de Visão Personalizada. Essa função usa o valor de base_image_url e define o diretório para a pasta que contém as imagens da tag que criamos usando os nomes de pasta. Em seguida, acrescentamos cada imagem à lista, que usaremos para carregar em lotes na tag criada:

      def createImageList(tag, tag_id):
      
      # Set directory to current tag.
         base_image_url = f"./{tag}/"
         photo_name_list = os.listdir(base_image_url)
         image_list = []
         for file_name in photo_name_list:
             with open(base_image_url+file_name, "rb") as image_contents:
                 image_list.append(ImageFileCreateEntry(name=base_image_url+file_name, contents=image_contents.read(), tag_ids=[tag_id]))
         return image_list
      
    3. O último código a ser adicionado é destinado a criar a função uploadImageList. Passamos a image_list que criamos por meio da pasta e carregamos a lista no tag:

      def uploadImageList(image_list):
            upload_result = trainer.create_images_from_files(project_id=project.id, batch=image_list)
            if not upload_result.is_batch_successful:
               print("Image batch upload failed.")
               for image in upload_result.images:
                    print("Image status: ", image.status)
               exit(-1)
      
  7. Agora vamos adicionar o código para nosso método principal. Para cada marca, o método acessa as três funções que criamos. Fizemos um loop em cada marca (nome da pasta) na coleção de tags que criamos a partir das pastas no diretório bird-photos/custom-photos. Confira as seguintes etapas no loop for:

    1. Chame a função createTag que você criou antes para criar a classe tag no projeto de Visão Personalizada.

    2. Chame a função createImageList que você criou antes com o nome de tag e os valores de tag_id retornados da Visão Personalizada. A função retorna a lista de imagens a ser carregadas.

    3. Chame a função imageList que você criou antes para carregar as imagens do image_list em lotes de 25. Carregamos em lotes de 25 porque a Visão Personalizada atingirá o tempo limite se tentarmos carregar todo o conjunto de dados de uma vez.

      for tag in tags: 
            tag_id = createTag(tag)
            print(f"tag creation done with tag id {tag_id}")
            image_list = createImageList(tag, tag_id)
            print("image_list created with length " + str(len(image_list)))
      
      # Break list into lists of 25 and upload in batches.
       for i in range(0, len(image_list), 25):
            batch = ImageFileCreateBatch(images=image_list[i:i + 25])
            print(f'Upload started for batch {i} total items {len  (image_list)} for tag {tag}...')
            uploadImageList(batch)
            print(f"Batch {i} Image upload completed. Total uploaded  {len(image_list)} for tag {tag}")
      

      Aviso

      Execute o código nessa célula apenas uma vez. Se você tentar executar a célula mais de uma vez sem também excluir seu projeto da Visão Personalizada, a execução da célula falhará.