(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa

Como criar um classificador de imagens por transferência de aprendizagem em Azure ML

João Barros 27 de October de 2026 5 min de leitura

Este tutorial mostra como criar um classificador de imagens usando transferência de aprendizagem em Azure AI & Machine Learning, útil para acelerar o treino com poucas imagens e obter um modelo pronto para inferência. Explica o porquê das escolhas e um passo a passo prático para treinar e implantar usando uma compute instance/cluster.

Pré-requisitos

  • Conta Azure com subscrição activa e permissões para criar recursos.
  • Workspace de Azure Machine Learning criado.
  • Imagens organizadas em pastas por classe (ex.: data/train/).
  • Azure CLI e Azure ML SDK para Python instalados (ou usar o Azure ML Studio).
  • Noções básicas de Python e comandos de terminal.

Passo 1: Porque usar transferência de aprendizagem

A transferência de aprendizagem permite aproveitar redes pré-treinadas (ex.: ResNet, EfficientNet) para tarefas específicas com menos dados e menos tempo de treino. Em Azure ML, isto integra-se bem com o compute e com pipelines, e reduz o overfitting quando tens poucas imagens.

Passo 2: Preparar o ambiente e os dados no Workspace

Cria um recurso de compute (Compute Instance para desenvolvimento, Compute Cluster para treino) e regista os dados no datastore do Workspace. Organiza as imagens em train/val/test.

# Exemplo mínimo para registar dados no Workspace via Python
from azureml.core import Workspace, Dataset
ws = Workspace.from_config()
datastore = ws.get_default_datastore()
# Carrega uma pasta local para o datastore
datastore.upload(src_dir='data', target_path='image-data', overwrite=True)
# Regista como Dataset
dataset = Dataset.File.from_files(path=(datastore, 'image-data/'))

Passo 3: Escrever o script de treino com transferência

Cria um ficheiro train.py que use PyTorch ou TensorFlow. Aqui um exemplo mínimo com PyTorch e uma base pré-treinada (ResNet18). O script faz load das imagens, substitui a cabeça final e treina apenas os pesos finais.

# train.py (resumo mínimo)
import argparse
from torchvision import models, transforms, datasets
import torch, torch.nn as nn, torch.optim as optim

def main(args):
    transform = transforms.Compose([transforms.Resize((224,224)), transforms.ToTensor()])
    train_ds = datasets.ImageFolder(args.train_dir, transform=transform)
    train_loader = torch.utils.data.DataLoader(train_ds, batch_size=16, shuffle=True)

    model = models.resnet18(pretrained=True)
    for param in model.parameters():
        param.requires_grad = False
    num_ftrs = model.fc.in_features
    model.fc = nn.Linear(num_ftrs, args.num_classes)

    device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
    model.to(device)
    criterion = nn.CrossEntropyLoss()
    optimizer = optim.Adam(model.fc.parameters(), lr=1e-3)

    model.train()
    for epoch in range(args.epochs):
        for imgs, labels in train_loader:
            imgs, labels = imgs.to(device), labels.to(device)
            optimizer.zero_grad()
            outputs = model(imgs)
            loss = criterion(outputs, labels)
            loss.backward()
            optimizer.step()
    # Guarda o modelo
    torch.save(model.state_dict(), args.output_model)

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--train_dir')
    parser.add_argument('--num_classes', type=int)
    parser.add_argument('--epochs', type=int, default=3)
    parser.add_argument('--output_model', default='model.pth')
    args = parser.parse_args()
    main(args)

Passo 4: Criar um Experimento e submeter o treino no Azure ML

Empacota o script num Estimator/ScriptRunConfig e submete-o para o compute. Isto permite controlar o ambiente, as dependências e os logs.

# submit_job.py (resumo usando Azure ML SDK v1)
from azureml.core import Workspace, Experiment, Environment, ScriptRunConfig
ws = Workspace.from_config()
exp = Experiment(ws, 'transfer-learning-images')
env = Environment.from_conda_specification(name='env-tl', file_path='conda_dependencies.yml')
src = ScriptRunConfig(source_directory='.', script='train.py', arguments=['--train_dir','/mnt/data/train','--num_classes', '3','--epochs','5'], compute_target='cpu-cluster', environment=env)
run = exp.submit(src)
run.wait_for_completion(show_output=True)

Passo 5: Registar e implementar o modelo

Depois do treino, regista o modelo no Workspace e cria uma image/container para inferência ou usa um endpoint do Azure ML para deploy.

# registar_model.py
from azureml.core import Workspace, Model
ws = Workspace.from_config()
model = Model.register(ws, model_path='model.pth', model_name='resnet_transfer')
# Para um deploy rápido podes usar os endpoints online do Azure ML (ex.: ACI) via SDK/Studio

Verificar o resultado

Faz uma inferência de teste carregando o modelo registado num ambiente similar ao de produção. Confirma que as previsões fazem sentido e que a acurácia em dados de validação é aceitável. Verifica os logs do run e as métricas no Studio para erros comuns: falta de GPU, paths incorrectos, incompatibilidade de versões.

Conclusão

Concluíste um fluxo completo: preparar dados, escrever um script de transferência de aprendizagem, submeter o treino em Azure ML e registar o modelo para deploy. Próximos passos: experimentar diferentes backbones (EfficientNet), ajustar a learning rate e o congelamento de camadas, e criar um endpoint para inferência em produção. Dica: começa por treinar poucos epochs e valida frequentemente para evitar overfitting — qual é a tua classe mais difícil de distinguir?