Python Optical Character Recognition

Introduction

Humans can understand the contents of an image simply by looking. Percebemos o texto na imagem como texto e podemos lê-lo.os computadores não funcionam da mesma maneira. Eles precisam de algo mais concreto, organizado de uma forma que possam entender.

é aqui que o reconhecimento óptico de caracteres (OCR) entra em acção. Seja o reconhecimento de placas de carro de uma câmera, ou documentos escritos à mão que devem ser convertidos em uma cópia digital, esta técnica é muito útil. Embora nem sempre seja perfeito, é muito conveniente e torna muito mais fácil e rápido para algumas pessoas para fazer o seu trabalho.

neste artigo, vamos aprofundar a profundidade do reconhecimento óptico de caracteres e suas Áreas de Aplicação. Nós também vamos construir um script simples em Python que vai nos ajudar a detectar caracteres de imagens e expor isso através de uma aplicação de Flask para um meio de interação mais conveniente.

o que é o reconhecimento óptico de caracteres?

Reconhecimento Óptico de caracteres envolve a detecção de conteúdo de texto nas imagens e a tradução das imagens para texto codificado que o computador pode facilmente compreender. Uma imagem contendo texto é digitalizada e analisada a fim de identificar os caracteres nela contidos. Após a identificação, o personagem é convertido em texto codificado por máquina.como é realmente alcançado? Para nós, o texto em uma imagem é facilmente discernível e nós somos capazes de detectar caracteres e ler o texto, mas para um computador, é tudo uma série de pontos.

A imagem é digitalizada pela primeira vez e os elementos texto e gráficos são convertidos em um bitmap, que é essencialmente uma matriz de pontos preto e branco. A imagem é então pré-processada, onde o brilho e contraste são ajustados para aumentar a precisão do processo.

A imagem está agora dividida em zonas que identificam as áreas de interesse, como onde as imagens ou texto estão e isso ajuda a iniciar o processo de extração. As áreas contendo texto agora podem ser divididas em linhas e palavras e caracteres e agora o software é capaz de combinar os caracteres através de comparação e vários algoritmos de detecção. O resultado final é o texto na imagem que nos é dada.

o processo pode não ser 100% preciso e pode precisar de intervenção humana para corrigir alguns elementos que não foram digitalizados corretamente. A correção de erro também pode ser alcançada usando um dicionário ou mesmo o processamento de Linguagem Natural (NLP).

a saída pode agora ser convertida para outros meios, como documentos do word, PDFs, ou até mesmo conteúdo de áudio através de tecnologias de texto-para-fala.

usos de OCR

anteriormente, a digitalização de documentos foi conseguida digitando manualmente o texto no computador. Através do OCR, este processo é mais fácil como o documento pode ser digitalizado, processado e o texto extraído e armazenado em uma forma editável, como um documento word.

Se tiver um scanner de documentos no seu telemóvel, como o Scan Adobe, provavelmente encontrou a tecnologia OCR em uso.os aeroportos também podem utilizar OCR para automatizar o processo de reconhecimento de passaportes e extração de informações deles.outros usos do OCR incluem automação de processos de entrada de dados, detecção e reconhecimento de placas de matrícula de automóveis.

o que vamos usar

para este projecto OCR, vamos usar a biblioteca Python-Tesseract, ou simplesmente Python-Tesseract, que é um invólucro para o motor Tesseract-OCR do Google.

eu escolhi isso porque ele é completamente de código aberto e está sendo desenvolvido e mantido pelo gigante que é o Google. Siga estas instruções para instalar o Tesseract na sua máquina, uma vez que o PyTesseract depende disso.

também usaremos o web framework Flask para criar o nosso servidor OCR simples, onde podemos tirar fotos através da webcam ou enviar fotos para fins de reconhecimento de caracteres.nós também vamos usar o Pipenv, uma vez que ele também lida com a configuração do ambiente virtual e gerenciamento de requisitos.

Além desses, também usaremos a biblioteca de travesseiros, que é um garfo da biblioteca de imagens Python (PIL) para lidar com a abertura e manipulação de imagens em muitos formatos em Python.

