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:
¿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:
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!