Exercício - Carregue os dados
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.
Crie um projeto no portal de Visão Personalizada:
Aceda a https://www.customvision.ai/projects e inicie sessão. Selecione Novo projeto.
Em Create new project (Criar novo projeto):
Em Nome, insira um nome de projeto de sua escolha.
Em Descrição, insira uma breve descrição do modelo.
Para Grupo de recursos, selecione o grupo de recursos 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.
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.
Adicione imagens e tags para uma espécie de ave:
No seu projeto de Visão Personalizada, selecione Adicionar imagens.
Em Abrir, vá para a pasta birds-photo onde você extraiu os arquivos de imagens do arquivo zip do conjunto de dados.
Abra uma pasta de espécies de aves.
Selecione Ctrl + A para selecionar todas as imagens na pasta species e, em seguida, selecione Abrir.
Em Upload de imagem, adicione uma descrição em Minhas tags para indicar as espécies das aves mostradas nas fotos.
Selecione Carregar <número> ficheiros.
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:
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 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:
No portal do Azure, vá para o recurso Visão Personalizada.
No menu de recursos, em Gerenciamento de Recursos, selecione Chaves e Ponto de Extremidade.
Copie o valor da caixa Ponto de extremidade . No código, substitua o espaço reservado
<endpoint>
por esse valor.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.
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!")
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á.
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)
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:
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}")
Em seguida, adicione o código para a
createImageList
função. A função usa dois parâmetros: umtag
nome da lista de nomes de pastas e otag_id
da tag que criamos no projeto Visão Personalizada. A função usa obase_image_url
valor para definir o diretório para a pasta que contém as imagens para otag
que criamos a partir dos nomes de pasta. Em seguida, anexamos cada imagem à lista, que usaremos para carregar em lotes para o criadotag
: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 adicionar é para criar a
uploadImageList
função. Passamos oimage_list
que criamos a partir da pasta e, em seguida, carregamos a lista para otag
: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
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 nofor
loop:Chame a
createTag
função, que você criou anteriormente, para criar a classetag
no projeto Visão Personalizada.Chame a
createImageList
função, que você criou anteriormente, e com o nome etag
ostag_id
valores retornados da Visão Personalizada. A função retorna a lista de imagens a serem carregadas.Chame a
imageList
função, que você criou anteriormente, para carregar as imagens dosimage_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á.