Google Vision API

Continuando as postagens relacionadas a machine learning, agora vamos falar sobre a identificação de objetos em fotos. Para tal, vamos utilizar uma API do Google Cloud Plataform: a Cloud Vision API. Diferente do que acontece com o Microsoft Cognitive Services (MCS), onde temos APIs diferentes para cada tipo de objetivo, o Google agrupou tudo em uma única API, permitindo detectar faces (mas não identifica-los), descrever imagens e até mesmo dizer o local onde a foto foi tirada. Na postagem, vamos dar uma visão geral das principais funcionalidades da API.

Assim como acontece no MCS, para utilizar a API é necessário realizar um cadastro e obter uma chave de identificação. O próprio Google fornece um tutorial de como obter essa chave, que você pode encontrar nesse link. Uma desvantagem é que para obter a chave é necessário informar um cartão de crédito, mas não se preocupem, pois o uso dessa API é gratuito para pequenas quantidades de solicitações. Uma das vantagens desta API é que a foto não precisa estar hospedada em nenhum servidor para ser analisada, podendo ser enviada junto com o comando, e outra é que todas análises são solicitadas pelo mesmo comando, tendo que especificar somente qual tipo análise você quer através do parâmetro features. As opções são:

FACE_DETECTION: Para detectar face
LANDMARK_DETECTION: Para identificar estruturas naturais ou arquitetônicas populares
LOGO_DETECTION: Para identificar logos
LABEL_DETECTION: Para descrever elementos/objetos
TEXT_DETECTION: Para leitura de texto (OCR)
SAFE_SEARCH_DETECTION: Para avaliar o conteúdo da foto (adulto, editado, medicinal e violência)
IMAGE_PROPERTIES: Propriedades da imagem (como cor dominante)

Identificando pessoas em fotos

Dando sequência à postagem anterior, vamos falar um pouco agora sobre outra API do Microsoft Cognitive Services: a Face API. Esta API tem como finalidade detectar rotos em fotos e analisa-los, podendo descrever características do rosto (como gênero, idade estimada, se a pessoa está de óculos, ...), informar localização de elementos faciais (olhos, boca, nariz, ...) até identificar a pessoa, comparando com rostos previamente cadastrados. Nesta postagem vamos mostrar essas 3 funcionalidades, mas dando mais ênfase na identificação de rostos.

Antes de começar, é necessário solicitar acesso à API - basta entrar no MCS e clicar em Get started for free, selecionar a API Face - Preview e no final da página aceitar os termos de serviço e clicar em Subscribe (caso você queira rodar o código disponibilizado no final da postagem, aconselho fazer o registro antes da leitura, pois demora alguns minutos para efetivar). Você deve terminar em uma página parecida com isso:

Como exemplo, usarei fotos dos atores/personagens do último filme do Harry Potter (juro que pensei em algo mais recente, mas não achei muitas fotos do elenco de Stranger Things). A ideia é cadastrar os 3 principais personagens e tentar identifica-los em fotos com outros personagens. Para tal, temos que seguir as seguintes etapas (que serão explicadas com mais detalhes logo após a enumeração):
  1. Criar um grupo de pessoas
  2. Criar uma pessoa no grupo
  3. Associar uma face a pessoa (pode ser repetido diversas vezes para a mesma pessoa)
  4. Treinar para reconhecer os rostos das pessoas no grupo
  5. Identificar pessoas nas fotos 
Continue lendo para ver como podemos fazer esses passos no R!

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.

Lendo arquivos OFX no R

Há um tempo atrás, a Nubank (se você não sabe o que é Nubank, deveria) postou em sua página que era possível exportar as faturas fechadas, para serem levadas a programas de organização financeira. Apesar de não usar nenhum programa do tipo, resolvi dar uma olhada no arquivo disponibilizado. Admito que esperava encontrar um arquivo amigável e de fácil manipulação no R, ou até mesmo no Excel. Mas o que encontrei foi um arquivo no formato OFX. 

Coletando dados do Facebook

Em nossas últimas postagens mostramos duas maneiras de extrair informações de sites: através do código fonte do site, manipulando diretamente no R e através do pacote RSelenium. Nesta postagem falaremos uma terceira maneira: o uso de API, exemplificando com a API do Facebook.

O Facebook permite que certos dados sejam coletados através da Graph API, permitindo com que a análise seja feita em qualquer linguagem de programação. O uso dela é bastante simples, bem documentado e possui um ambiente de teste, que permite formular e testar as querys a serem utilizadas. Agora, vamos aos exemplos!


Primeiros contatos com o RSelenium

Mostramos em nossa última postagem que é possível baixar dados/arquivos de sites através do R - o site em questão era bastante antigo e simples, o que facilitou a extração das informações desejadas. Mas e quando o site é mais complexo e necessita que algumas ações sejam feitas no site antes de baixar os dados? Recentemente me foi dada a tarefa de baixar todas as tabelas do Observatório do Trabalho de Porto Alegre - um site um pouco mais complexo, que utiliza javascript. E agora, como fazer?

A solução encontrada foi utilizar o pacote RSelenium, um pacote que permite a interação do R com um servidor Selenium, que é quem faz toda interação com o site, baseado em comandos executados no R. Com ele, é possível localizar elementos (botões, links, textos, ...) em sites através de seu id, nome, texto (e outras características) e simular clicks - também é possível a execução direta de scripts da página. A instalação do Selenium é bastante simples e pode ser feita pelo pacote do R através do comando checkForServer() - caso o comando falhe (como aconteceu comigo) você precisará baixar manualmente a versão standalone no site oficial e executar através do prompt - não tente fazer que nem eu e 'dezipar' o arquivo .jar.

Baixando e interpretando sites (ou: como fazer backup do seu fotolog) com R.

Se você usava a internet no início dos anos 2000, muito provavelmente teve - ou quis ter - um Fotolog. Como o próprio nome diz, era um blog voltado a fotografia, onde as pessoas podiam postar 1 foto por dia (ou 6, caso pagasse). Em 01/01/2016, o Fotolog encerrou suas atividades sem aviso prévio, gerando uma comoção nos mais saudosistas, voltando ao em final de janeiro com um aviso de que o site ficaria mais um mês online, permitindo que as pessoas fizessem backup. E agora que entra a parte de R da postagem.

Como já mostramos em outras postagens, o R é uma linguagem de programação bastante poderosa e versátil, podendo ser utilizada para coisas além da estatística. Por ser a única linguagem que eu domino (e por ter mais de 500 fotos no Fotolog), resolvi fazer uma função em R para fazer um backup dele, salvando foto, descrição e comentários. Pelo site ser bastante antigo, ele não possui uma API que facilitasse a minha vida, e com isso tive que interpretar a página do Fotolog com as ferramentas que o R disponibiliza, mais especificamente, com expressão regular.

Modelagem Preditiva: Aprendendo a partir dos dados

Em 2013 foi publicada uma reportagem pela Forbes onde era afirmado que machine learning era a disciplina mais popular de Stanford com 760 alunos inscritos. E o motivo pelo qual esta disciplina se tornou popular é simples: porquê machine learning funciona bem no mundo real. Ainda que machine learning seja uma área bem ampla e com diversas aplicações, existe uma especialmente interessante: A modelagem preditiva.

Predição é um dos assuntos mais intrigantes e que despertam o interesse e curiosidade humana. Desde o início dos tempos desejamos fazer predições: a condição climática para saber se o dia será propício a caça, os oráculos prevendo o futuro e as datas em que acontecerá a cheia do Rio Nilo, são exemplos de que esta sempre acompanhou os seres humanos. E utilizando técnicas de modelagem preditiva, é possível estimar predições de forma eficiente.

É possível aumentar as chances na loteria?

Sempre que o final do ano se aproxima boa parte dos brasileiros começa a pensar em uma coisa: a mega da virada. E não é a toa que isso acontece: o prêmio do ano passado chegou a R$ 264 milhões - e foi dividido entre 4 apostas. E sempre que se fala em megasena vem a pergunta: será que tem como aumentar as chances de ganhar? Existem diversos sites que dão dicas de como aumentar as chances de ganhar. Mas será que essas dicas realmente funcionam?

