当前位置: 首页 > 面试题库 >

通过virtualenv在AWS Lambda上的Tesseract OCR

梁丘兴腾
2023-03-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”

  • 从https://bitbucket.org/3togo/python-tesseract/downloads下载0.9.1 python-tesseract鸡蛋文件 并执行easy_install在查找依赖项时也会出错
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。



 类似资料:
  • 问题内容: 以下是我运行时遇到的错误: 问题答案: 在没有空格的路径中创建您的virtualenv环境。这就是为什么它发生的原因: 创建环境时,它会建立一个目录。在该目录中是与环境有关的所有可执行文件。有些是脚本。如您所知,hashbang用来告诉系统使用什么解释程序来运行脚本。您可能经常在脚本顶部看到此信息: 如果脚本位于,则告诉系统运行以下命令来执行脚本: 就您而言,virtualenv正在创

  • 问题内容: 如何在Windows上正确安装virtualenv? 我从这里下载virtualenv1.9.1并尝试使用以下命令安装它: 但它没有出现在MyPythonPath / Scripts中 我尝试以相同的方式安装virutalenvwrapper- win 并正确安装。但是我不能使用它,因为我没有virtualenv python.exe:无法打开文件“ MyPythonPath \ Sc

  • 问题内容: 本质上,我似乎无法激活我创建的virtualenv环境。 我在Windows PowerShell中通过使用 但收到错误消息 “无法加载,因为在此系统上禁用了脚本的执行”。 可能是因为我的计算机没有管理员权限吗? 问题答案: 移动评论到答案部分:) 根据Microsoft技术支持,可能是执行策略设置有问题。要修复它,您应该尝试在Power Shell中执行(如@wtsiamruk的注释

  • 问题内容: 我想在本地运行我的结构脚本,这将依次登录到我的服务器,切换用户以进行部署,激活项目.virtualenv,这将把dir更改为项目并发出git pull。 我通常使用来自virtualenvwrapper的workon命令,该命令提供激活文件,后激活文件会将我放置在项目文件夹中。在这种情况下,似乎因为结构是在shell中运行的,所以控制权移交给了结构,所以我不能将内置的bash源使用到’

  • 问题内容: 我正在使用Ubuntu 16.04,该版本随附Python 2.7和Python 3.5。我已经在上面安装了Python 3.6,并通过将符号3链接到python3.6 。 然后,我使用安装了。当我检查时,virtualenv已安装在适当的位置,因此当我尝试使用它创建virtualenv时,会抛出错误: 我该怎么办? 问题答案: 我们通常用来创建一个新的virtualenv(这是我们的

  • 问题内容: 这听起来像是一个愚蠢的问题,因为的目的恰恰是这样:在虚拟环境中安装某个特定版本的软件包(在本例中为Django)。但这正是我想要做的,我无法弄清楚。 我在Windows XP上,并且成功创建了虚拟环境,并且能够运行它,但是我应该如何在其中安装我想要的Django版本呢?我的意思是,我知道要使用新创建的脚本,但是如何安装Django 1.0.7?如果我这样做,它将安装最新版本。我尝试以各