通过virtualenv在AWS Lambda上的Tesseract OCR

安迪·G

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在AWS Lambda函数中定义tesseract_cmd以使用Tesseract-OCR

来自分类Dev

在CentOS 6上安装Tesseract-OCR

来自分类Dev

在64位Windows上编译Tesseract OCR

来自分类Dev

ubuntu上的Tesseract OCR引擎如何

来自分类Dev

在64位Windows上编译Tesseract OCR

来自分类Dev

Android Studio上的Android Tesseract OCR

来自分类Dev

无法在 Mac 上安装 Tesseract-OCR

来自分类Dev

ubuntu上的Tesseract OCR引擎如何

来自分类Dev

Tesseract OCR忽略“-”

来自分类Dev

Tesseract OCR - 指定模式

来自分类Dev

在Linux上为.jpg运行tesseract OCR时出错

来自分类Dev

NDK在Android的OCR tesseract库上编译警告

来自分类Dev

声明Tesseract OCR TessBaseAPI的问题

来自分类Dev

Tesseract OCR在Python中的UnicodeDecodeError

来自分类Dev

提高Tesseract OCR结果的质量

来自分类Dev

Tesseract OCR产生空结果

来自分类Dev

Windows中的Tesseract OCR Android

来自分类Dev

声明Tesseract OCR TessBaseAPI的问题

来自分类Dev

提高Tesseract OCR结果的质量

来自分类Dev

macOS上的python OCR

来自分类Dev

tesseract-ocr适用于EC2,而不是lambda

来自分类Dev

OCR。使用tesseract识别里程表

来自分类Dev

使用OpenCV的Tesseract OCR的预处理图像

来自分类Dev

Tesseract OCR无法识别划分符号“÷”

来自分类Dev

Tesseract OCR执行哪些预处理操作?

来自分类Dev

python tesseract获取没有OCR的行数

来自分类Dev

Tesseract OCR iOS图像格式

来自分类Dev

Aptfile:安装特定版本的Tesseract-OCR

来自分类Dev

Java OpenCV + Tesseract OCR“代码”重新注册