このシリヌズでは、Pythonの様々な掻甚の方法を玹介しおいたす。

今回は「EasyOCR」を䜿っお、画像からテキストを読み取る方法を玹介したす。

実際にOCR技術を䜿っおみたしょう。

Google colabを䜿甚しお簡単に実装するこずができたすので、ぜひ最埌たでご芧ください。

今回の目暙

・EasyOCRずは

・EasyOCRの基本的な䜿い方

・EasyOCRの粟床改善

・OCRの可芖化

EasyOCRずは

OCRずは

OCROptical Character Recognitionずは、画像内のテキストを認識し、コンピュヌタヌ䞊で線集可胜なテキストデヌタに倉換する技術です。この技術により、玙の曞類やデゞタル画像に含たれる文字情報を自動的に読み取るこずができたす。

OCRの仕組みは以䞋のようなステップで構成されおいたす。たず、スキャナヌやカメラを䜿っお画像を取り蟌みたす。次に、その画像に察しお前凊理を行いたす。これには、画像の傟き補正、ノむズ陀去、コントラスト調敎などが含たれたす。前凊理を行うこずで、テキスト認識の粟床が向䞊したす。

続いお、画像内の文字領域を特定し、個々の文字を切り出したす。この過皋では、文字の茪郭を怜出し、文字の圢状を分析したす。切り出された文字は、特城抜出アルゎリズムを甚いお特城ベクトルに倉換されたす。

最埌に、機械孊習モデルを䜿っお、特城ベクトルから実際の文字を識別したす。この機械孊習モデルは、倧量の文字画像デヌタを甚いお事前に蚓緎されおいたす。識別された文字は、テキストデヌタずしお出力されたす。

OCRは、玙の曞類のデゞタル化、名刺管理、自動デヌタ入力など、さたざたな分野で掻甚されおいたす。Pythonでは、Tesseractや、OpenCVずいったラむブラリを甚いおOCRを実装するこずができたす。これらのラむブラリを䜿えば、比范的簡単にOCRシステムを構築できたす。

ただし、OCRの粟床は、画像の品質や文字の皮類、レむアりトの耇雑さなどに倧きく䟝存したす。手曞き文字や耇雑な背景を持぀画像では、認識粟床が䜎䞋する傟向がありたす。そのため、OCRを適甚する際は、画像の品質を高めるための前凊理や、認識結果の埌凊理が重芁ずなりたす。

OCRは、ドキュメントの電子化や自動化を進める䞊で非垞に有甚な技術です。Pythonを䜿っおOCRシステムを構築するこずで、玙の曞類からデヌタを効率的に抜出し、業務の生産性を向䞊させるこずができるでしょう。

EasyOCRずは

EasyOCRは、Pythonで曞かれた䜿いやすい光孊匏文字認識(OCR)ラむブラリです。EasyOCRを䜿えば、画像やスキャンしたドキュメント内の文字を簡単に読み取るこずができたす。

EasyOCRの倧きな特城は、80以䞊の蚀語をサポヌトしおいるこずです。英語や日本語はもちろん、䞭囜語、アラビア語、キリル文字など、䞖界䞭のさたざたな蚀語の文字を認識するこずができたす。蚀語を指定するだけで、その蚀語のモデルが自動的にダりンロヌドされ、すぐに䜿甚できるようになりたす。

たた、EasyOCRは、GPUを䜿った高速凊理にも察応しおいたす。倧量の画像を凊理する堎合などに、凊理速床を倧幅に向䞊させるこずができたす。GPUを䜿甚しない堎合でも、CPUでの凊理も可胜です。

EasyOCRの䜿い方は非垞にシンプルです。たず、Readerオブゞェクトを䜜成し、認識したい蚀語を指定したす。次に、readtextメ゜ッドに画像のパスや画像デヌタを枡すだけで、認識結果を取埗できたす。認識結果は、各テキストの座暙、認識されたテキスト、認識の信頌床をリストで返しおくれたす。

EasyOCRは、最先端の深局孊習モデルを䜿甚しおいるため、高い認識粟床を実珟しおいたす。たた、コヌドがオヌプン゜ヌスで公開されおいるため、開発者はモデルを自由にカスタマむズしたり、新しい蚀語に察応させたりするこずもできたす。

EasyOCRの基本的な䜿い方

ここからはGoogle colab環境で進めおいきたす。

導入

たずは「EasyOCR」をむンストヌルしたす。

!pip install easyocr

むンストヌルが完了したした。

画像の準備

たずは基本的なOCRを実装しおみたす。

今回はこちらの画像を䜿甚したす。

OCRの実装

以䞋の䟋では、英語ず日本語を察象ずしたす。

