Análise de imagem poderosa com o Google Cloud Vision e Python
Publicados: 2022-03-10Recentemente, criei um aplicativo da web para gerenciar as despesas pessoais do usuário. Suas principais características são digitalizar recibos de compras e extrair dados para posterior processamento. A API do Google Vision acabou sendo uma ótima ferramenta para obter um texto de uma foto. Neste artigo, vou guiá-lo pelo processo de desenvolvimento com Python em um projeto de amostra.
Se você é um novato, não se preocupe. Você só precisará de um conhecimento muito básico dessa linguagem de programação - sem outras habilidades necessárias.
Vamos começar, vamos?
Nunca ouviu falar do Google Cloud Vision?
É uma API que permite aos desenvolvedores analisar o conteúdo de uma imagem por meio de dados extraídos. Para isso, o Google utiliza modelos de aprendizado de máquina treinados em um grande conjunto de dados de imagens. Tudo isso está disponível com uma única solicitação de API. O mecanismo por trás da API classifica imagens, detecta objetos, rostos de pessoas e reconhece palavras impressas nas imagens.
Para dar um exemplo, vamos trazer o popular Giphy. Eles adotaram a API para extrair dados de legendas de GIFs, o que resultou em uma melhora significativa na experiência do usuário. Outro exemplo é o realtor.com, que usa o OCR da API Vision para extrair texto de imagens de placas de Vende-se tiradas em um aplicativo móvel para fornecer mais detalhes sobre a propriedade.
Aprendizado de máquina em resumo
Vamos começar respondendo à pergunta que muitos de vocês provavelmente já ouviram antes – o que é o Machine Learning?
A ideia geral é desenvolver um modelo programável que encontre padrões nos dados fornecidos. Quanto maior a qualidade dos dados que você fornecer e quanto melhor for o design do modelo que você usar, o resultado mais inteligente será produzido. Com 'aprendizagem de máquina amigável' (como o Google chama seu Machine Learning por meio de serviços de API), você pode incorporar facilmente um pedaço de Inteligência Artificial em seus aplicativos.
Leitura recomendada : Introdução ao aprendizado de máquina
Como começar a usar o Google Cloud
Vamos começar com o registro no Google Cloud. O Google exige autenticação, mas é simples e indolor — você só precisará armazenar um arquivo JSON que inclua a chave de API, que pode ser obtida diretamente do Google Cloud Platform.
Baixe o arquivo e adicione seu caminho às variáveis de ambiente:
export GOOGLE_APPLICATION_CREDENTIALS=/path/to/your/apikey.json
Como alternativa, no desenvolvimento, você pode se sustentar com o método from_serivce_account_json()
, que descreverei mais adiante neste artigo. Para saber mais sobre autenticação, confira a documentação oficial do Cloud.
O Google fornece um pacote Python para lidar com a API. Vamos adicionar a versão mais recente do google-cloud-vision==0.33 ao seu aplicativo. Hora de codificar!
Como combinar o Google Cloud Vision com Python
Primeiramente, vamos importar classes da biblioteca.
from google.cloud import vision from google.cloud.vision import types
Quando isso for resolvido, agora você precisará de uma instância de um cliente. Para fazer isso, você usará um recurso de reconhecimento de texto.
client = vision.ImageAnnotatorClient()
Se você não armazenar suas credenciais em variáveis de ambiente, nesta etapa você poderá adicioná-las diretamente ao cliente.
client = vision.ImageAnnotatorClient.from_service_account_file( '/path/to/apikey.json' )
Supondo que você armazene imagens para serem processadas em uma pasta 'imagens' dentro do seu catálogo de projetos, vamos abrir uma delas.
image_to_open = 'images/receipt.jpg' with open(image_to_open, 'rb') as image_file: content = image_file.read()
O próximo passo é criar um objeto Vision, que permitirá enviar uma solicitação para prosseguir com o reconhecimento de texto.
image = vision.types.Image(content=content) text_response = client.text_detection(image=image)
A resposta consiste em palavras detectadas armazenadas como chaves de descrição, sua localização na imagem e uma previsão de idioma. Por exemplo, vamos dar uma olhada na primeira palavra:
[ ... description: "SHOPPING" bounding_poly { vertices { x: 1327 y: 1513 } vertices { x: 1789 y: 1345 } vertices { x: 1821 y: 1432 } vertices { x: 1359 y: 1600 } } ... ]
Como você pode ver, para filtrar apenas texto, você precisa obter uma descrição “em todos os elementos”. Felizmente, com a ajuda vem a poderosa compreensão de lista do Python.
texts = [text.description for text in text_response.text_annotations] ['SHOPPING STORE\nREG 12-21\n03:22 PM\nCLERK 2\n618\n1 MISC\n1 STUFF\n$0.49\n$7.99\n$8.48\n$0.74\nSUBTOTAL\nTAX\nTOTAL\nCASH\n6\n$9. 22\n$10.00\nCHANGE\n$0.78\nNO REFUNDS\nNO EXCHANGES\nNO RETURNS\n', 'SHOPPING', 'STORE', 'REG', '12-21', '03:22', 'PM', 'CLERK', '2', '618', '1', 'MISC', '1', 'STUFF', '$0.49', '$7.99', '$8.48', '$0.74', 'SUBTOTAL', 'TAX', 'TOTAL', 'CASH', '6', '$9.', '22', '$10.00', 'CHANGE', '$0.78', 'NO', 'REFUNDS', 'NO', 'EXCHANGES', 'NO', 'RETURNS']
Se você olhar com atenção, poderá notar que o primeiro elemento da lista contém todo o texto detectado na imagem armazenada como uma string, enquanto os demais são palavras separadas. Vamos imprimir.
print(texts[0]) SHOPPING STORE REG 12-21 03:22 PM CLERK 2 618 1 MISC 1 STUFF $0.49 $7.99 $8.48 $0.74 SUBTOTAL TAX TOTAL CASH 6 $9. 22 $10.00 CHANGE $0.78 NO REFUNDS NO EXCHANGES NO RETURNS
Bem preciso, certo? E obviamente bastante útil, então vamos jogar mais.
O que você pode obter do Google Cloud Vision?
Como mencionei acima, o Google Cloud Vision não se trata apenas de reconhecer texto, mas também permite descobrir rostos, pontos de referência, propriedades de imagem e conexões da Web. Com isso em mente, vamos descobrir o que ele pode dizer sobre as associações da imagem na web.
web_response = client.web_detection(image=image)
Ok Google, você realmente sabe o que é mostrado na imagem que recebeu?
web_content = web_response.web_detection web_content.best_guess_labels >>> [label: "Receipt"]
Bom trabalho, Google! É um recibo mesmo. Mas vamos fazer um pouco mais de exercício – você consegue ver mais alguma coisa? Que tal mais previsões expressas em porcentagem?
predictions = [ (entity.description, '{:.2%}'.format(entity.score))) for entity in web_content.web_entities ] >>> [('Receipt', '70.26%'), ('Product design', '64.24%'), ('Money', '56.54%'), ('Shopping', '55.86%'), ('Design', '54.62%'), ('Brand', '54.01%'), ('Font', '53.20%'), ('Product', '51.55%'), ('Image', '38.82%')]
Muitos insights valiosos, muito bem, meu amigo todo-poderoso! Você também pode descobrir de onde vem a imagem e se ela tem cópias?
web_content.full_matching_images >>> [ url: "https://www.rcapitalassociates.com/wp-content/uploads/2018/03/receipts.jpg", url:"https://media.istockphoto.com/photos/shopping-receipt-picture-id901964616?k=6&m=901964616&s=612x612&w=0&h=RmFpYy9uDazil1H9aXkkrAOlCb0lQ-bHaFpdpl76o9A=", url: "https://www.pakstat.com.au/site/assets/files/1172/shutterstock_573065707.500x500.jpg" ]
Estou impressionado. Obrigado, Google! Mas um não é suficiente, você pode me dar três exemplos de imagens semelhantes?
web_content.visually_similar_images[:3] >>>[ url: "https://thumbs.dreamstime.com/z/shopping-receipt-paper-sales-isolated-white-background-85651861.jpg", url: "https://thumbs.dreamstime.com/b/grocery-receipt-23403878.jpg", url:"https://image.shutterstock.com/image-photo/closeup-grocery-shopping-receipt-260nw-95237158.jpg" ]
Doce! Bem feito.
Existe realmente uma inteligência artificial no Google Cloud Vision?
Como você pode ver na imagem abaixo, lidar com recibos pode ser um pouco emocional.
Vamos dar uma olhada no que a API Vision pode dizer sobre esta foto.
image_to_open = 'images/face.jpg' with open(image_to_open, 'rb') as image_file: content = image_file.read() image = vision.types.Image(content=content) face_response = client.face_detection(image=image) face_content = face_response.face_annotations face_content[0].detection_confidence >>> 0.5153166651725769
Nada mal, o algoritmo tem mais de 50% de certeza de que há um rosto na imagem. Mas você pode aprender alguma coisa sobre as emoções por trás disso?
face_content[0] >>> [ ... joy_likelihood: VERY_UNLIKELY sorrow_likelihood: VERY_UNLIKELY anger_likelihood: UNLIKELY surprise_likelihood: POSSIBLE under_exposed_likelihood: VERY_UNLIKELY blurred_likelihood: VERY_UNLIKELY headwear_likelihood: VERY_UNLIKELY ... ]
Surpreendentemente, com um simples comando, você pode verificar a probabilidade de algumas emoções básicas, bem como chapéus ou propriedades da foto.
Quando se trata da detecção de rostos, preciso direcionar sua atenção para alguns dos possíveis problemas que você pode encontrar. Você precisa se lembrar de que está entregando uma foto para uma máquina e, embora a API do Google utilize modelos treinados em grandes conjuntos de dados, é possível que ela retorne alguns resultados inesperados e enganosos. Online, você pode encontrar fotos que mostram como a inteligência artificial pode ser facilmente enganada quando se trata de análise de imagens. Alguns deles podem ser engraçados, mas há uma linha tênue entre erros inocentes e ofensivos, especialmente quando um erro diz respeito a um rosto humano.
Sem dúvida, o Google Cloud Vision é uma ferramenta robusta. Além disso, é divertido trabalhar com ele. A arquitetura REST da API e o pacote Python amplamente disponível o tornam ainda mais acessível para todos, independentemente de quão avançado você seja no desenvolvimento do Python. Imagine o quão significativamente você pode melhorar seu aplicativo utilizando seus recursos!
Leitura recomendada : Aplicações de aprendizado de máquina para designers
Como você pode ampliar seu conhecimento sobre o Google Cloud Vision
O escopo de possibilidades de aplicação do serviço Google Cloud Vision é praticamente infinito. Com a biblioteca Python disponível, você pode utilizá-la em qualquer projeto baseado na linguagem, seja uma aplicação web ou um projeto científico. Certamente pode ajudá-lo a despertar um interesse mais profundo nas tecnologias de Machine Learning.
A documentação do Google fornece algumas ótimas ideias sobre como aplicar os recursos da API Vision na prática, além de oferecer a possibilidade de aprender mais sobre o Machine Learning. Eu recomendo especialmente verificar o guia sobre como criar um aplicativo de pesquisa avançada de imagens.
Pode-se dizer que o que você viu neste artigo é como mágica. Afinal, quem imaginaria que uma API simples e de fácil acesso é apoiada por uma ferramenta científica tão poderosa? Tudo o que resta a fazer é escrever algumas linhas de código, descontrair sua imaginação e experimentar o potencial ilimitado da análise de imagens.