このブログ投稿では、光学式文字認識で研究された最新の知識でアップグレードされた、最も使用されているTesseract Engineの背後にあるテクノロジーについて説明します。 この記事は、Tesseractエンジンを使用してPythonにOCRを実装する方法のハウツーガイド/チュートリアルとしても役立ちます。 次のモジュールについて説明します。
- Tesseract OCRの機能
- OpenCVを使用したOCRの前処理
- CLIとPythonでTesseractを実行する
- Tesseractエンジンの制限
目次
- 概要
- オープンソース OCR ツール
- Tesseract OCR
- PytesseractおよびOpenCVを使用したOCR
- カスタムデータに関するTesseractのトレーニング
- Tesseractの制限
- Nanonetを使用したOCR
- まとめ
概要
OCR = 光学式文字認識。 言い換えると、OCRシステムは、テキストのXNUMX次元画像を変換します。この画像には、機械で印刷または手書きされたテキストを、その画像表現から機械で読み取り可能なテキストに含めることができます。 プロセスとしてのOCRは通常、可能な限り正確に実行するためのいくつかのサブプロセスで構成されます。 サブプロセスは次のとおりです。
- 画像の前処理
- テキストのローカリゼーション
- 文字のセグメンテーション
- 文字認識
- ポスト処理
上記のリストのサブプロセスはもちろん異なる場合がありますが、これらは自動文字認識に取り組むために必要な大まかな手順です。 OCRソフトウェアの主な目的は、書かれたテキスト文字からさまざまな言語を使用して、すべてのユニークな単語を識別してキャプチャすることです。
ほぼ XNUMX 年にわたり、光学式文字認識システムは、コンピュータ化されたシステムに自動テキスト入力を提供するために広く使用されてきました。 しかし、これまでずっと、従来の OCR システム ( ゾーンOCR)一握りのタイプのフォントとページフォーマット以上を読むことができないことを克服したことはありません。 比例間隔のタイプ(事実上すべてのタイプセットコピーを含む)、レーザープリンターフォント、および多くの非比例タイプライターフォントでさえ、これらのシステムの範囲を超えたままです。 その結果、従来のOCRは、デジタル形式への変換が必要なドキュメントの総数にわずかな影響しか及ぼさなかった。
次世代のOCRエンジンは、ディープラーニングの分野における最新の研究を活用することにより、上記のこれらの問題に非常によく対応しています。 公開されているディープモデルと巨大なデータセットの組み合わせを活用することで、モデルは特定のタスクで最先端の精度を実現します。 最近では、 合成データを生成する 生成的敵対的ネットワークと他のいくつかの生成的アプローチを使用して異なるフォントで。
光学式文字認識は 挑戦的な問題 次のような制約のない環境でテキストが発生した場合 自然のシーン、幾何学的な歪み、複雑な背景、多様なフォントが原因です。 次のようなディープラーニングベースのOCRのさまざまなユースケースにより、このテクノロジーは依然として大きな可能性を秘めています。
OCR の問題を念頭に置いていますか? 組織のデータ入力コストを削減したいですか? に向かいます ナノネット OCRモデルを構築して 画像からテキストを抽出する or PDFからデータを抽出する AIベース PDF OCR!
オープンソース OCR ツール
がたくさんあります 光学式文字認識 利用可能なソフトウェア。 それらの間の品質の比較は見つかりませんでしたが、開発者にとって最も使いやすいと思われるいくつかについて説明します。
Tesseract – OCR開発者の間で人気を得ているオープンソースのOCRエンジン。 場合によっては実装や変更が困難になることもありますが、市場に出回っている無料で強力なOCRの選択肢はそれほど多くありませんでした。 テッセラクトは博士号を取得し、 HP研究所、ブリストルでの研究プロジェクト。 HPは人気を博し、1984年から1994年の間にHPによって開発されました。2005年にHPはTesseractをオープンソースソフトウェアとしてリリースしました。 2006年以来、それはグーグルによって開発されました。
オクロパス – OCRopusはオープンソースのOCRシステムであり、研究者と企業の両方によるOCRコンポーネントの評価と再利用を容易にします。 ターンキーOCRシステムではなく、ドキュメント分析プログラムのコレクション。 これをドキュメントに適用するには、画像の前処理を行う必要があり、新しいモデルをトレーニングする必要がある場合もあります。 認識スクリプト自体に加えて、グラウンドトゥルースの編集と修正、エラー率の測定、使いやすく編集しやすい混同行列の決定のためのスクリプトがいくつかあります。
接眼レンズ – Ocularは、複数の言語で書かれたものを含め、ハンドプレスを使用して印刷されたドキュメントに最適です。 コマンドラインを使用して動作します。 これは、最先端の歴史的なOCRシステムです。 主な機能は次のとおりです。
- 未知のフォントの教師なし学習:ドキュメントの画像とテキストのコーパスのみが必要です。
- ノイズの多いドキュメントを処理する機能:一貫性のないインク、間隔、垂直方向の配置
- 単語レベルのコード切り替えがかなり多いドキュメントを含む、多言語ドキュメントのサポート。
- 古風な綴りやプリンターの短縮形を含む、正書法の変動パターンの教師なし学習。
- 外交(リテラル)と正規化された形式の両方への同時の共同転写。
SwiftOCR –また、ディープラーニングに使用される開発プログラミング言語としてSwiftの使用を促進するために大規模な開発が行われているため、Swiftで記述されたOCRエンジンについても触れます。 チェックアウト ブログ 詳細については、こちらをご覧ください。 SwiftOCRは、画像認識にニューラルネットワークを使用する高速でシンプルなOCRライブラリです。 SwiftOCRは、彼らのエンジンがよく知られているTessaractライブラリよりも優れていると主張しています。
このブログ投稿では、 Tesseract OCRに焦点を当てる それがどのように機能し、どのように使用されるかについての詳細をご覧ください。
Tesseract OCR
Tesseract は、Apache 2.0 ライセンスの下で利用できるオープンソースのテキスト認識 (OCR) エンジンです。 これは直接使用することも、(プログラマの場合は) API を使用して画像から印刷されたテキストを抽出することもできます。 さまざまな言語をサポートしています。 Tesseract には組み込みの GUI がありませんが、以下からいくつかの GUI を利用できます。 サードパーティのページ。 Tesseractは、検出可能なラッパーを介して、多くのプログラミング言語およびフレームワークと互換性があります。 こちら。 既存のレイアウト分析と組み合わせて大きなドキュメント内のテキストを認識したり、外部のテキスト検出器と組み合わせてXNUMXつのテキスト行の画像からテキストを認識したりできます。
Tesseract 4.00には、テキスト行認識機能として構成された新しいニューラルネットワークサブシステムが含まれています。 それはその起源を持っています OCRopus の Python ベースの LSTM 実装ですが、C ++のTesseract用に再設計されています。 TesseractのニューラルネットワークシステムはTensorFlowよりも前から存在しますが、TensorFlowでも使用可能な変数グラフ仕様言語(VGSL)と呼ばれるネットワーク記述言語があるため、TensorFlowと互換性があります。
単一の文字を含む画像を認識するために、通常は畳み込みニューラルネットワーク(CNN)を使用します。 任意の長さのテキストは文字のシーケンスであり、そのような問題はRNNを使用して解決され、LSTMはRNNの一般的な形式です。 詳細については、この投稿をお読みください LSTM.
テクノロジー–仕組み
LSTMはシーケンスの学習には優れていますが、状態の数が多すぎると速度が大幅に低下します。 多くのクラスの短いシーケンスよりも長いシーケンスを学習するようにLSTMに依頼する方が良いことを示唆する経験的な結果があります。 Tesseractは、PythonのOCRopusモデルから開発されました。これは、CLSTMと呼ばれるC ++のLSMTのフォークでした。 CLSTMは、C ++でのLSTMリカレントニューラルネットワークモデルの実装であり、数値計算にEigenライブラリを使用します。
レガシーTesseract 3.xは、ステップを区別できるマルチステージプロセスに依存していました。
- 単語発見
- ラインファインディング
- キャラクター分類
単語の検索は、テキスト行をblobに編成することによって行われ、行と領域は、固定ピッチまたは比例テキストについて分析されます。 テキスト行は、文字間隔の種類によって異なる方法で単語に分割されます。 次に、認識はXNUMXパスプロセスとして進行します。 最初のパスでは、各単語を順番に認識しようとします。 満足できる各単語は、学習データとして適応分類器に渡されます。 次に、適応分類子は、ページの下のテキストをより正確に認識する機会を得ます。
Tesseractツールの最新化は、コードのクリーニングと新しいLSTMモデルの追加に向けた取り組みでした。 入力画像は、LSTMモデルにラインフィードされてボックス(長方形)で処理され、出力されます。 下の画像では、それがどのように機能するかを視覚化できます。
新しいトレーニングツールを追加し、多くのデータとフォントを使用してモデルをトレーニングすると、Tesseractはより優れたパフォーマンスを実現します。 それでも、手書きのテキストや奇妙なフォントで作業するには十分ではありません。 実験のために最上層を微調整または再トレーニングすることが可能です。
Tesseractのインストール
Windowsへのtesseractのインストールは、プリコンパイルされたバイナリが見つかれば簡単です こちら。 「path」環境変数を編集し、tesseractパスを追加することを忘れないでください。 LinuxまたはMacのインストールの場合は、 いくつかのコマンド.
インストール後、ターミナルまたはコマンドでコマンドを入力して、すべてが機能していることを確認します。
$ tesseract --version
そして、次のような出力が表示されます。
tesseract 4.0.0
leptonica-1.76.0
libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.8
Found AVX2
Found AVX
Found SSE
この後、pipを使用してtesseractのpythonラッパーをインストールできます。
$ pip install pytesseract
Tesseractライブラリには、tesseractと呼ばれる便利なコマンドラインツールが付属しています。 このツールを使用して画像に対してOCRを実行でき、出力はテキストファイルに保存されます。 C ++またはPythonコードにTesseractを統合する場合は、TesseractのAPIを使用します。
CLIでTesseractを実行する
画像でTesseractエンジンを呼び出します 画像パス 次のように入力して、コマンドプロンプトで行ごとに記述された画像をテキストに変換します。
$ tesseract image_path stdout
出力テキストをファイルに書き込むには:
$ tesseract image_path text_result.txt
言語モデル名を指定するには、後に言語ショートカットを記述します -l フラグ、デフォルトでは英語を使用します。
$ tesseract image_path text_result.txt -l eng
デフォルトでは、Tesseract は画像をセグメント化するときにテキストのページを予期します。 小さな領域を OCR したいだけの場合は、 –psm 引数。 見つけることができる利用可能な14のモードがあります こちら。 デフォルトでは、Tesseractはページセグメンテーションを完全に自動化しますが、向きとスクリプトの検出は実行しません。 パラメータを指定するには、次のように入力します。
$ tesseract image_path text_result.txt -l eng --psm 6
また、もう4つの重要な引数、OCRエンジンモード(oem)があります。 Tesseract XNUMXには、レガシーTesseractエンジンとLSTMエンジンのXNUMXつのOCRエンジンがあります。 –oemオプションを使用して選択したXNUMXつの操作モードがあります。
0レガシーエンジンのみ。
1ニューラルネットLSTMエンジンのみ。
2つのレガシー+ LSTMエンジン。
3利用可能なものに基づいて、デフォルト。
PytesseractおよびOpenCVを使用したOCR
PytesseractはTesseract-OCRエンジンのラッパーです。 jpeg、png、gif、bmp、tiffなど、PillowおよびLeptonicaイメージングライブラリでサポートされているすべての画像タイプを読み取ることができるため、tesseractのスタンドアロン呼び出しスクリプトとしても役立ちます。 Pythonアプローチに関する詳細情報を読む こちら。 このチュートリアルのコードは、この中にあります 倉庫.
import cv2 import pytesseract img = cv2.imread('image.jpg') # Adding custom options
custom_config = r'--oem 3 --psm 6'
pytesseract.image_to_string(img, config=custom_config)
Tesseractの前処理
tesseractの出力精度が低下する可能性があるすべての方法を回避するには、画像が適切であることを確認する必要があります 前処理.
これには、再スケーリング、XNUMX値化、ノイズ除去、デスキューなどが含まれます。
OCRの画像を前処理するには、次のPython関数のいずれかを使用するか、 OpenCVドキュメント.
import cv2
import numpy as np img = cv2.imread('image.jpg') # get grayscale image
def get_grayscale(image): return cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # noise removal
def remove_noise(image): return cv2.medianBlur(image,5) #thresholding
def thresholding(image): return cv2.threshold(image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1] #dilation
def dilate(image): kernel = np.ones((5,5),np.uint8) return cv2.dilate(image, kernel, iterations = 1) #erosion
def erode(image): kernel = np.ones((5,5),np.uint8) return cv2.erode(image, kernel, iterations = 1) #opening - erosion followed by dilation
def opening(image): kernel = np.ones((5,5),np.uint8) return cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel) #canny edge detection
def canny(image): return cv2.Canny(image, 100, 200) #skew correction
def deskew(image): coords = np.column_stack(np.where(image > 0)) angle = cv2.minAreaRect(coords)[-1] if angle < -45: angle = -(90 + angle) else: angle = -angle (h, w) = image.shape[:2] center = (w // 2, h // 2) M = cv2.getRotationMatrix2D(center, angle, 1.0) rotated = cv2.warpAffine(image, M, (w, h), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE) return rotated #template matching
def match_template(image, template): return cv2.matchTemplate(image, template, cv2.TM_CCOEFF_NORMED)
状況をより良く理解するために例を見てみましょう。 元の画像は次のようになります –
次のコードで前処理した後
image = cv2.imread('aurebesh.jpg') gray = get_grayscale(image)
thresh = thresholding(gray)
opening = opening(gray)
canny = canny(gray)
結果の画像をプロットすると、次の結果が得られます。
元の画像の出力は次のようになります–
GALACTIC BASIC
(AUREBESH) RE HFVMEVEIiZwoyv Ze
ABC DE F GH I JK LM
N—0- PQ RST Uv WX
2 | Ff 8 G& Pf fF § 5 op 7
ee
5, jf FF Ty ee ee
=
334 477 OED
さまざまな前処理画像の出力は次のようになります。
キャニーエッジイメージ(あまり良くない)-
CAE Cn Cae AS
(AUREBESE) EA Na
oe SS
(Ne CI (ENE
a, ee oe ea
2
a a A: rc
|, |
a
Sear eo/e ecm emclomt Cia cuoomct mi im
しきい画像–
GALACTIC BASIC
(AVREBESH)
RS 7FVMeEVEi1iFf o£
A B C D EF GH IJ K LM
AOoder7Nnvroroava
N O P Q@R S$ TU VW XK Y¥ Z
7 ee For 8 Ro Pf F Boao om #
0 12 3 4 5 6 7 8 9 , . !
>» 1kr7 @ by FEN
2? S$ ( Por Foy of ee
ASGSANDIE
CH AE EO KH NG OO SH TH
オープニング画像–
GALACTIC BASIC
(AUREZEBELSH)
KEE VTMEUOU EB iw oN es
A BC D EF F @ H | J K LT Ww
AOGdrcrT7WTt HYOAVa4
WO P Q R BS T U VW WK y Z
i J
Oo 1 2 3 46 8 7 SC Ps,
VY ir- -rp,ptUuY?
a a a
AGoOAnNnoOID
CH AE BO KH ®@ OO SH TH
テキストの周りのボックスを取得する
Pytesseractを使用すると、以下を使用してOCR結果の境界ボックス情報を取得できます コード.
以下のスクリプトは、OCR中にtesseractによって検出された各キャラクターのバウンディングボックス情報を提供します。
import cv2
import pytesseract img = cv2.imread('image.jpg') h, w, c = img.shape
boxes = pytesseract.image_to_boxes(img) for b in boxes.splitlines(): b = b.split(' ') img = cv2.rectangle(img, (int(b[1]), h - int(b[2])), (int(b[3]), h - int(b[4])), (0, 255, 0), 2) cv2.imshow('img', img)
cv2.waitKey(0)
文字ではなく単語の周りにボックスが必要な場合は、関数 image_to_data
重宝します。 あなたは使うことができます image_to_data
pytesseractで指定された出力タイプの関数 Output
.
OCRの問題を覚えていますか? 請求書、PDF、ナンバープレートをデジタル化したいですか? に向かう ナノネット 無料でOCRモデルを作成してください!
上記のサンプル請求書イメージを使用して、テッセラクト出力をテストします。
import cv2
import pytesseract
from pytesseract import Output img = cv2.imread('invoice-sample.jpg') d = pytesseract.image_to_data(img, output_type=Output.DICT)
print(d.keys())
これにより、次の出力が得られます–
dict_keys(['level', 'page_num', 'block_num', 'par_num', 'line_num', 'word_num', 'left', 'top', 'width', 'height', 'conf', 'text'])
この辞書を使用して、検出された各単語、それらの境界ボックス情報、それらのテキスト、およびそれぞれの信頼スコアを取得できます。
以下のコードを使用してボックスをプロットできます–
n_boxes = len(d['text'])
for i in range(n_boxes): if int(d['conf'][i]) > 60: (x, y, w, h) = (d['left'][i], d['top'][i], d['width'][i], d['height'][i]) img = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2) cv2.imshow('img', img)
cv2.waitKey(0)
請求書のサンプル画像は次のようになります。
テキストテンプレートマッチング
日付が画像内のどこにあるかを見つけようとする例を見てみましょう。 ここでのテンプレートは、適切な境界ボックスを見つけるためにOCRの結果と照合する正規表現パターンになります。 私たちは regex
モジュールと image_to_data
このための機能。
import re
import cv2
import pytesseract
from pytesseract import Output img = cv2.imread('invoice-sample.jpg')
d = pytesseract.image_to_data(img, output_type=Output.DICT)
keys = list(d.keys()) date_pattern = '^(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[012])/(19|20)dd$' n_boxes = len(d['text'])
for i in range(n_boxes): if int(d['conf'][i]) > 60: if re.match(date_pattern, d['text'][i]): (x, y, w, h) = (d['left'][i], d['top'][i], d['width'][i], d['height'][i]) img = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2) cv2.imshow('img', img)
cv2.waitKey(0)
予想どおり、画像の請求日を囲むボックスがXNUMXつ表示されます。
ページ分割モード
テキストのページを分析する方法はいくつかあります。 tesseract apiは、小さな領域でのみ、または異なる方向などでOCRを実行する場合に、いくつかのページ分割モードを提供します。
これは、tesseract によってサポートされているページ セグメンテーション モードのリストです。
0方向およびスクリプト検出(OSD)のみ。
1OSDによる自動ページセグメンテーション。
2自動ページセグメンテーション。ただし、OSDまたはOCRはありません。
3完全自動のページセグメンテーション。ただし、OSDはありません。 (デフォルト)
4可変サイズのテキストの単一列を想定します。
5垂直に配置されたテキストの単一の均一なブロックを想定します。
6テキストの単一の均一なブロックを想定します。
7画像を単一のテキスト行として扱います。
8画像をXNUMXつの単語として扱います。
9画像を円の中のXNUMXつの単語として扱います。
10画像をXNUMX文字として扱います。
11スパーステキスト。 できるだけ多くのテキストを順不同で検索します。
12OSDを使用したスパーステキスト。
13生のライン。 Tesseract固有のハックをバイパスして、画像を単一のテキスト行として扱います。
ページ分割モードを変更するには、 --psm
上記のモードコードのいずれかにカスタム構成文字列の引数。
向きとスクリプトを検出する
画像内のテキストの向きと、それが記述されているスクリプトを検出できます。 次の画像–
次のコードを実行した後-
osd = pytesseract.image_to_osd(img)
angle = re.search('(?<=Rotate: )d+', osd).group(0)
script = re.search('(?<=Script: )d+', osd).group(0)
print("angle: ", angle)
print("script: ", script)
次の出力が出力されます。
angle: 90
script: Latin
数字のみを検出
たとえば、この画像を見てみましょう–
この画像から抽出されたテキストは次のようになります。
‘Customer name Hallium Energy services
Project NEHINS-HIB-HSA
lavoice no 43876324
Dated 17%h Nov2018
Pono 76496234
設定を次のように変更することで、数字のみを認識できます
custom_config = r'--oem 3 --psm 6 outputbase digits'
print(pytesseract.image_to_string(img, config=custom_config))
出力は次のようになります。
-- . 43876324
172018
0 76496234
文字のホワイトリスト
特定の画像から特定の文字のみを検出し、残りは無視したいとします。 次の構成を使用して、文字のホワイトリストを指定できます(ここでは、aからzまでのすべての小文字を使用しています)。
custom_config = r'-c tessedit_char_whitelist=abcdefghijklmnopqrstuvwxyz --psm 6'
print(pytesseract.image_to_string(img, config=custom_config))
出力–
customername
roject
tnvoleeno
ated alliumenergyservices
e
thovo
文字のブラックリスト化
一部の文字または式がテキストで明確に表示されないことが確実である場合(OCRはブラックリストに登録された文字の代わりに誤ったテキストを返す)、次の構成を使用してそれらの文字をブラックリストに登録できます。
custom_config = r'-c tessedit_char_blacklist=0123456789 --psm 6'
pytesseract.image_to_string(img, config=custom_config)
出力–
Customer name Hallium Energy services
Project NEHINS-HIB-HSA
lavoice no
Dated %h Nov%
Pono
複数の言語で検出する
ターミナルでこれを入力して、利用可能な言語を確認できます
$ tesseract --list-langs
特定の言語の使用のためにテッセラクトをダウンロードするには
$ sudo apt-get install tesseract-ocr-LANG
ここで、LANGは必要な言語のXNUMX文字のコードです。 あなたはLANGの値を見つけることができます こちら.
あなたがダウンロードすることができます .traindata
必要な言語のファイル こちら そしてそれを置きます $TESSDATA_PREFIX
ディレクトリ(これは、 tessdata
ディレクトリがインストールされています)、それを使用する準備ができている必要があります。
Note –がある言語のみ .traineddata
ファイル形式はtesseractでサポートされています。
OCR出力に必要な言語を指定するには、 -l LANG
LANGは使用する言語の3文字のコードです。
custom_config = r'-l eng --psm 6'
pytesseract.image_to_string(img, config=custom_config)
たとえば、この画像を見てみましょう–
このようにLANGパラメータを変更することで、複数の言語で作業できます–
custom_config = r'-l grc+tha+eng --psm 6'
pytesseract.image_to_string(img, config=custom_config)
次の出力が得られます–
Here’s some Greek: Οδιο διστα ιμπεδιτ φιμ ει, αδ φελ αβχορρεανθ ελωκυενθιαμ, εξ εσε εξερσι γυ-
βεργρεν ηας. Ατ μει σολετ σριπτορεμ. ἴυς αλια λαβωρε θε. Σιθ κυωτ νυσκυαμ
τρασυνδια αν, ὠμνιυμ ελιγενδι τιν πρι. Παρτεμ φερθερεμ συσιπιαντὺυρ εξ ιυς,ναμ
%0790 แ ร เง ๑ ๕ 80 ๕ 6 ๑ อ 06 ส 0 เง น อ ๓ , πρω πρωπριαε σαεφολα ιδ. Ατ πρι δολορ νυ-
σκυαμ. 6 Thai Here’s some Thai: ν᾿ ค อ ร ั ป ซั น จ ุ ้ ย โป ร ด ิ ว เซ อ ร ์ ส ถา ป ั ต ย ์ จ ๊ า บ แจ ็ ก พ ็ อ ต ม ้ า ห ิ น อ ่ อ น ซา ก ุ ร ะ ค ั น ถ ธ ุ ร ะ ฟิ ด ส ต า ร ์ ท ง ี ้ บ อ ย
ค อ ต อ ื ่ ม แป ร ั ส ั ง โฆ ค ํ า ส า ป แฟ น ซี ศิ ล ป ว ั ฒ น ธร ร ม ไฟ ล ท ์ จ ิ ๊ ก โก ๋ ก ั บ ด ั ก เจ ล พ ล ็ อ ต ม า ม ่ า ซา ก ุ ร ะ ด ี ล เล อ
ร ์ ซี น ด ั ม พ ์ แฮ ป ป ี ้ เอ ๊ ้ า ะ อ ุ ร ั ง ค ธา ต ุ ซิ ม ฟิ น ิ ก ซ์ เท ร ล เล ่ อ ร ์ อ ว อ ร ์ ด แค น ย อ น ส ม า พ ั น ธ์ ค ร ั ว ซอ ง ฮั ม อ า
ข่ า เอ ็ ก ซ์ เพ ร ส
Note –最初に指定された言語 -l
パラメータは第一言語です。
残念ながら、tesseractには画像内のテキストの言語を自動的に検出する機能がありません。 代替ソリューションは、別のpythonモジュールによって提供されます langdetect
これはpip経由でインストールできます。
$ pip install langdetect
このモジュールも、画像を使用してテキストの言語を検出しませんが、言語を検出するには文字列の入力が必要です。 これを行う最良の方法は、最初にtesseractを使用して、そこにあると思われる言語でOCRテキストを取得することです。 langdetect
OCRテキストに含まれている言語を検索し、見つかった言語でOCRを再度実行します。
英語とポルトガル語だと思ったテキストがあるとします。
custom_config = r'-l eng+por --psm 6'
txt = pytesseract.image_to_string(img, config=custom_config) from langdetect import detect_langs
detect_langs(txt)
これにより、テキスト内の言語とその確率のリストが出力されます。
[en:0.714282468983554, es:0.2857145605644145]
が使用する言語コード langdetect
ISO 639-1コードに従います。 比較するには、確認してください この & この。 テキストで使用されている言語は英語とスペイン語であることがわかりました。
設定を次のように変更して、テキストを再度取得します
custom_config = r'-l eng+spa --psm 6'
txt = pytesseract.image_to_string(img, config=custom_config)
Note – 複数の言語を含むイメージで、構成で指定された言語が間違っているか、まったく言及されていない場合、Tesseract のパフォーマンスが低下します。 これは、langdetect モジュールをかなり誤解させる可能性もあります。
tessdata_fastの使用
速度が重要な場合は、tessdata言語モデルを、tessdataモデルの8ビット整数バージョンであるtessdata_fastモデルに置き換えることができます。
tessdata_fastによると githubの –
このリポジトリには、トレーニング済みモデルの高速整数バージョンが含まれています TesseractオープンソースOCRエンジン.
これらのモデルは、Tesseract 4のLSTM OCRエンジンでのみ機能します。
- これらは、速度と精度の点で最高の「コストパフォーマンス」を提供するものについての速度と精度の妥協点です。
- 一部の言語では、これはまだ最善ですが、ほとんどの場合はそうではありません。
- 「コストパフォーマンスに最も優れた」ネットワーク構成は、さらに高速化するために統合されました。
- ほとんどのユーザーはこれらのtraineddataファイルを使用してOCRを実行することを望み、これらはLinuxディストリビューションの一部として出荷されます。 Ubuntu 18.04。
- 微調整/増分トレーニングは NOT これらから可能である
fast
モデルは、8ビット整数であるためです。 - このリポジトリのモデルを使用する場合、新しいLSTMベースのOCRエンジンのみがサポートされます。 遺産
tesseract
エンジンはこれらのファイルではサポートされていないため、Tesseract の OEM モード「0」および「2」はこれらのファイルでは動作しません。
使用するには tessdata_fast
の代わりにモデル tessdata
、あなたがする必要があるすべてはあなたのダウンロードです tessdata_fast
言語データファイル こちら そしてあなたの中にそれを置きます $TESSDATA_PREFIX
ディレクトリにあります。
文書、領収書、または請求書をデジタル化する必要がありますが、コーディングが面倒です。 に向かう ナノネット 無料でOCRモデルを作成してください!
カスタムデータに関するTesseractのトレーニング
Tesseract 4.00には、ニューラルネットワークベースの新しい認識エンジンが含まれており、ドキュメント画像の精度が大幅に向上します。 ニューラルネットワークは、はるかに多くのトレーニングデータを必要とし、ベースのTesseractよりもはるかに遅くトレーニングします。 ラテン語ベースの言語の場合、提供される既存のモデルデータは、約400000フォントに及ぶ約4500テキスト行でトレーニングされています。
Tesseract 4.0 LSTMトレーニングチュートリアルを正常に実行するには、Tesseract 4およびTesseract 4トレーニングツールのインストールが機能し、トレーニングスクリプトと必要なトレーニング済みデータファイルが特定のディレクトリにある必要があります。 訪問 githubリポジトリ ファイルとツール。
Tesseract 4.00は、ゼロからのトレーニングに数日から数週間かかります。 これらすべての新しいトレーニングデータがある場合でも、トレーニングのオプションは次のとおりです。
- 微調整 –既存のトレーニング済み言語から始めて、特定の追加データでトレーニングします。 たとえば、手書きのデータセットといくつかの追加フォントのトレーニング。
- 最上層を切り取ります – ネットワークから取得し、新しいデータを使用して新しい最上位層を再トレーニングします。 微調整が機能しない場合は、これが次善の選択肢となる可能性が高くなります。 これが役立つ理由を、ImageNet データセットでトレーニングされたインスタンス モデルに例えてみます。 目標は、猫または犬の分類器を構築することです。モデルの下位層はコーナー、水平線、垂直線などの低レベルの抽象化に優れていますが、モデルの上位層はこれらの特徴を組み合わせて、猫または犬の耳、目、鼻を検出します。等々。 最上位レイヤーのみを再トレーニングすることで、下位レイヤーの知識を使用し、新しい異なるデータセットと組み合わせることができます。
- ゼロから再トレーニング –これは、問題に対して非常に代表的で十分に大きなトレーニングセットがない限り、非常に時間がかかるアプローチです。 ゼロからトレーニングするための最良のリソースは次のとおりです githubリポジトリ.
カスタムデータをトレーニングして作成する方法に関するガイド .traineddata
ファイルが見つかります こちら, こちら & こちら.
このブログ投稿では、Tesseractを使用したトレーニングのコードについては取り上げません。
Tesseractの制限
Tesseractは、前景のテキストを背景から明確にセグメント化している場合に最適に機能します。 実際には、これらのタイプの設定を保証することは非常に困難です。 画像に背景にノイズがある場合など、Tesseractから高品質の出力が得られない理由はさまざまです。 画質(サイズ、コントラスト、稲妻)が高いほど、認識結果が向上します。 OCRの結果を改善するには、少し前処理が必要です。画像を適切に拡大縮小し、できるだけ多くの画像コントラストを設定し、テキストを水平方向に揃える必要があります。 Tesseract OCRは非常に強力ですが、次の制限があります。
リストに合計されたテッセラクトの制限。
- OCRは、利用可能ないくつかの商用ソリューションほど正確ではありません。
- 部分的なオクルージョン、歪んだ遠近感、複雑な背景などのアーティファクトの影響を受けた画像には適していません。
- 手書き文字を認識することはできません。
- 意味不明なものを見つけて、これをOCR出力として報告する場合があります。
- ドキュメントに-l LANG引数で指定された言語以外の言語が含まれている場合、結果が悪くなる可能性があります。
- 文書の自然な読み順を分析することは必ずしも良いとは限りません。 たとえば、ドキュメントにXNUMXつの列が含まれていることを認識できず、列をまたいでテキストを結合しようとする場合があります。
- 低品質のスキャンでは、低品質のOCRが生成される場合があります。
- フォントファミリーテキストがどのフォントに属しているかに関する情報は公開されません。
もちろん、OCR タスクを実行するための、より優れた、はるかにシンプルで直感的な方法があります。
Nanonetを使用したOCR
ナノネット OCR API OCRモデルを簡単に構築できます。 OCRモデルの精度を上げるために、画像の前処理やテンプレートのマッチング、ルールベースのエンジンの構築について心配する必要はありません。
データをアップロードし、注釈を付け、トレーニングするようにモデルを設定し、XNUMX行のコードを記述したり、GPUを心配したり、ディープラーニングモデルに適したアーキテクチャを見つけたりせずに、ブラウザーベースのUIを介して予測を取得するまで待機できます。 また、各予測のJSON応答を取得して、独自のシステムと統合し、最先端のアルゴリズムと強力なインフラストラクチャに基づいて構築された機械学習対応アプリを構築することもできます。
GUIの使用: https://app.nanonets.com/
以下の手順に従って、Nanonets-OCR APIを使用することもできます:
ステップ1:リポジトリのクローンを作成し、依存関係をインストールする
git clone https://github.com/NanoNets/nanonets-ocr-sample-python.git
cd nanonets-ocr-sample-python
sudo pip install requests tqdm
ステップ2:無料のAPIキーを取得する
から無料のAPIキーを取得 http://app.nanonets.com/#/keys
ステップ3:APIキーを環境変数として設定する
export NANONETS_API_KEY=YOUR_API_KEY_GOES_HERE
ステップ4:新しいモデルを作成する
python ./code/create-model.py
注: これにより、次のステップに必要なMODEL_IDが生成されます
ステップ5:モデルIDを環境変数として追加する
export NANONETS_MODEL_ID=YOUR_MODEL_ID
注: 前のステップからYOUR_MODEL_IDを取得します
ステップ6:トレーニングデータをアップロードする
トレーニングデータは images
(画像ファイル)および annotations
(画像ファイルの注釈)
python ./code/upload-training.py
ステップ7:モデルのトレーニング
画像がアップロードされたら、モデルのトレーニングを開始します
python ./code/train-model.py
ステップ8:モデルの状態を取得する
モデルのトレーニングには最大2時間かかります。 モデルがトレーニングされると、メールが届きます。 その間、モデルの状態を確認します
python ./code/model-state.py
ステップ9:予測を行う
モデルがトレーニングされたら。 モデルを使用して予測を行うことができます
python ./code/prediction.py ./images/151.jpg
ループの中のナノネットと人間
「中程度」画面は、修正および入力プロセスを支援し、手動レビュー担当者の作業負荷をほぼ 90% 削減し、組織のコストを 50% 削減します。
機能が含まれます
- 正しい予測を追跡する
- どれが間違っているかを追跡する
- 不正確なものを修正する
- 間違っているものを削除する
- 不足している予測を入力してください
- 日付範囲で画像をフィルタリングする
- モデレートされていない画像に対するモデレートされた画像の数を取得します
すべてのフィールドは使いやすいGUIに構造化されているため、ユーザーはOCRテクノロジーを活用して、コードを入力したり、テクノロジーの仕組みを理解したりすることなく、OCRテクノロジーをより良いものにすることができます。
OCR の問題を念頭に置いていますか? 組織のデータ入力コストを削減したいですか? に向かいます ナノネット OCRモデルを構築して 画像からテキストを抽出する or PDFからデータを抽出する!
まとめ
ディープラーニングがコンピュータービジョンのほぼすべての側面に影響を与えたように、文字認識と手書き認識についても同じことが言えます。 ディープラーニングベースのモデルは、従来をはるかに超える前例のないテキスト認識精度を得ることができました 情報抽出 & 機械学習画像処理 アプローチ。
ドキュメントの画像が次のガイドラインに従っている場合、Tesseractはうまく機能します。
- 前景テキストの背景からの明確なセグメンテーション
- 水平方向に整列し、適切にスケーリング
- ぼやけやノイズのない高品質の画像
Tesseract 4.0の最新リリースは、大幅に正確な深層学習ベースのOCRをサポートしています。 OCRエンジン自体は、一種のリカレントニューラルネットワーク(RNN)であるLong Short-Term Memory(LSTM)ネットワーク上に構築されています。
Tesseractは、クリーンなドキュメントのスキャンに最適であり、トレーニングが包括的であるため、非常に高い精度とフォントの変動性を備えています。 Tesseractは、あなたの仕事が本、文書、そしてきれいな白い背景の上の印刷されたテキストのスキャンであるなら、頼りになるツールだと思います。
参考文献
- LSTM Tesseract 4.0 の最適なトレーニング済みモデル
- OCR 4.2017 に対する Dropbox のアプローチ
- Tesseract OCR エンジン レガシーの概要
- Tesseract開発者向けフォーラム
- Tesseract ユーザー向けフォーラム
- を使用した初期の印刷書籍の OCR 精度の比較
オープンソース エンジン Calamari と OCRopus - 深層学習を使用した効率的で辞書不要の OCR
- 情報抽出システムにおける OCR エンジンの適合性 – 比較評価
- ディープテキストベンチマーク
- OCRプロジェクト一覧
- Tesseract Github 最新リリース
- CVPR 2019 – テキスト検出のための文字領域認識 (CRAFT)
- OpenCV と Python を使用したクレジット カード OCR
- 画像の前処理
- OpenCV での画像の前処理
- Raspberry Pi で Tesseract を使用した OCR
- 英語以外の言語用 Tesseract OCR
- Tesseract を使用して Linux コマンドラインから OCR を実行する方法
- Tesseract OCRエンジンの概要
アップデート:
多くの人から、テキスト形式で日付を取得したり、日付やその他の特定のデータを検出してリストに追加できるようにする方法を尋ねられました。
答えは次のとおりです。
日付ボックスの周囲にバウンディングボックスを描画するコードでは、正規表現パターンと一致する線が表示されます。d['text']
。 パターンが一致する場合にのみボックスを描画します。 から値を抽出するだけで済みますd['text']
パターンが一致したら、それらをリストに追加します。
アップデート2:
英語以外のOCRに関する質問に対処するために、さらに読書リストを更新しました。
- 100
- 2019
- 7
- 9
- 私たちについて
- 従った
- 正確な
- 達成
- 取得する
- 越えて
- NEW
- 住所
- 利点
- AI
- エイズ
- アルゴリズム
- すべて
- 許可
- 間で
- 分析
- 別の
- API
- アプローチ
- アプリ
- AREA
- 引数
- 周りに
- 宝品
- 記事
- 自動化
- 利用できます
- 認知度
- さ
- BEST
- ビット
- ブログ
- 本
- 国境
- ボックス
- ブラウザ
- ビルド
- 内蔵
- 取得することができます
- CD
- 変化する
- サークル
- クレーム
- クリーニング
- CNN
- コード
- コレクション
- コラム
- 組み合わせ
- コマーシャル
- 企業
- 複雑な
- 信頼
- 混乱
- 含まれています
- 変換
- 補正
- コスト
- 可能性
- カップル
- データ
- 取引
- 検出された
- 検出
- 決定
- 発展した
- 開発者
- 開発
- DID
- 異なる
- 異なります
- デジタル
- デジタイズ
- 数字
- ドキュメント
- ダウン
- Drop
- ドロップボックス
- 早い
- エッジ(Edge)
- エンドポイント
- エネルギー
- 英語
- 環境
- すべてのもの
- 例
- 予想される
- 期待する
- 家族
- スピーディー
- 特徴
- 特徴
- フィールズ
- 名
- フロー
- フォロー中
- フォーク
- フォーム
- 形式でアーカイブしたプロジェクトを保存します.
- フォーム
- 発見
- 無料版
- function
- 受け
- Gitの
- GitHubの
- 与え
- 目標
- 良い
- でログイン
- グレー
- グレースケール
- 素晴らしい
- ガイド
- ガイドライン
- ハック
- 持って
- こちら
- ハイ
- 保持している
- 認定条件
- How To
- HTTPS
- 巨大な
- 人間
- 識別する
- 画像
- 影響
- 実装する
- 重要
- 改善します
- その他の
- 含まれました
- 含めて
- 増える
- info
- 情報
- インフラ
- 統合する
- 直観的な
- IT
- join
- キー
- キー
- 知識
- 既知の
- ラボ
- 言語
- ESL, ビジネスESL <br> 中国語/フランス語、その他
- 大
- 最新の
- LEARN
- 学習
- 図書館
- ライセンス
- 稲妻
- LINE
- linuxの
- リスト
- リスト
- 長い
- MAC
- 機械
- 機械学習
- 主要な
- 作成
- マニュアル
- 市場
- 一致
- メモリ
- マインド
- モデル
- 最も
- ネットワーク
- ネットワークベース
- ネットワーク
- ノイズ
- 開いた
- オープンソース
- 開設
- オプション
- オプション
- 注文
- 整理する
- その他
- さもないと
- パターン
- のワークプ
- パフォーマンス
- 視点
- 貧しいです
- 人気
- 可能
- 強力な
- 予測
- 予測
- かなり
- 主要な
- 問題
- プロセス
- ラボレーション
- 作り出す
- プログラマ
- プログラミング
- プログラミング言語
- プログラム
- プロジェクト
- 提供します
- は、大阪で
- 品質
- 価格表
- Raw
- RE
- リーディング
- 理由は
- 減らします
- レギュラー
- 残った
- レポート
- 倉庫
- 必要とする
- の提出が必要です
- 研究
- リソースを追加する。
- REST
- 結果
- ラン
- ランニング
- スキャニング
- 画面
- セグメンテーション
- サービス
- セッションに
- ショート
- 同様の
- 簡単な拡張で
- サイズ
- 小さい
- So
- ソフトウェア
- ソリューション
- スペイン語
- 仕様
- スピード
- 都道府県
- 米国
- 強い
- 首尾よく
- サポート
- サポート
- SWIFT
- システム
- タスク
- テクノロジー
- ターミナル
- test
- 介して
- 時間
- 豊富なツール群
- top
- 伝統的な
- トレーニング
- 最適化の適用
- 治療する
- トレンド
- Ubuntu
- ui
- わかる
- ユニーク
- us
- つかいます
- ユースケース
- users
- 値
- ビジョン
- W
- wait
- ウォーキング
- この試験は
- 何ですか
- ホワイトリスト
- Wikipedia
- ウィンドウズ
- 以内
- 無し
- 言葉
- 仕事
- ワーキング
- 作品
- 書き込み
- X