画像内の文字認識に関する調査まとめ(初心者の覚書WIP)
ゴール
横書き認識だけに止まっているiPadアプリのディレクションを担当した経緯があります(2020.5頃)が、その時点でエンジニアによると縦書き認識は実装ができそうにないということで、横書き認識だけで実装されました。
これを縦書きも認識させるためには、どうすればいいのか?
精度をある程度まで保たせたまま実装することはできるのか?
といった問の答えを模索したいと思います。
できれば、自分でも多少のプロトタイプを作れたら良いなと思います。
まずは検索
「画像認識」で検索してみました。
画像認識といえば、OpenCVというライブラリのようです。
ただ、「画像」を認識するので、点を読み込んだり、色を認識して、変換したりとそういう用途のようです。
今探しているのは、「画像内の文字認識」だということがわかりました。
画像ファイル内の文字をテキストファイルとして読み込む技術のことを、OCRと言うそうです。
まずとても小さな一歩。
なんの略だろ。
・・・
Optical Character Recognition/Reader の略だそうです。
「光学的文字認識」と訳されるようです。
そして次の大変小さな一歩。
「OCR アプリ開発」で検索
画像認識 API で OCR アプリを実装してみた - Qiita
こちらを読んでみます。
気になったことは、AR的にカメラを向けて、認識させるのと、写真を撮ってそれを読み込ませるのって違うのかな、ってことです。
もしも後者が圧倒的に楽とか、認識精度が高いとかだった場合、そっちを採用するのが良いような気がするからです。
気になっていることは、一つの章にまとめておこう。
気になっていること(溜めておいてぼちぼち調べること)
AR的にカメラを向けて文字認識させることと、写真を撮ってそれを読み込ませるのは違うのか? 開発の難易度や、認識精度の違いがあるか?
認識する(写真を読み込ませる)範囲を限定させることで、認識精度を上げることはできるのか?
そもそもARってなんすか。。。(迷走w)
閑話休題 上のQiita記事を読んでみました
2018年末の記事で、少し古いです。(執筆時点が2020.12)
Microsoft Azureの公開している、Computer VisionというAPIを使うようでした。
これは、撮影した写真を読み込むことでテキストを認識することもできるし、撮影しなくてもカメラを向けるだけで、文字を認識して表示することもできるそうです。
ここから、Google App Scriptというのを解して、Google Spread Sheetに読み込んだテキストを入力する、という流れで作られていました。
BundleIDとAPIキーを自分用に埋め込めば、動くようになっているそうです。
すごいですね。
今今は、まだXCodeでの開発やSwiftのキャッチアップができていないので、すぐ試してみることはしませんが、パラで調査&開発やってみているXCodeでのアプリ開発が進んだら、ぜひこれも試してみたいと思います!
2018年なので、Microsoft AzureのConputer Vision APIもきっとその時点より進化しているはず!
さて、ゴールの縦書きが読めるのか? についてもうしばらく調べてみたいと思います。
「OCR iPhoneアプリ 縦書き」で検索してみました
動画で、以下のものがあったのでみてみました。
https://www.youtube.com/watch?v=SD674KYO5WM
「もじかめ」というアプリの使い方を紹介する動画でした。
文字認識方向を、横、縦と切り替えることができ、縦にすると、縦書きの新聞記事を読めているようでした。
認識精度はかなり高いようです。
・・・
結論、縦書きはできる。
上記は、iPadアプリのようで、カメラ範囲が画面上で指定されていて、そこに写し込む形となっていました。
やはりある程度、向きやカメラ範囲は限定した方が、精度が上がるということではないかなと仮説を置くことができるかもです。
Google keepのOCR機能
iPhoneだけで日本語縦書きの書き起こしが実現!Google KeepのOCR機能 - [Mu]ムジログ
という記事を見つけました。
こちらの方は、本の執筆をされているようで、本の表紙を、縦書き・横書き混じった状態で、写真撮影し、それをGoogle Keepのアプリに読み込ませて、OCR機能でテキスト認識する、という手法をとっていました。
ほとんどが縦書きで、横書きがちょろっと入っている画像でした。
横書きの部分が、少し乱れていましたが、縦書きに関してはほぼ完璧に読み込めていました。
・・・
やはり縦書きはできるようです。
GoogleやMicrosoftのような大企業が提供しているAPIを使うと、認識精度も高いということなんでしょうか。。。
今のプロトタイプ作成されたAppは、なんていうライブラリを使っていたか、確認してみようと思います。
また、GoogleやMicrosoftの出しているOCRのAPIなどについて、調べてみようと思います。
無料などで使えるのか? ネットワークは少なくとも要りそうですね。(ネットワークは、今のアプリも使う前提ですので問題ありません)
制限があるのか? アプリに組み込むには? などなど。
GoogleのOCR技術
画像内のテキストを検出する | Cloud Vision API | Google Cloud
APIで、Cloud Visionというのが提供されているようでした。
ただし、リジョンが限られていて、米国内と欧州連合内、という記述がありました。
ちょっと翻訳のせいもあるのか、分かりにくかったです。
アプリで使う場合は、Firebase 向け ML Kitというのをみろ、とありました。
Firebase 向け ML Kit
これ、じゃないかなあ。作ったアプリで使われたの。確か、こんな名前だったと思います。
Google Cloud Visionが組み込まれたSDKとあります。
これを組み込むことで、テキスト認識や顔認識、そのほか諸々ができるとあるので、これがアプリを作る上でGoogleさんの力(API)を借りる場合の選択肢ってことですね。
これを使ったら、認識精度が高くなかったというのは、何が問題だったんだろう。
そして、縦書きもできなかった、というのは、何が問題だったんだろう。
何をすれば、今すでに出ているアプリで実装されているような、縦書きもスラスラ読める形になるんだろう。
精度を上げる方法は??
この辺りが気になりますね。
Firebase 向け ML Kit の「テキスト認識」のページ
こちらをみると、ML Kitには、2つの新しいAPIに分割された、とあります。
一つは、On-Device text recognition。
もう一つは、Cloud text recognitionです。
違いを見ると、オンデバイスでも「リアルタイム処理(カメラや動画のフィードに最適)、画像内のまばらなテキストを認識」ができるとあります。
これで十分そうですが、言語対応が、「ラテン文字の認識」とあります。
Cloudの方は、さまざまな言語の認識、とあり、こちらは、月1000回まで無料、つまり有料ということですね。
ただ、今回のアプリは、文字自体は全て数字かアルファベットです。
ひらがなやカタカナを読むわけではないので、Cloudである必要性はなさそう??
Cloudの方は、「高精度のテキスト認識、画像内のまばらなテキストを認識、ドキュメントに含まれる画像内で密集したテキストを認識」に最適、とあるので、こちらの方がやはり認識精度は高いと考えていいのかと思います。
お金がかかるが、こちらに切り替えることで、認識精度を上げることができるかもしれない、ということが分かりました。
Cloud Vision API のお試しができるサイト
のリンクが、上のページにありました。
試してみる | Cloud Vision API | Google Cloud
やってみています。
ここで見ると、何が認識されるかが、一目瞭然なのでいいですね。
実際に試してみた画面のこのキャプチャを見ると、よくわかるのが、縦に並んでいるアルファベットの、縦の隙間が小さいと、文字として読めてないような感じがします。
縦書きで、文字1つとして読み込めているのは「G」だけですね。
横書きだったら結構読めているのに。
間は空いているとしても、全体としてParagraphとかで読めています。
縦書きの、文字の隙間が小さい場合が読めるのかどうか? どうすれば、1文字ずつでも読んでもらえるのか? という点、調べが必要そうです。
新聞記事とか読み込んでいたやつ、かなり縦の幅は狭いですよね。。。
あれで読めてるなら、これも読めるんじゃなかろうか。
次回は、もう少し試しながら、MicrosoftのComputer Vision APIなんかも試してみられたらいいな、と思います。
つづく。