Tesseract OCR на AWS Lambda через virtualenv

Я потратил всю неделю на это, так что это немного град Мэри.

Я пытаюсь упаковать Tesseract OCR в AWS Lambda, работающий на Python (я также использую PILLOW для предварительной обработки изображения, следовательно, выбор Python).

Я понимаю, как развернуть пакеты Python на AWS с помощью virtualenv, однако я не могу найти способ развертывания реального OCR Tesseract в среде (например,/env/)

  • Выполнение pip install py-tesseract приводит к успешному развертыванию оболочки python в /env/, однако это зависит от отдельной (локальной) установки Tesseract
  • Выполнение pip install tesseract-ocr дает мне только определенное расстояние, прежде чем он выйдет из строя, как следует из того, что я предполагаю, из-за отсутствия зависимости от leptonica. Тем не менее, я не знаю, как упаковать leptonica в/env/(если это возможно)
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

Любые указатели будут очень благодарны.

Ответ 1

Причина, по которой он не работает, заключается в том, что эти пакеты Python являются только оболочками для тессеракта. Вы должны скомпилировать tesseract с использованием экземпляра AWS Linux и скопировать двоичные файлы и библиотеки в zip файл функции lambda.

1) Запустите экземпляр EC2 с 64-битным Amazon Linux;

2) Установить зависимости:

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) Скомпилируйте и установите 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) Скомпилируйте и установите 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) Загрузите обученные данные в 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/

На этом этапе вы сможете использовать tesseract для этого экземпляра EC2. Чтобы скопировать двоичные файлы tesseract и использовать их в лямбда-функции, вам необходимо скопировать некоторые файлы из этого экземпляра в zip файл, который вы загружаете в lambda. Я выложу все команды, чтобы получить zip файл со всеми необходимыми файлами.

6) Заархивируйте все необходимое для запуска тессеракта на лямбду

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

В файле tesseract-lambda.zip есть все, что нужно лямбде для запуска tesseract. Последнее, что нужно сделать, это добавить функцию lambda в корень zip файла и загрузить ее в lambda. Вот пример, который я не проверял, но должен работать.

7) Создайте файл с именем main.py, напишите лямбда-функцию, подобную приведенной выше, и добавьте ее в корень 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

При создании функции AWS Lambda на консоли AWS загрузите zip файл и установите для Hanlder значение main.lambda_handler. Это скажет AWS Lambda найти файл main.py внутри zip и вызвать функцию lambda_handler.

ВАЖНЫЙ

Время от времени все меняется в среде AWS Lambda. Например, текущее изображение для лямбда-env - amzn-ami-hvm-2017.03.1.20170812-x86_64-gp2 (это может быть не то, что вы читаете этот ответ). Если tesseract начинает возвращать ошибку сегментации, запустите "ldd tesseract" для функции Lambda и посмотрите, для чего нужны библиотеки (в настоящее время libtesseract.so.3 liblept.so.5 libpng12.so.0).

Спасибо за комментарий, SergioArcos.

Ответ 2

Адаптации для тессеракта 4:

Tesseract предлагает много улучшений в версии 4, благодаря нейронной сети. Я попробовал это с некоторыми сканированиями, и улучшения весьма существенны. Плюс вся упаковка была на 25% меньше в моем случае. Запланированная дата выпуска версии 4 - первая половина 2018 года.

Этапы сборки аналогичны tesseract 3 с некоторыми настройками, поэтому я хотел поделиться ими в полном объеме. Я также сделал репозиторий github с готовыми бинарными файлами (большая часть которого основана на посте Хосе, который был очень полезен), а также в блоге, как использовать его в качестве шага обработки после шага сканера с raspberrypi3.

Чтобы скомпилировать двоичные файлы tesseract4, выполните следующие действия на свежем 64-битном экземпляре AWS AIM:

Составить лептонику

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

Скомпилировать автоконф-архив

К сожалению, поскольку в течение нескольких недель tesseract нуждается в autoconf-архиве, который недоступен для amazon AIM, вам нужно скомпилировать его самостоятельно:

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/

Компилировать тессеракт

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

Получить все необходимые файлы и 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 *

Ответ 3

Создал автономный zip-архив с tesseract, как описано выше, но его размер составляет около 280 МБ, и он не может связываться с лямбдой AWS, поскольку максимально допустимый размер составляет 250 МБ. Я застрял в этой точке за последний месяц. Пожалуйста, помогите мне решить эту проблему