Cómo OCR con Tesseract, OpenCV y Python PlatoBlockchain Data Intelligence. Búsqueda vertical. Ai.

Cómo OCR con Tesseract, OpenCV y Python

Cómo OCR con Tesseract, OpenCV y Python

En esta publicación de blog, intentaremos explicar la tecnología detrás del motor Tesseract más utilizado, que se actualizó con los últimos conocimientos investigados en reconocimiento óptico de caracteres. Este artículo también servirá como guía práctica / tutorial sobre cómo implementar OCR en python usando el motor Tesseract. Recorreremos los siguientes módulos:

  • Características de Tesseract OCR
  • Preprocesamiento para OCR usando OpenCV
  • Ejecutar Tesseract con CLI y Python
  • Limitaciones del motor Tesseract

Índice del contenido

Introducción

OCR = Reconocimiento óptico de caracteres. En otras palabras, los sistemas de OCR transforman una imagen bidimensional de texto, que podría contener texto impreso a máquina o escrito a mano desde su representación de imagen en texto legible por máquina. El OCR como proceso generalmente consta de varios subprocesos para realizar con la mayor precisión posible. Los subprocesos son:

  • Preprocesamiento de la imagen
  • Localización de texto
  • Segmentación de personajes
  • Reconocimiento de caracteres
  • Postprocesamiento

Los subprocesos en la lista anterior, por supuesto, pueden diferir, pero estos son aproximadamente los pasos necesarios para abordar el reconocimiento automático de caracteres. En el software OCR, su objetivo principal es identificar y capturar todas las palabras únicas usando diferentes idiomas de los caracteres de texto escritos.

Durante casi dos décadas, los sistemas de reconocimiento óptico de caracteres se han utilizado ampliamente para proporcionar entrada de texto automatizada en sistemas informáticos. Sin embargo, en todo este tiempo, los sistemas OCR convencionales (como OCR zonal) nunca han superado su incapacidad para leer más de un puñado de tipos de letra y formatos de página. El tipo con espaciado proporcional (que incluye prácticamente todas las copias tipográficas), las fuentes de impresora láser e incluso muchas fuentes de máquina de escribir no proporcionales han permanecido fuera del alcance de estos sistemas. Y como resultado, el OCR convencional nunca ha logrado más que un impacto marginal en la cantidad total de documentos que necesitan conversión a formato digital.

Cómo OCR con Tesseract, OpenCV y Python
Proceso de reconocimiento óptico de caracteres (cortesía)

Los motores de OCR de próxima generación abordan estos problemas mencionados anteriormente realmente buenos utilizando las últimas investigaciones en el área del aprendizaje profundo. Al aprovechar la combinación de modelos profundos y enormes conjuntos de datos disponibles públicamente, los modelos logran precisiones de vanguardia en tareas determinadas. Hoy en día también es posible generar datos sintéticos con diferentes fuentes utilizando redes generativas de confrontación y algunos otros enfoques generativos.

El reconocimiento óptico de caracteres sigue siendo un problema desafiante cuando el texto se produce en entornos sin restricciones, como escenas naturales, debido a distorsiones geométricas, fondos complejos y fuentes diversas. La tecnología aún tiene un inmenso potencial debido a los diversos casos de uso de OCR basado en aprendizaje profundo como


¿Tiene un problema de OCR en mente? ¿Quiere reducir los costos de entrada de datos de su organización? Dirigirse a Nanonetas y construir modelos OCR para extraer texto de imágenes or extraer datos de archivos PDF con IA basada PDF OCR!


Herramientas OCR de código abierto

Hay una gran cantidad de reconocimiento óptico de caracteres Software disponible. No encontré ninguna comparación de calidad entre ellos, pero escribiré sobre algunos de ellos que parecen ser los más amigables para los desarrolladores.

Tesseract - un motor de OCR de código abierto que ha ganado popularidad entre los desarrolladores de OCR. A pesar de que a veces puede ser doloroso implementar y modificar, no había demasiadas alternativas de OCR gratuitas y potentes en el mercado durante mucho tiempo. Tesseract comenzó como Ph.D. proyecto de investigación en HP Labs, Bristol. Ganó popularidad y fue desarrollado por HP entre 1984 y 1994. En 2005, HP lanzó Tesseract como un software de código abierto. Desde 2006 es desarrollado por Google.

Cómo OCR con Tesseract, OpenCV y Python
Comparación de tendencias de Google para diferentes herramientas de OCR de código abierto

OCropus - OCRopus es un sistema de OCR de código abierto que permite una fácil evaluación y reutilización de los componentes de OCR por parte de investigadores y empresas. Una colección de programas de análisis de documentos, no un sistema de OCR llave en mano. Para aplicarlo a sus documentos, es posible que deba realizar un preprocesamiento de imágenes y, posiblemente, también entrenar nuevos modelos. Además de los propios scripts de reconocimiento, hay varios scripts para editar y corregir la verdad básica, medir las tasas de error y determinar las matrices de confusión que son fáciles de usar y editar.


