web-dev-qa-db-ja.com

virtualenvを介したAWS Lambda上のTesseract OCR

私は一週間これを試すのに費やしましたので、これはちょっとした雹のマリアです。

Pythonで実行されているAWS LambdaにTesseract OCRをパッケージ化しようとしています(画像の前処理にもPILLOWを使用しているため、Pythonを選択しています)。

Virtualenvを使用してAWSにPythonパッケージをデプロイする方法を理解していますが、実際のTesseract OCRを環境にデプロイする方法が見つからないようです(例:/ env /)

  • やっているpip install py-tesseractは、pythonラッパーを/ env /に正常にデプロイしますが、これはTesseractの個別の(ローカル)インストールに依存しています。
  • やっているpip install tesseract-ocrは、レプトニカ依存関係が欠落していることが原因であると想定して、次のようにエラーになる前に、特定の距離だけを取得します。しかし、レプトニカを/ 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

どんなポインタでも大歓迎です。

16
Andy G

これが機能しない理由は、これらのpythonパッケージはtesseractのラッパーにすぎないためです。AWSLinuxインスタンスを使用してtesseractをコンパイルし、バイナリとライブラリをラムダ関数の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

)レプトニカをコンパイルしてインストールします:

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)言語traineddataを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のバイナリをコピーしてラムダ関数で使用するには、このインスタンスからラムダにアップロードするZipファイルにいくつかのファイルをコピーする必要があります。すべてのコマンドを投稿して、必要なすべてのファイルを含むZipファイルを取得します。

6)ラムダで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ファイルのルートにラムダ関数を追加し、ラムダにアップロードします。これは私がテストしていないが、動作するはずの例です。

7)main.pyという名前のファイルを作成し、上記のようなラムダ関数を記述して、それを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)。

コメントをありがとう、SergioArcos。

39

tesseract 4のアダプテーション

Tesseractは、ニューラルネットワークのおかげで、バージョン4で多くの改善を提供しています。私はいくつかのスキャンでそれを試しました、そして、改善はかなり実質的です。さらに、私の場合、パッケージ全体が25%小さくなりました。バージョン4のリリース予定日は 2018年前半 です。

ビルド手順はtesseract 3に似ており、微調整がいくつかあるため、それらを完全に共有したかったのです。私も github repo を既製のバイナリファイルで作成しました(そのほとんどは上記のJoseの投稿に基づいており、とても役に立ちました)、さらに- raspberrypi3パワードスキャナーのステップの後の処理ステップとして使用する方法のブログ記事

Tesseract4バイナリをコンパイルするには、新しい64ビットAWS AIMインスタンスで次の手順を実行します。

レプトニカをコンパイルする

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はAmazon AIMでは使用できないautoconf-archiveを必要とするため、自分でコンパイルする必要があります。

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/

テセラクトをコンパイルする

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

必要なすべてのファイルとZipを取得する

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 *
5
hansaplast

Dockerを使用してラムダでTesseract 4.0.0を設定する方法については、これをチェックしてください 中程度の記事 。 pythonパッケージをレイヤーに変換する方法も示しています

1
HazimoRa3d