Saltar al contenido

Tesseract OCR en AWS Lambda a través de virtualenv

Solución:

La razón por la que no funciona es porque estos paquetes de Python son solo envoltorios para tesseract. Debe compilar tesseract utilizando una instancia de AWS Linux y copiar los archivos binarios y las bibliotecas en el archivo zip de la función lambda.

1) Inicie una instancia EC2 con Amazon Linux de 64 bits;

2) Instalar dependencias:

sudo yum install gcc gcc-c++ make
sudo yum install autoconf aclocal automake
sudo yum install libtool
sudo yum install libjpeg-devel libpng-devel libpng-devel libtiff-devel zlib-devel

3) Compila e instala leptonica:

cd ~
mkdir leptonica
cd leptonica
wget http://www.leptonica.com/source/leptonica-1.73.tar.gz
tar -zxvf leptonica-1.73.tar.gz
cd leptonica-1.73
./configure
make
sudo make install

4) Compila e instala tesseract

cd ~
mkdir tesseract
cd tesseract
wget https://github.com/tesseract-ocr/tesseract/archive/3.04.01.tar.gz
tar -zxvf 3.04.01.tar.gz
cd tesseract-3.04.01
./autogen.sh
./configure
make
sudo make install

5) Descargar datos entrenados en idiomas a tessdata

cd /usr/local/share/tessdata
wget https://github.com/tesseract-ocr/tessdata/raw/3.04.00/eng.traineddata
export TESSDATA_PREFIX=/usr/local/share/

En este punto, debería poder usar tesseract en esta instancia EC2. Para copiar los binarios de tesseract y usarlos en una función lambda, necesitará copiar algunos archivos de esta instancia al archivo zip que cargue en lambda. Publicaré todos los comandos para obtener un archivo zip con todos los archivos que necesita.

6) Comprima todas las cosas que necesita para ejecutar tesseract en lambda

cd ~
mkdir tesseract-lambda
cd tesseract-lambda
cp /usr/local/bin/tesseract .
mkdir lib
cd lib
cp /usr/local/lib/libtesseract.so.3 .
cp /usr/local/lib/liblept.so.5 .
cp /usr/lib64/libpng12.so.0 .
cd ..

mkdir tessdata
cd tessdata
cp /usr/local/share/tessdata/eng.traineddata .
cd ..

cd ..
zip -r tesseract-lambda.zip tesseract-lambda

El archivo tesseract-lambda.zip tiene todo lo que lambda necesita para ejecutar tesseract. Lo último que debe hacer es agregar la función lambda en la raíz del archivo zip y cargarlo en lambda. Aquí hay un ejemplo que no he probado, pero debería funcionar.

7) Cree un archivo llamado main.py, escriba una función lambda como la anterior y agréguela en la raíz de tesseract-lambda.zip:

from __future__ import print_function

import urllib
import boto3
import os
import subprocess

SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
LIB_DIR = os.path.join(SCRIPT_DIR, 'lib')

s3 = boto3.client('s3')

def lambda_handler(event, context):

    # Get the bucket and object from the event
    bucket = event['Records'][0]['s3']['bucket']['name']
    key = urllib.unquote_plus(event['Records'][0]['s3']['object']['key']).decode('utf8')

    try:
        print("Bucket: " + bucket)
        print("Key: " + key)

        imgfilepath="/tmp/image.png"
        jsonfilepath="/tmp/result.txt"
        exportfile = key + '.txt'

        print("Export: " + exportfile)

        s3.download_file(bucket, key, imgfilepath)

        command = 'LD_LIBRARY_PATH={} TESSDATA_PREFIX={} {}/tesseract {} {}'.format(
            LIB_DIR,
            SCRIPT_DIR,
            SCRIPT_DIR,
            imgfilepath,
            jsonfilepath,
        )

        try:
            output = subprocess.check_output(command, shell=True)
            print(output)
            s3.upload_file(jsonfilepath, bucket, exportfile)
        except subprocess.CalledProcessError as e:
            print(e.output)

    except Exception as e:
        print(e)
        print('Error processing object {} from bucket {}.'.format(key, bucket))
        raise e

Al crear la función AWS Lambda en la consola de AWS, cargue el archivo zip y configure Hanlder en main.lambda_handler. Esto le indicará a AWS Lambda que busque el archivo main.py dentro del zip y que llame a la función lambda_handler.

IMPORTANTE

De vez en cuando, las cosas cambian en el entorno de AWS Lambda. Por ejemplo, la imagen actual para lambda env es amzn-ami-hvm-2017.03.1.20170812-x86_64-gp2 (puede que no sea esta cuando lea esta respuesta). Si tesseract comienza a devolver un error de segmentación, ejecute “ldd tesseract” en la función Lambda y vea el resultado de las bibliotecas que se necesitan (actualmente libtesseract.so.3 liblept.so.5 libpng12.so.0).

Gracias por el comentario, SergioArcos.

Adaptaciones para tesseract 4:

Tesseract ofrece muchas mejoras en la versión 4, gracias a una red neuronal. Lo he probado con algunos escaneos y las mejoras son bastante sustanciales. Además, todo el paquete era un 25% más pequeño en mi caso. La fecha de lanzamiento prevista de la versión 4 es la primera mitad de 2018.

Los pasos de compilación son similares a tesseract 3 con algunos ajustes, por eso quería compartirlos en su totalidad. También hice un repositorio de github con archivos binarios listos para usar (la mayoría se basa en la publicación de José anterior, que fue muy útil), además de una publicación de blog sobre cómo usarlo como un paso de procesamiento después de un paso de escáner con raspberrypi3.

Para compilar los binarios de tesseract4, siga estos pasos en una instancia nueva de AWS AIM de 64 bits:

Compilar leptonica

cd ~
sudo yum install clang -y
sudo yum install libpng-devel libtiff-devel zlib-devel libwebp-devel libjpeg-turbo-devel -y
wget https://github.com/DanBloomberg/leptonica/releases/download/1.75.1/leptonica-1.75.1.tar.gz
tar -xzvf leptonica-1.75.1.tar.gz
cd leptonica-1.75.1
./configure && make && sudo make install

Compilar autoconf-archive

Desafortunadamente, desde algunas semanas, tesseract necesita autoconf-archive, que no está disponible para los AIM de Amazon, por lo que deberá compilarlo usted mismo:

cd ~
wget http://mirror.switch.ch/ftp/mirror/gnu/autoconf-archive/autoconf-archive-2017.09.28.tar.xz
tar -xvf autoconf-archive-2017.09.28.tar.xz
cd autoconf-archive-2017.09.28
./configure && make && sudo make install
sudo cp m4/* /usr/share/aclocal/

Compilar tesseract

cd ~
sudo yum install git-core libtool pkgconfig -y
git clone --depth 1  https://github.com/tesseract-ocr/tesseract.git tesseract-ocr
cd tesseract-ocr
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
./autogen.sh
./configure
make
sudo make install

Obtenga todos los archivos necesarios y zip

cd ~
mkdir tesseract-standalone
cd tesseract-standalone
cp /usr/local/bin/tesseract .
mkdir lib
cp /usr/local/lib/libtesseract.so.4 lib/
cp /usr/local/lib/liblept.so.5 lib/
cp /usr/lib64/libjpeg.so.62 lib/
cp /usr/lib64/libwebp.so.4 lib/
cp /usr/lib64/libstdc++.so.6 lib/
mkdir tessdata
cd tessdata
wget https://github.com/tesseract-ocr/tessdata_fast/raw/master/osd.traineddata
wget https://github.com/tesseract-ocr/tessdata_fast/raw/master/eng.traineddata
# additionally any other language you want to use, e.g. `deu` for Deutsch
mkdir configs
cp /usr/local/share/tessdata/configs/pdf configs/
cp /usr/local/share/tessdata/pdf.ttf .
cd ..
zip -r ~/tesseract-standalone.zip *

Genere archivos zip utilizando scripts de shell para compilar el código Tesseract 4 para Python 3.7

He estado luchando con este problema durante unos días tratando de hacer que Tesseract 4 funcione en una función de Python 3.7 Lambda. ¡Finalmente encontré este artículo y GitHub que describe cómo generar archivos zip para tesseract, pytesseract, opencv y pillow usando scripts de shell que generan los archivos .zip necesarios usando imágenes de Docker en EC2! Este proceso lleva menos de 20 minutos siguiendo estos pasos y se puede reproducir de forma fiable.

Pasos resumidos:

Inicie una instancia EC2 de Amazon Linux (t2 micro funcionará bien)

sudo yum update
sudo yum install git-core -y
sudo yum install docker -y
sudo service docker start
sudo usermod -a -G docker ec2-user #allows ec2-user to call docker

Después de ejecutar el quinto comando, deberá cerrar la sesión y volver a iniciarla para que el cambio surta efecto.

git clone https://github.com/amtam0/lambda-tesseract-api.git
cd lambda-tesseract-api/
bash build_tesseract4.sh #takes a few minutes
bash build_py37_pkgs.sh

Esto generará archivos .zip para tesseract, pytesseract, pillow y opencv. Para usarlo con lambda, debe completar dos pasos más.

  1. Cree capas Lambda, una para cada archivo zip, y adjunte las capas a su función Lambda.
  2. Cree una variable de entorno. Clave: PYTHONPATH y Valor: / opt /

(Nota: probablemente necesitará aumentar la asignación de memoria y el tiempo de espera)

¡En este punto, ya está listo para cargar su código y comenzar a usar Tesseract en AWS Lambda! Consulte el artículo de Medium para obtener un guión de prueba.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *