msdd’s blog

deep learning勉強中。プログラム関連のこと書きます。

EasyOCRを使って楽々OCR!画像から文字を取り出してみる

はじめに

PythonのGithub Trendingを見ていたら、EasyOCRというリポジトリを見つけました。 名前にEasyとついていたので、簡単にOCRできるならやってみようということで、試しに動かしてみました。

OCRとは

Wikipediaによると、

光学文字認識(こうがくもじにんしき、Optical character recognition)は、活字の文書の画像(通常イメージスキャナーで取り込まれる)を文字コードの列に変換するソフトウェアである。

とあります。 看板やノートの写真から文字の部分を読み取ってくれるようなソフトのことです。

EasyOCRとは

様々な言語を読み取ることが出来るOCRです。2020年7月7日では、スター数は1.1kでした。2020年7月15日にもう一度見てみると、5.5kまで増えていました。すごい!

このEasyOCRは、日本語、英語、中国語など、40以上の言語をサポートしています。Pythonで書かれていて、内部では、Deep learningライブラリのPyTorchも使われているようです。

githubのリンクは、https://github.com/JaidedAI/EasyOCRで、 ライセンスはApache License 2.0です。

使ってみる

使ってみました。

インストール

まずはeasyocrをインストール。

pip install easyocr

サンプルで試す

OCRにかける画像を用意します

EasyOCRに入っていたサンプルの画像を使ってみます。

f:id:msdd:20200715190536p:plain

メインのコード部分は、下のような感じです。 readerで引数に日本語のjaと英語のenを指定します。 readtextメソッドで引数に画像のパスを与えることで 結果が返ってきます。

import easyocr
reader = easyocr.Reader(['ja','en'])
result=reader.readtext("/path/to/image")
print(result)

結果は、文字部分を囲んだ矩形の4頂点、文字、confidentのリストが得られます。confidentは、よくわかっていません。 確信度?信頼度?テキストを予測したその予測テキストが当たってる確率的なものだと思っています。今度調べます。

下がサンプルに適用してみた時の結果です。

[([[71, 49], [489, 49], [489, 159], [71, 159]], 'ポ<捨て禁止!', 0.6339447498321533), ([[95, 149], [461, 149], [461, 235], [95, 235]], 'NOLITTER', 0.32493865489959717), ([[80, 232], [475, 232], [475, 288], [80, 288]], '清潔できれいな港区を', 0.9784268140792847), ([[109, 289], [437, 289], [437, 333], [109, 333]], '港 区 MINATO CITY', 0.18788912892341614)]

試しに、上の結果の一つ目を見てみると、 矩形の頂点の座標xyが4つで、リストに格納されている([[71, 49], [489, 49], [489, 159], [71, 159]])。次にテキスト('ポ<捨て禁止!')。最後の値がconfident(0.6339447498321533)です。

([[71, 49], [489, 49], [489, 159], [71, 159]], 'ポ<捨て禁止!', 0.6339447498321533)

これを画像上に表示してみると、 下のようになります。

結構いい感じで文字の場所と認識が出来ていますね。 まぁサンプルなので。 "イ"が"<"に間違われているのが気になります。。。

f:id:msdd:20200715190551p:plain

他の画像で試す

画像は、いらすとやのものを使わせてもらいました。 文字が入った画像を探しやすかったので。

confidentは詳しくは見ていません。 ぱっと見では、間違っているのはconfidentが低いものが多いです。

横書き

金魚すくいの画像で試してみました。 この画像は、文字が横に並んでいます。

元画像と結果画像は下にあります。

矩形はうまい具合に文字全体を囲んでいますね。 文字の認識は、ひらがなの"く"が不等号の"<"になってしまっています。 このOCRのモデルは、不等号が好きみたいですね。

f:id:msdd:20200715190604p:plain

f:id:msdd:20200715190614p:plain

縦書き

残暑お見舞いの画像で試してみました。

"残"と他の文字の矩形が別々になっています。 識別を見ても、大きく囲まれた部分は"・"と識別されている ことから、縦書きの判別ができないみたいです。

f:id:msdd:20200715190626p:plain

f:id:msdd:20200715190634p:plain

斜めに配置された文字

有給申請書の画像で試してみました。 この画像は、斜め

矩形はうまい具合に文字全体を囲んでいますね。

f:id:msdd:20200715190648p:plain

f:id:msdd:20200715190655p:plain

文字いっぱい

スタッフ急募の広告画像です。 文字いっぱいあります。

カタカナの文字の認識が弱そうです。 "スタッフ"や"アットホーム"の部分を間違えて 判別しています。

f:id:msdd:20200715190707p:plain

f:id:msdd:20200715190716p:plain

円状に配置された文字

ダルマ画像で試してみました。 この画像では、文字が円状に配置されています。 これは、矩形で判定するのは難しそうなので、 試してみました。

ゆるいカーブ状に配置されている"明けまして"の部分は最後の"て"の部分以外はうまく読み取れていますね。 上側のカーブも読み取れないと思っていました。

下側の部分はさすがにうまく認識はしてくれませんでしたが、 囲む部分はうまく囲っている印象です。

f:id:msdd:20200715190725p:plain

f:id:msdd:20200715190729p:plain

点状の文字

ドット状の文字で"THANK YOU"と文字が書かれている画像です。 試してみましたが、何も認識しませんでした。矩形自体が検出されませんでした。 フォントなど関係あるかもしれないです。

f:id:msdd:20200715190746p:plain

f:id:msdd:20200715190755p:plain

まとめ

EasyOCRを使って、色々な画像で試してみました。 EasyOCRは、すごく少ないコードでOCRできるので、使いやすかったです。 精度はまだまだ改善余地があると感じました。

テキスト部分の矩形はうまく囲えて、 認識に失敗しているようなものが見られました。 横書きの文字は、うまく認識できているものがありましたが、縦書きが全く認識できていませんでした。 カタカナの認識も弱そうという印象です。

コード置き場

使たコードです

https://gist.github.com/3sdd/a5045740b208cc1b06bb1841d91de5bb