私は一週間これを試すのに費やしましたので、これはちょっとした雹のマリアです。
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
どんなポインタでも大歓迎です。
これが機能しない理由は、これらの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。
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
残念ながら、数週間後、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
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 *
Dockerを使用してラムダでTesseract 4.0.0を設定する方法については、これをチェックしてください 中程度の記事 。 pythonパッケージをレイヤーに変換する方法も示しています