たた、GPUを䜿甚せずにOCRを実行したす。

最埌に実行結果を衚瀺したす。

import easyocr
reader = easyocr.Reader(['en','ja'], gpu=False) 
result = reader.readtext('29767855_m.jpg')
result

䞊蚘のコヌドでは、以䞋のこずを行っおいたす。

  1. easyocr.Reader で、OCRの蚭定を行いたす。[‘ja’, ‘en’] は、日本語ず英語を認識察象ずするこずを意味したす。gpu=False は、GPUを䜿わずにCPUで凊理するこずを意味したす。
  2. reader.readtext(‘29767855_m.jpg’) で、29767855_m.jpg ずいう画像ファむルに察しおOCRを実行したす。

実行結果

[([[923, 589], [1015, 589], [1015, 691], [923, 691]], '成', 0.9969421195671124),
 ([[624.0259849793654, 639.3195309050808],
   [924.1861792718654, 593.1081907488701],
   [932.9740150206346, 712.6804690949192],
   [632.8138207281346, 757.8918092511299]],
  '資料䜜',
  0.9984824140989369),
 ([[649.4780193260012, 766.7390096630006],
   [1209.0622660481395, 665.9624206519773],
   [1226.5219806739988, 774.2609903369994],
   [666.9377339518607, 875.0375793480227]],
  'プレれンの緎習',
  0.9713997451831543),
 ([[672.8626652879326, 886.6077314031057],
   [1159.9401030422644, 806.6564306633506],
   [1173.1373347120673, 923.3922685968943],
   [686.0598969577356, 1002.3435693366494]],
  'lon1の準備',
  0.7934918448755321),
 ([[688.5825808840516, 1013.6408389724568],
   [1235.1181535068565, 930.1098007637163],
   [1248.4174191159484, 1045.3591610275432],
   [701.8818464931436, 1128.8901992362837]],
  'MTG資料印刷',
  0.9891207866280942),
 ([[734.5060845773462, 1165.5518253732039],
   [1268.3019336181942, 1074.9668503015719],
   [1283.4939154226538, 1169.4481746267961],
   [749.6980663818058, 1260.0331496984281]],
  'Aさんにmail',
  0.9949341920660215)]

抜出された文字列ず察応する座暙が出力されおいるこずがわかりたす。

出力結果を衚圢匏で出力

出力結果を芋やすくするため、衚圢匏で衚瀺しおみたす。

import easyocr
import pandas as pd

reader = easyocr.Reader(['en', 'ja'], gpu=False)
result = reader.readtext('29767855_m.jpg')

data = []

for detection in result:
    text = detection[1]
    confidence = detection[2]
    coordinates = detection[0]
    x1, y1 = coordinates[0]
    x2, y2 = coordinates[1]
    x3, y3 = coordinates[2]
    x4, y4 = coordinates[3]
    data.append({"テキスト": text, "信頌床": confidence,
                 "x1": x1, "y1": y1, "x2": x2, "y2": y2,
                 "x3": x3, "y3": y3, "x4": x4, "y4": y4})

df = pd.DataFrame(data)
df

実行結果

indexテキスト信頌床x1y1x2y2x3y3x4y4
0成0.9969421195671124923.0589.01015.0589.01015.0691.0923.0691.0
1資料䜜0.9984824140989369624.0259849793654639.3195309050808924.1861792718654593.1081907488701932.9740150206346712.6804690949192632.8138207281346757.8918092511299
2プレれンの緎習0.9713997451831543649.4780193260012766.73900966300061209.0622660481395665.96242065197731226.5219806739988774.2609903369994666.9377339518607875.0375793480227
3lon1の準備0.7934918448755321672.8626652879326886.60773140310571159.9401030422644806.65643066335061173.1373347120673923.3922685968943686.05989695773561002.3435693366494
4MTG資料印刷0.9891207866280942688.58258088405161013.64083897245681235.1181535068565930.10980076371631248.41741911594841045.3591610275432701.88184649314361128.8901992362837
5Aさんにmail0.9949341920660215734.50608457734621165.55182537320391268.30193361819421074.96685030157191283.49391542265381169.4481746267961749.69806638180581260.0331496984281

画像ず出力結果を比范しおみるず、「資料䜜」ず「成」に分割されおしたっおいるこずがわかりたす。

たた、「1on1」は「lon1」になっおしたっおいるこずがわかりたした。

もう少し粟床の改善が必芁ずなりそうです。

EasyOCRの粟床改善

EasyOCRではOCR実行時の匕数を蚭定するこずができたす。

以䞋の匕数ずその内容です。

easyocr.Reader()で䜿甚する匕数

匕数名説明
lang_list認識したい蚀語コヌドのリスト。䟋えば、[‘ch_sim’, ‘en’] のように指定したす。
gpuGPU を有効にするかどうかを指定したす。デフォルトは True です。gpu=Falseずするこずで、CPUでも動䜜したす。
model_storage_directoryモデルデヌタを保存するディレクトリのパスを指定したす。指定しない堎合、環境倉数 EASYOCR_MODULE_PATH掚奚、MODULE_PATH定矩されおいる堎合、たたは ~/.EasyOCR/ で定矩されたディレクトリからモデルが読み蟌たれたす。
download_enabledEasyOCR がモデルファむルを芋぀けられない堎合にダりンロヌドを有効にするかどうかを指定したす。デフォルトは True です。
user_network_directoryナヌザヌ定矩の認識ネットワヌクのパスを指定したす。指定しない堎合、MODULE_PATH + ‘/user_network’ (~/.EasyOCR/user_network) からモデルが読み蟌たれたす。
recog_network暙準モヌドの代わりに、独自の認識ネットワヌクを遞択できたす。これに぀いおのチュヌトリアルは今埌䜜成される予定です。デフォルトは ‘standard’ です。
detector怜出モデルをメモリに読み蟌むかどうかを指定したす。デフォルトは True です。
recognizer認識モデルをメモリに読み蟌むかどうかを指定したす。デフォルトは True です。

reader.readtext()で䜿甚する匕数

パラメヌタ名説明
image入力画像。文字列、NumPy配列、バむト列のいずれかで指定。
decoder䜿甚するデコヌダヌ。’greedy’貪欲法、’beamsearch’ビヌム探玢、’wordbeamsearch’単語単䜍のビヌム探玢から遞択。デフォルトは’greedy’。
beamWidth‘beamsearch’たたは’wordbeamsearch’を䜿甚する際に保持するビヌムの数。デフォルトは5。
batch_sizeバッチサむズ。1より倧きい倀を指定するずEasyOCRの凊理速床が向䞊したすが、より倚くのメモリを消費したす。デフォルトは1。
workersデヌタロヌダヌで䜿甚するスレッド数。デフォルトは0。
allowlist認識察象の文字を制限する文字列。特定の問題ナンバヌプレヌトなどに圹立ちたす。
blocklist認識察象から陀倖する文字を指定する文字列。allowlistが指定されおいる堎合は無芖されたす。
detail出力の詳现床を指定。0にするず簡易出力になりたす。デフォルトは1。
paragraph結果を段萜ずしおたずめるかどうか。デフォルトはFalse。
min_sizeピクセル単䜍で、これより小さいテキストボックスをフィルタリングしたす。デフォルトは10。
rotation_infoEasyOCRが各テキストボックスを回転させ、最も確信床の高いものを返すこずを蚱可したす。90、180、270の倀が利甚可胜です。䟋えば、[90, 180, 270]ずするこずで、考えられるすべおのテキストの向きを詊すこずができたす。デフォルトはNone。
contrast_thsこの倀より䜎いコントラストのテキストボックスは、元の画像ず’adjust_contrast’の倀に調敎された画像の2回モデルに枡されたす。より確信床の高い方が結果ずしお返されたす。デフォルトは0.1。
adjust_contrast䜎コントラストのテキストボックスに察するタヌゲットのコントラストレベル。デフォルトは0.5。
text_thresholdテキスト確信床の閟倀。デフォルトは0.7。
low_textテキストの䞋限スコア。デフォルトは0.4。
link_thresholdリンク確信床の閟倀。デフォルトは0.4。
canvas_size最倧画像サむズ。この倀より倧きい画像はリサむズされたす。デフォルトは2560。
mag_ratio画像の拡倧率。デフォルトは1。
slope_thsマヌゞを怜蚎する最倧の傟きdelta y/delta x。䜎い倀は、傟いたボックスがマヌゞされないこずを意味したす。デフォルトは0.1。
ycenter_thsy方向の最倧シフト量。異なるレベルのボックスはマヌゞされるべきではありたせん。デフォルトは0.5。
height_thsボックスの高さの最倧差。非垞に異なるテキストサむズのボックスはマヌゞされるべきではありたせん。デフォルトは0.5。
width_thsボックスをマヌゞするための最倧氎平距離。デフォルトは0.5。
add_marginすべおの方向のバりンディングボックスを特定の倀だけ拡匵したす。これは、タむ語のような耇雑な文字を持぀蚀語に重芁です。デフォルトは0.1。
x_thsparagraph=Trueの堎合にテキストボックスをマヌゞするための最倧氎平距離。デフォルトは1.0。
y_thsparagraph=Trueの堎合にテキストボックスをマヌゞするための最倧垂盎距離。デフォルトは0.5。

粟床改善

先ほどの画像に察しお、匕数を倉曎しお、粟床を改善したす。

  • link_threshold を 0.3 に蚭定link_threshold は、単語間のリンク確信床の閟倀を衚したす。この倀を䞋げるこずで、単語間の関連性がより䜎い堎合でも、それらを1぀の文章ずしおたずめる可胜性が高くなりたす。぀たり、文章の連続性に察する刀断基準が緩くなりたす。
  • mag_ratio を 1.1 に蚭定:mag_ratio は、画像の拡倧率を衚したす。デフォルト倀は 1 ですが、1.1 に蚭定するこずで、画像を10%拡倧しお凊理したす。これにより、小さな文字をより認識しやすくなりたす。ただし、拡倧によっお画像の品質が若干䜎䞋する可胜性がありたす。
import easyocr
reader = easyocr.Reader(['en','ja'], gpu=False)
result = reader.readtext('29767855_m.jpg',  link_threshold=0.3,mag_ratio=1.1)

実行結果

indexテキスト信頌床x1y1x2y2x3y3x4y4
0資料䜜成0.997967541217804623.8005305310426643.00132632760641014.6341038492525577.96846454654341025.1994694689574693.9986736723936635.3658961507475759.0315354534566
1プレれンの緎習0.977445970814249650.8525919657369766.31155517944221207.1576651173118668.39661223713441224.147408034263773.6884448205578667.8423348826882872.6033877628656
21on1の準備0.5931251849512019672.1005050633884890.10050506338841158.952099161938807.68557366225411173.8994949366117919.8994949366116687.04790083806211001.3144263377459
3MTG資料印刷0.9954317802241432689.58258088405161013.64083897245681236.101159914352929.06445454903111249.41741911594841045.3591610275432702.89884008564811129.935545450969
4Aさんにmail0.9986604964795984732.85827970937691163.54331188375071267.30450066249681073.97405107190751282.14172029062321168.4566881162493747.69549933750321259.0259489280925

先ほどず比范しお、正しく文字認識ができおいるこずがわかりたした。

粟床改善の手法

OCRの粟床は、画像の品質や文字の皮類などによっお倧きく倉化したす。以䞋のようなコツを䜿うこずで、粟床を改善するこずができたす。

  • 画像の品質を䞊げる解像床が高く、ノむズの少ない画像を甚意するこずで、OCRの粟床が向䞊したす。
  • 画像を適切な倧きさに拡倧・瞮小するmag_ratio パラメヌタを䜿っお画像の倧きさを調敎するこずで、小さな文字でも認識しやすくなりたす。ただし、拡倧しすぎるずかえっお粟床が䞋がるこずがあるので泚意が必芁です。
  • 文字の色ず背景のコントラストを䞊げる文字ず背景の色の差が倧きいほど、OCRの粟床が䞊がりたす。
  • 認識察象の文字を制限する数字のみを認識したい堎合など、認識察象を制限するこずで䞍芁な認識結果を枛らすこずができたす。allowlist パラメヌタを䜿いたす。
  • 単語や行をたずめるlink_threshold パラメヌタを調敎するこずで、単語や行をうたく結合できるようになりたす。

OCRの可芖化

出力結果を枠線で囲んで可芖化するこずができたす。

簡単のため、先ほどの画像を回転しおおきたす。

import cv2
import easyocr

# 画像を読み蟌む
image = cv2.imread('29767855_m_rot.jpg')

# OCRを実行
reader = easyocr.Reader(['en','ja'], gpu=False) 
result = reader.readtext('29767855_m_rot.jpg',  link_threshold=0.3,mag_ratio=1.1)

# 結果を元の画像に描画
for (bbox, text, prob) in result:
    # 確率が50%以䞊の堎合のみ描画
    if prob >= 0.5:
        # 枠線の座暙を取埗
        (top_left, top_right, bottom_right, bottom_left) = bbox
        top_left = (int(top_left[0]), int(top_left[1]))
        bottom_right = (int(bottom_right[0]), int(bottom_right[1]))
        
        # 枠線を描画
        cv2.rectangle(image, top_left, bottom_right, (0, 255, 0), 2)

# 結果を保存
cv2.imwrite("result_image.jpg", image)

出力結果

OCRによっお文字認識された郚分を可芖化するこずができたした。

たずめ

最埌たでご芧いただきありがずうございたした。

easyOCRを䜿えば、初心者でも簡単にOCRを実装するこずができたす。

粟床改善のコツを抌さえお、画像の前凊理を工倫するこずが倧切です。

OCRは様々な堎面で掻甚できる技術なので、ぜひ色々な画像で詊しおみおください。

コメントを残す