PyTesseract: Reconocimiento óptico de Caracteres Simple de Python

Introducción

Los seres humanos pueden comprender el contenido de una imagen simplemente mirando. Percibimos el texto de la imagen como texto y podemos leerlo.

Las computadoras no funcionan de la misma manera. Necesitan algo más concreto, organizado de una manera que puedan entender.

Aquí es donde entra en juego el Reconocimiento Óptico de caracteres (OCR). Ya se trate del reconocimiento de placas de automóviles de una cámara, o de documentos escritos a mano que deben convertirse en una copia digital, esta técnica es muy útil. Si bien no siempre es perfecto, es muy conveniente y hace que sea mucho más fácil y rápido para algunas personas hacer su trabajo.

En este artículo, profundizaremos en la profundidad del Reconocimiento Óptico de Caracteres y sus áreas de aplicación. También construiremos un script sencillo en Python que nos ayudará a detectar caracteres de imágenes y a exponerlos a través de una aplicación Flask para un medio de interacción más conveniente.

¿Qué es el Reconocimiento Óptico de Caracteres?

El reconocimiento óptico de caracteres implica la detección de contenido de texto en imágenes y la traducción de las imágenes a texto codificado que el ordenador pueda comprender fácilmente. Una imagen que contiene texto se escanea y analiza para identificar los caracteres que contiene. Una vez identificado, el carácter se convierte en texto codificado por máquina.

¿Cómo se logra realmente? Para nosotros, el texto en una imagen es fácilmente discernible y somos capaces de detectar caracteres y leer el texto, pero para una computadora, todo es una serie de puntos.

La imagen se escanea primero y los elementos de texto y gráficos se convierten en un mapa de bits, que es esencialmente una matriz de puntos en blanco y negro. La imagen se procesa previamente, donde el brillo y el contraste se ajustan para mejorar la precisión del proceso.

La imagen ahora se divide en zonas que identifican las áreas de interés, como dónde se encuentran las imágenes o el texto, lo que ayuda a iniciar el proceso de extracción. Las áreas que contienen texto ahora se pueden desglosar en líneas, palabras y caracteres, y ahora el software puede hacer coincidir los caracteres a través de la comparación y varios algoritmos de detección. El resultado final es el texto de la imagen que se nos da.

El proceso puede no ser 100% preciso y puede necesitar intervención humana para corregir algunos elementos que no se escanearon correctamente. La corrección de errores también se puede lograr utilizando un diccionario o incluso el Procesamiento del Lenguaje Natural (PNL).

La salida ahora se puede convertir a otros medios, como documentos de Word, PDF o incluso contenido de audio a través de tecnologías de conversión de texto a voz.

Usos del OCR

Anteriormente, la digitalización de documentos se lograba escribiendo manualmente el texto en la computadora. A través del OCR, este proceso se hace más fácil ya que el documento se puede escanear, procesar y el texto se extrae y almacena en una forma editable, como un documento de Word.

Si tiene un escáner de documentos en su teléfono, como Adobe Scan, es probable que haya encontrado la tecnología OCR en uso.

Los aeropuertos también pueden usar OCR para automatizar el proceso de reconocimiento de pasaportes y extracción de información de ellos.

Otros usos del OCR incluyen la automatización de los procesos de entrada de datos, la detección y el reconocimiento de matrículas de automóviles.

Lo que usaremos

Para este proyecto de OCR, usaremos la biblioteca Python-Tesseract, o simplemente PyTesseract, que es un envoltorio para el motor Tesseract-OCR de Google.

Elegí esto porque es completamente de código abierto y está siendo desarrollado y mantenido por el gigante que es Google. Siga estas instrucciones para instalar Tesseract en su máquina, ya que PyTesseract depende de ella.

También usaremos el marco web Flask para crear nuestro sencillo servidor OCR donde podemos tomar fotos a través de la cámara web o subir fotos con fines de reconocimiento de caracteres.

También vamos a usar Pipenv, ya que también maneja la configuración del entorno virtual y la administración de requisitos.

Además de eso, también usaremos la biblioteca Pillow, que es una bifurcación de la Biblioteca de Imágenes de Python (PIL) para manejar la apertura y manipulación de imágenes en muchos formatos en Python.

En este post, nos concentraremos en PyTesseract, aunque hay otras bibliotecas de Python que pueden ayudarlo a extraer texto de imágenes, como:

  • Textract: que puede extraer datos de archivos PDF, pero es un paquete pesado.
  • Pyocr: ofrece más opciones de detección, como oraciones, dígitos o palabras.

Setup

Comience instalando Pipenv utilizando el siguiente comando a través de Pip(En caso de que necesite configurarlo, consulte esto).

$ pip install pipenv

Cree el directorio del proyecto e inicie el proyecto ejecutando el siguiente comando:

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