Ocular - Ocular funciona mejor en documentos impresos con una prensa manual, incluidos los escritos en varios idiomas. Funciona usando la línea de comando. Es un sistema de OCR histórico de última generación. Sus características principales son:

  • Aprendizaje no supervisado de fuentes desconocidas: solo requiere imágenes de documentos y un corpus de texto.
  • Capacidad para manejar documentos ruidosos: tinta inconsistente, espaciado, alineación vertical
  • Soporte para documentos multilingües, incluidos aquellos que tienen un cambio considerable de código a nivel de palabra.
  • Aprendizaje no supervisado de patrones de variación ortográfica, incluyendo ortografía arcaica y taquigrafía.
  • Transcripción conjunta y simultánea en formas diplomáticas (literales) y normalizadas.


SwiftOCR - También mencionaré el motor de OCR escrito en Swift ya que se está haciendo un gran desarrollo para avanzar en el uso de Swift como el lenguaje de programación de desarrollo utilizado para el aprendizaje profundo. Revisa blog para saber más por qué. SwiftOCR es una biblioteca OCR rápida y simple que utiliza redes neuronales para el reconocimiento de imágenes. SwiftOCR afirma que su motor supera a la conocida biblioteca Tessaract.

En esta publicación de blog, pondremos centrarse en Tesseract OCR y descubra más sobre cómo funciona y cómo se usa.


Tesseract OCR

Tesseract es un motor de reconocimiento de texto (OCR) de código abierto, disponible bajo la licencia Apache 2.0. Se puede usar directamente o (para programadores) usando una API para extraer texto impreso de las imágenes. Es compatible con una amplia variedad de idiomas. Tesseract no tiene una GUI integrada, pero hay varias disponibles en el Tercera página de la fiesta. Tesseract es compatible con muchos lenguajes de programación y marcos a través de envoltorios que se pueden encontrar esta página. Se puede usar con el análisis de diseño existente para reconocer texto dentro de un documento grande, o se puede usar junto con un detector de texto externo para reconocer texto de una imagen de una sola línea de texto.

Cómo OCR con Tesseract, OpenCV y Python
OCR Process Flow para construir API con Tesseract desde un del blog

Tesseract 4.00 incluye un nuevo subsistema de red neuronal configurado como un reconocedor de línea de texto. Tiene sus orígenes en LSTM basado en Python de OCRopus implementación pero ha sido rediseñado para Tesseract en C ++. El sistema de red neuronal en Tesseract es anterior a TensorFlow pero es compatible con él, ya que existe un lenguaje de descripción de red llamado Lenguaje de especificación de gráfico variable (VGSL), que también está disponible para TensorFlow.

Para reconocer una imagen que contiene un solo carácter, generalmente usamos una red neuronal convolucional (CNN). El texto de longitud arbitraria es una secuencia de caracteres, y tales problemas se resuelven usando RNN y LSTM es una forma popular de RNN. Lea esta publicación para obtener más información sobre LSTM.


Tecnología: cómo funciona

Los LSTM son excelentes para aprender secuencias, pero se ralentizan mucho cuando el número de estados es demasiado grande. Hay resultados empíricos que sugieren que es mejor pedirle a un LSTM que aprenda una secuencia larga que una secuencia corta de muchas clases. Tesseract se desarrolló a partir del modelo OCRopus en Python, que era una bifurcación de un LSMT en C ++, llamado CLSTM. CLSTM es una implementación del modelo de red neuronal recurrente LSTM en C ++, que utiliza la biblioteca Eigen para cálculos numéricos.

Cómo OCR con Tesseract, OpenCV y Python
Proceso Tesseract 3 OCR de

Legacy Tesseract 3.x dependía del proceso de múltiples etapas donde podemos diferenciar los pasos:

  • Encontrar palabras
  • Búsqueda de línea
  • Clasificación de personajes

La búsqueda de palabras se realizó organizando líneas de texto en blobs, y las líneas y regiones se analizan para un tono fijo o texto proporcional. Las líneas de texto se dividen en palabras de manera diferente según el tipo de espacio entre caracteres. El reconocimiento luego procede como un proceso de dos pasos. En el primer pase, se intenta reconocer cada palabra por turno. Cada palabra que es satisfactoria se pasa a un clasificador adaptativo como datos de entrenamiento. El clasificador adaptativo tiene la oportunidad de reconocer con mayor precisión el texto en la parte inferior de la página.

La modernización de la herramienta Tesseract fue un esfuerzo para limpiar el código y agregar un nuevo modelo LSTM. La imagen de entrada se procesa en cuadros (rectángulo) línea por línea que se introduce en el modelo LSTM y da salida. En la imagen a continuación podemos visualizar cómo funciona.

Cómo OCR con Tesseract, OpenCV y Python
Cómo usa Tesseract el modelo LSTM presentation

Después de agregar una nueva herramienta de capacitación y entrenar el modelo con muchos datos y fuentes, Tesseract logra un mejor rendimiento. Aún así, no es lo suficientemente bueno para trabajar en texto escrito a mano y fuentes extrañas. Es posible ajustar o reentrenar las capas superiores para la experimentación.


Instalar Tesseract

