利用virtualenv在AWS Lambda上运行Tesseract OCR

23
我已经花了整个星期来尝试这个,所以这有点像最后的希望。
我正在尝试将Tesseract OCR打包到运行Python的AWS Lambda中(我还使用PILLOW进行图像预处理,因此选择了Python)。
我知道如何使用virtualenv将Python程序包部署到AWS上,但是我似乎找不到一种将实际的Tesseract OCR部署到环境中的方法(例如/env/)。
  • 执行pip install py-tesseract会成功将python wrapper部署到/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
任何指导都将不胜感激。
5个回答

53

无法正常工作的原因是这些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):

    # 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文件并将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的评论。


3
对Jose的答案进行小修正:获取共享依赖项列表的工具是ldd。 - Dmitry Kolomiets
1
同时,主分支中的训练数据适用于Tesseract 4.0,而不适用于3.04。对于3.04,您需要从https://github.com/tesseract-ocr/tessdata/raw/3.04.00/eng.traineddata获取训练数据。 - ssindelar
2
我想使用最新的lambda(amzn-ami-hvm-2017.03.1.20170812-x86_64-gp2)来使用此工具,因为它返回了分段错误,所以我必须修复它:(1)克隆repo(2)$ LD_LIBRARY_PATH =。/ ldd tesseract查找NotFound库(3)仅需要这些库:liblept.so.5,libpng12.so.0和libtesseract.so.3(4)它又可以工作了!无需复制任何其他的东西! - SergioArcos
1
如果您想创建可搜索的PDF文件,您还需要从tessdata中复制一些其他文件,最好使用cp -r /usr/local/share/tessdata . 命令复制整个tesdata目录。 - hansaplast
1
很好的答案,运行良好。首先,我逐个执行命令,但没有成功。然后创建了一个脚本并一次性执行它,成功地构建了正确的库。使用Docker镜像dacut/amazon-linux-python-3.6来构建库。 - knownUnknown
显示剩余8条评论

8

Tesseract 4的适应性:

由于采用了神经网络,Tesseract在版本4中提供了很多改进。我已经尝试过一些扫描,并且改进相当显著。此外,在我的情况下,整个软件包缩小了25%。版本4的计划发布日期是2018年上半年

构建步骤与Tesseract 3相似,但有一些微调,这就是为什么我想要完整地分享它们的原因。我还制作了一个github repo,其中包含现成的二进制文件(其中大部分基于Jose上面的帖子,非常有帮助),以及一个博客文章如何将其用作树莓派3驱动的扫描仪步骤之后的处理步骤

要编译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 AIMs上无法使用,因此您需要自己进行编译:

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 *

1
http://babyname.tips/mirrors/gnu/autoconf-archive/autoconf-archive-2017.09.28.tar.xz 返回404错误,我从http://ftpmirror.gnu.org/autoconf-archive/下载了该文件。 - Jan Giacomelli
请问您为什么需要configs文件夹?谢谢。 - Charlie Chen
@CharlieChen 我使用命令 tesseract -l deu in.pdf out pdf 启动 Tesseract。为此,它需要 PDF 配置(因为最后一个参数是 pdf),这基本上是一个属性文件,指定了 OCR 转换应如何进行,同时还需要语言文件(在这种情况下是德语的 deu)以获得更好的 OCR 质量。 - hansaplast
明白了。感谢您的解释。 - Charlie Chen
2
我已经按照上述步骤安装了Tesseract 4,并在EC2实例中无缝运行。之后,我按照上述方法收集了所有文件并部署到AWS Lambda(之前使用其他AWS Linux编译,例如opencv2,没有任何问题)。但是现在,当我尝试运行我的函数时,我一直收到错误提示:“pytesseract.pytesseract.TesseractNotFoundError:未安装tesseract或者它不在您的路径中”。这里有什么提示吗? - Pedro Sousa
我正在尝试运行这个程序,但是出现了错误libpng15.so.15: cannot open shared object file。有没有人知道如何安装它?(使用libtesseract.so.5) - user3701979

4
使用shell脚本生成zip文件,以编译Tesseract 4用于Python 3.7。我花了几天时间试图让Tesseract 4在Python 3.7 Lambda函数上工作。最终,我发现了这篇文章GitHub,它们描述了如何使用在EC2上使用Docker镜像生成必要的.zip文件的shell脚本来为tesseract、pytesseract、opencv和pillow生成zip文件!这个过程只需要使用这些步骤不到20分钟,并且是可靠地可重复的。
总结步骤:
启动Amazon Linux EC2实例(t2微型机器就可以)。
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

运行第五个命令后,您需要注销并重新登录以使更改生效。

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中使用,您需要完成两个步骤。
  1. 创建Lambda层,每个zip文件一个,并将这些层附加到您的Lambda函数上。
  2. 创建环境变量。键:PYTHONPATH,值:/opt/
(注意:您可能需要增加内存分配和超时时间)
此时,您已经准备好上传代码并开始在AWS Lambda上使用Tesseract!请参考Medium文章中的测试脚本。

提醒一下:这确实有效,而且非常简单! - adriaanbd
1
谢谢分享,这对我也有效。仅供参考,我在Ubuntu 18.04和Amazon Linux EC2实例上尝试执行bash脚本时遇到了问题。只有在Ubuntu 16.04上才有效! - David López

3

请查看这篇中文介绍,了解如何使用Docker在lambda中设置Tesseract 4.0.0。该文章还展示了如何将python包转换为Lambda的layers。


谢谢分享,这对我也有用。只是一个有用的提示,我尝试在Ubuntu 18.04和Amazon Linux EC2实例上执行bash脚本时遇到了问题。只有在Ubuntu 16.04中才能正常工作! - David López
你能告诉我如何在Java上实现这个吗? - abc123

2
请注意,wget http://www.leptonica.com/source/leptonica-1.73.tar.gz无法使用。他们已经迁移到leptonica.org,请使用wget http://www.leptonica.org/source/leptonica-1.83.0.tar.gz

非常感谢!这帮我节省了很多时间! - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接