【问题标题】:Tesseract OCR on AWS Lambda via virtualenv通过 virtualenv 在 AWS Lambda 上进行 Tesseract OCR
【发布时间】:2016-02-08 20:49:04
【问题描述】:

我整个星期都在尝试这个,所以这有点万岁。

我正在尝试将 Tesseract OCR 打包到在 Python 上运行的 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"
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 amazon-web-services virtualenv tesseract aws-lambda


    【解决方案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 文件中。我将发布所有命令以获取包含您需要的所有文件的 zip 文件。

    6) 压缩在 lambda 上运行 tesseract 所需的所有内容

    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 env 的当前图像是 amzn-ami-hvm-2017.03.1.20170812-x86_64-gp2 (当你阅读这个答案时它可能不是这个)。如果 tesseract 开始返回分段错误,请在 Lambda 函数上运行“ldd tesseract”并查看需要哪些库的输出(当前为 libtesseract.so.3 liblept.so.5 libpng12.so.0)。

    感谢塞尔吉奥阿科斯的评论。

    【讨论】:

    • 对 Jose 的回答的小修正:获取共享依赖项列表的工具是 ldd
    • 同时,主分支中的训练数据适用于 tesseract 4.0,不适用于 3.04。对于 3.04,您需要从 github.com/tesseract-ocr/tessdata/raw/3.04.00/eng.traineddata 获取训练数据
    • 其他人收到与errorMessage": "Command 'LD_LIBRARY_PATH=/var/task/lib TESSDATA_PREFIX=/var/task /var/task/tesseract -v' returned non-zero exit status -11 类似的错误。我尝试打印 tesseract -v 的输出而不是 OCRing 任何真实文件,在 EC2 上运行良好。
    • 我想将此工具与最新的 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) 它又工作了!无需复制任何其他!
    • 如果你想创建可搜索的 pdf,你还需要从 tessdata 复制一些其他文件,你最好只复制整个 tesdata 目录cp -r /usr/local/share/tessdata .
    【解决方案2】:

    tesseract 4 的适配

    Tesseract 在版本 4 中提供了很多改进,这要归功于神经网络。我已经尝试了一些扫描,并且改进非常大。另外,在我的情况下,整个包装要小 25%。第 4 版的计划发布日期为first half of 2018

    构建步骤与 tesseract 3 类似,但有一些调整,这就是我想完整分享它们的原因。我还用现成的二进制文件创建了一个github repo(其中大部分是基于 Jose 上面的帖子,这非常很有帮助),加上一个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,这对亚马逊 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 *
    

    【讨论】:

    • 请问为什么需要configs文件夹?谢谢。
    • @CharlieChen 我从 tesseract -l deu in.pdf out pdf 开始 tesseract。为此,它需要 pdf 配置(因为最后一个参数是 pdf),它基本上是一个属性文件,说明应该如何进行 OCR 转换,还需要语言文件(在这种情况下,deu 用于德语)更好的 OCR 质量
    • 知道了。谢谢解释
    • 我已经按照上面的步骤进行了 tesseract 4 并在 EC2 实例中完美地工作。之后,我收集了上述所有文件并部署到 AWS Lambda(之前使用其他 AWS Linux 编译完成,例如 opencv2 没有问题)。但是现在,当尝试运行我的函数时,我不断收到错误“pytesseract.pytesseract.TesseractNotFoundError: tesseract is not installed or it's not in your path”。这里有什么提示吗?
    【解决方案3】:

    使用 shell 脚本生成 zip 文件以编译 Python 3.7 的代码 Tesseract 4

    几天来,我一直在努力解决这个问题,试图让 Tesseract 4 在 Python 3.7 Lambda 函数上工作。最后我找到了articleGitHub,它描述了如何使用 shell 脚本为 tesseract、pytesseract、opencv 和枕头生成 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 一起使用,您需要再完成两个步骤。

    1. 创建 Lambda 层,每个 zip 文件一个,并将这些层附加到您的 Lambda 函数。
    2. 创建环境变量。键:PYTHONPATH 和值:/opt/

    (注意:您可能需要增加内存分配和超时)

    此时,您已准备好上传代码并开始在 AWS Lambda 上使用 Tesseract!参考Medium article 获取测试脚本。

    【讨论】:

    • 请注意:这确实有效,而且非常简单!
    • 感谢您的分享,它也适用于我。只是一个有用的说明,我尝试使用 Ubuntu 18.04 和 Amazon Linux EC2 实例,但在执行 bash 脚本时遇到了问题。仅在 Ubuntu 16.04 中有效!
    【解决方案4】:

    查看medium article,了解如何使用 Docker 在 lambda 中设置 Tesseract 4.0.0。它还展示了如何将 python 包转换为层

    【讨论】:

    • 感谢您的分享,它也适用于我。只是一个有用的说明,我尝试使用 Ubuntu 18.04 和 Amazon Linux EC2 实例,但在执行 bash 脚本时遇到了问题。仅在 Ubuntu 16.04 中有效!
    • 你能告诉我如何在 Java 上做到这一点
    猜你喜欢
    • 2013-07-14
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    • 1970-01-01
    • 2019-06-10
    • 1970-01-01
    • 2013-05-11
    • 1970-01-01
    相关资源
    最近更新 更多