Gerando dataset sintético para detecção de objetos
Geração automática de dataset sintético utilizando máscaras e usando esse dataset para treinar o object_detection com TensorFlow 2.
Criar um dataset sintético, por conta da falta de dados de qualidade e anotação, costuma demorar muito. Por isso, este projeto é criar um sistema de geração sintética de dados para ser usado apenas em tarefas como classificação e detecção de objetos. Basicamente, a única coisa necessária é tirar fotos com uma câmera dos objetos e dos fundos, e decidir a quantidade de dados a ser gerada. Esse processo não é generalista: os dados gerados servem apenas para reconhecer objetos específicos em uma área específica. No meu caso, foi utilizado para um robô detectar objetos domésticos apenas em uma área da casa. Para outros ambientes que não estejam representados no dataset, é possível que o modelo não reconheça corretamente.
Todo o processo de utilização e execução está disponível no meu GitHub: https://github.com/Nicolasalan/Object-Detection-Tensorflow/blob/main/DataSet_Mask_TensorFlow1.ipynb
Processo de geração
O processo envolve coletar dados de fundos e dos objetos, adicioná-los em pastas separadas e executar o código no arquivo .ipynb. Vale lembrar que datasets sintéticos apresentam desempenho inferior a dados de treinamento bem rotulados manualmente. Em geral, utiliza-se cerca de 70% de dados sintéticos e 30% de dados rotulados manualmente. Isso funcionou na prática, mas não foi realizado um estudo. Para dois objetos, criei cerca de 3 mil imagens sintéticas.
- Coletar dados de fundo e dos objetos
- Gerar máscaras dos objetos
- Adicionar fundo + objetos (mascarados) e randomizar posição, rotação, fundo e tamanho
- Transformar o dataset para o formato .record
Aqui está o formato do mascaramento:
E o resultado da geração
Processo de treinamento
O treinamento foi realizado apenas na camada final do detector. Como as primeiras camadas aprendem características gerais usando o EfficientDet-D0, foi necessário apenas modificar a saída para classificar corretamente os objetos.
A maior parte do script está automatizada, sendo necessário apenas ajustar os passos de acordo com a quantidade de objetos.