Aécio Neves é um político importante no Brasil, agora como todos sabem está no centro das atenções. 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
Como dito, para utilizar tal API utilizamos a linguagem R e os pacotes carregados para essa análise foram:
library(tidyverse) library(httr) 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.
## recomendo adicionar a API key no arquivo ~/.Renviron ## EMOTION_API=<sua_key> ## (necessário pular linha no final do arquivo) key <- Sys.getenv('EMOTION_API') d_emocoes <- map_df(u_imagens, pegar_emocoes, key = key, .id = 'id')
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%.
Figura 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 sobrancelhas mais caídas.
Figura 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 😉
Até,
Julio Trecenti – Bacharel, mestre e doutorando em Estatística pelo IME-USP. Diretor-técnico da Associação Brasileira de Jurimetria (ABJ). Vice-presidente – CONRE-3a Região. Sócio da Erri consultoria – Trabalha com web scraping, consolidação de dados, visualização e modelagem, construindo modelos preditivos, APIs, pacotes em R e dashboards em Shiny.
O algoritmo funciona para várias pessoas em uma foto?