Anime ou Cartoon? Como um Modelo de Rede Neural Convolucional pode nos Ajudar a Identificá-los Corretamente

Cláudio Henrique
8 min readJan 1, 2024

--

Muitas pessoas simplesmente chamariam ambos de “desenho”. Você consegue diferenciar um anime de um cartoon? Embora ambos se enquadrem na categoria de animações feitas à mão ou em 3D, as nuances entre animes, originários da cultura japonesa, e cartoons, em sua maioria provenientes dos Estados Unidos, vão além de uma questão cultural. Os estilos de animação apresentam traços distintos nos personagens. Mas se tratando de imagens, existem algumas características que diferenciam animes de cartoons. Em cartoons, a caracterização dos personagens tende a ser mais caricata. Com partes do corpo como boca, olhos e corpo bem desproporcionais à realidade, visando predominantemente à comédia. As expressões faciais e fisionomias, cenas e ambientes, são simplificadas também, focalizando a exibição frontal dos personagens. Já em animes, os personagens refletem fisionomias e estilos de vestimenta mais próximos da realidade, com expressões faciais detalhadas e cenas ricas em três dimensões, impulsionadas pela ênfase na trama, cenas de luta ou gêneros específicos.

Mas olhando apenas uma imagem, você é capaz de diferenciar? Se você for um bom otaku com certeza conseguirá distinguir. Mas e quanto a uma máquina? Ela é capaz de comparar duas imagens e identificá-las?

Como uma Máquina Pode ser Capaz de Analisar uma Imagem?

Diferentemente dos humanos, as máquinas não possuem um senso crítico. Elas não conseguem discernir informações abstratas, como olhos grandes, cabelo espetado ou cabeça grande. O entendimento de uma máquina resume-se a valores numéricos. Na verdade, é assim que uma imagem é interpretada por um computador. O processamento de uma imagem ocorre da seguinte maneira: a tela é dividida em pixels, que são pequenos quadrados. Em seguida, a tela é organizada em linhas e colunas, assemelhando-se a uma tabela no Excel. Cada quadrado (pixel) é preenchido com uma cor, e, ao final, esses pequenos quadrados formam uma imagem. O exemplo abaixo ilustra esse processo de maneira simplificada:

No exemplo, cada pixel é preenchido com um valor variando de 0 a 255. Cada valor representa a intensidade do pixel em uma imagem em escala de cinza, onde 255 indica a intensidade máxima (branco) e 0 indica a intensidade mínima (preto). O exemplo acima demonstra como a uma imagem pode ser exibida na tela. Entretanto, quanto à forma como ela é interpretada pelo computador: a imagem é carregada em formato de matriz, que é um vetor de vetores. Cada vetor dentro da matriz contém os valores equivalentes às colunas do exemplo anterior.

Todo esse conjunto de valores Representa uma imagem que nós sabemos que é a representação do número 1. Embora este seja um exemplo básico em tons de cinza, imagens mais complexas podem conter milhares de pixels. O objetivo é apenas destacar que são esses padrões numéricos que dão formas às imagens como nós a compreendemos, e podem ser analisados por um modelo de inteligência artificial para que ele aprenda esses padrões e possa identificá-los através de características específicas que uma imagem pode ter.

Como um Modelo De Inteligência Artificial Pode Ser Capaz de Classificar uma Imagem Como Anime ou Cartoon?

Destacamos anteriormente as características particulares dos estilos de animação em animes e cartoons. Além disso, compreendemos que, para um computador, elementos como formato de um objeto, cor e detalhes em uma imagem são traduzidos em valores numéricos representados por pixels. O ponto onde queremos chegar é que, podemos procurar por formas em uma imagem, que podem caracterizá-las como anime ou cartoon. Veja no exemplo abaixo. Essa imagem contém formas como a de uma cabeça, olhos, nariz, orelhas e boca.

Veja que todas as imagens que iremos usar para treinar o nosso modelo deverão possuir esses padrões que foram destacados no exemplo acima. Elas devem apresentar formas semelhantes a uma cabeça, boca, olhos e nariz. É claro que isso são apenas características básicas que serão identificadas pelo modelo. Ao processar várias imagens, o modelo identificará centenas de outras características. Assim, a medida que mais imagens são vistas, o modelo se torna capaz de identificar padrões e classificar uma imagem corretamente.

Carregando um Conjunto de Dados

Para que um modelo de inteligência artificial seja capaz de aprender a identificar padrões em imagens, é essencial contar com um conjunto de dados abrangente, composto por centenas e milhares de imagens representativas do que desejamos treinar. Então como primeiro passo vamos carregar um conjunto de dados contendo imagens de animes e cartoons. Vamos importar um arquivo compactado contendo as imagens. Nele temos dois diretórios, cada um com seus arquivos de imagens: animes e cartoons

Agora vamos carregar exclusivamente as imagens do diretório destinado aos animes. Essas imagens serão transformadas em matrizes para análise posterior pelo nosso modelo. Um detalhe é que estamos definindo um rótulo para essas imagens. Os animes conterão o valor 0 como rótulo. Assim, durante o treinamento do modelo, especificaremos que imagens rotuladas como 0 são representativas de animes, instigando o modelo a classificá-las adequadamente.

