无法正常工作的原因是这些Python包只是tesseract的包装器。您必须在AWS Linux实例上编译tesseract,然后将二进制文件和库复制到lambda函数的zip文件中。
1)使用64位Amazon Linux启动EC2实例;
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)下载语言的 traineddata 文件到 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/
此时,您应该能够在这个EC2实例上使用Tesseract。要将Tesseract二进制文件复制并在Lambda函数上使用,您需要从此实例复制一些文件到上传到Lambda的zip文件中。我会发布所有命令,以获得包含所需所有文件的zip文件。
6) 将您需要运行Tesseract的所有文件压缩成一个zip文件
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文件包含lambda运行tesseract所需的所有内容。最后一步是将lambda函数添加到zip文件的根目录并将其上传到lambda。以下是一个示例,尚未经过测试,但应该可以正常工作。
7) 创建名为main.py的文件,编写类似上面那个lambda函数,并将其添加到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):
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控制台创建AWS Lambda函数时,请上传zip文件并将Handler设置为main.lambda_handler。这将告诉AWS Lambda在zip文件中查找main.py文件,并调用lambda_handler函数。
重要提示
AWS Lambda环境中的事物会不时发生变化。例如,Lambda环境的当前镜像为amzn-ami-hvm-2017.03.1.20170812-x86_64-gp2(当您阅读此答案时可能已不是该版本)。如果tesseract开始返回分段错误,请在Lambda函数上运行"ldd tesseract"并查看所需库(当前为libtesseract.so.3 liblept.so.5 libpng12.so.0)的输出。
感谢SergioArcos的评论。
$ LD_LIBRARY_PATH =。/ ldd tesseract
查找NotFound库(3)仅需要这些库:liblept.so.5,libpng12.so.0和libtesseract.so.3(4)它又可以工作了!无需复制任何其他的东西! - SergioArcoscp -r /usr/local/share/tessdata .
命令复制整个tesdata目录。 - hansaplastdacut/amazon-linux-python-3.6
来构建库。 - knownUnknown