Ответ 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.