頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


OCRアプリは膨大な文字データをどう持てばいいの?

OCRアプリは膨大な文字データをどのように持っておけばいいんだろうってお話だよ。

日本語OCRのiOSアプリを作ろうとすると、膨大な元データが必要になるよね。ひらがな、カタカナ、数字、漢字、、、アルファベットや記号なんかも必要だよね、やっぱり。常用漢字でも約2000あるらしいから結構な量だよ。
この膨大なデータをあらかじめアプリは持っておいて、カメラなどでユーザーが入力した画像と比較していくことになるわけだよね。
となると、アプリ起動時にその膨大な文字データをロードしておく必要が出てくるよね。入力された画像と比較する段階になってデータをロードしてたんじゃ最初は動作がやたらめったら遅くなっちゃうから。

それじゃどういう形でどういうデータを持つんだってことになるんだけど、そもそもどういう評価方法でこの入力された画像はこの文字です!って決定するかがまだ定まっていないんだけど、、、仮に適当なサイズで二値化した画像で比べる(かなり原始的だよね)とするよ。
すると、そのデータをアプリ内に納めておいて、アプリ起動時にメモリを確保してその膨大なデータを配列などへ割り当てておく必要があるわけだよ。使い勝手を考えるとここで何秒も待たせるなんて許されないわけだよね。
あ!イメージしているアプリの完成形ではサーバに問い合わせとかなしでオフラインでも使えるモノを考えてるよ。だから画像データをサーバに送信して、なんてのはなしってことで。
話を戻してじゃあ二値化画像のデータをどう準備しておくかってことなんだけど、いろいろあるよね。
(その1)UILabelで文字を一つずつ表示してそれを二値化して配列へ。
(その2)二値化済み画像を用意してそれをプロジェクトに追加、コードでは画像を読み取り配列へ。
(その3)二値化済み画像のデータをバイナリで用意しておいてそれをプロジェクトに追加、コードで読み取り配列へ。
(その4)二値化済み画像のデータを直接ファイル内にだらーーーっと記述しておく。

数字が大きくなるほど起動時に必要な時間は短いはず。それだけ下準備してるわけだから当然といえば当然なんだけど。
実際に(3)の方法のようにバイナリファイルを作って読み込んでみたんだけど、、、数千個となると予想外に時間がかかりそうなんだよ。iPhone4S実機で測定してみた結果、2000個なら1.2秒くらい。ひとつのバイナリファイルにいくつもの文字データを埋め込んでやればもう少し早くなりそうではあるんだけど、やっぱり(4)の方法が圧倒的に早かったんだよね。
ただ、何千個もある数値データをコード内にキレイに記述する方法がよくわからないんだ。ってことで現在その方法を検討中。


そうそうメモリ確保の件だけどさ、callocでメモリ確保テストしてみたんだけど、ウチのもっさり君ことiPod touch(4thG)でも200MBをエラーなく確保してくれたよ。実際のところ(どういうデータを用意するかにもよるけど)どう考えても文字データの量はその十分の一もいかないからこの点については心配なさそう。最初はデータ量が多すぎてアプリとして成立しないんじゃないか?!なんて心配してたんだけどね。

<< 「翔ぶが如く」を読んでみた   TopPage  iOSで日本語OCRはやめておけ! >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/641-0610055b




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad