通过virtualenv在AWS Lambda上的Tesseract OCR

发布于 2021-01-29 18:42:14

我花了整整一个星期的时间尝试这个,所以这真是个冰雹玛丽。

我试图将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

任何指针将不胜感激。

关注者
0
被浏览
52
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    它不起作用的原因是因为这些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”,并查看输出所需的lib(当前为libtesseract.so.3 liblept.so.5 libpng12.so.0)。

    感谢您的评论,SergioArcos。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看