A Google Cloud Platform é uma plataforma de computação em nuvem criada pela empresa Google, com intuito de facilitar a execução de serviços baseados em nuvem. Junto a esta plataforma encontra-se uma ferramenta poderosa chamada Google Vision. A ferramenta conta com aprendizado de máquina e inteligência artificial. O recurso encapsula modelos avançados de machine learning em uma API REST fácil de usar. Com o Google Vision é possível extrair conteúdo de imagens, reconhecer padrões, detectar objetos, reconhecer formas geométricas e rostos, classificar objetos ou até mesmo transcrever palavras impressas contidas em imagens.
Objetivo
Neste post usarei o OCR (Reconhecimento Óptico de caracteres) para detectar e extrair os caracteres das placas dos veículos e por seguinte consultar os dados do veículo através de uma api do SINESP (Sistema Nacional de Informações de Segurança Pública).
Bibliotecas
Abra o terminal de comandos da Raspberry e execute os seguintes comandos.
sudo apt-get update sudo apt-get upgrade pip install virtualenv virtualenv env source env/bin/activate sudo apt-get update env/bin/pip install google-cloud-vision sudo apt-get install python-dev python-setuptools
Antes de mais nada é necessário fazer a instalação de algumas libs para que o algoritmo funcione. Todo o algoritmo foi desenvolvido na linguagem Python. Os comandos apresentados neste post se referem ao ambiente linux, porém são facilmente encontrados para outros sistemas operacionais. Primeiramente é necessária a instalação do python para executar a aplicação, é possível encontrar o tutorial de instalação aqui. O próximo passo é a instalação da lib referente ao Sinesp. Em seguida faça a instalação da lib Pillow para manipular imagens clicando aqui.
Agora partiremos para a instalação da biblioteca Google Vision e configuração da mesma, clique aqui para criar sua conta e acessar o console. Após concluir esta etapa é necessário cumprir este passo a passo.
Ao concluir o passo a passo será feito o download de um arquivo json contendo as chaves necessárias para o funcionamento adequado do algoritmo. Por fim execute este comando de ativação no terminal de comandos onde [PATH] é o caminho do json que foi feito o download na etapa anterior, seguido do próprio arquivo json. Exemplo:
export GOOGLE_APPLICATION_CREDENTIALS=”/home/user/Downloads/service-account-file.json”
export GOOGLE_APPLICATION_CREDENTIALS=”[PATH]”
Ótimo! Agora que está tudo configurado podemos utilizar a ferramenta de computação em nuvem para analisar as imagens e extrair as informações desejadas.
Algoritmo
Após toda configuração da plataforma, é necessário criar um arquivo de extensão .py para executar a aplicação. Para isso criei o exec.py, clique aqui para acessar o algoritmo. O mesmo funciona de maneira simples, a ideia é tratar a imagem antes de processá-la a fim de diminuir o tempo que a API leva para extrair os dados da imagem. Após a extração é feita a consulta no SINESP, onde é devolvido um json contendo informações como ano, modelo, cor, status da documentação, número do chassis, etc. A fim de um melhor entendimento, a explicação do algoritmo será discorrida em três partes.
def resize(image):
imageFile = image
im1 = Image.open(imageFile)
width = 500
height = 300
im3 = im1.resize((width, height), Image.BILINEAR)
ext = ".jpg"
im3.save("BILINEAR" + ext)
detect_text("BILINEAR.jpg")
Esta função tem o intuito de redimensionar a imagem para diminuir o tamanho em KB, pois quanto menor a imagem, menor é o tempo de processamento para extração das informações. As dimensões escolhidas foram 500×300 pixels, uma vez que em testes, imagens mais largas têm um melhor rendimento para detecção de palavras. Após o redimensionamento o parâmetro Image.BILINEAR contribui com um filtro de interpolação linear em um ambiente 2×2. A nova imagem é salva e a função responsável pelo processamento dos dados recebe a nova imagem como parâmetro.
def detect_text(path):
client = vision.ImageAnnotatorClient()
with open(path, 'rb') as image_file:
content = image_file.read()
image = vision.types.Image(content=content)
response = client.text_detection(image=image)
texts = response.text_annotations
try:
conv = texts[0].description
if(conv[3] == '-' or conv[3] == ' '):
conv =conv.replace(conv[3],"")
if(conv[7] == "\n"):
conv =conv.replace(conv[7],"")
print(conv)
aux = str(conv)
sinesp(aux)
except:
print("Placa nao encontrada")
A função detect_text() é a responsável por consumir a API de visão computacional. Após receber o retorno da API é necessário fazer algumas alterações com intuito de preparar o dado para consultá-lo no SINESP. Para que a consulta ocorra com sucesso é necessário que o número da placa seja enviado sem quebra de linha, espaço ou hífen. Para isso é feito uma manipulação da string recebida e após o tratamento, a variável é passada como parâmetro para a função sinesp().
def sinesp(placa):
sc = SinespClient()
result = sc.search(placa)
print(result['model'] + "\n" + result['color'] + "\n" + result['year'] + "\n" + result['return_message']+ "\n" + result['status_message'] + "\n" + result['chassis'])
Após consumir a API, é retornado um json contendo todas as informações do veículo solicitado, por fim algumas informações são selecionadas e impressas no terminal. Para finalizar é criado um loop infinito onde são recebidos os nomes das imagens para verificação das informações referente ao veículo.
while (True):
aux = raw_input(“Imagem: ”) #python 2.7
# aux = input("Imagem: ") #python 3
try:
resize(aux)
except:
print("Placa nao identificada")
Testes
Para testar o funcionamento do algoritmo utilizei algumas imagens baixadas da internet, é possível fazer o download das mesmas aqui. Salve as imagens na mesma pasta que contém o algoritmo. Após executar o arquivo exec.py obteve-se as seguintes respostas.
Conclusão
Depois de realizar todos os procedimentos citados, o sistema funcionará de maneira adequada. Façam testes com outras imagens, com ângulos diferentes para notarem o quanto a ferramenta Google Vision é poderosa. A título de curiosidade as primeiras mil fotos mensais não são cobradas, após isso são cobrados valores baixíssimos podendo chegar a custar $0,0006 por foto. Postem nos comentários sobre as aplicações feitas com a ferramenta e eventuais dúvidas.











