Reconhecimento de placas com o Google Vision

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.

Reconhecimento de placas com o Google Vision

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.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.
Comentários:
Notificações
Notificar
25 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
nathan
nathan
17/03/2023 19:52

consigo fazer usando um arduino ?

Paulo Borges
Paulo Borges
02/09/2021 06:37

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

Blady
Blady
20/08/2021 20:04

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

Raimaiane Rocha
Raimaiane Rocha
17/08/2021 17:14

Olá, tudo bem? será que voce pode olhar uma placa de carro pra mim? é muito importante

Luis Gomes
Luis Gomes
11/10/2020 20:33

SINESP não está funcionando… Ocorreu algo?

Allef
Allef
Reply to  Luis Gomes
13/10/2020 10:39

Essa biblioteca do Sinesp infelizmente foi desativada. Creio que agora existam outras

Romulo Gome
Romulo Gome
08/07/2020 10:35

Olá, tudo certo, não estou conseguindo importar o Vision e o SinespClient, fiz todos os passos e mesmo assim ainda persiste o erro.

Jean
Jean
22/10/2019 12:11

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?

Allef
Allef
Reply to  Jean
05/06/2020 15:35

É 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

Patricia Silveira
Patricia Silveira
Reply to  Allef
17/07/2025 23:21

Allef, você pode me ensinar? Preciso melhorar a imagem de uma placa de carro para identificar as pessoas que furtaram o comércio.

joao guilherme
joao guilherme
18/10/2019 22:54

fala mano! belo projeto! aqui esta dando um erro no modulo , sera q estou fazendo algo errado

Bi
Bi
Reply to  joao guilherme
23/10/2019 20:05

Aqui tbm. Ele disse que teve uma atualização na lib e q vai corrigir o código pra voltar a dar certo

Allef
Allef
Reply to  joao guilherme
05/06/2020 15:33

Fala! Tudo bem. Teve uma atualização da lib, poderia me enviar um email que lhe mando o algorítimo atualizado

B
B
18/10/2019 02:36

Aqui na hora de executar aparece “No module named google.cloud”. Como resolver?

Allef
Allef
Reply to  B
18/10/2019 11:02

Teve uma atualização da lib. Vou editar o arquivo do github para voltar a dar certo.

B
B
Reply to  Allef
18/10/2019 22:05

Ahhhh, show!

Wagner Loch
Wagner Loch
20/08/2019 21:03

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! 😀

Allef
Allef
Reply to  Wagner Loch
21/08/2019 17:38

consigo sim. Me mande um email allef.anderson@hotmail.com

Home » Software » Reconhecimento de placas com o Google Vision

EM DESTAQUE

WEBINARS

VEJA TAMBÉM

JUNTE-SE HOJE À COMUNIDADE EMBARCADOS

Talvez você goste: