febrero 11, 2022 10:00 am

Jesús

Otra de las configuraciones que podemos aplicar a Tesseract tiene que ver con el filtrado de qué caracteres queremos permitir, y cuáles queremos prohibir.

En inglés, nos referimos a este tipo de filtrado como whitelisting y blacklisting, respectivamente.

Estas opciones resultan muy útiles, dependiendo del contexto, para enfocarnos en carácteres relevantes. 

Por ejemplo, si estamos escaneando una receta médica, podríamos prohibir caracteres especiales y símbolos, y más bien centrar nuestra atención en letras y cifras correspondientes a medicamentos, tratamientos y dosis.

Al final de este artículo habrás aprendido:

  • Cómo configurar Tesseract para permitir solo ciertos caracteres (whitelisting).
  • Cómo configurar Tesseract para prohibir determinados caracteres (blacklisting).

¿Preparado? Comencemos.

Diferencias entre Whitelisting y Blacklisting

Considero que la mejor manera de entender estos dos tipos de filtros, es mediante un ejemplo.

Imagina que eres el bouncer o guardia de seguridad de la discoteca más exclusiva de tu ciudad.
Nightclub bouncer

Un día tu jefe organiza una gran celebración para los empleados de, digamos, Tesla, y te entrega una lista de invitados.

Siempre que alguien esté anotado en esa lista, podrá pasar. Si no, no podrá. Esto sería whitelisting.

Sigamos construyendo nuestro ejemplo.

Tu jefe, como el hombre perceptivo, poderoso y bien conectado que es, tiene otra lista, esta vez de personajes peligrosos, problemáticos e indeseables que, bajo ningún concepto, pueden acceder a la fiesta que ha organizado.

Esto sería blacklisting.

¿Queda claro? Perfecto. Sigamos.

Creación del Entorno de Desarrollo con Anaconda

Nuestro proyecto, acorde a la estructura mostrada a continuación, contiene un único script relevante: datasmarts/filter.py:

Puedes descargar el código asociado al post en el formulario que sigue:

Para configurar el ambiente de Anaconda, tienes que ubicarte en la raíz del proyecto. EStando allí, corre este comando para crear y configurar el ambiente:

conda env create -f pytesseract-whitelist-blacklist-ocr

El ambiente que acabas de crear responde a esta configuración (pytesseract-whitelist-blacklist-ocr):

Para activar el ambiente, corre esto:

conda activate pytesseract-whitelist-blacklist-ocr

Continuemos en la siguiente sección para ponernos manos a la obra.

Filtrado de Caracteres con Tesseract OCR (Blacklisting y Whitelisting)

Inicia abriendo el archivo datasmarts/filter.py, e inserta estas líneas para traerte las dependencias del programa:

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.

Nuestro programa recibe tres parámetros:

  • -i/--image: La ruta a la imagen de entrada.
  • -w/--whitelist: Lista de caracteres a permitir.
  • -b/--blacklist: Lista de caracteres a prohibir.

A continuación, cargamos la imagen de entrada, y la desplegamos en pantalla:

Para garantizar compatibilidad con Tesseract, tenemos que pasar de BGR a RGB:

Dependiendo de los argumentos enviados por el usuario, añadiremos la configuración de Tesseract asociada a la variable options:

Como vemos, para especificar una whitelist, usamos “-c tessedit_char_whitelist” y, análogamente, para la blacklist, la configuración correspondiente es “-c tessedit_char_blacklist”. En ambos casos, tenemos que pasar el string con los caracteres que definen cada lista.

Después, para extraer el texto de la imagen, usamos la ya familiar pytesseract.image_to_string(), pasándole el options al parámetro config para modificar su comportamiento:

Finalmente, destruimos las ventanas creadas:

¡ATENTO!

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

El primer ejemplo que correremos involucra escanear una imagen usando una whitelist:

python datasmarts/filter.py -i address.png -w ‘1234’

Esta instrucción ejecuta el código sobre la imagen que vemos abajo, especificando que ÚNICAMENTE los números del 1 al 4 están permitidos en el resultado:

Figura de ejemplo de dirección

Y en la consola veremos el resultado:

Texto escaneado:

121
3313
34214

¡Funcionó a la perfección!

Probemos ahora con una blacklist:

python datasmarts/filter.py -i address.png -b ‘1’

Esta instrucción le dice al programa que BAJO NINGÚN CONCEPTO, puede aparecer un 1 en el resultado. Como vemos, ese es el caso:

Texto escaneado:

Address

02! Lincoln Road
Miami Beach, FL 33739
(305) 42-0400

Driving directions and map

Si bien la mayoría de los 1 fueron excluídos, uno de ellos fue reemplazado por “!”. Esto es un error que podemos corregir fácilmente, así:

python datasmarts/filter.py -i address.png -b ‘1!’

Al añadir el signo de exclamación a la blacklist, el resultado es el deseado:

Texto escaneado:

Address

02 Lincoln Road
Miami Beach, FL 33739
(305) 42-0400

Driving directions and map

Resumen

Hoy aprendimos a usar filtros para enfocarnos únicamente en el conjunto de caracteres que deseamos escanear.

Por supuesto, qué permitir y qué prohibir siempre varía dependiendo del contexto de nuestra aplicación.

Cuando buscamos especificar qué caracteres permitir, nos referimos a una whitelist.

Si, en cambio, queremos especificar cuáles caracteres prohibir, entonces hablamos de una blacklist.

Para configurar Tesseract con una whitelist, usamos la configuración “-c tessedit_char_whitelist=<LISTA>”.

Análogamente, para una blacklist, la configuración es “-c tessedit_char_blacklist=<LISTA>”.

Después, por supuesto, dicha configuración se la proporcionamos en el parámetro config a la función pytesseract.image_to_string().

No olvides descargar el código aquí, ya que en el proyecto se encuentran muchas otras imágenes que te motivarán a experimentar más por cuenta propia:

¡Hasta la próxima ocasión!

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.