Exercício - Carregue os dados

Concluído

Agora, é hora de carregar as imagens que usaremos para treinar o modelo de aprendizado de máquina. Existem duas formas de carregar imagens:

  • No portal Visão Personalizada, selecione, carregue e marque 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 tags para carregar, é mais rápido usar o SDK de Visão Personalizada. No entanto, você pode escolher uma das opções descritas nas próximas seções. Conclua as etapas para carregar as imagens no conjunto de dados da maneira que melhor se adapta a você.

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, você pode querer carregar imagens em apenas quatro ou cinco das subpastas, dependendo da sua velocidade de upload. Tenha em mente que, ao treinar um módulo de aprendizado de máquina, mais e variados exemplos produzirão melhores resultados.

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

    1. Aceda a https://www.customvision.ai/projects e inicie sessão. Selecione Novo projeto.

    2. Em Create new project (Criar novo projeto):

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

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

      3. Para Grupo de recursos, selecione o grupo de recursos 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 que mostra como criar um novo recurso no portal Visão Personalizada.

    Nota

    Se quiser exportar o modelo para um dispositivo móvel ou em TensorFlow.js ou IoT, em Domínios, selecione uma opção de modelo compacto. Você pode alterar essa opção nas configurações depois que o projeto é criado.

  2. Adicione imagens e tags para uma espécie de ave:

    1. No seu projeto de Visão Personalizada, selecione Adicionar imagens.

      Captura de tela que destaca o botão Adicionar imagens em um projeto de Visão Personalizada.

    2. Em Abrir, vá para a pasta birds-photo onde você extraiu os arquivos de imagens do arquivo zip do conjunto de dados.

    3. Abra uma pasta de espécies de aves.

    4. Selecione Ctrl + A para selecionar todas as imagens na pasta species e, em seguida, selecione Abrir.

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

    5. Em Upload de imagem, adicione uma descrição em Minhas tags para indicar as espécies das aves mostradas nas fotos.

    6. Selecione Carregar <número> ficheiros.

      Captura de ecrã que mostra como adicionar uma descrição de etiqueta às fotografias carregadas na Visão Personalizada.

  3. Repita o passo anterior para carregar as fotografias em cada pasta de espécies de aves no conjunto de dados transferido.

Opção 2: Use Python e o SDK da Visão Personalizada para carregar e marcar imagens

O SDK da Visão Personalizada está disponível nas seguintes linguagens de programação: Python, .NET, Node.js, Go e Java. Vamos usar Python. Se você ainda não tem o Python instalado, recomendamos que você o obtenha com uma instalação do Anaconda. Você obtém Python quando você baixar Anaconda.

Se preferir baixar o código do GitHub, você pode 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 código a seguir para criar o projeto Custom Vision. Antes de executar o código, substitua os <endpoint> espaços reservados e <key> pelos valores do recurso Visão Personalizada.

    Para obter os valores do recurso Visão Personalizada:

    1. No portal do Azure, vá para o recurso Visão Personalizada.

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

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

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

      Captura de ecrã que destaca o ponto de extremidade e os valores-chave de um recurso de Visão Personalizada no portal do Azure.

    Seu código será semelhante a este 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 de bird-photos.zip baixado para o mesmo diretório onde você salvou o arquivo do Jupyter Notebook. Adicione o seguinte código para alterar o diretório para as 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 nesta 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 tags de tipo de pássaro. As tags são criadas com base nos nomes das pastas no diretório bird-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. Em seguida, criamos três funções que chamaremos em um for loop:

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

    Para criar as três funções:

    1. No arquivo do Jupyter Notebook, adicione o código da createTag função. A função cria uma marca de nome de imagem no projeto 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 para a createImageList função. A função usa dois parâmetros: um tag nome da lista de nomes de pastas e o tag_id da tag que criamos no projeto Visão Personalizada. A função usa o base_image_url valor para definir o diretório para a pasta que contém as imagens para o tag que criamos a partir dos nomes de pasta. Em seguida, anexamos cada imagem à lista, que usaremos para carregar em lotes para o criado tag:

      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 adicionar é para criar a uploadImageList função. Passamos o image_list que criamos a partir da pasta e, em seguida, carregamos a lista para o 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 o nosso método principal. Para cada tag, o método chama as três funções que criamos. Percorremos cada tag (nome da pasta) na tags coleção que criamos a partir das pastas no diretório bird-photos/custom-photos. Aqui estão as etapas no for loop:

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

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

    3. Chame a imageList função, que você criou anteriormente, para carregar as imagens dos image_list lotes de 25. Carregamos em lotes de 25 porque a Visão Personalizada expira se tentarmos carregar todo o conjunto de dados de uma só 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 nesta célula apenas uma vez. Se você tentar executar a célula mais de uma vez sem excluir também seu projeto de Visão Personalizada, a execução da célula falhará.