Ahora podemos activar nuestro entorno virtual y comenzar a instalar nuestras dependencias:

$ pipenv shell$ pipenv install pytesseract Pillow 

En caso de que no use Pipenv, siempre puede usar el enfoque de Pip y Entorno Virtual. Siga la documentación oficial para ayudarlo a comenzar con Pip y Entorno Virtual:

Nota: En ese caso, en lugar de pipenv install Pillow, el comando será pip install Pillow.

Aplicación

vamos a implementar este proyecto en 2 fases. En el primero, crearemos el script, y en el siguiente construiremos una aplicación Flask para que actúe como interfaz.

Script OCR

Con la configuración completa, ahora podemos crear una función simple que toma una imagen y devuelve el texto detectado en la imagen, este será el núcleo de nuestro proyecto:

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'))

La función es bastante sencilla, en las primeras 5 líneas importamos Image del y nuestra biblioteca PyTesseract.

Luego creamos y ocr_core la función que toma un nombre de archivo y devuelve el texto contenido en la imagen.

Veamos cómo funciona el script con una imagen simple que contiene algo de texto:

Y al ejecutar el fragmento de código, nos recibe con esto:

¡Nuestro script OCR simple funciona! Obviamente, esto fue algo fácil, ya que se trata de texto digital, perfecto y preciso, a diferencia de la escritura a mano. Hay mucho más que podemos hacer con la biblioteca PyTesseract, pero más sobre esto más adelante en el post.

Primero integremos este script en una aplicación Flask, para que sea más fácil cargar imágenes y realizar operaciones de reconocimiento de caracteres.

Interfaz Web de Flask

Nuestro script se puede usar a través de la línea de comandos, pero una aplicación Flask lo haría más fácil de usar y versátil. Por ejemplo, podemos cargar fotos a través del sitio web y obtener el texto extraído que se muestra en el sitio web o podemos capturar fotos a través de la cámara web y realizar el reconocimiento de caracteres en ellas.

Si no está familiarizado con el framework Flask, este es un buen tutorial para ponerse al día y ponerse en marcha.

Vamos a empezar instalando el Frasco paquete:

$ pipenv install Flask

Ahora, vamos a definir una ruta básica:

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

Guarde el archivo y ejecutar:

$ python3 app.py

Si usted abra su navegador y la cabeza en el 127.0.0.1:5000 o localhost:5000 debería ver el mensaje «Hola Mundo!»en la página. Esto significa que nuestra aplicación Flask está lista para los siguientes pasos.

Ahora crearemos una carpeta templates para alojar nuestros archivos HTML. Vamos a seguir adelante y crear un simple index.html:

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

también Vamos a modificar nuestro app.py para representar nuestra nueva plantilla:

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

Aviso nos ha importado render_template y lo utilizó para procesar el archivo HTML. Si reinicia la aplicación de su frasco, aún debería ver » ¡Hola Mundo!»en la página de inicio.

Eso es suficiente en el curso intensivo de Flask, ahora integremos nuestro script OCR en la aplicación web.

Primero, agregaremos funcionalidad para cargar imágenes a nuestra aplicación Flask y pasarlas a la función ocr_core que escribimos anteriormente. Luego renderizaremos la imagen junto al texto extraído en nuestra aplicación web como 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 en nuestra función upload_page(), recibiremos la imagen por correo y renderizaremos el HTML de carga si la solicitud es GET.

Comprobamos si el usuario ha cargado realmente un archivo y utilizamos la función allowed_file() para comprobar si el archivo es de un tipo aceptable.

Al verificar que la imagen es del tipo requerido, la pasamos al script de reconocimiento de caracteres que creamos anteriormente.

La función detecta el texto de la imagen y lo devuelve. Finalmente, como respuesta a la carga de la imagen, renderizamos el texto detectado junto a la imagen para que el usuario vea los resultados.

El archivoupload.html manejará la publicación de la imagen y la representación del resultado con la ayuda del motor de plantillas Jinja, que se envía con Flask de forma predeterminada:

<!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 plantillas nos permite mostrar texto en escenarios específicos a través de la etiqueta {% if %} {% endif %} etiquetas. También podemos pasar mensajes desde nuestra aplicación Flask para que se muestren en la página web dentro de las etiquetas {{ }}. Utilizamos un formulario para cargar la imagen en nuestra aplicación Flask.

El resultado es:

cargar la página inicial

Ahora, si seguimos adelante y subir nuestra imagen a partir de principios:

cargar la página de resultados

¡Sí! Nuestra aplicación Flask ha sido capaz de integrar la funcionalidad OCR y mostrar el texto en el navegador. Esto hace que sea más fácil procesar imágenes en lugar de ejecutar comandos en la CLI cada vez que tenemos que procesar una nueva imagen.

Adjuntemos algunas imágenes más para explorar más a fondo los límites de nuestro sencillo script OCR, ya que no funcionará en todas las situaciones.

Por ejemplo, intentemos extraer texto de la siguiente imagen y el resultado se ha resaltado en la imagen:

canciones de portada de escaneo fallidas

Esto es evidencia de que el OCR no siempre es 100% preciso y puede necesitar intervención humana de vez en cuando.

También probé el script OCR con mi escritura a mano para ver cómo funcionaría, y este es el resultado:

mi escritura a mano

Como puedes ver, no puede extraer texto de mi escritura a mano como lo hizo con otras imágenes que hemos visto antes. Decidí darle otra oportunidad, esta vez con una imagen de esta fuente, y estos fueron los resultados:

escrito a mano descargado

El reconocimiento de caracteres en esta imagen es mucho mejor que en la que usé mi propia escritura a mano. Como puedes ver, las líneas de la imagen descargada son más gruesas y hay un mejor contraste entre el texto y el fondo, y esta podría ser la razón de la mala detección en mi escritura a mano.

Este es un área para explorar más a fondo, puede obtener notas escritas a mano de amigos o colegas y ver qué tan bien el script será capaz de detectar caracteres. Incluso puede obtener carteles para eventos e intentar escanearlos en busca de texto, las posibilidades son muchas.

Otras opciones de PyTesseract

Python-Tesseract tiene más opciones que puedes explorar. Por ejemplo, puede especificar el idioma mediante el uso de un lang marca:

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

Este es el resultado de la digitalización de una imagen sin el lang indicador:

Y ahora con el lang bandera:

El framework también está optimizado para detectar mejor los idiomas como se ve en las capturas de pantalla. (Fuente de la imagen).

Sin la bandera lang, el script perdió algunas palabras en francés, pero después de introducir la bandera pudo detectar todo el contenido en francés. La traducción no es posible, pero esto sigue siendo impresionante. La documentación oficial de Tesseract incluye los idiomas admitidos en esta sección.

La detección de scripts y orientación también se encuentra entre las capacidades de PyTesseract y esto ayuda a detectar las fuentes utilizadas y la orientación del texto en la imagen dada. Si podemos hacer referencia a la imagen manuscrita que descargamos anteriormente:

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

No había información de número de página en la imagen, por lo que no se detectó. El motor Tesseract es capaz de extraer información sobre la orientación del texto en la imagen y la rotación. La confianza de orientación es una figura de la seguridad del motor sobre la orientación detectada para actuar como guía y también para mostrar que no siempre es 100% precisa. La sección script indica el sistema de escritura utilizado en el texto y a esto también le sigue el marcador de confianza.

Si buscamos los caracteres reconocidos y sus límites de caja, PyTesseract logra esto a través de pytesseract.image_to_boxes(Image.open('downloaded_handwritten.png')).

Estas son algunas de las capacidades de PyTesseract, entre otras, como la conversión del texto extraído en un PDF con capacidad de búsqueda o una salida HOCR.

Lo que no hemos hecho

Hemos logrado mucho en este post, pero aún queda mucho por hacer para refinar nuestro proyecto y prepararlo para el mundo real. En primer lugar, podemos agregar estilo a nuestro sitio web y hacerlo más atractivo para el usuario final mediante el uso de CSS. También podemos agregar la opción de cargar y escanear varias imágenes a la vez y mostrar toda su salida a la vez. ¿No haría esto más conveniente escanear varios documentos?

El navegador nos permite acceder a la cámara de una máquina y capturar imágenes, con el permiso del usuario, por supuesto. Esto puede ser de gran ayuda, especialmente en dispositivos móviles. En lugar de que el usuario tenga que capturar y guardar la imagen y luego cargarla en el sitio web, si agregamos la funcionalidad de la cámara, podemos permitir que el usuario realice las operaciones directamente desde la aplicación web Flask. Esto hará que el proceso de escaneo sea más rápido.

Supongamos que una aplicación Flask no es lo que pretendía exponer su escáner OCR, también puede crear una herramienta CLI. La herramienta le permitiría ejecutar un comando que incluya la ubicación de la imagen y luego imprimir la salida del escáner en su terminal o enviarla a una base de datos o API. Si eligió esta ruta, Docopt es una herramienta fantástica para crear herramientas de línea de comandos usando Python.

Conclusión

A través de Tesseract y la biblioteca Python-Tesseract, hemos podido escanear imágenes y extraer texto de ellas. Esto es Reconocimiento óptico de Caracteres y puede ser de gran utilidad en muchas situaciones.

Hemos construido un escáner que toma una imagen y devuelve el texto contenido en la imagen y lo integra en una aplicación Matraz como interfaz. Esto nos permite exponer la funcionalidad en un medio más familiar y de una manera que puede servir a varias personas simultáneamente.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *