Identificador de Paisagens.

Matheus Costa
Curso Fastai CIS UnB
4 min readOct 30, 2019

Após a primeira aula do curso do fastai, selecionei um dataset bastante conhecido, que já vi sendo citado em palestras sobre IA mais de uma vez.

O dataset criado pela Intel para um desafio contém imagens de diferentes paisagens, separadas nos rótulos “prédios”, “floresta”, “geleira”, “montanha”, “mar” e “rua”. O dataset possui cerca de 25 mil imagens, 150x150, as quais 14 mil são destinadas para treino, 3 mil para teste e 7 mil para predição.

O dataset está disponível em Intel Image Classification.

As imagens foram incorporadas e descompactadas no Google Colab por comandos de terminal Linux. Os dados vieram do Kaggle em uma organizada hierarquia de diretórios, de modo que as imagens se encontravam em pastas nomeadas com as respectivas ‘labels’.

Essa disposição do banco de dados sugere a utilização do ‘factory method’ sugerido pelo Jeremy na Lição 1 chamado de “from_folder”, o qual é aplicado sobre o objeto ImageDataBunch.

Nesse contexto, obtive minha primeira dificuldade. O método em questão espera uma estrutura de diretórios organizada com as pastas ‘train’ e ‘valid’. Imagino que tenha como passar o nome atual das pastas como parâmetro, todavia, não consegui. Por isso, tive que mudar a organização e o nome das pastas com as imagens. Com os arquivos organizados corretamente, foi possível gerar o ImageDataBunch.

Segui a mesma abordagem adotada na primeira aula. Primeiro foi aplicado um Transfer Learning sobre a ResNet34 e executado 5 épocas sobre o dataset. Cada época durou 2 minutos e 13 segundos e a 5ª época obteve um ‘error_rate’ de 6,8%.

Na segunda etapa, os parâmetros da rede neural foram descongelados e analisou-se o gŕafico do ‘Loss’ pelo ‘Learning Rate’.

O gráfico me gerou uma certa dificuldade para a escolha do ‘slice’, visto que, diferente das outras aplicações, o gráfico não apresentou uma região clara de derivada negativa mais acentuada e com contorno mais comportado.

Figura 1 - Loss x Learning Rate para ResNet34 com parâmetros descongelados.

A figura 2 ilustra o intervalo escolhido para o LR a partir do gráfico da figura 1.

Figura 2 - Escolha do intervalo do LR e resultados obtidos.

Foi observado uma melhora do desempenho do classificador em relação à primeira classificação desde a primeira época. Todavia, a partir da segunda época, percebe-se que o ‘train_loss’ começou a ser menor do que o ‘valid_loss’, o que é reforçado ser uma característica não desejada na Lição 2 do curso.

Após obter um excelente desempenho na 4ª época, a taxa de erro voltou a ser maior na 5ª época, o que indica o ocorrência de um certo ‘overfitting’.

Ao analisar os resultados da classificação, utilizei o método que exibe os “top losses”, que são ilustrados na figura 3.

Figura 3 — Top Losses da Classificação.

As imagens da figura 3, ao meu ver, reforçam a eficiência da rede, já que muitos seres humanos errariam as ‘labels’ atreladas para algumas imagens.

Supondo a figura 3 como uma matriz 3x3, as imagens [0,0], [0,2] e [2,2] são alguns exemplos de que os rótulos de algumas das imagens do dataset são definitivamente inadequados.

De modo a visualizar melhor o resultado obtido na segunda etapa, a matriz de confusão é exibida na figura 4.

Figura 4 — Matriz de Confusão.

Um resultado esperado e confirmado foi de que as maiores confusões foram relacionando geleiras e montanhas; ruas e prédios; e que a classe das florestas foi a com melhor classificação.

Apenas para citar como um ponto de dificuldades, acredito que atualizações nas bibliotecas do ‘fastai’ possam produzir alguns tipos de ‘bugs’. Dois comportamentos inadequados foram observados durante a atividade, os quais não ocorreram no vídeo da lição 1.

O primeiro ocorre quando se tenta criar o ImageDataBunch. Um ‘warning’ relacionado ao PyTorch aparece para cada imagem visitada. A solução que obtive foi importar a biblioteca “warnings” e filtrar a notificação lançada inúmeras vezes ao gerar o data bunch.

O segundo erro ocorre ao gerar a matriz de confusão, a qual tem a primeira e a última linhas cortadas pela metade. Para selecionar tal adversidade, executei o comando Linux que atualizada a biblioteca ‘matplotlib’ para a versão 3.1.0.

Com esses pequenos erros corrigidos e o dataset corretamente organizado, foi possível reproduzir de forma eficaz os conceitos discutidos pelo CIS nessa primeira semana.

Muito obrigado pela atenção!

Matheus Costa

--

--

Matheus Costa
Curso Fastai CIS UnB

Electrical Engeneering Graduate in University of Brasilia, Brasil and IEEE Computational Intelligence Society UnB Member.