Repetimos o mesmo passo com as imagens de cartoons. A diferença é que eles possuirão como rótulo o valor 1.

Dividir os Dados Entre Teste e Treino

Um passo importante ao tentar treinar um modelo, é separar o conjunto de dados em duas partes: treino e teste. Isso é importante porque usamos uma parte desses dados para que o modelo possa aprender a classificar as imagens. E após termos treinado o modelo, queremos testá-lo para garantir que ele está funcionando corretamente. Na fase de teste, é fundamental empregar um conjunto de dados diferente do utilizado no treinamento. Isso é essencial pois verificamos se o modelo realmente aprendeu a classificar a imagem ou se ele apenas está memorizando padrões específicos do conjunto de dados de treino.

Treinar o Modelo

Como ponto de partida para o treinamento do modelo, precisamos definir uma arquitetura que seja adaptada ao problema em questão. A arquitetura é construída e ajustada de acordo com os resultados obtidos à medida que treinamos o modelo. Em nosso trabalho, optamos por utilizar uma arquitetura elaborada por Kanak Mittal especificamente para esse problema, disponível no seguinte link: repositório no kaggle.

Esta é uma arquitetura de rede neural convolucional (CNN), implementada utilizando as bibliotecas TensorFlow e Keras. Basicamente, ela está dividida em duas partes. Na primeira parte, encontram-se as camadas convolucionais, enquanto na segunda parte estão as camadas densas.

Camadas convolucionais:

  • Responsáveis por processar os dados de entrada, que são tipicamente imagens representadas como matrizes (neste caso, de dimensão 128x128x4, onde 4 representa os canais RGBA).
  • Extraem características espaciais das imagens, como bordas, texturas, ou outras características locais importantes.

Camadas densas:

  • Analisam as características previamente extraídas pelas camadas convolucionais.
  • Os neurônios nestas camadas estão conectados a todos os neurônios na camada anterior, o que permite que o modelo aprenda padrões e faça previsões finais.

Agora que a arquitetura foi definida, podemos treinar o modelo. Para isso, algumas configurações importantes precisam ser feitas. Utilizamos callbacks, que são funções executadas em cada época. A primeira callback interrompe o treinamento do modelo se a métrica monitorada ‘val_accuracy’ não mostrar melhora após um determinado número de épocas:

A próxima callback salvará o modelo no final de cada época se a métrica monitorada ‘val_accuracy’ melhorar. Caso contrário, mantém o modelo como está:

Por último, treinamos o modelo, definindo que ele será executado por um total de 100 épocas. Cada época corresponde a uma passagem completa pelo conjunto de dados de treinamento. Além disso, utilizamos o conjunto de dados de validação, que é uma pequena porção separada anteriormente para validar os resultados obtidos durante cada época de treinamento. Esses dados são importantes para que o modelo possa se ajustar e validar se os resultados obtidos durante cada época de seu treinamento estão corretos:

Pipeline

Após todo o treino do modelo, por motivos de usabilidade decidimos adicionar o modelo já treinando dentro de um objeto pipeline da biblioteca sklearn, junto a uma classe normalizadora que será utilizada para normalizar os dados de entrada do pipeline no formato que o nosso modelo necessita como entrada, assim não necessitamos fazer todo aquele tratamento com o dado antes de tentarmos predizer o seu resultado já que essa vai ser uma função da classe normalizadora presente no pipeline.

Adicionando tanto a classe normalizadora quanto o modelo no nosso pipeline:

Testando a Eficiência do Modelo

Após completar o treinamento e realizar alguns ajustes para garantir um desempenho satisfatório. Salvamos o modelo com o estado em que obtivemos melhor resultado e partimos para a última etapa, que é testar como ele se comporta analisando valores de um conjunto de dados aos quais ele nunca viu.

Nosso modelo alcançou uma precisão de aproximadamente de 88%

Considerações Finais

Durante este trabalho analisamos dois estilos de animações diferentes: animes e cartoons. Cada um com suas características particulares. Vimos também, como esses detalhes em uma imagem são traduzidos em padrões numéricos por meio de matrizes. E empregando uma arquitetura de rede neural convolucional, destacamos a capacidade das camadas convolucionais e densas na extração e análise dessas características.

Ao treinar e ajustar o modelo, testamos sua eficácia, alcançando uma precisão de aproximadamente 88% ao analisar imagens não vistas anteriormente.

Este trabalho evidencia o potencial das técnicas de inteligência artificial na classificação de imagens e como podemos fazer uso disso até mesmo em áreas como a arte e cultura. Agora da próxima vez em que você escutar aquele seu parente como pai, mãe ou esposo(a) chamando qualquer um desses estilos de animação como “desenho”, você pode executar este algoritmo para ele(a) e mostrar que não são a mesma coisa.

Créditos

Meu linkedin: linkedin.com/in/claudio-henrique-8047a7266

Minha conta no github: github.com/ClauHenrique

Linkedin de Valmir: linkedin.com/in/valmir-francisco-581222288

github de Valmir: github.com/valfra0425

Arquivos

Repositório contendo os notebooks com todas as implementações desse artigo: github.com/valfra0425/cnn_animation

Dataset: kaggle.com/datasets/kanakmittal/anime-and-cartoon-image-classification/data

--

--