neste post, vamos concentrar-nos no Python, embora existam outras bibliotecas em Python que podem ajudá-lo a extrair texto de imagens como:

  • Textract: que pode extrair dados de PDFs, mas é um pacote pesado.
  • Pyocr: oferece mais opções de detecção, como sentenças, dígitos ou palavras.

configure

comece por instalar o Pipenv usando o seguinte comando através do Pip (no caso de ser necessário configurá-lo, consulte isto).

$ pip install pipenv

Crie o directório do projecto e inicie o projecto executando o seguinte comando:

$ mkdir ocr_server && cd ocr_server && pipenv install --three

podemos agora activar o nosso ambiente virtual e começar a instalar as nossas dependências:

$ pipenv shell$ pipenv install pytesseract Pillow 

No caso de não estar a usar o Pipenv, pode sempre usar a abordagem Pip e Ambiente Virtual. Siga a documentação oficial para ajudar você a começar com Pip e Ambiente Virtual:

Nota: nesse caso, em vez de pipenv install Pillow, o comando será pip install Pillow.

implementação

vamos implementar este projecto em 2 fases. No primeiro, vamos criar o script, e no próximo vamos construir uma aplicação de Flask para agir como uma interface.

OCR Script

Com a instalação concluída, podemos agora criar uma função simples, que leva uma imagem e retorna o texto detectado na imagem – este será o núcleo do nosso projeto:

try: from PIL import Imageexcept ImportError: import Imageimport pytesseractdef ocr_core(filename): """ This function will handle the core OCR processing of images. """ text = pytesseract.image_to_string(Image.open(filename)) # We'll use Pillow's Image class to open the image and pytesseract to detect the string in the image return textprint(ocr_core('images/ocr_example_1.png'))

A função é bastante simples, nas 5 primeiras linhas temos de importação de Image a partir do Pillow biblioteca e o nosso PyTesseract biblioteca.

então criamos e ocr_core função que toma em um nome de arquivo e retorna o texto contido na imagem.

Vamos ver como o script de tarifas com uma imagem simples, contendo algumas de texto:

E após a execução do trecho de código, somos recebidos com este:

a Nossa simples OCR script funciona! Obviamente, isso foi um pouco fácil, uma vez que este é o texto digital, perfeito e preciso, ao contrário da caligrafia. Há muito mais que podemos fazer com a biblioteca de PyTesseract, mas mais sobre isso mais tarde no post.

vamos integrar este programa em uma aplicação de Flask primeiro, para facilitar o envio de imagens e realizar operações de reconhecimento de caracteres.

Flask Web Interface

nosso script pode ser usado através da linha de comando, mas uma aplicação de frasco o tornaria mais fácil de usar e versátil. Por exemplo, podemos fazer upload de fotos através do site e obter o texto extraído exibido no site ou podemos capturar fotos através da câmera web e realizar o reconhecimento de caracteres neles.

Se você não está familiarizado com o framework Flask, este é um bom tutorial para levá-lo até a velocidade e ir.

Vamos começar instalando o Frasco pacote:

$ pipenv install Flask

Agora, vamos definir uma rota básica:

from flask import Flaskapp = Flask(__name__)@app.route('/')def home_page(): return "Hello World!"if __name__ == '__main__': app.run()

Salve o arquivo e execute:

$ python3 app.py

Se você abrir o navegador e ir para o 127.0.0.1:5000 ou localhost:5000 você deve ver “Olá, Mundo!”na página. Isto significa que o nosso App Flask está pronto para os próximos passos.

agora vamos criar uma pastatemplates para hospedar os nossos ficheiros HTML. Vamos ir em frente e criar um simples index.html:

<!DOCTYPE html><html> <head> <title>Index</title> </head> <body> Hello World. </body></html>

Deixe-nos também ajustar as nossas app.py para deixar o nosso novo modelo:

from flask import Flask, render_templateapp = Flask(__name__)@app.route('/')def home_page(): return render_template('index.html')if __name__ == '__main__': app.run()

Observe que agora temos importado render_template e é usado para processar o arquivo HTML. Se você reiniciar seu aplicativo de Flask, você ainda deve ver ” Olá Mundo!”na página inicial.

