Aprende a usar Tesseract OCR con PHP en un proyecto de Symfony 3.

Introducción al reconocimiento óptico de caracteres (OCR) con Tesseract en Symfony 3

Imaginemos que necesita digitalizar una página de un libro o un documento impreso, utilizará un escáner para crear una imagen de la página real. Sin embargo, aunque tiene los derechos para editar el contenido del libro escaneado, no puede editarlo en su computadora porque es una imagen y no puede simplemente editar una imagen como si fuera un documento digital. Sí, el usuario puede usar programas que crean PDF con texto seleccionable y luego pueden hacer lo que quieran, sin embargo, como desarrollador, puedes ofrecer a tu usuario la posibilidad de extraer el texto de las imágenes usando la tecnología de reconocimiento óptico de caracteres. Para lograr nuestro objetivo de convertir imágenes a texto, usaremos Tesseract escrito en C ++ instalándolo en el sistema y luego usando la línea de comando con el contenedor PHP.

En este artículo aprenderás a extraer el texto de una imagen en un proyecto Symfony con la ayuda de Tesseract.

1. Instale Tesseract en su sistema

Para utilizar la API de reconocimiento óptico de caracteres, como se menciona en el artículo, vamos a utilizar Tesseract. Tesseract  es un motor de reconocimiento óptico de caracteres (OCR) de código abierto, disponible bajo la licencia Apache 2.0. Se puede utilizar directamente mediante una API para extraer texto mecanografiado, escrito a mano o impreso de imágenes. Admite una amplia variedad de idiomas (que deben instalarse). Tesseract admite varios formatos de salida: texto sin formato, hocr (html) y pdf.

El proceso de instalación de Tesseract en su sistema variará según el Sistema Operativo que utilice:

Ventanas

La instalación de Tesseract en Windows es bastante simple, le recomendamos que utilice el instalador no oficial mencionado en la wiki aquí (tesseract-ocr-setup- <version> .exe) . Puede obtener una lista de todas las configuraciones disponibles en el sitio web oficial de tesseract aquí  (descargue siempre la versión más reciente).

El proceso de instalación es muy sencillo, solo siga el asistente. Sin embargo, le recomendamos que instale directamente todos los idiomas que necesita para tesseract en la configuración (solo los que necesita, de lo contrario el proceso de descarga llevará mucho tiempo) y registre tesseract en la RUTA:

Tesseract Windows Installation Setup

Espere hasta que finalice la instalación y esté listo para comenzar. Puede probar si se instaló correctamente ejecutándose en una nueva ventana del símbolo del sistema tesseract -v(que debería mostrar la versión instalada).

Ubuntu

Instale Tesseract usando el siguiente comando:

sudo apt-get install tesseract-ocr

Luego, instale los idiomas que necesita reconocer (por ejemplo, -deu, -fra, -eng, -spa inglés requerido):

sudo apt-get install tesseract-ocr-eng

Entonces tesseract debería estar disponible en cualquier terminal y por lo tanto accesible por nuestros scripts PHP más adelante.

Mac OS

Si está usando Mac OS X, puede instalar tesseract usando  MacPorts Homebrew :

MacPorts

Para instalar Tesseract, ejecute este comando:

sudo port install tesseract

Para instalar cualquier dato de idioma, ejecute:

sudo port install tesseract-<langcode>

Puede encontrar una lista completa de códigos de idioma disponibles en la página de tesseract de MacPorts .

Homebrew

Para instalar Tesseract, ejecute este comando:

brew install tesseract

En caso de que necesite más información o su sistema operativo no esté en la lista, consulte la wiki de instalación del repositorio de Tesseract en Github aquí .

2. Instale el contenedor PHP de Tesseract

Para manejar Tesseract con PHP, usaremos el Wrapper de Tesseract más conocido escrito por @thiagoalessio . Tesseract OCR para PHP es un contenedor útil y muy fácil de usar de las instrucciones de la línea de comandos para Tesseract OCR dentro de PHP.

La forma preferida de instalación es a través del compositor, puede ejecutar el siguiente comando directamente en la terminal:

composer require thiagoalessio/tesseract_ocr 1.0.0-RC

O si lo desea, edite el archivo composer.json y agregue la siguiente dependencia y ejecute luego composer install:

{
    "require": {
        "thiagoalessio/tesseract_ocr": "1.0.0-RC",
    }
}

Después de la instalación, podrás usar el Wrapper en tus controladores Symfony.

Nota: debe instalar la versión especificada como en la documentación de la biblioteca, el método para reconocer el texto en la imagen usando Tesseract es $tesseract->run(). En las versiones anteriores, debe usar $tesseract->recognize() en su lugar.

3. Implementación dentro de un controlador

El uso de la biblioteca es bastante simple y fácil de entender:

<?php

// Incluye el wrapper de Tesseract
use TesseractOCR;
// o sin usar la declaración de use
// $tesseractInstance = new \TesseractOCR($filepath);

// Ruta absoluta o relativa a la imagen a reconocer
$filepath = "image-to-recognize.jpeg";

// Cree una instancia de tesseract con la ruta de archivo como primer parámetro
$tesseractInstance = new TesseractOCR($filepath);

// Ejecute tesseract para reconocer texto
$result = $tesseractInstance->run();

// Mostrar texto reconocido
echo $result;

El siguiente ejemplo muestra cómo reconocer el texto de la siguiente imagen:

Lazy Fox OCR with Tesseract and PHP

Tenga en cuenta que el archivo se ubicará en /your-project/web/text.jpeg:

<?php

namespace myBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;

// Incluya el wrapper de Tesseract
use TesseractOCR;

class DefaultController extends Controller
{
    public function indexAction()
    {
        // Recuperar la ruta web en Symfony
        $webPath = $this->get('kernel')->getRootDir().'/../web/';
        // El nombre de archivo de la imagen es text.jpeg y se encuentra dentro de la carpeta web
        $filepath = $webPath.'text.jpeg';

        // Es útil para verificar si el archivo existe, porque el contenedor tesseract
        // arrojará un error pero sin descripción
        if(!file_exists($filepath)){
            return new Response("Warning: the providen file [".$filepath."] doesn't exists.");
        }

        // Cree una nueva instancia de tesseract y proporcione como primer parámetro
        // el directorio local de la imagen
        $tesseractInstance = new TesseractOCR($filepath);

        // Ejecute tesseract para reconocer texto
        $result = $tesseractInstance->run();

        // Devuelve el texto reconocido como respuesta (esperado: el rápido zorro marrón salta sobre el perro perezoso).
        return new Response($result);
    }
}

Navegue hasta la ruta que coincida con la acción de índice de este controlador, y verá como salida el texto reconocido de la imagen.

4. Idiomas de apoyo

Como sabes, hay otros idiomas en el mundo que usan caracteres especiales, por eso Tesseract ofrece paquetes de diferentes idiomas. Por ejemplo, si intenta reconocer la siguiente imagen sin el paquete alemán:

Tesseract German Package

Obtendrá como resultado "griifien". Eso no es cierto en absoluto, eso sucede porque estos personajes son del idioma alemán. Para resolverlo, debe agregar el paquete alemán (identificado con deu):

<?php 

// Cree una nueva instancia de tesseract y proporcione como primer parámetro
// el directorio local de la imagen
$tesseractInstance = new TesseractOCR("image.jpeg");

// Configure el idioma alemán, tenga en cuenta que debe instalarse
$tesseractInstance->lang("deu");

// Ejecute tesseract para reconocer texto
$result = $tesseractInstance->run();

echo $result;

Ahora, como resultado, debería obtener "grüßen" como se esperaba. Puede configurar varios idiomas para que funcionen al mismo tiempo proporcionando varios argumentos:

$tesseractInstance->lang("deu", "spa", "por");

Nota: para utilizar diferentes idiomas, también necesitará tener instalados los paquetes respectivos.

5. Opciones personalizadas

