Encontrando o Wally com CreateML

Luma Gabino
Academy@EldoradoCPS
6 min readAug 24, 2020

Como Object Detection e o CreateML podem ser usados para localizar "Onde Está Wally?"

Esse artigo é um tutorial de como gerar um modelo de aprendizado para encontrar o Wally nas imagens do ilustrador Martin Handford. Para isso usaremos o CreateML, que permite isso de uma forma muito simples, abstraindo toda a criação de um modelo em uma ferramenta bastante visual e sem a necessidade de se escrever códigos.

Conjunto de dados

Inicialmente, o mais importante é encontrar um conjunto de dados para usarmos no treinamento do modelo. Nesse caso precisamos de imagens e suas respectivas anotações indicando onde o Wally se encontra em cada uma.

Encontrar ou criar um bom dataset para o problema que queremos resolver pode ser um grande desafio. É necessário se atentar para a quantidade de dados, se não possuem informações faltantes, se há variedade suficiente para evitar a indução de viés no aprendizado, se existem formas de visualização dessas informações, dentre outras questões que podem ser mais ou menos relevantes de acordo com o contexto do problema.

Por sorte, o artigo How to Find Wally with a Neural Network, que explica como treinar uma Rede Neural para esse mesmo problema utilizando TensorFlow, possui um ótimo conjunto de dados e podemos aproveitá-lo e adaptá-lo para o uso na ferramenta CreateML.

Anotações

A principal adequação a ser feita se deve às anotações das imagens no projeto que estamos nos baseando, elas estão em formato de uma planilha .csv, porém o CreateML se orienta por um arquivo .json. Neste arquivo devemos ter, para todas as imagens, a sua identificação, o label referente a que objeto estamos tentando detectar, as coordenadas x e y do centro da região anotada e a largura e altura dessa região.

A anotação acima se refere a imagem abaixo. Podemos ver, ao aproximar a região demarcada, um retângulo verde com as orientações do centro (x,y), e da largura e altura (width, height).

Para fazer tais anotações precisamos marcar, uma por uma, todas as imagens do nosso conjunto de treino e isso pode ser bastante demorado. Felizmente, existem algumas ferramentas e artigos que nos ajudam nesse processo:

Training the model

  1. Crie um novo projeto no CreateML e selecione a opção Object Detector

2. Dê um nome a seu projeto

3. Escolha uma pasta para armazenar seu projeto

4. Arraste ou selecione a pasta com todas as imagens que serão usadas no treinamento e o arquivo annotations.json mostrado na etapa anterior desse tutorial

5. E aperte o botão Train! ▶️

Também podemos selecionar um conjunto de imagens para a validação e teste e o número de iterações de treino. Mas para um primeiro momento não é necessário, podemos deixar no automático e rodar.

6. Agora seu modelo já está em treinamento 🥳. Essa etapa pode demorar um bom tempo mas é possível acompanhar as métricas e evolução do modelo na aba Training.

Sobre o tempo de treinamento, fiz dois testes - o primeiro deixando o computador rodar apenas o CreateML que resultou em um treinamento de 3h30 e outro durante uso intenso de outras aplicações que resultou em 8h20. Então, uma recomendação é deixar o CreateML rodando durante um período de menor uso do computador, assim o treinamento será mais rápido e exigirá menos de sua máquina.

(Aproveitando o tempo de espera rs) É importante entender o que essa ferramenta está fazendo por trás de toda essa praticidade e “rapidez” de uso. A técnica utilizada é conhecida como transfer learning, e consiste no aproveitamento de um aprendizado já existente para um problema para a resolução de outro problema. Assim, um modelo de detecção de objetos mais genérico e com bons resultados é usado como base para os novos dados que foram passados. O treinamento passa a demandar uma quantidade de dados e de tempo bastante reduzidos em comparação ao modelo base.

Outro ponto importante é sobre a métrica apresentada, chamada de loss. A loss (perda, em português) é a penalidade sobre quão ruim é a previsão. No modelo em treinamento, diz para uma imagem o quão longe está do alvo. Logo, em um modelo sem erros a loss vale 0 (zero), e caso contrário ela será maior. Quando acompanhamos uma curva descendente estamos, na verdade, vendo o modelo melhorar.

É importante lembrar que uma loss muito próxima do 0 (zero) pode indicar algo ruim, como um excesso de especialização. Seu modelo pode se tornar muito bom apenas para as poucas imagens de treino e insuficiente para outras imagens diferentes, efeito conhecido como overfitting.

7. Quando finalizar, será possível ver o campo Metrics.

Ao final, obtivemos uma loss de 0,62 e uma curva que demonstra a evolução do modelo ao longo das iterações. Além disso, 57% de desempenho geral, valor que para a detecção de objetos tem potencial para melhorar.

Se existissem mais classes de objetos a serem identificados, elas seriam listadas na tabela Metrics e seria válido comparar esse valor para cada uma, verificando se esse desempenho ocorre de forma equilibrada entre as classes ou se há alguma que não obteve um bom desempenho (que poderia, por exemplo, ser corrigido com mais imagens dessa classe).

8. Para obter o modelo no formato .mlmodel que pode ser utilizado nas aplicações por meio integração feita pelo CoreML, basta ir na aba Output e arrastar o ícone do modelo para algum local de escolha e pronto.

Resultados

Para testar basta arrastar alguma imagem ou pasta com imagens para a região em destaque abaixo.

Seguem alguns resultados encontrados:

Para o teste, é importante buscar imagens que mostrem se o modelo generalizou bem. Nos exemplos anteriores temos imagens onde o Wally aparece de forma bem nítida e grande e outros em que está pequeno e a resolução é baixa. Esse tipo de variedade de imagens de teste irá mostrar onde o modelo não é suficiente e poderia melhorar, guiando para novos testes e aperfeiçoamento do próprio treinamento.

De forma geral, os resultados apresentados foram bastante satisfatórios, sendo que, na maioria das imagens, o Wally é encontrado com uma boa precisão de localização. Em algumas poucas não foi encontrado, ou a marcação da região está próxima mas não exatamente enquadrando o personagem.

Essa foi só uma demonstração de como é possível utilizar a ferramenta CreateML para a detecção de objetos, mas existem várias outras possibilidades com igual facilidade e praticidade, sendo elas:

  • Image Classifier
  • Sound Classifier
  • Activity Classifier
  • Text Classifier
  • Word Tagger
  • Tabular Regressor
  • Tabular Classifier
  • Recommender

O conjunto de dados utilizados e o modelo gerado podem ser acessados no GitHub. Espero que esse tutorial tenha ajudado!

Referências

Agradecimentos à Sergio Ordine!

--

--