Boa parte das 'dicas' são baseadas nos sorteios que aconteceram anteriormente. Isto é, elas se baseio nos princípios (falhos, como vamos mostrar mais adiante) de que os sorteios não são independentes entre si ou que as bolas não possuem a mesma probabilidade de serem sorteadas (ou ambos). Os mais bizarro é que alguns locais sugerem apostar nos números que mais saíram - como se eles tivessem uma probabilidade maior de serem sorteados novamente - e outros nos números que menos saíram - como se eles tivessem que sair agora, já que todos deveriam ser sorteados em quantidades iguais. Mas será que isso funcionaria? Do sorteio 1 (11/3/96) ao 1761 (14/11/2015), as 6 dezenas mais e menos sorteadas (e a quantidade de vezes sorteadas) foram:

  • Menos sorteadas:  26 (141), 22 (142), 55 (150), 21 (152), 39 (154) e 09 (155)
  • Mais sorteadas: 33 (196), 42 (196), 04 (197), 53 (201), 51 (202) e 05 (206)
Se alguém tivesse apostado nesses números desde o início da loteria, nunca  teria ganho nada. Nada mesmo, nem a quadra - os menos sorteadores acertaram 3 números 10 vezes, enquanto os mais sorteados 31. Essa diferença é facilmente explicada: afinal de contas, estou comparando no passado os números mais e menos sorteados no passado. Como disse anteriormente, esses palpites se baseiam em:
  1. As bolas não possuem a mesma probabilidade de serem sorteadas: Essa hipótese pode facilmente ser testada pelo teste Qui-Quadrado (H0: As bolas possuem mesma probabilidade de serem sorteadas; H1: Pelo menos 1 bola possui probabilidade diferente de ser sorteada que as demais). O valor-p encontra foi 0,1174 e, portanto, não é possível rejeitar H0.
  2. Os sorteios não são independentes entre si: Essa hipótese é mais difícil de ser testada por não ter um teste específico para tal. A opção que eu utilizei foi verificar se a quantidade de sorteios entre 2 aparições do mesmo número seguia distribuição geométrica (H0: Os dados seguem distribuição geométrica com probabilidade de sucesso igual a 0,1; H1: Os dados não seguem distribuição geométrica com probabilidade de sucesso igual a 0,1). Novamente, não foi possível rejeitar a H0 (valor-p igual a 0,2432) 

Uma nova maneira de ler dados externos

Há cerca de 2 anos atrás postei uma pergunta no StackOverflow (caso não conheça, leia esta postagem nossa) perguntando como podia fazer para ler grandes bancos de dados, de cerca de 600mb - esse era meu primeiro contato com bancos grandes, provenientes do Censo Escolar. Das duas respostas dadas na época, a que mais me agradou usava o pacote sqldf, que utiliza SQL para fazer a leitura e manipulação de fontes externas de dados.

Há pouco mais de 1 mês um usuário postou uma nova resposta à pergunta, utilizando o pacote readr. O pacote é um dos muitos pacotes criados/mantidos por Hadley Wickham - que criou, além desse e do ggplot2, mais de 50 pacotes para o R - o que significa que vale a pena dedicarmos um tempo para estudarmos o pacote.

O pacote possui sua própria versão dos comandos read.delim() (e, de quebra, read.table(), read.csv() e read.csv2()) e read.fwf() - para arquivos de largura fixa (fixed width formated), com sintaxes e nomes praticamente idênticas aos do pacote base - basta trocar o . por _ na função. Além do ganho de velocidade frente à outros pacotes disponíveis (link - note que há referência a mais um pacote do Hadley, o stringi), vale a pena destacar dois pontos : 1) ele possui uma progressbar (não funciona muito bem no Windows, mas está la!); 2) nos arquivos de largura fixa é possível ler somente as variáveis de interesse, e não todo o banco.

E você, utiliza outro pacote do Hadley, ou conhece algum pacote que valha a pena 'perder tempo' estudando? Tem sugestão de outros pacotes que merecem uma postagem? Deixe seu comentário!