Si ya ha leído algún contenido de la documentación del uso de Tesseract con la línea de comandos , sabe que hay muchas propiedades que puede cambiar. El contenedor PHP de tesseract proporciona algunos métodos para las opciones más utilizadas:

Cambiar la ruta ejecutable

Por diferentes razones, es posible que no tenga tesseract disponible directamente en la variable de entorno PATH, por lo tanto, la ejecución de un comando con el contenedor php " tesseract imagename.jpeg outputbase" no funcionará. Puede especificar la ubicación del ejecutable tesseract con el método ejecutable:

$tsaInstance = new TesseractOCR("image.jpeg");

// Por ejemplo, en Windows, debes ajustar la ruta entre comillas dobles para que funcione.
$executablePath = '"C:/Program Files (x86)/Tesseract-OCR/tesseract.exe"';

$tsaInstance->executable($executablePath);

$recognized = $tsaInstance->run();

Segmentación de páginas

Puede configurar el modo de segmentación de la página con la ->psm($mode)instrucción, que le indica a tesseract cómo interpretar la imagen dada:

$tsaInstance = new TesseractOCR("image.jpeg");

$tsaInstance->psm(1);

$recognized = $tsaInstance->run();

Los posibles valores para la segmentación de la página son:

Value Description
0 Solo orientación y detección de guiones (OSD).
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. (Este valor se usa de forma predeterminada si no se proporciona ninguno)
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.

Establecer idiomas para reconocer

Puede definir uno o más idiomas para usar durante el reconocimiento usando el método ->lang($lang1, $lang2). Puede obtener una lista de todos los idiomas admitidos por tesseract en la documentación aquí :

$tsaInstance = new TesseractOCR("image.jpeg");

// Para proporcionar reconocimiento chino completo
$tsaInstance->lang('chi_sim', 'chi_tra');

$recognized = $tsaInstance->run();

Usa palabras de una lista

Puede proporcionar una lista. esta lista debe ser un archivo de texto sin formato que contenga una lista de palabras que desea que tesseract considere como un diccionario normal de palabras, por ejemplo ( mywords.txt):

jargon
artyom.js
recognition

Y agrégalo con el envoltorio:

$tsaInstance = new TesseractOCR("image.jpeg");

// Palabras personalizadas
$tsaInstance->userWords('mywords.txt');

$recognized = $tsaInstance->run();

Esta lista es realmente útil cuando se trata de contenidos que contienen terminología técnica.

Caracteres de la lista blanca

Incluso puede limitar los caracteres que reconocerá tesseract, por ejemplo con la siguiente imagen:

Tesseract example whitelist

Tesseract lo reconocerá "BOSS". Eso es genial, porque en la imagen parece que alguien escribió BOSS sin embargo, el usuario (probablemente un niño o alguien con mala caligrafía) escribió el número "8055". Ahí es donde la lista blanca es útil, en este caso podemos limitar los caracteres para reconocer solo números usando un rango de 0 a 9:

$tsaInstance = new TesseractOCR("image.jpeg");

// Reconocer todo en números
$tsaInstance->whitelist(range(0,9));

$recognized = $tsaInstance->run();

Dando como resultado el número esperado "8055" .

Establecer valor de configuración

Tesseract ofrece más de 600 propiedades personalizables (puede listarlas usando en la consola tesseract --print-parameters) que puede modificar usando ->config($propertyName, $value):

$tsaInstance = new TesseractOCR("image.jpeg");

// Tamaño de la ventana para la segmentación de splines
$tsaInstance->config("textord_spline_medianwin", 6 );
// Para un factor suave
$tsaInstance->config("textord_skewsmooth_offset", 3);

$recognized = $tsaInstance->run();

Si necesita más información sobre los métodos admitidos de este contenedor, visite el repositorio oficial aquí .

Que te diviertas ❤️!


Interesado en la programación desde los 14 años, Carlos es un programador autodidacta, fundador y autor de la mayoría de los artículos de Our Code World.

Conviertete en un programador más sociable

Patrocinadores