isso é suficiente no curso do estoiro do frasco, vamos agora integrar o nosso script OCR na aplicação web.

Primeiro, vamos adicionar funcionalidade para enviar imagens para o nosso aplicativo Flask e passá-las para a função ocr_core que escrevemos acima. Nós, então, processar a imagem ao lado extraídos do texto em nosso web app como um resultado:

import osfrom flask import Flask, render_template, request# import our OCR functionfrom ocr_core import ocr_core# define a folder to store and later serve the imagesUPLOAD_FOLDER = '/static/uploads/'# allow files of a specific typeALLOWED_EXTENSIONS = set()app = Flask(__name__)# function to check the file extensiondef allowed_file(filename): return '.' in filename and \ filename.rsplit('.', 1).lower() in ALLOWED_EXTENSIONS# route and function to handle the home [email protected]('/')def home_page(): return render_template('index.html')# route and function to handle the upload [email protected]('/upload', methods=)def upload_page(): if request.method == 'POST': # check if there is a file in the request if 'file' not in request.files: return render_template('upload.html', msg='No file selected') file = request.files # if no file is selected if file.filename == '': return render_template('upload.html', msg='No file selected') if file and allowed_file(file.filename): # call the OCR function on it extracted_text = ocr_core(file) # extract the text and display it return render_template('upload.html', msg='Successfully processed', extracted_text=extracted_text, img_src=UPLOAD_FOLDER + file.filename) elif request.method == 'GET': return render_template('upload.html')if __name__ == '__main__': app.run()

Como podemos ver em nossas upload_page() função, vamos receber a imagem via POST e processar o upload de HTML, se o pedido CHEGAR.

verificamos se o utilizador carregou realmente um ficheiro e utiliza a função allowed_file() para verificar se o ficheiro é de um tipo aceitável.

ao verificar que a imagem é do tipo requerido, passamos então para o script de reconhecimento de caracteres que criamos anteriormente.

a função detecta o texto na imagem e devolve-o. Finalmente, como Resposta ao upload da imagem, rendemos o texto detectado ao lado da imagem para que o usuário veja os resultados.

o ficheiroupload.html irá lidar com a publicação da imagem e a renderização do resultado com a ajuda do Motor Jinja templating, que envia com o frasco por omissão:

<!DOCTYPE html><html> <head> <title>Upload Image</title> </head> <body> {% if msg %} <h1>{{ msg }}</h1> {% endif %} <h1>Upload new File</h1> <form method=post enctype=multipart/form-data> <p><input type=file name=file> <input type=submit value=Upload> </form> <h1>Result:</h1> {% if img_src %} <img src="{{ img_src }}"> {% endif %} {% if extracted_text %} <p> The extracted text from the image above is: <b> {{ extracted_text }} </b></p> {% else %} The extracted text will be displayed here {% endif %} </body></html>

Jinja templating allows us to display text in specific scenarios through the{% if %} {% endif %} tags. Também podemos passar mensagens do nosso aplicativo Flask para serem exibidas na página web dentro do{{ }} tags. Usamos um formulário para enviar a imagem para o nosso aplicativo Flask.

O resultado é:

upload página inicial

Agora, se formos em frente e fazer o upload de nossa imagem do anterior:

página de envio de resultado

Sim! Nossa aplicação Flask foi capaz de integrar a funcionalidade OCR e exibir o texto no navegador. Isso torna mais fácil de processar imagens em vez de executar comandos no CLI cada vez que temos uma nova imagem para processar.

vamos anexar mais algumas imagens para explorar mais os limites do nosso script OCR simples, uma vez que ele não vai funcionar em todas as situações.

Por exemplo, vamos tentar extrair o texto da seguinte imagem e o resultado foi realçado na imagem:

failed scan cover songs

Esta é a evidência de que OCR nem sempre é 100% preciso e pode precisar de intervenção humana de tempos em tempos.

também testei a escrita OCR contra a minha caligrafia para ver como ela funcionaria, e este é o resultado:

a minha caligrafia

como podes ver, não consegue extrair texto da minha caligrafia como fez com outras imagens que já vimos antes. Eu decidi dar-lhe outra tentativa, desta vez com uma imagem desta fonte, e estes foram os resultados:

