はじめに
人間は見るだけで画像の内容を理解することができます。 私たちは画像上のテキストをテキストとして認識し、それを読むことができます。
コンピュータは同じように動作しません。 彼らは理解できる方法で組織された、より具体的な何かを必要としています。これは、光学式文字認識(OCR)が始まる場所です。
カメラからの車のプレートの認識、またはデジタルコピーに変換する必要があります手書きの文書のかどうか、この技術は非常に便利です。 それは常に完璧ではありませんが、それは非常に便利だし、何人かの人々が自分の仕事をするために、それははるかに簡単かつ迅速になります。
この記事では、光学式文字認識とその応用分野の深さを掘り下げます。 また、画像から文字を検出し、より便利な対話媒体のためにFlaskアプリケーションを介してこれを公開するのに役立つPythonで簡単なスクリプトを構築し
光学式文字認識とは何ですか?
光学式文字認識は、画像上のテキストコンテンツの検出と、コンピュータが容易に理解できるエンコードされたテキストへの画像の翻訳を含みます。 テキストを含む画像は、その中の文字を識別するためにスキャンされ、分析される。 識別時に、文字は機械でエンコードされたテキストに変換されます。それは本当にどのように達成されていますか?
私たちにとって、画像上のテキストは簡単に識別でき、文字を検出してテキストを読み取ることができますが、コンピュータにとってはすべて一連のド
画像が最初にスキャンされ、テキストとグラフィックス要素がビットマップに変換されます。 その後、画像は前処理され、明るさとコントラストが調整されてプロセスの精度が向上します。
画像は、画像やテキストがどこにあるかなど、関心のある領域を識別するゾーンに分割され、抽出プロセスを開始するのに役立ちます。 テキストを含む領域は、現在、行や単語や文字にさらに分解することができ、今のソフトウェアは、比較や様々な検出アルゴリズムを介して文字を一致させることができます。 最終的な結果は、与えられた画像内のテキストです。
プロセスは100%正確ではない可能性があり、正しくスキャンされなかった一部の要素を修正するために人間の介入が必要な場合があります。 誤り訂正は、辞書や自然言語処理(NLP)を使用しても実現できます。出力は、テキストを音声に変換する技術を使用して、word文書、Pdf、またはオーディオコンテンツなどの他の媒体に変換できるようになりました。
出力は、
OCRの使用
以前は、文書のデジタル化は、コンピュータ上のテキストを手動で入力することによって達成されました。 OCRを介して、このプロセスは、文書をスキャンし、処理し、テキストを抽出し、word文書などの編集可能な形式で保存することができるように容易にな
Adobe Scanなどのドキュメントスキャナを携帯電話に搭載している場合は、OCR技術が使用されている可能性があります。空港は、OCRを使用して、パスポートの認識とそこからの情報の抽出のプロセスを自動化することもできます。
空港では、OCRを使用して、パスポートの認識OCRの他の用途には、データ入力プロセスの自動化、検出、および車のナンバープレートの認識が含まれます。
OCRの他の用途には、データ入力プロセスの自動化、検出、おこのOCRプロジェクトでは、GoogleのTesseract-OCRエンジンのラッパーであるPython-Tesseract、または単にPyTesseractライブラリを使用します。それは完全にオープンソースであり、Googleである巨人によって開発され、維持されているので、私はこれを選択しました。
私はこれを選択しました。
私は PyTesseractはそれに依存しているので、tesseractをあなたのマシンにインストールするには、次の指示に従ってください。
また、Flask webフレームワークを使用して、webカメラを介して写真を撮ったり、文字認識の目的で写真をアップロードしたりできる単純なOCRサーバーを作成します。また、仮想環境の設定と要件管理も処理するため、Pipenvも使用します。これらに加えて、Python Imaging Library(PIL)のフォークであるPillowライブラリを使用して、Pythonで多くの形式の画像の開きと操作を処理します。この記事では、PyTesseractに集中しますが、画像からテキストを抽出するのに役立つ他のPythonライブラリがあります。
- Textract:Pdfからデータを抽出できますが、重いパッケーPyocr:文、数字、単語などのより多くの検出オプションを提供します。
- Pyocr:文、数字、単語などのより多くの検出オプションを提供します。
Setup
Pipを介して次のコマンドを使用してPipenvをインストールして起動します(設定する必要がある場合は、これを参照してください)。
$ pip install pipenv
プロジェクトディレクトリを作成し、次のコマンドを実行してプロジェクトを開始します:
$ mkdir ocr_server && cd ocr_server && pipenv install --three
仮想環境をアクティブにして、依存関係のインストールを開始できます。
$ pipenv shell$ pipenv install pytesseract Pillow
Pipenvを使用しない場合は、いつでもPipと仮想環境のアプローチを使用できます。 注:その場合、pipenv install Pillow
pip install Pillow
になります。
実装
このプロジェクトを2つのフェーズで実装します。 最初はスクリプトを作成し、次はインターフェイスとして機能するFlaskアプリケーションを構築します。
OCRスクリプト
セットアップが完了すると、画像を取得し、画像で検出されたテキストを返す単純な関数を作成することができます。
try: from PIL import Imageexcept ImportError: import Imageimport pytesseractdef ocr_core(filename): """ This function will handle the core OCR processing of images. """ text = pytesseract.image_to_string(Image.open(filename)) # We'll use Pillow's Image class to open the image and pytesseract to detect the string in the image return textprint(ocr_core('images/ocr_example_1.png'))
関数は非常に簡単で、最初の5行でImage
Image
Image
Image
Image
Image
Image
Pillow
ライブラリと私たちのPyTesseract
ライブラリ。次に、ファイル名を取り込み、画像に含まれるテキストを返すandocr_core
関数を作成します。
スクリプトがテキストを含む単純な画像でどのように運賃を見てみましょう:
コードを実行すると、次のように挨拶されます。
私たちの単純なOCRスクリプトが動作します! これは手書きとは異なり、完璧で正確なデジタルテキストであるため、明らかに、これはやや簡単でした。 PyTesseractライブラリでできることはもっとたくさんありますが、これについては後の投稿で詳しく説明します。
まず、このスクリプトをFlaskアプリケーションに統合して、画像のアップロードや文字認識操作を簡単にしましょう。
Flask Web Interface
私たちのスクリプトは、コマンドラインを介して使用することができますが、Flaskアプリケーションは、それがよりユーザーフレンドリーで多 たとえば、webサイト経由で写真をアップロードして、抽出したテキストをwebサイトに表示したり、webカメラ経由で写真をキャプチャして文字認識を実行したりすることができます。
あなたがFlaskフレームワークに慣れていない場合、これはあなたをスピードアップして行くための良いチュートリアルです。
まずのインストールによりフラスコのパッケージ:
$ pipenv install Flask
それでは、定義の基本的なルート
from flask import Flaskapp = Flask(__name__)@app.route('/')def home_page(): return "Hello World!"if __name__ == '__main__': app.run()
ファイルを保存し、実行します:
$ python3 app.py
を開いた場合ブラウザと、127.0.0.1:5000
localhost:5000
ご覧ください”こんにちは。”ページに。 これは、Flaskアプリが次のステップの準備ができていることを意味します。ここで、HTMLファイルをホストするためのtemplates
index.html
:
<!DOCTYPE html><html> <head> <title>Index</title> </head> <body> Hello World. </body></html>
新しいテンプレートをレンダリングするためにapp.py
を微調整しましょう。
from flask import Flask, render_templateapp = Flask(__name__)@app.route('/')def home_page(): return render_template('index.html')if __name__ == '__main__': app.run()
from flask import Flask, render_templateapp = Flask(__name__)@app.route('/')def home_page(): return render_template('index.html')if __name__ == '__main__': app.run()
from flask import Flask, render_templateapp = Flask(__name__)@app.route('/')def home_page(): return render_template('index.html')if __name__ == '__main__': app.run()
from flask import Flask, render_templateapp = Flask(__name__)@app.route('/')def home_page(): return render_template('index.html')if __name__ == '__main__': app.run()
from flask import Flask, render_templateapp = Flask(__name__)@app.route('/')def home_page(): return render_template('index.html')if __name__ == '__main__': app.run()
from flask import Flask, render_templateapp = Flask(__name__)@app.route('/')def home_page(): return render_template('index.html')if __name__ == '__main__': app.run()
from flask import Flask, render_templateapp = Flask(__name__)@app.route('/')def home_page(): return render_template('index.html')if __name__ == '__main__': app.run()
render_template
そして、htmlファイルをレンダリングするためにそれを使用しました。 た場合の再起動をフラスコア、まだ見”こんにちは。”ホームページで。
これでFlask crashコースで十分です。最初に、Flaskアプリに画像をアップロードして、上で書いたocr_core
関数に渡す機能を追加します。 結果として、webアプリで抽出されたテキストの横に画像をレンダリングします。
import osfrom flask import Flask, render_template, request# import our OCR functionfrom ocr_core import ocr_core# define a folder to store and later serve the imagesUPLOAD_FOLDER = '/static/uploads/'# allow files of a specific typeALLOWED_EXTENSIONS = set()app = Flask(__name__)# function to check the file extensiondef allowed_file(filename): return '.' in filename and \ filename.rsplit('.', 1).lower() in ALLOWED_EXTENSIONS# route and function to handle the home [email protected]('/')def home_page(): return render_template('index.html')# route and function to handle the upload [email protected]('/upload', methods=)def upload_page(): if request.method == 'POST': # check if there is a file in the request if 'file' not in request.files: return render_template('upload.html', msg='No file selected') file = request.files # if no file is selected if file.filename == '': return render_template('upload.html', msg='No file selected') if file and allowed_file(file.filename): # call the OCR function on it extracted_text = ocr_core(file) # extract the text and display it return render_template('upload.html', msg='Successfully processed', extracted_text=extracted_text, img_src=UPLOAD_FOLDER + file.filename) elif request.method == 'GET': return render_template('upload.html')if __name__ == '__main__': app.run()
upload_page()
関数でわかるように、POSTを介して画像を受信し、リクエストがGETの場合はアップロードHTMLをレンダリングします。
ユーザーが実際にファイルをアップロードしたかどうかを確認し、関数allowed_file()
を使用してファイルが許容可能なタイプかどうかを確認します。
画像が必要なタイプであることを確認したら、それを前に作成した文字認識スクリプトに渡します。この関数は、画像内のテキストを検出し、それを返します。
関数は、画像内のテキストを検出し、それを返します。 最後に、画像のアップロードへの応答として、検出されたテキストを画像と一緒にレンダリングして、ユーザーが結果を見ることができます。
upload.html
ファイルは、デフォルトでFlaskに同梱されているJinjaテンプレートエンジンの助けを借りて、画像の投稿と結果のレンダリングを処理します:P>
<!DOCTYPE html><html> <head> <title>Upload Image</title> </head> <body> {% if msg %} <h1>{{ msg }}</h1> {% endif %} <h1>Upload new File</h1> <form method=post enctype=multipart/form-data> <p><input type=file name=file> <input type=submit value=Upload> </form> <h1>Result:</h1> {% if img_src %} <img src="{{ img_src }}"> {% endif %} {% if extracted_text %} <p> The extracted text from the image above is: <b> {{ extracted_text }} </b></p> {% else %} The extracted text will be displayed here {% endif %} </body></html>
Jinjaテンプレートを使用すると、{% if %} {% endif %}
タグを使用して特定のシナリオでテキストを表示できます。 また、Flaskアプリからのメッセージを{{ }}
タグ内のwebページに表示することもできます。 フォームを使用してFlaskアプリに画像をアップロードします。p>
結果は次のとおりです。
今、我々は先に行くと、以前から私たちの画像をアップロードする場合:
はい! 私たちのFlaskアプリケーションは、OCR機能を統合し、ブラウザにテキストを表示することができました。 これにより、処理する新しいイメージがあるたびにCLIでコマンドを実行するのではなく、イメージの処理が容易になります。それはすべての状況で動作しませんので、さらに私たちの単純なOCRスクリプトの限界を探るためにいくつかのより多くの画像を添付してみま
たとえば、次の画像からテキストを抽出してみて、結果が画像上で強調表示されているとしましょう。
たとえば、次の画像からテキストを抽出してみ:これは、OCRが常に100%正確ではなく、時々人間の介入が必要な可能性があるという証拠です。
これは、OCRが常に100%正確ではな私はまた、それが実行される方法を確認するために私の手書きに対してOCRスクリプトをテストし、これは結果です:
今回はこのソースからの画像を使ってもう一度試してみることにしましたが、これらは結果でした:この画像の文字認識は、私が自分の手書きを使用したものよりもはるかに優れています。
この画像の文字認識は、私が自分の手書きを使用したものよりもはるかに優れています。 あなたが見ることができるように、ダウンロードした画像の線が厚く、テキストと背景の間に良いコントラストがあり、これは私の手書きの検出が悪
これはさらに探索する領域であり、あなたは友人や同僚から手書きのメモを取得し、スクリプトが文字を検出することができるようになりますど あなたも、イベントにポスターを取得し、テキストのためにそれらをスキャンしようとすることができ、可能性はたくさんあります。
その他のPyTesseractオプション
Python-Tesseractには、探索できるより多くのオプションがあります。 たとえば、lang
フラグを使用して言語を指定できます。
pytesseract.image_to_string(Image.open(filename), lang='fra')
これは、lang
フラグなしでイメージをスキャンした結果です。
そして今、lang
フラグ:
フレームワークは、スクリーンショットに見られるように、より良い言語を検出するために最適化されています。 (画像ソース)。
lang
フラグがなければ、スクリプトはいくつかのフランス語の単語を逃しましたが、フラグを導入した後、すべてのフランス語のコンテ 翻訳は不可能ですが、これはまだ印象的です。 Tesseractの公式ドキュメントには、このセクションでサポートされている言語が含まれています。
向きとスクリプトの検出もPyTesseractの機能の一つであり、これは使用されるフォントの検出と指定された画像上のテキストの向きを支援します。 先にダウンロードした手書きの画像を参照する場合:
print(pytesseract.image_to_osd(Image.open('downloaded_handwritten.png')))
画像にページ番号情報がなかったため、これは検出されませんでした。 Tesseractエンジンは、画像内のテキストの向きと回転に関する情報を抽出することができます。 向きの信頼度は、ガイドとして機能し、常に100%正確ではないことを示すために検出された向きについてのエンジンの保証人の図です。 スクリプトセクションは、テキストで使用される書き込みシステムを示し、これに続いて信頼マーカーも続きます。認識された文字とそのボックス境界の後にあった場合、PyTesseractはpytesseract.image_to_boxes(Image.open('downloaded_handwritten.png'))
を介してこれを実現します。これらは、抽出されたテキストを検索可能なPDFまたはHOCR出力に変換するなど、PyTesseractの機能の一部です。
これらは、抽出されたテキストを検索可能なPDFまたはHOCR出力に変換するなど、PyTesseractの機能の一部です。私たちがやっていないこと
この記事では多くのことを達成しましたが、プロジェクトを洗練し、現実の世界に備えるためにはまだやるべきこと まず、私たちは私たちのウェブサイトにスタイルを追加し、CSSを使用して、エンドユーザーにそれをより魅力的にすることができます。 また、一度に複数の画像をアップロードしてスキャンし、一度にすべての出力を表示するオプションを追加することができます。 これにより、複数の文書をスキャンする方が便利になりませんか?
ブラウザは、私たちはもちろん、ユーザーからの許可を得て、マシンのカメラにタップし、画像をキャプチャすることができます。 これは、特にモバイルデバイス上で大きな助けになることができます。 ユーザーが画像をキャプチャして保存してからwebサイトにアップロードするのではなく、カメラ機能を追加すると、ユーザーがFlask webアプリケーションから直接操作を実行できるようになります。 これにより、スキャン処理が高速化されます。FLASKアプリケーションがOCRスキャナを公開することを意図したものではないと仮定すると、CLIツールを作成することもできます。 このツールを使用すると、画像の場所を含むコマンドを実行し、スキャナの出力を端末に印刷するか、データベースまたはAPIに送信することができます。 このパスを選択した場合、DocoptはPythonを使用してコマンドラインツールを構築するための素晴らしいツールです。結論
TesseractとPython-Tesseractライブラリを使用すると、画像をスキャンしてテキストを抽出することができました。 これは、光学式文字認識であり、それは多くの状況で大きな使用することができます。
画像を取得して画像に含まれるテキストを返すスキャナを構築し、それをインターフェイスとしてFlaskアプリケーションに統合しました。 これにより、より使い慣れた媒体で、同時に複数の人にサービスを提供できる方法で機能を公開することができます。