Instalar tesseract en Windows es fácil con los binarios precompilados encontrados esta página. No olvide editar la variable de entorno "ruta" y agregar la ruta tesseract. Para la instalación de Linux o Mac, se instala con pocos comandos.

Después de la instalación, verifique que todo esté funcionando escribiendo el comando en la terminal o cmd:

$ tesseract --version

Y verá una salida similar a:

tesseract 4.0.0
leptonica-1.76.0
libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.8
Found AVX2
Found AVX
Found SSE

Puede instalar el contenedor de python para tesseract después de esto usando pip.
$ pip install pytesseract

La biblioteca Tesseract se entrega con una práctica herramienta de línea de comandos llamada tesseract. Podemos usar esta herramienta para realizar OCR en imágenes y la salida se almacena en un archivo de texto. Si queremos integrar Tesseract en nuestro código C ++ o Python, utilizaremos la API de Tesseract.


Ejecutar Tesseract con CLI

Llame al motor Tesseract en la imagen con ruta de la imagen y convierta la imagen a texto, escrita línea por línea en el símbolo del sistema escribiendo lo siguiente:

$ tesseract image_path stdout

Para escribir el texto de salida en un archivo:

$ tesseract image_path text_result.txt

Para especificar el nombre del modelo de idioma, escriba el acceso directo de idioma después de -l bandera, por defecto toma el idioma inglés:

$ tesseract image_path text_result.txt -l eng

De forma predeterminada, Tesseract espera una página de texto cuando segmenta una imagen. Si solo está buscando OCR en una región pequeña, pruebe con un modo de segmentación diferente, usando el –Psm argumento. Hay 14 modos disponibles que se pueden encontrar esta página. De forma predeterminada, Tesseract automatiza completamente la segmentación de la página, pero no realiza la orientación y la detección de secuencias de comandos. Para especificar el parámetro, escriba lo siguiente:

$ tesseract image_path text_result.txt -l eng --psm 6

También hay un argumento más importante, el modo motor OCR (oem). Tesseract 4 tiene dos motores OCR: el motor Tesseract heredado y el motor LSTM. Hay cuatro modos de operación elegidos usando la opción –oem.
0 Solo motor heredado.
1 Solo motor LSTM de Neural Nets.
2 motores Legacy + LSTM.
3 Predeterminado, según lo que esté disponible.

Cómo OCR con Tesseract, OpenCV y Python
Resultado del motor Tesseract OCR

OCR con Pytesseract y OpenCV

Pytesseract es un contenedor para el motor Tesseract-OCR. También es útil como un script de invocación independiente para tesseract, ya que puede leer todos los tipos de imágenes compatibles con las bibliotecas de imágenes Pillow y Leptonica, incluidos jpeg, png, gif, bmp, tiff y otros. Más información sobre el enfoque de Python leer esta página. El código para este tutorial se puede encontrar en este repositorio.

import cv2 import pytesseract img = cv2.imread('image.jpg') # Adding custom options
custom_config = r'--oem 3 --psm 6'
pytesseract.image_to_string(img, config=custom_config)

Preprocesamiento para Tesseract

Para evitar todas las formas en que la precisión de salida de su tesseract puede caer, debe asegurarse de que la imagen sea adecuada preprocesado.

Esto incluye reescalado, binarización, eliminación de ruido, desorientación, etc.

Para preprocesar la imagen para OCR, use cualquiera de las siguientes funciones de Python o siga las Documentación de OpenCV.

