Compilando a Darknet no Windows 10 e treinando modelo com a YOLOv3
Introdução
AVISO: Por mais que seja possível treinar um modelo utilizando a CPU, é um processo extremamente mais demorado do que poderia ser, pela sua própria sanidade, use o Google Collab se possível. Ou alguma distro de linux.
Um dos exercícios do Bootcamp de machine learning que estou realizando é realizar exatamente o que diz no título desse post. No caso, a parte de ser no windows é por eu ser cabeça dura demais para só usar o Google Collab e não ter problemas.
Se você tentar seguir o tutorial da própria Darknet, é possível que você encare os mesmos problemas que eu encarei, então vou explicar como fiz tudo funcionar.
Além disso, essa também é a própria resolução do exercício, uau estamos unindo o útil ao agradável.
Antes de prosseguirmos, caso tenha interesse no artigo sobre a YOLOv3 escrito pelos seus criadores, recomendo YOLOv3: An Incremental Improvement (está em inglês).
Requerimentos
- Microsoft Visual Studio (Não testei o code, mas talvez funcione)
- CMake GUI
- A própria Darknet
- OpenCV (Opcional)
- CUDA (Opcional, precisa ter GPU DA NVIDIA, é doloroso se não tiver)
Compilando a Darknet
- Extraia o darknet-master.zip
- Instale os programas da lista que não foram instalados
- Abra o CMake GUI
- Browse source -> Selecione a pasta aonde extraiu a darknet.
- Browse Build -> Selecione a pasta aonde quer que seja criada a solução (.sln)
- Configure irá carregar todas as opções de configuração da Solução.
- Opcional: Se não for usar CUDA/OpenCV, desmarque as opções ENABLE_CUDA e ENABLE_OPENCV
- Generate irá criar a solução no diretório especificado -> Open Project irá abrir a solução no visual studio.
- Build Solution (F6) como Release para x64.
Os binários estarão na pasta Release no diretório do .sln.
Baixando o COCO Dataset
Pelo próprio site do COCO eles tem alguns tutoriais de como baixar usando a COCO API, MASK API e através da FiftyOne. Para fins práticos (ou não), estarei seguindo o tutorial do próprio site da Darknet.
Dentro do darknet-master/scripts/ tem um arquivo chamado get_coco_dataset.sh, abrindo com um editor de texto, você vai ver que primeiro o arquivo clona a COCO API e cria uma pasta chamada images logo após. Se não tiver git instalado, basta baixar o repositório zipado, igual feito com a darknet.
1git clone https://github.com/pdollar/coco
2cd coco
3mkdir images
Então ele usa wget para baixar alguns arquivos, por fins práticos é mais rápido baixar só clicando neles, mesmo (se não tiver wget para Windows instalado, claro)
- Os arquivos abaixo são extraídos dentro da pasta images, que acabamos de criar.
- train2014.zip
- val2014.zip
- E os arquivos abaixo ficam dentro do diretório da Coco
- instances_train-val2014.zip
- 5k.part
- trainvalno5k.part
- labels.tgz
Não colocarei links pois é possível que na data que esteja lendo eles tenham expirado ou até mesmo os trocado (até porque o dataset de 2014 está meio desatualizado, né?). Baixe tudo, é possível que demore um pouco (os datasets de treino e validação são bem pesadinhos)
Extraia que foi baixado tudo na pasta aonde Buildou a Darknet. O arquivo labels.tgz gera um arquivo labels.tar. É basicamente um Zip dentro de um Zip, 7Zip descomprime. :
Para finalizar, o script concatena o diretório atual com cada linha dos arquivos e coloca tudo em dois arquivos de texto.
Você pode usar os seguintes comandos no Powershell para realizar essa parte final do script:
1Get-Content .\5k.part | ForEach-Object { "$PWD\$($_ -replace '/', '\')" -replace '\\+', '\' } > 5k.txt
2Get-Content .\trainvalno5k.part | ForEach-Object { "$PWD\$($_ -replace '/', '\')" -replace '\\+', '\' } > trainvalno5k.txt
Configurando a darknet para treinamento com a COCO
Dentro de darknet-master existe uma pasta chamada cfg e outra chamada data. Copie ambas e cole-as dentro de Release. Dentro de cfg, nós precisamos editar o arquivo coco.data
1classes = 80
2train = Caminho até trainvalno5k.txt
3valid = Caminho até 5k.txt
4names = Caminho para data/coco.names (A pasta que acabou de copiar)
5backup = backup
6eval = coco
Também precisamos editar o arquivo yolo.cfg, já que está configurado para testes, e não treinamento.
Altere as linhas abaixo:
1batch=64
2subdivisions=8
Copie o arquivo pthreadVC2.dll da pasta darknet-master\3rdparty\pthreads\bin para a pasta Release.
Só falta um ultimo arquivo, o darknet53.conv.74, que é um arquivo pre-treinado de pesos. Coloque-o em Releases.
Treinando o Modelo, finalmente
No powershell, basta executar:
1./darknet detector train *caminho completo*\cfg\coco.data *caminho completo*\cfg\yolov3.cfg darknet53.conv.74
Trocando o caminho completo pelo…caminho completo…
Esse processo vai demorar…muitos dias…por favor não cometa o mesmo erro que eu.
Após treinado, será gerado um arquivo .weight, que pode ser utilizado para detecções, como no exemplo abaixo:
1./darknet detect cfg/yolov3.cfg *arquivo.weight* data/dog.jpg
Bônus: AH MAS EU TENHO UMA PLACA DA AMD
Existe um repositório feito pra isso, mas não sei se é por estar desatualizado ou outro motivo, simplesmente não consigo compilar.
Talvez faça um post no futuro com uma solução, mas até lá, se quiser se aventurar é só clicar aqui.
Conclusão
Da próxima vez irei comprar uma placa da NVIDIA.