consigo fazer usando um arduino ?
Caro Allef, muito interessante seu projeto, tenho um Pi4 e gostaria de ver isso funcionando.
Sabe informar se este serviço de informação de veiculos do Detran volta a funcionar ou foi extinto definitivamente?
Encontrei na pesquisa alguns serviços do genero que são pagos. Que modificações seu código precisaria para operar com estes serviços pagos caso o do detran tenha realmente sido extinto?
Obrigado.
Paulo
Eu preciso de ajuda perdi meu cachorro já olhei pela câmeras de segurança mais não dá pra ver a placa do carro que levou Meu cachorro sai muito fosco
Olá, tudo bem? será que voce pode olhar uma placa de carro pra mim? é muito importante
SINESP não está funcionando… Ocorreu algo?
Essa biblioteca do Sinesp infelizmente foi desativada. Creio que agora existam outras
Olá, tudo certo, não estou conseguindo importar o Vision e o SinespClient, fiz todos os passos e mesmo assim ainda persiste o erro.
No caso eu queria extrair apenas a imagem da placa recortada da foto do carro, é possível? Como eu faço pra que ele me dê essa informação?
É possível sim. Vc consegue fazer isso somente com o opencv ou um dos parâmetros que a função passa é as coordenadas da plana na imagem
Allef, você pode me ensinar? Preciso melhorar a imagem de uma placa de carro para identificar as pessoas que furtaram o comércio.
fala mano! belo projeto! aqui esta dando um erro no modulo , sera q estou fazendo algo errado
Aqui tbm. Ele disse que teve uma atualização na lib e q vai corrigir o código pra voltar a dar certo
Fala! Tudo bem. Teve uma atualização da lib, poderia me enviar um email que lhe mando o algorítimo atualizado
Aqui na hora de executar aparece “No module named google.cloud”. Como resolver?
Teve uma atualização da lib. Vou editar o arquivo do github para voltar a dar certo.
Ahhhh, show!
Poxa, que achado. Comecei a estudar o assunto no início do ano pois estou fazendo um TCC relacionado com isso, não estou conseguindo usar a API do Sinesp, ele me retorna uma mensagem dizendo que preciso atualizar o aplicativo, consegue me ajuda com relação a isso? Obrigado! 😀
consigo sim. Me mande um email allef.anderson@hotmail.com