京橋のバイオインフォマティシャンの日常

南国のビーチパラソルの下で、Rプログラムを打ってる日常を求めて、、Daily Life of Bioinformatician in Kyobashi of Osaka

【R言語と文字認識】R環境で、OCR(光学文字認識)をやってみると、やはりの結果だった件

はじめに

さっき調べてみたら、R環境で、OCR(光学文字認識)がサクッとできるみたいとのことで、早速、記事を書いてみることにした。

OCRとは、スクリーンショットやスキャンした紙、手書きテキストの画像など、画像内からテキストを見つけ出して、文字コードに変換する技術のことです。 Rパッケージのtesseractを使うとサクッとできるみたいです。

tesseract::ocr関数を使った、画像からの文字起こし

tesseractパッケージは、100以上の言語をサポートする強力なOCRエンジンであるTesseractのRラッパーとして提供されています。このエンジンでは、検出アルゴリズムを調整し、可能な限り最良の結果を得るために、高度な設定もできるようです。

同パッケージの注釈を見ると、一般的なパターン認識としてのOCRは、コンピュータにとって非常に難しいタスクで、結果が完璧になることはほとんどなく、入力画像の質によって精度は急速に低下するのことです・・・ まぁ画像認識は一般論として、そうなんでしょうね。

そのため、入力画像を適切に品質管理することが大事なようです。

さて、OCRの実行には、Tesseractパッケージ内にocrという関数が用意されていて、それを使います。

OCR関連パッケージのセットアップ

まずは、関連パッケージをインストールします。

#tesseractのインストール
install.packages("tesseract")
library(tesseract)

#EBimageのインストール
install.packages("BiocManager")
BiocManager::install("EBImage")
library(EBImage)

文字認識して、英語を抽出する場合: 英文字のみ

さて、英語のタイプ文字の画像を使って、OCRの検証をやってみます。

まずは、英語(eng)のエンジンを設定します。

#言語設定: 英語(eng)
eng <- tesseract("eng")

#テスト画像の読み込み
Img <- EBImage::readImage(files="http://jeroen.github.io/images/testocr.png")

#テスト画像の表示
options(EBImage.display = "raster")
EBImage::display(Img)

この英字を含むテスト画像をインプットとして、次に、tesseractのOCRを実行してみます。

#OCR実行
text <- tesseract::ocr("http://jeroen.github.io/images/testocr.png", 
                       engine = eng)

#結果表示
cat(text)
#This is a lot of 12 point text to test the
#ocr code and see if it works on all types
#of file format.
#
#The quick brown dog jumped over the
#lazy fox. The quick brown dog jumped
#over the lazy fox. The quick brown dog
#jumped over the lazy fox. The quick
#brown dog jumped over the lazy fox.

text
#[1] "This is a lot of 12 point text to test the\nocr code and see if it works on all types\nof
#file format.\n\nThe quick brown dog jumped over the\nlazy fox. The quick brown dog jumped\nover
#the lazy fox. The quick brown dog\njumped over the lazy fox. The quick\nbrown dog jumped over the
#lazy fox.\n"

まぁ、テスト画像なので、ほぼ完璧に文字起こしされてますね。

どうも改行コード(\n)も出力されるみたいですね。

では、次の検証として、日本語の文字でも試してみます。

文字認識して、日本語を抽出する場合: その1 日本語文字のみ

デフォルトでは、日本語のエンジンが入っていないようなので、 手始めに、tesseract_download関数で、日本語のエンジンを入れてあげます。

直下の2行の実行で、日本語(jpn)のエンジンを設定します。

#言語設定: 日本語(jpn)
tesseract_download("jpn")
jpn <- tesseract("jpn")

#テスト画像の読み込み
imgj <- "https://raw.githubusercontent.com/kumeS/Blog/master/R_OCR/02.png"
Img <- EBImage::readImage(files=imgj)

#テスト画像の表示
options(EBImage.display = "raster")
EBImage::display(Img)

 

今回、上記のようなwikipediaの「リンゴ」の説明文を使って、日本語OCRを実行してみます。

#OCR実行
textj <- tesseract::ocr(imgj, engine = jpn)

#結果表示
cat(textj)
#リンゴとは、バラ科リンゴ属の落葉高木、またはその
#果実のこと。 植物学上はセイヨウリンゴと呼ぶ。春、
#
#白または薄氏の花が咲く。人との関わりは古く、紀元
#前から栽培されていたと見られ、16世紀以降に欧米
#
#での生産が盛んになり、日本においても平安時代には
#書物に記述がみられる。 ウィキペディア

おぉ〜〜、無事に上手くいっています!!

言語の関わらず、文字だけの画像だと、うまく行くみたいですね。

文字認識して、日本語を抽出する場合: その2 日本語 + 背景あり

さて、画像に背景がある場合に、結果はどうなるのでしょうか?

その場合も、検証してみました。

こういう画像で、以下のOCR実行をやってみました。

#言語設定: 日本語(jpn)
#tesseract_download("jpn")
#jpn <- tesseract("jpn")

#テスト画像の読み込み
imgj <- "https://cdn-ak.f.st-hatena.com/images/fotolife/s/skume/20220828/20220828015940.png"
#Img <- EBImage::readImage(files=imgj)

#テスト画像の表示
#options(EBImage.display = "raster")
#EBImage::display(Img)

#OCR実行
textj <- tesseract::ocr(imgj, engine = jpn)

#結果表示
cat(textj)
#0 い
#トマイニングをやっ      っ       ー
#てみたら、〇〇〇な         でミ
#ーー 件【その1: 夏目激        に
#ん」 を使った、テキ      SN

あらら、、、全然、テキスト変換できていませんね。

結局、背景があると、それが邪魔するようです。 「入力画像の質によって精度は急速に低下する」ということなんでしょうね。。

まとめ

今回、R環境でのOCRによる文字起こしをテーマにしてみました。

OCRの使い所ですが、経験上、辞書の索引の写真を撮って、それをテキスト変換とかなら結構使えます。

あとは、OCRよりも何方かと言えば、過去に紹介したPDFファイルのテキスト変換の方が利用シーンが多いかもしれない。

skume.net

参考資料

skume.net

Using the Tesseract OCR engine in R

dinov.sakura.ne.jp