Análise das emoções de Aécio Neves

Por Julio 15/04/2017

Aécio Neves é um político importante no Brasil. Por muito pouco não foi eleito Presidente da República em 2014 e é certamente um nome bem influente na atualidade. Mas sério, toda vez que eu vejo esse cara falando, não dou a mínima para quem ele é. Eu apenas fico pensando: ‘Por que ele sempre faz tanta cara de dor?’

Pensando nisso, decidi pegar algumas fotos famosas dele e aplicar um algoritmo de Inteligência Artificial para reconhecimento de emoções. Se minha hipótese estiver correta, provavelmente esse algoritmo retornaria emoções como “dor”, “tristeza” ou “descontentamento”.

A API escolhida para essa tarefa foi a Microsoft Emotions API. O motivo por trás da escolha não é nada especial: foi o primeiro resultado que apareceu no Google para mim!

As imagens utilizadas para testar o algoritmo contra minha hipótese são essas aqui:

Obtenção das emoções

Pacotes carregados para essa análise:

library(tidyverse)
library(httr)
library(forcats)
library(grid)
library(gridExtra)

Para obter os resultados, foi necessário entrar na página de APIs de visão da Microsoft e obter uma chave de acesso, guardando-a no objeto key. Depois disso, montei a função pegar_emocoes(), que recebe a URL de uma imagem da internet e uma chave de acesso, e retorna uma tibble com as proporções das emoções em cada coluna.

pegar_emocoes <- function(u_img, key) {
  u_api <- 'https://westus.api.cognitive.microsoft.com/emotion/v1.0/recognize'
  result <- httr::POST(
    url = u_api,
    httr::content_type('application/json'), 
    httr::add_headers(.headers = c('Ocp-Apim-Subscription-Key' = key)),
    body = list(url = u_img),
    encode = 'json'
  )
  tibble::as_tibble(httr::content(result, 'parsed')[[1]]$scores)
}

Finalmente, apliquei a função num vetor de links usando o funcional purrr::map_df. Como resultado, temos essa base de dados:

d_emocoes <- map_df(u_imagens, pegar_emocoes, key = key, .id = 'id')
id anger contempt disgust fear happiness neutral sadness surprise
1 0.0004080 0.0000004 0.0000960 0.0000001 0.9994901 0.0000018 0.0000025 0.0000011
2 0.1466579 0.1385524 0.1392320 0.0000411 0.2569676 0.3143989 0.0032987 0.0008515
3 0.0759952 0.0321533 0.0072514 0.0000727 0.0007214 0.6251250 0.2585501 0.0001311
4 0.0772784 0.1994352 0.0216270 0.0008681 0.0124632 0.6709319 0.0042846 0.0131115
5 0.0476197 0.0467561 0.0026372 0.0000568 0.0008743 0.8483697 0.0532359 0.0004504
6 0.2786264 0.0922678 0.0087203 0.0119777 0.0000222 0.4820632 0.0069891 0.1193333

Resultados

A Figura 1 mostra a média de cada emoção nas seis fotos. Para minha surpresa, a emoção com maior proporção média foi “neutro”, com peso de quase 50%. As emoções seguintes são “felicidade”, “raiva” e “desdém”. A emoção “tristeza”, que achei que seria frequente por conta da cara de dor do Aécio, ficou com uma proporção média de apenas 5,5%.

Média de cada emoção nas seis fotos baixadas.

Figure 1: Média de cada emoção nas seis fotos baixadas.

A Figura 2 mostra os resultados individuais das imagens. O primeiro resultado faz sentido, já que o Aécio está nitidamente rindo. Em todos os casos, é possível interpretar os resultados olhando a imagem. Por exemplo, o caso com “tristeza” mais alto é o que observamos as sombrancelhas mais caídas.

Emoções do Aécio em cada imagem.

Figure 2: Emoções do Aécio em cada imagem.

Conclusão

Aparentemente minha hipótese estava errada. Aécio é um cara neutro e feliz, com acessos raiva de vez em quando (por favor, não interprete isso seriamente, é uma brincadeira!). Mas, sinceramente, achei que faltou na API uma emoção “cara de dor” para captar perfeitamente a expressão do Aécio. De qualquer forma, foi uma análise rápida e muito divertida de fazer. Se quiser replicá-la para outras imagens, acesse o código fonte no repositório do GitHub que gera esse site.

É isso. Happy coding ;)

comments powered by Disqus