通过 virtualenv 在 AWS Lambda 上进行 Tesseract OCR
Tesseract OCR on AWS Lambda via virtualenv
我整个星期都在尝试这个,所以这有点像冰雹玛丽。
我正尝试在 Python 上将 Tesseract OCR 打包到 AWS Lambda 运行 中(我还使用 PILLOW 进行图像预处理,因此选择了 Python)。
我了解如何使用 virtualenv 将 Python 包部署到 AWS 上,但是我似乎找不到将实际的 Tesseract OCR 部署到环境中的方法(例如 /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"
- 正在下载 0.9.1 python-tesseract egg 文件来自
https://bitbucket.org/3togo/python-tesseract/downloads 并执行 easy_install 也会在查找依赖项时出错
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
任何指点将不胜感激。
它不起作用的原因是因为这些 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) 下载语言训练数据到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 文件中。我将 post 所有命令以获取包含您需要的所有文件的 zip 文件。
6) 压缩所有你需要的东西 运行 tesseract on 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
tesseract-lambda.zip 文件包含 lambda 运行 tesseract 所需的一切。最后要做的是在 zip 文件的根目录添加 lambda 函数并将其上传到 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):
# 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 控制台上创建 AWS Lambda 函数时,上传 zip 文件并将 Hanlder 设置为 main.lambda_handler。这将告诉 AWS Lambda 在 zip 中查找 main.py 文件并调用函数 lambda_handler.
重要
AWS Lambda 的环境有时会发生变化。例如,lambda 环境的当前映像是 amzn-ami-hvm-2017.03.1.20170812-x86_64-gp2(当您阅读此答案时可能不是这个)。如果 tesseract 开始出现 return 分段错误,则在 Lambda 函数上 运行 "ldd tesseract" 并查看需要哪些库的输出(当前 libtesseract.so.3 liblept.so。 5 libpng12.so.0).
感谢 SergioArcos 的评论。
tesseract 4 的改编:
Tesseract 在第 4 版中提供了很多改进,这要归功于神经网络。我已经尝试过一些扫描,并且改进非常显着。另外,在我的情况下,整个包裹小了 25%。版本 4 的计划发布日期是 first half of 2018.
构建步骤类似于 tesseract 3,但有一些调整,这就是为什么我想完整地分享它们。我也做了一个github repo with ready made binary files (most of it is based on Jose's post above, which was very helpful), plus a blog post how to use it as a processing step after a raspberrypi3 powered scanner step.
要编译 tesseract4 二进制文件,请在新的 64 位 AWS AIM 实例上执行以下步骤:
编译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
编译 autoconf-archive
不幸的是,由于几周 tesseract 需要 autoconf-archive,它不适用于 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/
编译 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
获取所有需要的文件并压缩
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 *
查看此 medium article,了解如何使用 Docker 在 lambda 中设置 Tesseract 4.0.0。它还显示了如何将 python 包转换为层
使用 shell 脚本生成 zip 文件,为 Python 3.7
编译代码 Tesseract 4
几天来我一直在努力解决这个问题,试图让 Tesseract 4 在 Python 3.7 Lambda 函数上工作。最后我找到了这个 article and GitHub,它描述了如何使用 shell 脚本为 tesseract、pytesseract、opencv 和 pillow 生成 zip 文件,这些脚本在 EC2 上使用 Docker 图像生成必要的 .zip 文件!使用这些步骤,此过程只需不到 20 分钟,并且可以可靠地重现。
步骤总结:
启动 Amazon Linux EC2 实例(t2 micro 就可以了)
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
在 运行 第 5 个命令之后,您需要注销并重新登录才能使更改生效。
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
这将为 tesseract、pytesseract、pillow 和 opencv 生成 .zip 文件。为了与 lambda 一起使用,您需要再完成两个步骤。
- 创建 Lambda 层,每个 zip 文件一个,并将这些层附加到您的 Lambda 函数。
- 创建一个环境变量。键:PYTHONPATH 和值:/opt/
(注意:您可能需要增加内存分配和超时)
至此,您已准备好上传代码并开始在 AWS Lambda 上使用 Tesseract!请参阅 Medium article 以获取测试脚本。
我整个星期都在尝试这个,所以这有点像冰雹玛丽。
我正尝试在 Python 上将 Tesseract OCR 打包到 AWS Lambda 运行 中(我还使用 PILLOW 进行图像预处理,因此选择了 Python)。
我了解如何使用 virtualenv 将 Python 包部署到 AWS 上,但是我似乎找不到将实际的 Tesseract OCR 部署到环境中的方法(例如 /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"
- 正在下载 0.9.1 python-tesseract egg 文件来自 https://bitbucket.org/3togo/python-tesseract/downloads 并执行 easy_install 也会在查找依赖项时出错
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
任何指点将不胜感激。
它不起作用的原因是因为这些 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) 下载语言训练数据到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 文件中。我将 post 所有命令以获取包含您需要的所有文件的 zip 文件。
6) 压缩所有你需要的东西 运行 tesseract on 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
tesseract-lambda.zip 文件包含 lambda 运行 tesseract 所需的一切。最后要做的是在 zip 文件的根目录添加 lambda 函数并将其上传到 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):
# 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 控制台上创建 AWS Lambda 函数时,上传 zip 文件并将 Hanlder 设置为 main.lambda_handler。这将告诉 AWS Lambda 在 zip 中查找 main.py 文件并调用函数 lambda_handler.
重要
AWS Lambda 的环境有时会发生变化。例如,lambda 环境的当前映像是 amzn-ami-hvm-2017.03.1.20170812-x86_64-gp2(当您阅读此答案时可能不是这个)。如果 tesseract 开始出现 return 分段错误,则在 Lambda 函数上 运行 "ldd tesseract" 并查看需要哪些库的输出(当前 libtesseract.so.3 liblept.so。 5 libpng12.so.0).
感谢 SergioArcos 的评论。
tesseract 4 的改编:
Tesseract 在第 4 版中提供了很多改进,这要归功于神经网络。我已经尝试过一些扫描,并且改进非常显着。另外,在我的情况下,整个包裹小了 25%。版本 4 的计划发布日期是 first half of 2018.
构建步骤类似于 tesseract 3,但有一些调整,这就是为什么我想完整地分享它们。我也做了一个github repo with ready made binary files (most of it is based on Jose's post above, which was very helpful), plus a blog post how to use it as a processing step after a raspberrypi3 powered scanner step.
要编译 tesseract4 二进制文件,请在新的 64 位 AWS AIM 实例上执行以下步骤:
编译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
编译 autoconf-archive
不幸的是,由于几周 tesseract 需要 autoconf-archive,它不适用于 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/
编译 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
获取所有需要的文件并压缩
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 *
查看此 medium article,了解如何使用 Docker 在 lambda 中设置 Tesseract 4.0.0。它还显示了如何将 python 包转换为层
使用 shell 脚本生成 zip 文件,为 Python 3.7
编译代码 Tesseract 4几天来我一直在努力解决这个问题,试图让 Tesseract 4 在 Python 3.7 Lambda 函数上工作。最后我找到了这个 article and GitHub,它描述了如何使用 shell 脚本为 tesseract、pytesseract、opencv 和 pillow 生成 zip 文件,这些脚本在 EC2 上使用 Docker 图像生成必要的 .zip 文件!使用这些步骤,此过程只需不到 20 分钟,并且可以可靠地重现。
步骤总结:
启动 Amazon Linux EC2 实例(t2 micro 就可以了)
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
在 运行 第 5 个命令之后,您需要注销并重新登录才能使更改生效。
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
这将为 tesseract、pytesseract、pillow 和 opencv 生成 .zip 文件。为了与 lambda 一起使用,您需要再完成两个步骤。
- 创建 Lambda 层,每个 zip 文件一个,并将这些层附加到您的 Lambda 函数。
- 创建一个环境变量。键:PYTHONPATH 和值:/opt/
(注意:您可能需要增加内存分配和超时)
至此,您已准备好上传代码并开始在 AWS Lambda 上使用 Tesseract!请参阅 Medium article 以获取测试脚本。