import cv2
import numpy as np img = cv2.imread('image.jpg') # get grayscale image
def get_grayscale(image): return cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # noise removal
def remove_noise(image): return cv2.medianBlur(image,5) #thresholding
def thresholding(image): return cv2.threshold(image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1] #dilation
def dilate(image): kernel = np.ones((5,5),np.uint8) return cv2.dilate(image, kernel, iterations = 1) #erosion
def erode(image): kernel = np.ones((5,5),np.uint8) return cv2.erode(image, kernel, iterations = 1) #opening - erosion followed by dilation
def opening(image): kernel = np.ones((5,5),np.uint8) return cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel) #canny edge detection
def canny(image): return cv2.Canny(image, 100, 200) #skew correction
def deskew(image): coords = np.column_stack(np.where(image > 0)) angle = cv2.minAreaRect(coords)[-1] if angle < -45: angle = -(90 + angle) else: angle = -angle (h, w) = image.shape[:2] center = (w // 2, h // 2) M = cv2.getRotationMatrix2D(center, angle, 1.0) rotated = cv2.warpAffine(image, M, (w, h), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE) return rotated #template matching
def match_template(image, template): return cv2.matchTemplate(image, template, cv2.TM_CCOEFF_NORMED) 

Trabajemos con un ejemplo para ver mejor las cosas. Así es como se ve nuestra imagen original:

Cómo OCR con Tesseract, OpenCV y Python
El sistema de escritura Aurebesh

Después de preprocesar con el siguiente código

image = cv2.imread('aurebesh.jpg') gray = get_grayscale(image)
thresh = thresholding(gray)
opening = opening(gray)
canny = canny(gray)

y trazando las imágenes resultantes, obtenemos los siguientes resultados.

Cómo OCR con Tesseract, OpenCV y Python
La imagen después del preprocesamiento.

El resultado de la imagen original se ve así:

GALACTIC BASIC
(AUREBESH) RE HFVMEVEIiZwoyv Ze
ABC DE F GH I JK LM
N—0- PQ RST Uv WX
2 | Ff 8 G& Pf fF § 5 op 7
ee
5, jf FF Ty ee ee
=
334 477 OED

Así es como se ve la salida para diferentes imágenes preprocesadas:

Imagen de borde canny (no tan buena) -

CAE Cn Cae AS
(AUREBESE) EA Na
oe SS
(Ne CI (ENE
a, ee oe ea
2
a a A: rc
|, |
a
Sear eo/e ecm emclomt Cia cuoomct mi im

Imagen trillada

GALACTIC BASIC
(AVREBESH)
RS 7FVMeEVEi1iFf o£
A B C D EF GH IJ K LM
AOoder7Nnvroroava
N O P Q@R S$ TU VW XK Y¥ Z
7 ee For 8 Ro Pf F Boao om #
0 12 3 4 5 6 7 8 9 , . !
>» 1kr7 @ by FEN
2? S$ ( Por Foy of ee
ASGSANDIE
CH AE EO KH NG OO SH TH

Imagen de apertura -

GALACTIC BASIC
(AUREZEBELSH)
KEE VTMEUOU EB iw oN es
A BC D EF F @ H | J K LT Ww
AOGdrcrT7WTt HYOAVa4
WO P Q R BS T U VW WK y Z
i J
Oo 1 2 3 46 8 7 SC Ps,
VY ir- -rp,ptUuY?
a a a
AGoOAnNnoOID
CH AE BO KH ®@ OO SH TH


Obteniendo cuadros alrededor del texto

Con Pytesseract, puede obtener la información del cuadro delimitador para sus resultados de OCR utilizando lo siguiente código.

El siguiente script le dará información del cuadro delimitador para cada carácter detectado por tesseract durante OCR.

import cv2
import pytesseract img = cv2.imread('image.jpg') h, w, c = img.shape
boxes = pytesseract.image_to_boxes(img) for b in boxes.splitlines(): b = b.split(' ') img = cv2.rectangle(img, (int(b[1]), h - int(b[2])), (int(b[3]), h - int(b[4])), (0, 255, 0), 2) cv2.imshow('img', img)
cv2.waitKey(0)

Si desea cuadros alrededor de palabras en lugar de caracteres, la función image_to_data será útil Puedes usar el image_to_data función con tipo de salida especificado con pytesseract Output.

Cómo OCR con Tesseract, OpenCV y Python

¿Tiene un problema de OCR en mente? ¿Quiere digitalizar facturas, PDF o placas de matrícula? Dirigirse a Nanonetas y crea modelos OCR gratis!


Utilizaremos la imagen de factura de muestra anterior para probar nuestros resultados de tesseract.

import cv2
import pytesseract
from pytesseract import Output img = cv2.imread('invoice-sample.jpg') d = pytesseract.image_to_data(img, output_type=Output.DICT)
print(d.keys())

Esto debería darte el siguiente resultado:
dict_keys(['level', 'page_num', 'block_num', 'par_num', 'line_num', 'word_num', 'left', 'top', 'width', 'height', 'conf', 'text'])

Con este diccionario, podemos detectar cada palabra, su información de cuadro delimitador, el texto que contienen y los puntajes de confianza de cada una.

Puede trazar los cuadros usando el siguiente código:

n_boxes = len(d['text'])
for i in range(n_boxes): if int(d['conf'][i]) > 60: (x, y, w, h) = (d['left'][i], d['top'][i], d['width'][i], d['height'][i]) img = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2) cv2.imshow('img', img)
cv2.waitKey(0)

Así es como se vería esto para la imagen de una factura de muestra.

Cómo OCR con Tesseract, OpenCV y Python


Coincidencia de plantilla de texto

Tome el ejemplo de tratar de encontrar dónde está una fecha en una imagen. Aquí nuestra plantilla será un patrón de expresión regular que combinaremos con nuestros resultados de OCR para encontrar los cuadros delimitadores apropiados. Utilizaremos el regex módulo y el image_to_data Función para esto.

import re
import cv2
import pytesseract
from pytesseract import Output img = cv2.imread('invoice-sample.jpg')
d = pytesseract.image_to_data(img, output_type=Output.DICT)
keys = list(d.keys()) date_pattern = '^(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[012])/(19|20)dd$' n_boxes = len(d['text'])
for i in range(n_boxes): if int(d['conf'][i]) > 60: if re.match(date_pattern, d['text'][i]): (x, y, w, h) = (d['left'][i], d['top'][i], d['width'][i], d['height'][i]) img = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2) cv2.imshow('img', img)
cv2.waitKey(0)

Como se esperaba, obtenemos un cuadro alrededor de la fecha de la factura en la imagen.

Cómo OCR con Tesseract, OpenCV y Python

Modos de segmentación de página

Hay varias formas de analizar una página de texto. La API de tesseract proporciona varios modos de segmentación de página si desea ejecutar OCR solo en una región pequeña o en diferentes orientaciones, etc.

Aquí hay una lista de los modos de segmentación de páginas admitidos por tesseract:

0 Orientación y detección de guiones (OSD) únicamente.
1 Segmentación automática de páginas con OSD.
2 Segmentación automática de páginas, pero sin OSD ni OCR.
3 Segmentación de páginas totalmente automática, pero sin OSD. (Defecto)
4 Suponga una sola columna de texto de tamaños variables.
5 Suponga un solo bloque uniforme de texto alineado verticalmente.
6 Suponga un solo bloque de texto uniforme.
7 Trate la imagen como una sola línea de texto.
8 Trate la imagen como una sola palabra.
9 Trate la imagen como una sola palabra en un círculo.
10 Trate la imagen como un solo carácter.
11 Texto escaso. Busque la mayor cantidad de texto posible sin ningún orden en particular.
12 Texto escaso con OSD.
13 Línea cruda. Trate la imagen como una sola línea de texto, sin pasar por los trucos que son específicos de Tesseract.

Para cambiar el modo de segmentación de la página, cambie el --psm argumento en su cadena de configuración personalizada a cualquiera de los códigos de modo mencionados anteriormente.


Detectar orientación y guión

Puede detectar la orientación del texto en su imagen y también el guión en el que está escrito. La siguiente imagen:
Cómo OCR con Tesseract, OpenCV y Python
después de ejecutar el siguiente código:

osd = pytesseract.image_to_osd(img)
angle = re.search('(?<=Rotate: )d+', osd).group(0)
script = re.search('(?<=Script: )d+', osd).group(0)
print("angle: ", angle)
print("script: ", script)

imprimirá el siguiente resultado.

angle: 90
script: Latin

Detectar solo dígitos

Tome esta imagen por ejemplo:
Cómo OCR con Tesseract, OpenCV y Python
El texto extraído de esta imagen se ve así.

‘Customer name Hallium Energy services
Project NEHINS-HIB-HSA
lavoice no 43876324
Dated 17%h Nov2018
Pono 76496234

Puede reconocer solo dígitos cambiando la configuración a la siguiente

custom_config = r'--oem 3 --psm 6 outputbase digits'
print(pytesseract.image_to_string(img, config=custom_config))

La salida se verá así.

-- . 43876324
172018
0 76496234

Lista blanca de personajes

Digamos que solo desea detectar ciertos caracteres de la imagen dada e ignorar el resto. Puede especificar su lista blanca de caracteres (aquí, hemos utilizado todos los caracteres en minúsculas de la a a la z solamente) utilizando la siguiente configuración.

custom_config = r'-c tessedit_char_whitelist=abcdefghijklmnopqrstuvwxyz --psm 6'
print(pytesseract.image_to_string(img, config=custom_config))

Salida -

customername
roject
tnvoleeno
ated alliumenergyservices
e
thovo

Personajes de la lista negra

Si está seguro de que algunos caracteres o expresiones definitivamente no aparecerán en su texto (de lo contrario, el OCR devolverá texto incorrecto en lugar de caracteres en la lista negra), puede incluirlos en la lista negra utilizando la siguiente configuración.

custom_config = r'-c tessedit_char_blacklist=0123456789 --psm 6'
pytesseract.image_to_string(img, config=custom_config)

Salida -

Customer name Hallium Energy services
Project NEHINS-HIB-HSA
lavoice no
Dated %h Nov%
Pono

Detectar en múltiples idiomas

Puede verificar los idiomas disponibles escribiendo esto en la terminal

$ tesseract --list-langs

Para descargar tesseract para un uso de idioma específico

$ sudo apt-get install tesseract-ocr-LANG

donde LANG es el código de tres letras para el idioma que necesita. Puedes encontrar los valores de LANG esta página.

Usted puede descargar el .traindata archivo para el idioma que necesita de esta página y colocarlo en $TESSDATA_PREFIX directorio (esto debería ser el mismo que donde el tessdata directorio está instalado) y debe estar listo para usar.

Note - Solo idiomas que tienen un .traineddata formato de archivo son compatibles con tesseract.

Para especificar el idioma en el que necesita su salida de OCR, use el -l LANG argumento en la configuración donde LANG es el código de 3 letras para el idioma que desea usar.

custom_config = r'-l eng --psm 6'
pytesseract.image_to_string(img, config=custom_config)

Tome esta imagen por ejemplo:
Cómo OCR con Tesseract, OpenCV y Python
Puede trabajar con varios idiomas cambiando el parámetro LANG como tal:

custom_config = r'-l grc+tha+eng --psm 6'
pytesseract.image_to_string(img, config=custom_config)

y obtendrás el siguiente resultado:

Here’s some Greek: Οδιο διστα ιμπεδιτ φιμ ει, αδ φελ αβχορρεανθ ελωκυενθιαμ, εξ εσε εξερσι γυ-
βεργρεν ηας. Ατ μει σολετ σριπτορεμ. ἴυς αλια λαβωρε θε. Σιθ κυωτ νυσκυαμ
τρασυνδια αν, ὠμνιυμ ελιγενδι τιν πρι. Παρτεμ φερθερεμ συσιπιαντὺυρ εξ ιυς,ναμ
%0790 แ ร เง ๑ ๕ 80 ๕ 6 ๑ อ 06 ส 0 เง น อ ๓ , πρω πρωπριαε σαεφολα ιδ. Ατ πρι δολορ νυ-
σκυαμ. 6 Thai Here’s some Thai: ν᾿ ค อ ร ั ป ซั น จ ุ ้ ย โป ร ด ิ ว เซ อ ร ์ ส ถา ป ั ต ย ์ จ ๊ า บ แจ ็ ก พ ็ อ ต ม ้ า ห ิ น อ ่ อ น ซา ก ุ ร ะ ค ั น ถ ธ ุ ร ะ ฟิ ด ส ต า ร ์ ท ง ี ้ บ อ ย
ค อ ต อ ื ่ ม แป ร ั ส ั ง โฆ ค ํ า ส า ป แฟ น ซี ศิ ล ป ว ั ฒ น ธร ร ม ไฟ ล ท ์ จ ิ ๊ ก โก ๋ ก ั บ ด ั ก เจ ล พ ล ็ อ ต ม า ม ่ า ซา ก ุ ร ะ ด ี ล เล อ
ร ์ ซี น ด ั ม พ ์ แฮ ป ป ี ้ เอ ๊ ้ า ะ อ ุ ร ั ง ค ธา ต ุ ซิ ม ฟิ น ิ ก ซ์ เท ร ล เล ่ อ ร ์ อ ว อ ร ์ ด แค น ย อ น ส ม า พ ั น ธ์ ค ร ั ว ซอ ง ฮั ม อ า
ข่ า เอ ็ ก ซ์ เพ ร ส

Note - El idioma especificado primero para el -l El parámetro es el idioma principal.

Lamentablemente, tesseract no tiene una función para detectar automáticamente el idioma del texto en una imagen. Una solución alternativa es proporcionada por otro módulo de Python llamado langdetect que se puede instalar a través de pip.

$ pip install langdetect

Este módulo nuevamente no detecta el idioma del texto usando una imagen, pero necesita una entrada de cadena para detectar el idioma. La mejor manera de hacer esto es primero usando tesseract para obtener el texto de OCR en cualquier idioma que pueda sentir, usando langdetect para encontrar qué idiomas están incluidos en el texto de OCR y luego ejecutar OCR nuevamente con los idiomas encontrados.

Digamos que tenemos un texto que pensamos que estaba en inglés y portugués.

custom_config = r'-l eng+por --psm 6'
txt = pytesseract.image_to_string(img, config=custom_config) from langdetect import detect_langs
detect_langs(txt)

Esto debería generar una lista de idiomas en el texto y sus probabilidades.

[en:0.714282468983554, es:0.2857145605644145]

Los códigos de idioma utilizados por langdetect siga los códigos ISO 639-1. Para comparar, verifique así y así. Encontramos que el idioma utilizado en el texto es inglés y español.

Obtenemos el texto nuevamente cambiando la configuración a

custom_config = r'-l eng+spa --psm 6'
txt = pytesseract.image_to_string(img, config=custom_config)

Note – Tesseract funciona mal cuando, en una imagen con varios idiomas, los idiomas especificados en la configuración son incorrectos o no se mencionan en absoluto. Esto también puede confundir bastante al módulo langdetect.


Usando tessdata_fast

Si la velocidad es una preocupación importante para usted, puede reemplazar sus modelos de idioma tessdata con modelos tessdata_fast que son versiones enteras de 8 bits de los modelos tessdata.

De acuerdo con el tessdata_fast gitHub

Este repositorio contiene versiones enteras rápidas de modelos entrenados para Motor de OCR de código abierto Tesseract.

Estos modelos solo funcionan con el motor LSTM OCR de Tesseract 4.

  • Estos son un compromiso de velocidad/precisión en cuanto a lo que ofrece la mejor "relación calidad-precio" en velocidad frente a precisión.
  • Para algunos idiomas, esto sigue siendo el mejor, pero para la mayoría no.
  • La configuración de red con la "mejor relación calidad-precio" se integerizó para aumentar la velocidad.
  • La mayoría de los usuarios querrán usar estos archivos de datos capacitados para hacer OCR y se enviarán como parte de las distribuciones de Linux, por ejemplo. Ubuntu 18.04.
  • Ajuste fino / entrenamiento incremental NO ser posible a partir de estos fast modelos, ya que son enteros de 8 bits.
  • Cuando se utilizan los modelos en este repositorio, solo se admite el nuevo motor de OCR basado en LSTM. El legado tesseract El motor no es compatible con estos archivos, por lo que los modos oem '0' y '2' de Tesseract no funcionarán con ellos.

Para utilizar tessdata_fast modelos en lugar de tessdata, todo lo que necesitas hacer es descargar tu tessdata_fast archivo de datos de idioma de esta página y colóquelo dentro de su $TESSDATA_PREFIX directorio.


¿Necesita digitalizar documentos, recibos o facturas pero es demasiado vago para codificar? Dirigirse a Nanonetas y crea modelos OCR gratis!


Capacitación de Tesseract en datos personalizados

Tesseract 4.00 incluye un nuevo motor de reconocimiento basado en redes neuronales que ofrece una precisión significativamente mayor en las imágenes de documentos. Las redes neuronales requieren significativamente más datos de entrenamiento y entrenan mucho más lento que la base Tesseract. Para los idiomas basados ​​en latín, los datos del modelo existente proporcionados se han entrenado en aproximadamente 400000 líneas de texto que abarcan aproximadamente 4500 fuentes.

Para ejecutar con éxito el tutorial de capacitación Tesseract 4.0 LSTM, debe tener una instalación funcional de Tesseract 4 y Tesseract 4 Training Tools y también tener los scripts de capacitación y los archivos de datos capacitados necesarios en ciertos directorios. Visitar repositorio github para archivos y herramientas.

Tesseract 4.00 tarda entre unos días y un par de semanas en entrenar desde cero. Incluso con todos estos nuevos datos de entrenamiento, por lo tanto, aquí hay algunas opciones para el entrenamiento:

  • Afinar - Comenzando con un idioma capacitado existente, capacítese en sus datos adicionales específicos. Por ejemplo, capacitación sobre un conjunto de datos escritos a mano y algunas fuentes adicionales.
  • Cortar la capa superior – de la red y volver a entrenar una nueva capa superior utilizando los nuevos datos. Si el ajuste fino no funciona, lo más probable es que esta sea la siguiente mejor opción. La analogía por la que esto es útil, tome como ejemplo los modelos entrenados en el conjunto de datos de ImageNet. El objetivo es construir un clasificador de gatos o perros, las capas inferiores del modelo son buenas para la abstracción de bajo nivel como esquinas, líneas horizontales y verticales, pero las capas superiores del modelo combinan esas características y detectan orejas, ojos y nariz de gatos o perros. y así. Al volver a entrenar solo las capas superiores, está utilizando el conocimiento de las capas inferiores y combinándolo con su nuevo conjunto de datos diferente.
  • Vuelva a entrenar desde cero - Este es un enfoque muy lento a menos que tenga un conjunto de capacitación muy representativo y suficientemente grande para su problema. El mejor recurso para entrenar desde cero es seguir esto repositorio github.

Una guía sobre cómo entrenar sus datos personalizados y crear .traineddata los archivos se pueden encontrar esta página, esta página y esta página.

No cubriremos el código para la capacitación con Tesseract en esta publicación de blog.

Cómo OCR con Tesseract, OpenCV y Python

Limitaciones de Tesseract

Tesseract funciona mejor cuando hay una segmentación limpia del texto en primer plano del fondo. En la práctica, puede ser extremadamente difícil garantizar este tipo de configuración. Hay una variedad de razones por las que es posible que Tesseract no obtenga resultados de buena calidad, como si la imagen tuviera ruido de fondo. Cuanto mejor sea la calidad de la imagen (tamaño, contraste, rayos), mejor será el resultado del reconocimiento. Requiere un poco de preprocesamiento para mejorar los resultados de OCR, las imágenes deben ajustarse adecuadamente, tener el mayor contraste de imagen posible y el texto debe alinearse horizontalmente. Tesseract OCR es bastante potente pero tiene las siguientes limitaciones.

Limitaciones de Tesseract resumidas en la lista.

  • El OCR no es tan preciso como algunas soluciones comerciales disponibles para nosotros.
  • No funciona bien con imágenes afectadas por artefactos que incluyen oclusión parcial, perspectiva distorsionada y fondo complejo.
  • No es capaz de reconocer la escritura a mano.
  • Puede encontrar galimatías e informar esto como salida de OCR.
  • Si un documento contiene idiomas fuera de los dados en los argumentos de -l LANG, los resultados pueden ser pobres.
  • No siempre es bueno para analizar el orden natural de lectura de los documentos. Por ejemplo, es posible que no reconozca que un documento contiene dos columnas y puede intentar unir texto a través de columnas.
  • Los escaneos de baja calidad pueden producir OCR de baja calidad.
  • No expone información sobre a qué texto de familia de fuentes pertenece.


Por supuesto, existe una forma mejor, mucho más simple e intuitiva de realizar tareas de OCR.


OCR con nanonetas

Cómo OCR con Tesseract, OpenCV y Python

El API de OCR de nanonetas le permite construir modelos de OCR con facilidad. No tiene que preocuparse por el preprocesamiento de sus imágenes o preocuparse por las plantillas coincidentes o construir motores basados ​​en reglas para aumentar la precisión de su modelo de OCR.

Puede cargar sus datos, anotarlos, configurar el modelo para entrenar y esperar a obtener predicciones a través de una interfaz de usuario basada en navegador sin escribir una sola línea de código, preocuparse por las GPU o encontrar las arquitecturas adecuadas para sus modelos de aprendizaje profundo. También puede adquirir las respuestas JSON de cada predicción para integrarla con sus propios sistemas y crear aplicaciones con tecnología de aprendizaje automático basadas en algoritmos de última generación y una infraestructura sólida.

Usando la GUI: https://app.nanonets.com/

También puede usar la API Nanonets-OCR siguiendo los pasos a continuación: ‌

Paso 1: Clone el repositorio, instale dependencias

git clone https://github.com/NanoNets/nanonets-ocr-sample-python.git
cd nanonets-ocr-sample-python
sudo pip install requests tqdm

Paso 2: Obtenga su clave API gratuita
Obtenga su clave API gratuita de http://app.nanonets.com/#/keys

Cómo OCR con Tesseract, OpenCV y Python

Paso 3: establezca la clave API como una variable de entorno

export NANONETS_API_KEY=YOUR_API_KEY_GOES_HERE

Paso 4: crea un nuevo modelo

python ./code/create-model.py

Nota: Esto genera un MODEL_ID que necesita para el siguiente paso

Paso 5: Agregar ID de modelo como variable de entorno

export NANONETS_MODEL_ID=YOUR_MODEL_ID

Nota: obtendrá YOUR_MODEL_ID del paso anterior

Paso 6: cargue los datos de entrenamiento
Los datos de entrenamiento se encuentran en images (archivos de imagen) y annotations (anotaciones para los archivos de imagen)

python ./code/upload-training.py

Paso 7: modelo de tren
Una vez que se hayan cargado las imágenes, comience a entrenar al modelo

python ./code/train-model.py

Paso 8: Obtenga el estado del modelo
El modelo tarda ~ 2 horas en entrenar. Recibirá un correo electrónico una vez que el modelo esté capacitado. Mientras tanto, verifica el estado del modelo

python ./code/model-state.py

Paso 9: Hacer predicción
Una vez que el modelo está entrenado. Puedes hacer predicciones usando el modelo

python ./code/prediction.py ./images/151.jpg


Nanonets y humanos en el bucle

‌‌La pantalla 'Moderado' ayuda a los procesos de corrección e ingreso y reduce la carga de trabajo del revisor manual en casi un 90 % y reduce los costos en un 50 % para la organización.

Cómo OCR con Tesseract, OpenCV y Python

Las características incluyen

  1. Hacer un seguimiento de las predicciones correctas
  2. Rastrea cuáles están mal
  3. Hacer correcciones a las imprecisas
  4. Eliminar los que están mal
  5. Completa las predicciones que faltan
  6. Filtrar imágenes con rangos de fechas
  7. Obtenga recuentos de imágenes moderadas contra las no moderadas

Todos los campos están estructurados en una GUI fácil de usar que permite al usuario aprovechar la tecnología OCR y ayudar a mejorarla a medida que avanza, sin tener que escribir ningún código o comprender cómo funciona la tecnología.


¿Tiene un problema de OCR en mente? ¿Quiere reducir los costos de entrada de datos de su organización? Dirigirse a Nanonetas y construir modelos OCR para extraer texto de imágenes or extraer datos de archivos PDF!


Conclusión

Así como el aprendizaje profundo ha impactado en casi todas las facetas de la visión por computadora, lo mismo ocurre con el reconocimiento de caracteres y el reconocimiento de escritura a mano. Los modelos basados ​​en aprendizaje profundo han logrado obtener una precisión de reconocimiento de texto sin precedentes, mucho más allá de lo tradicional. extracción de información y procesamiento de imágenes de aprendizaje automático enfoques.

Tesseract funciona bien cuando las imágenes de documentos siguen las siguientes pautas:

  • Segmentación limpia del texto en primer plano del fondo
  • Horizontalmente alineado y escalado apropiadamente
  • Imagen de alta calidad sin borrosidad ni ruido.

La última versión de Tesseract 4.0 admite OCR basado en aprendizaje profundo que es significativamente más preciso. El motor OCR en sí está construido en una red de memoria a corto plazo (LSTM), una especie de red neuronal recurrente (RNN).

Tesseract es perfecto para escanear documentos limpios y viene con bastante alta precisión y variabilidad de fuente ya que su capacitación fue integral. Yo diría que Tesseract es una herramienta de referencia si su tarea es escanear libros, documentos y texto impreso sobre un fondo blanco limpio.


OTRAS LECTURAS

Actualizar:
Muchas personas nos preguntaron cómo pueden obtener la fecha en forma de texto o usar cuando detecta la fecha o cualquier otro dato específico para que puedan agregarlo a la lista.
Aquí está la respuesta:
En el código para dibujar un cuadro delimitador alrededor del cuadro de fecha, notará una línea que coincide con el patrón de expresión regular con d['text']. Solo dibuja un cuadro si el patrón coincide. Simplemente puede extraer los valores de d['text'] una vez que el patrón coincida y añádalos a una lista.

Update 2:
Para abordar las preguntas sobre el OCR en idiomas distintos del inglés, hemos actualizado otras listas de lectura.

Sello de tiempo:

Mas de IA y aprendizaje automático