Exercício – Carregar dados
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.
Crie um projeto no portal da Visão Personalizada:
Acesse https://www.customvision.ai/projects e faça login. Selecione Novo projeto.
Em Criar projeto:
Em Nome, insira um nome de projeto de sua escolha.
Em Descrição, insira uma breve descrição do modelo.
Em Grupo de recursos, selecione o grupo criado no portal do Azure.
Em Tipos de projeto, selecione Classificação.
Em Tipos de Classificação, selecione Multiclasse (marca única por imagem).
Em Domínios, selecione Geral.
Selecione Criar projeto.
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.
Adicione imagens e marcas a uma espécie de pássaro:
Em seu projeto da Visão Personalizada, selecione Adicionar imagens.
Em Abrir, acesse a pasta birds-photo em que você extraiu os arquivos de imagens do arquivo zip do conjunto de arquivos.
Abra uma pasta de espécies de pássaros.
Pressione CTRL+A para selecionar todas as imagens na pasta de espécies e clique em Abrir.
Em Carregar imagem, adicione uma descrição em Minhas Marcas para indicar as espécies de pássaros mostradas nas fotos.
Selecione Carregar <número> arquivos.
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:
Abra o IDE de sua escolha. Em seguida, execute o seguinte comando para importar o pacote:
!pip install azure-cognitiveservices-vision-customvision
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
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:
No portal do Azure, acesse o recurso de Visão Personalizada.
No menu de recursos, em Gerenciamento de Recursos, selecione Chaves e Ponto de extremidade.
Copie o valor da caixa de Ponto de extremidade. No código, substitua o espaço reservado
<endpoint>
por esse valor.Em CHAVE 1, selecione o ícone de cópia da chave. No código, substitua o espaço reservado
<key>
por esse valor.
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!")
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á.
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)
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:
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}")
Em seguida, adicione o código à função
createImageList
. Essa função usa dois parâmetros: um nome detag
da lista de nomes de pastas e otag_id
da marca que criamos no projeto de Visão Personalizada. Essa função usa o valor debase_image_url
e define o diretório para a pasta que contém as imagens datag
que criamos usando os nomes de pasta. Em seguida, acrescentamos cada imagem à lista, que usaremos para carregar em lotes natag
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
O último código a ser adicionado é destinado a criar a função
uploadImageList
. Passamos aimage_list
que criamos por meio da pasta e carregamos a lista notag
: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)
- A função
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 loopfor
:Chame a função
createTag
que você criou antes para criar a classetag
no projeto de Visão Personalizada.Chame a função
createImageList
que você criou antes com o nome detag
e os valores detag_id
retornados da Visão Personalizada. A função retorna a lista de imagens a ser carregadas.Chame a função
imageList
que você criou antes para carregar as imagens doimage_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á.