web-dev-qa-db-fra.com

OCR Tesseract sur AWS Lambda via virtualenv

J'ai passé toute la semaine à essayer cela, donc c'est un peu une grêle marie.

J'essaie de regrouper Tesseract OCR dans AWS Lambda fonctionnant sur Python (j'utilise également PILLOW pour le prétraitement des images, d'où le choix de Python).

Je comprends comment déployer Python sur AWS à l'aide de virtualenv, mais je n'arrive pas à trouver un moyen de déployer l'OCR Tesseract réel dans l'environnement (par exemple/env /)

  • Faire pip install py-tesseract se traduit par un déploiement réussi de l'encapsuleur python dans/env /, mais cela repose sur une installation (locale) distincte de Tesseract
  • Faire pip install tesseract-ocr ne m'obtient qu'une certaine distance avant de se tromper comme suit, ce qui, je suppose, est dû à une dépendance leptonica manquante. Cependant, je n'ai aucune idée de comment empaqueter leptonica dans/env/(si c'est même possible)
tesseract_ocr.cpp:264:10: fatal error: 'leptonica/allheaders.h' file not found
#include "leptonica/allheaders.h"
Processing dependencies for python-tesseract==0.9.1
Searching for python-tesseract==0.9.1
Reading https://pypi.python.org/simple/python-tesseract/
Couldn't find index page for 'python-tesseract' (maybe misspelled?)
Scanning index of all packages (this may take a while)
Reading https://pypi.python.org/simple/
No local packages or download links found for python-tesseract==0.9.1

Tout pointeur serait grandement apprécié.

16
Andy G

La raison pour laquelle cela ne fonctionne pas est que ces packages python ne sont que des wrappers pour tesseract. Vous devez compiler tesseract à l'aide d'une instance AWS Linux et copier les fichiers binaires et les bibliothèques dans le fichier Zip de la fonction lambda.

1) Démarrez une instance EC2 avec Amazon Linux 64 bits;

2) Installer les dépendances:

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

) Compilez et installez 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) Compilez et installez 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) Télécharger traineddata de langue à 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/

À ce stade, vous devriez pouvoir utiliser tesseract sur cette instance EC2. Pour copier les fichiers binaires de tesseract et les utiliser sur une fonction lambda, vous devrez copier certains fichiers de cette instance dans le fichier Zip que vous téléchargez sur lambda. Je posterai toutes les commandes pour obtenir un fichier Zip avec tous les fichiers dont vous avez besoin.

6) Compressez tout ce dont vous avez besoin pour exécuter tesseract sur 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

Le fichier tesseract-lambda.Zip contient tout ce dont lambda a besoin pour exécuter tesseract. La dernière chose à faire est d'ajouter la fonction lambda à la racine du fichier Zip et de la télécharger sur lambda. Voici un exemple que je n'ai pas testé, mais qui devrait fonctionner.

7) Créez un fichier nommé main.py, écrivez une fonction lambda comme celle ci-dessus et ajoutez-la à la racine 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

Lors de la création de la fonction AWS Lambda sur la console AWS, téléchargez le fichier Zip et définissez Hanlder sur main.lambda_handler. Cela indiquera à AWS Lambda de rechercher le fichier main.py à l'intérieur du Zip et d'appeler la fonction lambda_handler.

IMPORTANT

De temps en temps, les choses changent dans l'environnement d'AWS Lambda. Par exemple, l'image actuelle de l'env lambda est amzn-AMI-hvm-2017.03.1.20170812-x86_64-gp2 (il se peut que ce ne soit pas celle-ci lorsque vous lisez cette réponse). Si tesseract commence à renvoyer une erreur de segmentation, exécutez "ldd tesseract" sur la fonction Lambda et voyez la sortie pour quelles libs sont nécessaires (actuellement libtesseract.so.3 liblept.so.5 libpng12.so.0).

Merci pour le commentaire, SergioArcos.

39

Adaptations pour tesseract 4 :

Tesseract propose de nombreuses améliorations dans la version 4, grâce à un réseau de neurones. Je l'ai essayé avec quelques scans et les améliorations sont assez substantielles. De plus, l'ensemble du colis était 25% plus petit dans mon cas. La date de sortie prévue de la version 4 est premier semestre 2018 .

Les étapes de construction sont similaires à tesseract 3 avec quelques ajustements, c'est pourquoi je voulais les partager entièrement. J'ai également fait un github repo avec des fichiers binaires prêts à l'emploi (la plupart sont basés sur le post de Jose ci-dessus, qui était très utile), plus un article de blog comment l'utiliser comme étape de traitement après une étape de scanner propulsé par raspberrypi .

Pour compiler les binaires tesseract4, procédez comme suit sur une nouvelle instance AWS 64 bits AIM instance:

Compiler 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

Compiler autoconf-archive

Malheureusement, depuis quelques semaines, tesseract a besoin de l'archivage automatique, qui n'est pas disponible pour les AIM d'Amazon, vous devez donc le compiler vous-même:

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/

Compiler 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

Obtenez tous les fichiers nécessaires et 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 *
5
hansaplast

Vérifiez ceci article moyen sur la façon de configurer Tesseract 4.0.0 dans lambda en utilisant Docker. Il montre également comment convertir des packages python en couches

1
HazimoRa3d