はじめに
さっき調べてみたら、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ファイルのテキスト変換の方が利用シーンが多いかもしれない。