marzo 2, 2022 10:00 am

Jesús

Tesseract es una herramienta con muchas facetas.

Hasta este punto, la hemos utilizado principalmente para extraer texto de una imagen, así como obtener información sobre la escritura y la orientación del texto en la misma (OSD).

Sin embargo, Tesseract, al igual que OpenCV, cuenta con una serie de modelos de deep learning que nos permiten realizar operaciones interesantes, como la localización de texto.

En este artículo aprenderemos qué es, concretamente, la localización de texto, y cómo podemos utilizar Tesseract para hallar y escanear texto en una imagen.

Al final de este post sabrás:

  • Cómo usar la función de detección de texto en Tesseract.
  • Cómo implementar un simple script con Python para localizar y visualizar el texto detectado, con la ayuda de Tesseract y OpenCV.

¿Qué es la Detección de Texto?

La detección de texto es el acto o procedimiento de hallar la ubicación de texto en una imagen.

Realmente se trata de un caso específico de la detección de objetos, un tema que hemos tratado extensamente en DataSmarts.

En esta instancia en especial, el objeto que deseamos localizar es texto, y para ello existen numerosos modelos de deep learning especializados en esta tarea.

Afortunadamente, no tenemos que entrenar ninguno desde cero, ya que Tesseract nos provee de un API de alto nivel para localizar texto con suma facilidad.

Creación del Entorno de Desarrollo con Anaconda

Observemos la estructura del proyecto:

Nuestra implementación vivirá en el archivo datasmarts/localize.py. En la siguiente sección iremos armando paso a paso nuestra solución.

Para descargar el proyecto, simplemente llena el siguiente formulario con tus datos:

A continuación crearemos el entorno de desarrollo con Anaconda, para lo que primero deberemos ubicarnos en la raíz del proyecto. Desde ahí ejecuta este comando:

conda env create -f pytesseract-text-detection

La configuración del ambiente (pytesseract-text-detection) es esta:

Para activar el ambiente, corre este comando:

conda activate pytesseract-text-detection

Pasemos a la próxima sección.

Localización de Texto con Tesseract y OpenCV

Abre el archivo datasmarts/localize.py e inserta estas líneas, las cuales importan las dependencias del proyecto:

Si estás trabajando en Windows, es posible que tengas que añadir esta línea para que el script funcione:

Evidentemente, cambia la ruta para que apunte a la ubicación del ejecutable tesseract.exe en tu máquina. 

Si usas Ubuntu/Debian o macOS, puedes ignorar este paso.

Definamos la función auxiliar cleanup_text(), la cual filtra caracteres que no pertenezcan al estándar ASCII, ya que OpenCV no puede mostrar caracteres Unicode:

Lo siguiente es definir los argumentos de entrada del programa:

  • -i/--image: Ruta a la imagen de entrada.
  • -c/--min-confidence: Confianza mínima que debe tener una detección para considerarse válida. Por defecto es 0, lo que significa que toleraremos cualquier detección. Vale la pena que experimentes con este parámetro en tus propias fotos.

Cargamos la imagen de entrada y la redimensionamos para que tenga un ancho de 800 píxeles, siempre manteniendo la relación de aspecto.

¿Por qué? De esta forma garantizamos que tendremos suficiente espacio para mostrar la ubicación y los caracteres del texto detectado, como veremos más adelante:

Para evitar problemas de compatibilidad con Tesseract, debemos cambiar el modo de color de la imagen, de BGR → RGB:

Llegamos a la parte buena del artículo, pues localizaremos el texto en nuestra imagen usando Tesseract. La función que usaremos para este propósito es pytesseract.image_to_data():

Iteramos sobre los resultados, extrayendo las coordenadas del “bounding box” de cada porción de texto detectado por Tesseract:

También extraeremos el texto per se, así como la confianza del detector:

Solo si la detección es lo suficientemente confiable procederemos a pintarla en la imagen original:

Por último, mostramos la imagen etiquetada, y destruimos las ventanas creadas durante la ejecución del programa:

¡ATENTO!

Antes de ejecutar el código, asegúrate de hallarte en la raíz del proyecto para que los comandos funcionen correctamente.

Ejecuta el programa así:

python datasmarts/localize.py -i address.png

En la pantalla veremos la imagen original, justo antes de pasarla por Tesseract:

Y justo después veremos la versión etiquetada por OpenCV, con el resultado de la detección hecha por Tesseract:

Como podemos notar, nuestro script realizó un gran trabajo, ya que no solo ubicó cada palabra en la imagen, sino que “leyó” correctamente el texto.

En la consola observamos la confianza del detector asociada a cada pedazo de texto que Tesseract leyó:

Confianza: 96.449638
Text: Address

Confianza: 65.958359
Text: 1021

Confianza: 95.457336
Text: Lincoln

Confianza: 96.349197
Text: Road

Confianza: 96.095718
Text: Miami

Confianza: 96.708298
Text: Beach,

Confianza: 94.387146
Text: FL

Confianza: 94.387146
Text: 33139

Confianza: 96.036583
Text: (305)

Confianza: 96.443596
Text: 421-0400

Confianza: 96.768227
Text: Driving

Confianza: 95.73645
Text: directions

Confianza: 95.85585
Text: and

Confianza: 96.322052
Text: map

Genial, ¿no crees?

Resumen

Hoy aprendimos a detectar texto con la ayuda de Tesseract.

Si bien es algo que podemos llevar a cabo con OpenCV, puesto que incluye varios modelos específicamente entrenados para detectar texto, la principal ventaja de hacerlo con Tesseract, es que solo debemos llamar a la función pytesseract.image_to_data() y voilà.

No obstante, si queremos ir un paso más allá, y no solo “leer” el texto, sino también desplegarlo en la imagen original, necesariamente debemos acudir a OpenCV, ya que Tesseract no cuenta con las herramientas necesarias para etiquetar imágenes.

¿Qué te pareció el post? ¿Lo encontraste útil? 

Para cimentar tu entendimiento, mi recomendación es que descargues el código a continuación, y experimentes con tus propias imágenes. Es posible que tengas que ajustar la confianza del detector para deshacerte de detecciones erróneas o débiles:

¡Nos vemos muy pronto! 

Sobre el Autor

Jesús Martínez es el creador de DataSmarts, un lugar para los apasionados por computer vision y machine learning. Cuando no se encuentra bloggeando, jugando con algún algoritmo o trabajando en un proyecto (muy) cool, disfruta escuchar a The Beatles, leer o viajar por carretera.