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.
- 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
.cfgque 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
- 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.
- 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
- 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