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%.
## Warning: `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> =
## "none")` instead.
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.
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 ;)