Treinamento de Classificadores de Imagens com o Framework Darknet

O Darknet é um framework de código aberto para redes neurais, conhecido por sua eficiência e flexibilidade, especialmente em tarefas de visão computacional como classificação e detecção de objetos. Este guia detalha as etapas para configurar e treinar um classificador de imagens usando o Darknet, cobrindo desde a preparação dos dados até a execução do treinamento.

  1. Preparação dos Dados e Configurações Essenciais

Para treinar um modelo de classificação no Darknet, é crucial organizar os dados adequadamente e criar arquivos de configuração específicos. Os principais arquivos necessários são:

  • Listas de Imagens: Arquivos texto contendo os caminhos absolutos para as imagens de treino e validação.
  • Nomes das Classes: Um arquivo listando todas as categorias que o modelo deve classificar.
  • Arquivo de Dados: Um arquivo de configuração do Darknet que aponta para os arquivos mencionados acima e outras configurações globais.
  • Arquivo de Rede: O arquivo .cfg que define a arquitetura da rede neural a ser treinada.

Estrutura de Diretórios Recomendada

Uma boa prática é organizar suas imagens e arquivos de configuração em uma estrutura clara. Por exemplo:

dataset_principal/
├── imagens/
│   ├── treino/         # Imagens para treinamento
│   │   ├── img_001.jpg
│   │   └── ...
│   └── validacao/      # Imagens para validação
│       ├── img_test_001.jpg
│       └── ...
└── configuracoes_darknet/
   ├── lista_treino.txt       # Lista de caminhos para imagens de treino
   ├── lista_validacao.txt    # Lista de caminhos para imagens de validação
   ├── nomes_categorias.txt   # Arquivo com os nomes das classes
   ├── dados_classificador.data # Configurações de dados do Darknet
   └── arquitetura_cnn.cfg     # Arquivo de configuração da rede neural

Criação das Listas de Imagens

As listas de imagens devem conter um caminho absoluto por linha para cada imagem. Você pode gerá-las usando comandos de terminal:

# Navegue até o diretório 'imagens' dentro de 'dataset_principal'
cd dataset_principal/imagens

# Gerar a lista de treino
find "$(pwd)/treino" -name "*.jpg" > ../configuracoes_darknet/lista_treino.txt

# Gerar a lista de validação
find "$(pwd)/validacao" -name "*.jpg" > ../configuracoes_darknet/lista_validacao.txt

A divisão entre treino e validação depende do tamanho do dataset. Para datasets menores (até 10.000 imagens), uma proporção de 80% treino e 20% validação é comum. Para datasets muito grandes (acima de 100.000 imagens), 99% treino e 1% validação pode ser suficiente.

Arquivo de Nomes das Classes (nomes\_categorias.txt)

Este arquivo simples contém o nome de cada classe, um por linha. Por exemplo, para um classificador de dez categorias como o CIFAR-10:

avião
carro
pássaro
gato
cervo
cachorro
sapo
cavalo
navio
caminhão

Configuração do Arquivo de Dados (dados\_classificador.data)

Este arquivo é essencial para o Darknet saber onde encontrar as informações do seu dataset:

num_classes = 10                  # O número total de classes do seu dataset
caminho_treino = configuracoes_darknet/lista_treino.txt    # Caminho para a lista de imagens de treino
caminho_validacao = configuracoes_darknet/lista_validacao.txt # Caminho para a lista de imagens de validação
nomes_categorias = configuracoes_darknet/nomes_categorias.txt # Caminho para o arquivo de nomes das classes
diretorio_backup = backup/          # Onde os checkpoints do modelo serão salvos
top_k = 2                         # Define o cálculo da acurácia Top-K (ex: Top-2 acurácia)

Definição da Arquitetura da Rede (arquitetura\_cnn.cfg)

O Darknet utiliza arquivos .cfg para definir a estrutura da rede neural. A seguir, um exemplo baseado no AlexNet, adaptado para classificação:

[net]
batch=128         # Tamanho do lote de imagens processado
subdivisions=1    # Lotes são divididos em 'subdivisions' para GPUs com menos memória
height=227        # Altura de entrada das imagens
width=227         # Largura de entrada das imagens
channels=3        # Número de canais de cor (3 para RGB)
momentum=0.9      # Parâmetro do otimizador de momentum
decay=0.0005      # Peso do decaimento (L2 regularization)
max_crop=256      # Tamanho máximo de recorte aleatório para aumento de dados

learning_rate=0.01  # Taxa de aprendizado inicial
policy=poly       # Política de agendamento da taxa de aprendizado (polinomial)
power=4           # Potência para a política polinomial
max_batches=800000  # Número total de iterações de treinamento

angle=7           # Variação angular para data augmentation
hue = .1          # Variação de matiz para data augmentation
saturation=.75    # Variação de saturação
exposure=.75      # Variação de exposição
aspect=.75        # Variação de proporção

[convolutional]
filters=96        # Número de filtros na camada
size=11           # Dimensão do kernel (11x11)
stride=4          # Passo do kernel
pad=0             # Preenchimento (padding)
activation=relu   # Função de ativação ReLU

[maxpool]
size=3            # Dimensão da janela de pooling
stride=2          # Passo do pooling
padding=0         # Preenchimento

[convolutional]
filters=256
size=5
stride=1
pad=1
activation=relu

[maxpool]
size=3
stride=2
padding=0

[convolutional]
filters=384
size=3
stride=1
pad=1
activation=relu

[convolutional]
filters=384
size=3
stride=1
pad=1
activation=relu

[convolutional]
filters=256
size=3
stride=1
pad=1
activation=relu

[maxpool]
size=3
stride=2
padding=0

[connected]
output=4096       # Número de neurônios na camada densa
activation=relu

[dropout]
probability=.5    # Probabilidade de dropout

[connected]
output=4096
activation=relu

[dropout]
probability=.5

[connected]
output=10         # Número final de neurônios (igual ao num_classes)
activation=linear

[softmax]
groups=1

  1. Configuração do Ambiente Darknet

Para começar, é necessário obter e compilar o código-fonte do Darknet:

git clone https://github.com/pjreddie/darknet.git
cd darknet
make -j4 # Compila o Darknet, usando 4 threads para acelerar o processo

Se você pretende utilizar uma GPU NVIDIA para o treinamento, certifique-se de ter o CUDA (versão 8.0 ou supeiror) e o cuDNN (versão 6.0 ou superior) instalados. Após clonar e entrar no diretório do Darknet, edite o arquivo Makefile. Altere as linhas GPU=0 para GPU=1 e CUDNN=0 para CUDNN=1. Salve o arquivo e recompile o Darknet com make -j4 para ativar o suporte à GPU.

Organização Final dos Arquivos

Certifique-se de que seus arquivos de configuração e dados estejam acessíveis a partir do executável do Darknet. Uma disposição comum é:

darknet/
├── cfg/
│   └── arquitetura_cnn.cfg  # Seu arquivo de rede
└── data/
   ├── dados_classificador.data # Seu arquivo de dados
   ├── nomes_categorias.txt    # Nomes das suas classes
   ├── lista_treino.txt        # Lista de imagens de treino
   └── lista_validacao.txt     # Lista de imagens de validação

Os caminhos dentro do dados_classificador.data devem estar consistentes com essa estrutura.

  1. Executando Comandos no Darknet

Com o Darknet compilado e os arquivos preparados, você pode interagir com o framework para treinar, validar e realizar previsões.

Iniciar Treinamento

Para iniciar o treinamento de um novo modelo:

./darknet classifier train data/dados_classificador.data cfg/arquitetura_cnn.cfg

Se precisar retomar um treinamento a partir de um checkpoint (arquivo .backup):

./darknet classifier train data/dados_classificador.data cfg/arquitetura_cnn.cfg backup/nome_do_modelo_final.backup

Validar o Modelo

Para avaliar a performance do modelo no conjunto de validação, utilizando um modelo já treinado:

./darknet classifier valid data/dados_classificador.data cfg/arquitetura_cnn.cfg backup/nome_do_modelo_final.backup

Realizar Previsão em uma Imagem

Para classificar uma única imagem com um modelo treinado:

./darknet classifier predict data/dados_classificador.data cfg/arquitetura_cnn.cfg backup/nome_do_modelo_final.backup /caminho/para/sua_imagem.jpg

Utilizando Múltiplas GPUs

Caso tenha mais de uma GPU e o Darknet esteja compilado com suporte a CUDA, você pode especificar quais GPUs usar:

./darknet classifier train data/dados_classificador.data cfg/arquitetura_cnn.cfg -gpus 0,1,2

  1. Exemplo Prático: Classificador CIFAR-10

Este exemplo demonstra o processo completo para treinar um classificador no dataset CIFAR-10, um dataset popular de 10 classes de objetos comuns.

Obtenção e Preparação dos Dados CIFAR-10

Dentro do diretório do Darknet, navegue até a pasta data e baixe o dataset CIFAR-10:

cd data
wget https://pjreddie.com/media/files/cifar.tgz
tar -xzvf cifar.tgz # Descompacta o arquivo cifar.tgz

cd cifar
# Gera as listas de treino e teste. Observe que os nomes das listas são ligeiramente diferentes para evitar conflitos.
find "$(pwd)/train" -name "*.png" > ../cifar_imagens_treino.list
find "$(pwd)/test" -name "*.png" > ../cifar_imagens_teste.list
cd ../.. # Retorna ao diretório raiz do Darknet

Arquivo de Dados Específico para CIFAR-10 (data/cifar\_config.data)

Crie este arquivo para o dataset CIFAR-10:

num_classes = 10
caminho_treino = data/cifar_imagens_treino.list
caminho_validacao = data/cifar_imagens_teste.list
nomes_categorias = data/cifar/labels.txt # Este arquivo é criado automaticamente ao descompactar o cifar.tgz
diretorio_backup = backup/
top_k = 2

Arquivo de Rede para CIFAR-10 (cfg/cifar\_rede\_pequena.cfg)

Uma arquitetura de rede mais compacta, ideal para datasets menores como o CIFAR-10:

[net]
batch=128
subdivisions=1
height=28
width=28
channels=3
max_crop=32
min_crop=32

hue=.1
saturation=.75
exposure=.75

learning_rate=0.1
policy=poly
power=4
max_batches = 5000
momentum=0.9
decay=0.0005

[convolutional]
batch_normalize=1
filters=32
size=3
stride=1
pad=1
activation=leaky

[maxpool]
size=2
stride=2

[convolutional]
batch_normalize=1
filters=16
size=1
stride=1
pad=1
activation=leaky

[convolutional]
batch_normalize=1
filters=64
size=3
stride=1
pad=1
activation=leaky

[maxpool]
size=2
stride=2

[convolutional]
batch_normalize=1
filters=32
size=1
stride=1
pad=1
activation=leaky

[convolutional]
batch_normalize=1
filters=128
size=3
stride=1
pad=1
activation=leaky

[convolutional]
batch_normalize=1
filters=64
size=1
stride=1
pad=1
activation=leaky

[convolutional]
filters=10       # Camada de saída para as 10 classes do CIFAR-10
size=1
stride=1
pad=1
activation=leaky

[avgpool]

[softmax]

Iniciando o Treinamento do CIFAR-10

Com todos os arquivos de configuração prontos, você pode iniciar o treinamento e a validação:

# Comando para iniciar o treinamento
./darknet classifier train data/cifar_config.data cfg/cifar_rede_pequena.cfg

# Comando para validar o modelo treinado
./darknet classifier valid data/cifar_config.data cfg/cifar_rede_pequena.cfg backup/cifar_rede_pequena_final.backup

Tags: Darknet ClassificacaoDeImagens RedesNeurais AlexNet CIFAR10

Publicado em 8-1 01:10