downloaded handwritten

o reconhecimento de caracteres nesta imagem é muito melhor do que aquele onde eu usei a minha própria caligrafia. Como você pode ver as linhas na imagem baixada são mais grossas e há um melhor contraste entre o texto e o fundo e esta pode ser a razão para a detecção pobre em minha caligrafia.

esta é uma área para explorar mais, você pode obter notas manuscritas de amigos ou colegas e ver quão bem o script será capaz de detectar caracteres. Você pode até mesmo obter cartazes para eventos e tentar digitalizá-los para texto, as possibilidades são bastantes.

outras opções do Python-Tesseract

o Python-Tesseract tem mais opções que pode explorar. Por exemplo, você pode especificar o idioma usando um lang código:

pytesseract.image_to_string(Image.open(filename), lang='fra')

Este é o resultado da digitalização de uma imagem sem o lang bandeira:

E agora com o lang bandeira:

o framework também é otimizado para detectar línguas melhor como visto nas imagens. (Fonte da imagem).

Sem olang flag, o script falhou algumas palavras francesas, mas depois de introduzir a bandeira foi capaz de detectar todo o conteúdo Francês. A tradução não é possível, mas isso ainda é impressionante. A documentação oficial do Tesseract inclui as línguas suportadas nesta secção.

orientação e detecção de script também está entre as capacidades do PyTesseract e isso ajuda na detecção das fontes usadas e orientação do texto na imagem dada. Se podemos referir-se ao manuscrito imagem que baixou anteriormente:

print(pytesseract.image_to_osd(Image.open('downloaded_handwritten.png')))

houve nenhum número de página de informação sobre a imagem de forma que este não foi detectado. O motor Tesseract é capaz de extrair informações sobre a orientação do texto na imagem e rotação. A confiança de orientação é uma figura da garantia do motor sobre a orientação detectada para agir como um guia e também para mostrar que nem sempre é 100% preciso. A seção script denota o sistema de escrita usado no texto e este também é seguido pelo Marcador de confiança.

If we were after the recognized characters and their box boundaries, PyTesseract achieve this throughpytesseract.image_to_boxes(Image.open('downloaded_handwritten.png')).

estas são algumas das capacidades do PyTesseract, entre outras, como a conversão do texto extraído em um PDF pesquisável ou saída HOCR.

What we haven’t Done

we have accomplished a lot in this post, but there is still more to do to refine our project and prepare it for the real world. Primeiro, podemos adicionar estilo ao nosso site e torná-lo mais atraente para o usuário final, usando CSS. Também podemos adicionar a opção de carregar e digitalizar várias imagens de uma só vez e mostrar toda a sua saída de uma só vez. Não seria mais conveniente digitalizar vários documentos?

o navegador nos permite acessar a câmera de uma máquina e capturar imagens, com permissão do Usuário, é claro. Isso pode ser de grande ajuda, especialmente em dispositivos móveis. Em vez de o usuário ter que capturar e salvar a imagem e, em seguida, carregá-lo no site, se adicionarmos a funcionalidade da câmera, podemos permitir que o Usuário para realizar as operações diretamente a partir da aplicação web Flask. Isto tornará o processo de digitalização mais rápido.suponha que uma aplicação de frasco não é o que pretendia expor o seu scanner de OCR, também pode criar uma ferramenta de CLI. A ferramenta permite executar um comando incluindo a localização da imagem e, em seguida, imprimir o resultado do scanner para o seu terminal ou enviá-lo para uma base de dados ou API. Se você escolheu este path Docopt é uma ferramenta fantástica para construir ferramentas de linha de comando usando Python.

Conclusion

Through Tesseract and the Python-Tesseract library, we have been able to scan images and extract text from them. Este é o reconhecimento óptico de caracteres e pode ser de grande utilidade em muitas situações.

construímos um scanner que pega numa imagem e devolve o texto contido na imagem, integrando-o numa aplicação de frasco como interface. Isso nos permite expor a funcionalidade em um meio mais familiar e de uma forma que possa servir várias pessoas simultaneamente.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *