Identificando emoções em fotos

Não é novidade para nós que trabalhamos com análise de dados que a área de Machine Learning (ou no bom português, aprendizado de máquina) está evoluindo rapidamente, mas o que muitos podem desconhecer é que este conhecimento está ao alcance de todos, e muitos de forma gratuita (mesmo que limitada). Nesta postagem vamos falar um pouco sobre o Microsoft Cognitive Services, mais especificamente sobre a Emotion API, uma API que permite a análise de emoções em fotos e vídeos - mas vamos focar, por ora, só em fotos.
A Emotion API é bastante simples de ser utilizada, a apresenta apenas 3 opções de comandos: 
  1. Emotion Recognition, para identificação de faces em fotos e análise da emoção delas (que usaremos nesta postagem);
  2. Emotion Recognition in Video, para identificação de faces em vídeos e análises das emoção delas;
  3. Emotion Recognition with Face Rectangles, para análise da emoção de faces informadas previamente.
Os comandos para análise em foto retornam o resultado no momento da solicitação (claro, com um pequeno delay) e o de vídeo retorna um link que deve ser consultado após, e que expira em 24 horas. No final da página de cada um dos comandos há exemplos de como utilizar a API em diversas linguagens de programação. Nesta postagem usaremos somente o R para interagir com a API, através do pacote httr. Para usar as API do MCS, você deve fazer uma conta gratuita e solicitar acesso as APIs desejadas - a quantidade de uso gratuito é limitada, mas para usuários comuns a quota gratuita é mais que suficiente (para a Emotion API, 30.000 solicitações/mês, sendo 20 por minuto). O segundo passo necessário é... escolher uma foto! Essa foto precisa estar hospedada em algum servidor da internet. No nosso exemplo, usaremos a foto do funeral do ministro do STF Teori Zavascki desta matéria do G1.

Foto: REUTERS/Diego Vara TPX IMAGES OF THE DAY

Após requisitarmos acesso à API e hospedarmos a foto, a análise é bastante simples, como pode ser vista no comando abaixo.

urlFoto <- 'https://goo.gl/dW5x1r'
apiUrl <- "https://westus.api.cognitive.microsoft.com/emotion/v1.0/recognize"
key <- '4605b13b949f4bc7ad5f3f43476408ab'
mybody <- list(url = urlFoto)
# Request data from Microsoft AI
faceEMO <- httr::POST(
  url = apiUrl,
  httr::content_type('application/json'),
  httr::add_headers(.headers = c('Ocp-Apim-Subscription-Key' = key)),
  body = mybody,
  encode = 'json'
)


O objeto faceEMO é de classe 'response' - não vamos entrar em muitos detalhes sobre essa classe. Para obter o resultado da análise da API, podemos usar o comando content(faceEMO), que nos retornará uma lista com 12 elementos não nominados, sendo cada elemento uma lista de 2 elementos nominados faceRectangle e score - onde ele se localiza na foto e a pontuação de cada emoção. Isso significa que na foto em questão foram identificados 12 faces (o limite da API são 64 faces), sendo que para cada face é informado o retângulo onde ela se encontra e o score de cada emoção analisada (raiva, desprezo, desgosto, medo, felicidade, neutro, tristeza e surpresa). No caso, as faces identificadas foram:

Foto: REUTERS/Diego Vara TPX IMAGES OF THE DAY - A ordem dos rotos é definida pela área do retângulo


Identificados os rostos, agora só falta identificar a emoção expressa por ele. Os scores informados estão padronizados no intervalo de 0 a 1, de maneira que a soma de todos é igual a 1. Na figura abaixo está a pontuação de cada uma das 8 emoções analisadas.


Nos 12 rostos identificados, a emoção que mais pontuou foi a de neutralidade, sendo que a segunda que mais pontuou variava entre raiva e tristeza na maioria dos casos. A seguir mais algumas fotos e a tabela da pontuação de cada emoção.

Foto 2: Refugiados

Retirado de: http://www.esquerda.net/artigo/refugiados-urgencia-da-solidariedade/44444



Foto 3: Premiação Copa do Mundo
Retirado de: http://www.bbc.co.uk/sport/football/world-cup/2014




E aí, o que achou dessa API? Como podemos ver na última foto, ela ainda tem bastante a evoluir (pelo menos eu acredito que não tenha ninguém com raiva nessa foto, mas vai saber...). Os códigos utilizados na postagem estão no GitHub. Em breve estaremos postando como identificar emoções em vídeos com a mesma API. Dúvidas? Sugestões? Deixe seu comentário!

Um comentário:

  1. Realmente bem interessante o serviço. Nunca tinha ouvido falar.

    ResponderExcluir