python - 通过 virtualenv 在 AWS Lambda 上进行 Tesseract OCR

标签 python amazon-web-services virtualenv tesseract aws-lambda

我整个星期都在尝试这个,所以这有点像冰雹玛丽。

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

感谢 SergioArcos 的评论。

关于python - 通过 virtualenv 在 AWS Lambda 上进行 Tesseract OCR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33588262/

相关文章:

python - virtualenv 不复制现有的 python 模块

python - 如何在现有的旧 venv 中将 Django 与 Python 3 结合使用?

Python确保对象出现在列表的末尾

python - 使用 Python 和 BeautifulSoup 生成雅虎新闻和 Bing 新闻的 URL

python - 如何在本地调用交互式控制台中模型类的方法?

c# - 如何配置连接字符串到 RDS 实例 (MSSQLServer Express)

python - 如何在 Python 中创建静态框架 ASCII 接口(interface)?

python - 在 Boto3 python 脚本中添加 AWS 标签

amazon-web-services - AWS::Serverless::Api 和 AWS::Serverless::HttpApi 之间有什么区别?

python - Pip 在虚拟环境 (venv) 中无法工作