Este repositório possui três diretórios, além de quatro outros arquivos. O arquivo tcc.pdf contém o texto que detalha o processo de construção do detector, utilizado como trabalho de conclusão do curso de bacharelado em ciência da computação da Universidade Federal da Bahia. Os outros arquivos são utilizados para a extração e preparação da base de dados usada no trabalho. O diretório detector possui a implementação da rede, junto com os códigos para treino, teste e cálculo dos resultados. O diretório pretrained_detector possui o mesmo conteúdo, porém conta com os resultados calculados. O modelo pré-treinado, utilizado no trabalho, também está disponível e será explicado como é possível obtê-lo. Detalhes acerca dos arquivos contidos nesses diretórios e como manuseá-los serão mostrados nas instruções a seguir.
- Python3
- Tensorflow v1.6.0
- OpenCV-Python v3.4.3.18
- NumPy v1.15.4
- Matplotlib v3.0.2
- Imgaug v0.2.6
- Executar o script download_and_extract_data.sh dentro do diretório corrente. Este script fará o download e extração da base de dados utilizada no trabalho.
- Executar o script preprocess_and_merge_markings.sh para redimensionar as imagens para 160x160 e substituir as marcações originais pelas marcações contidas no diretório tcc_markings.
Ao final da execução dos scripts, será criado um diretório database, contendo todas as imagens de treino, validação e teste, com as marcações manuais complementares feitas durante o nosso trabalho, e no tamanho a ser utilizado pela rede.
Obter os modelos pré-treinados utilizados no trabalho (caso queira treinar o detector e gerar um novo modelo, esse passo não é necessário)
- Baixar o arquivo models_and_logs_ear_detection.zip no link
https://drive.google.com/open?id=1fDq8bAcwY4RoiOR-H89I5My1fJGqtfa7
O arquivo contém os modelos e logs do treinamento das duas redes utilizadas, que foram utilizados para o cálculo dos resultados finais. - Extrair os arquivos dentro do diretório pretrained_detector
- Entrar no diretório detector após ter obtido a base de dados e executado o pré-processamento.
- Executar o script train.py para treinar o preditor da rede, implementado no arquivo network.py.
- O subdiretório logs contém informações do loss e acurácia do modelo do preditor que são calculados durante o treino a cada época utilizando a base de validação. Para visualizar, é necessário executar o tensorboard utilizando o seguinte comando:
tensorboard --logdir='./logs' --port=7373
O tensorboard será acessível a partir do endereço: O uso da porta 7373 é apenas um exemplo e não é necessário o uso desse mesmo valor. O modelo do preditor será salvo no subdiretório model.
- O subdiretório logs contém informações do loss e acurácia do modelo do preditor que são calculados durante o treino a cada época utilizando a base de validação. Para visualizar, é necessário executar o tensorboard utilizando o seguinte comando:
- Executar o script class_train.py para treinar o classificador da rede, implementado no arquivo class_network.py.
- O subdiretório class_logs contém as mesmas informações anteriores para o classificador. Para visualizar, é necessário executar o tensorboard utilizando o seguinte comando:
tensorboard --logdir='./class_logs' --port=3737
O tensorboard será acessível a partir do endereço: Da mesma forma aqui, é possível utilizar outro número para a porta. O modelo do classificador será salvo no subdiretório class_model.
- O subdiretório class_logs contém as mesmas informações anteriores para o classificador. Para visualizar, é necessário executar o tensorboard utilizando o seguinte comando:
O arquivo data_manager.py contém a implementação de funções utilizadas para gerenciar as imagens e marcações durante o treino, teste e inferência. As redes são independentes e podem ser treinadas em paralelo. Após esses passos, os modelos do classificador e do preditor terão sido gerados e poderão ser usados para inferência.
Cálculo das métricas na base de dados (caso não esteja retreinando a rede, este passo pode ser pulado)
- De posse da rede treinada na etapa anterior, execute o script evaluate.py. Este script irá gerar os arquivos fdr_fnr_results.txte FDRxFNR_Graph.png. O primeiro contém resultados numéricos da quantidade de verdadeiros positivos (TP), falsos positivos (FP) e falsos negativos (FN), a taxa de falsa descoberta (FDR) e a taxa de falsos negativos (FNR). Estes valores são calculados para diferentes limiares confiança e de IOU, especificados no arquivo. O segundo mostra esses resultados visualmente através de um gráfico com curvas de FDRxFNR variando o limiar de confiança para cada limiar de IOU.
- Para calcular os resultados da rede a nível de píxel e gerar imagens marcadas utilizando a base de teste, execute o script test.py passando como argumento um número entre 0 e 100, indicando o limiar de confiança desejado, como por exemplo:
python3 test.py 42
O número 42 indica que queremos utilizar este valor como limiar de confiança para nossas detecções. Esta etapa pode ser realizada antes da anterior, porém a execução do script anterior nos dá uma forma de encontrar o melhor limiar de confiança a ser utilizado. Ao final da execução, será criado um arquivo pixel_wise_results.txt, que contém as métricas calculadas a nível de pixel. Além disso, o subdiretório test_outputs, inicialmente vazia, será preenchida com as imagens de teste no formato outX_IOU.png, onde X é um identificador dado à imagem durante a execução do script e IOU representa a métrica a nível de pixel para aquela imagem com quatro casas decimais. O número da imagem não possui relação com o identificador real na base, e só é utilizado para eliminar a possibilidade de imagens com mesmo IOU serem sobrescritas. OBS: caso o subdiretório test_outputs seja deletada, ao executar o script as imagens serão processadas, porém não serão salvas. É necessário que o subdiretório esteja presente para que as imagens sejam salvas
Após treinar uma nova rede por completo, ou utilizando a rede pré-treinada, podemos realizar a inferência em imagens de quaisquer tamanho. Para isso, dentro do diretório detector (ou pretrained_detector) execute o script inference.py, passando como argumento o diretório onde as imagens se encontram e o limiar de confiança desejado. Como um exemplo, suponha que queremos realizar a inferência em nossa base de teste. Podemos realizar essa tarefa com o seguinte comando
python3 inference.py ../database/CollectionB 42
As saídas sobrescreverão as imagens originais do diretório, desenhando as regiões detectadas. Imagens de quaisquer tamanho podem ser utilizadas, todas são redimensionadas durante a execução apenas para realizar a inferência, e as detecções são redimensionadas para o tamanho original antes de serem desenhadas. OBS: O script aceita apenas imagens no formato .png, ignorando todos os outros arquivos dentro do diretório passado como argumento (incluindo os subdiretórios) .