Aula 1 — Atividade: Classificador de Obras de Arte

Hugo Gontijo
2 min readOct 25, 2019

--

No nosso primeiro encontro Pierre nos apresentou um classificador de raças de cães e gatos. Ao final da aula nos foi dada a missão de construir um classificador baseado nos conhecimentos obtidos sobre o algoritmo de visão computacional do FastAI. O classificador deveria seria feito a partir de um dataset qualquer (obtido no Kaggle) que seja composto por imagens.

O dataset que eu escolhi foi de imagens de obras de arte que é divido em 5 classes: Desenho, pintura, gravura, iconografia e escultura. Este dataset é composto por 7819 imagens para treinamento e 866 imagens para validação.

Para realizar o treinamento eu parti do mesmo Notebook utilizado pelo Pierre na classificação de raças de cães e gatos. A única coisa que tive que alterar foi o endereço da pasta no novo dataset e o método ‘factory’ para construção do ‘ImageDataBunch’ de ‘from_name_re’ para ‘from_folder’. Quanto as diferenças de argumentos entre os dois métodos foi muito simples de visualizar, apenas dei um ‘doc(mageDataBunch.from_folder)’ e rapidamente já consegui criar meu novo ImageDataBunch.

A minha maior dificuldade em realizar esta tarefa foi relacionado ao dataset que veio com cerca de 108 imagens corrompidas distribuídas entre as 5 classes das imagens para treinamento e validação. Ao realizar o ‘fitting’ era retornado um erro dizendo que não foi possível carregar uma imagem específica. Ao procurar a imagem vi que realmente ela não abria e provavelmente estava corrompida e também vi que como ela havia várias outras.

Rapidamente me veio a mente uma biblioteca de processamento de imagem ‘OpenCV-python’ a qual já tenho certa intimidade. Quando abro a imagem nesta biblioteca na verdade instancio um tensor da imagem. Quando o arquivo não é uma imagem, ou a imagem está corrompida, ao invés de instanciar o tensor da imagem é atribuído ‘None’ a variável em questão. Deste modo fiz uma rotina simples que vasculhava as pastas das classes entre treinamento e validação e excluía aquelas que estavam corrompidas com o auxílio da biblioteca ‘os’.

Após a exclusão das imagens corrompidas o modelo foi treinado facilmente. Criei meu modelo utilizando ‘Transfer learning’ a partir da ReseNet50. Num primeiro momento foram realizados 4 épocas de treinamento. O método ‘unfreeze()’ foi então utilizado e o modelo foi treinado por mais 4 épocas. Este treinamento foi realizado com a minha própria GPU, as épocas de treinamento levaram em torno de 5min e 20s e o modelo atingiu 96% de precisão. Observando a matriz confusão após o treinamento é visto que a maior dificuldade do modelo é em separar as classes ‘gravura’ e ‘desenho’, onde 16 gravuras foram classificadas como desenhos e 8 desenhos como gravuras.

No mais o classificador com a acurácia de 96% se mostrou uma ótima alternativa na classificação de imagens de obras de arte e fiquei muito satisfeito com o resultado.

--

--