bunkoOCR操作手引き
iOS/Mac版のbunkoOCRの使い方のヘルプがあまりちゃんとしてなくて分かりにくいので、まとめておきます
メイン画面
カメラ撮影
デバイスのカメラで撮影した画像をOCR処理します。
詳しくは後述します。
写真ライブラリから選択
写真のライブラリの画像を選択します。複数選択することができ、その順にまとめてOCRされます。
ファイルから選択
ファイルブラウザーを使用して画像を選択します。複数選択することはできますが、仕様上順番が指定できません。まとめてOCRされます。
設定
様々な設定を変えることができます。
詳しくは後述します。
OCR結果
解析した結果が、リストになって表示されます。
ページの編集
OCRするのにスキャンや選択したものが、順番が違っていたり、抜けていたり、重複してしまっていた場合、ページの順番等を編集して解析し直すことができます。
購入メニュー
このアプリは無料で全ての機能が使用できます。ここから、作者にいろいろおごることができるので、気が向いたら購入してもらえると助かります。
購入すると、シークレット画像が表示されます。
なお、機械学習モデルを1から構築してるので、実はめっちゃ手間がかかってたりします。GPUも結構高いのです…
カメラ撮影
この画面では、カメラが起動し撮影を行います。撮り終わった画像から、順次OCR処理が行われていきます。
シャッターボタンを押すと、撮影されます。設定から、遅延シャッターや連続撮影モードにすることができます。両手でページをめくりながら、連続的に15秒毎にシャッターを切る、といった使い方もできます。
レンズ切り替えは、iPhoneの3つのレンズを切り替えるボタンです。焦点距離の違いで、上手く撮影できる撮影距離とレンズを探る必要があります。
ピント調節
画面内の任意の場所をタップすると、そこにフォーカスが合います。
画面内のどこかをタップして、マニュアルフォーカス状態になると、AFだった表示がLockedになります。
Lockedのところをタップすると、オートフォーカスに戻ります。
下に表示されているスライダーで、レンズ位置を調整することができます。Lens Positionは0から1で、0が近い所、1が遠いところにピントが合っています。0より近い所や、1より遠いところにはピントが合いません。違うレンズを使ってみるか、物理的に距離を変えてください。
Focus Scoreは、タップした場所付近のピントが合っているかどうかを、なんとなく表したものです。(内部的には、2dFFTをかけて高周波成分がどのくらいあるかで、エッジが立っているかを見ています)
スコアが高い方が、ピントが合っている可能性が高いです。1つの目安にしてください。なお、字がない無地のところだとスコアが低く出ます。
部分撮影
部分指定ボタンを押した状態(色が変わっている)で、シャッターを押すと、黄色の枠内が撮影されOCRされます。
枠の編集をするには、枠の編集ボタンを押します。
枠の角にある○の部分を持って動かすと枠の大きさが、枠の内部を持って動かすと枠の場所を動かすことができます。
編集が終わったら、色の変わっている編集ボタンをもう一度押して編集を終了します。
設定
各設定の項目名の部分をタップすると、デフォルト値に戻ります。
画像処理設定
リサイズ
処理する画像サイズを、拡大または縮小してからOCR処理します。このOCRエンジンでは、見かけの文字サイズがおおむね20pixelを下回ると認識できなくなりますので、一番小さい文字(ふりがな等)がこれ以上大きくなるように倍率を調整してください。また、現時点(v2.0)では、おおむね200pixel以上になると認識できなくなりますので、それ以下になる様にしてください。
大きい文字と小さい文字が混在して、この条件を満たせない場合は、口述の2pass OCRをお試しください。ガウスぼかし半径
gaussian blur(ガウスぼかし)をかける場合に、0より大きくしてください。現在の(v2.0)エンジンでは、ピクセルノイズ(文字の縁がギザギザしている)場合、例えばディスプレイを撮影したような画像、の場合は上手く認識できない場合があります。この場合、ぼかすと上手くいくときがあるのでお試しください。それ以外の場合、あまり必要ありません。鮮鋭化強度、鮮鋭化半径
unsharp maskをかけます。エッジが余りにぼけた画像の場合、輪郭がシャープになることがあります。
なお、OCRエンジンはある程度のぼやけた画像も認識できるように学習していますので、余り必要がないかもしれません。
ぼやけた画像を認識できないときにお使いください。彩度
saturationを調整します。輝度
brightnessを調整します。コントラスト
contrastを調整します。
OCRエンジンは、色の変化もだいたい対応できるように学習していますが、微妙な薄さでどうしても認識できない文字について、調整すると認識するかもしれません。色を反転
白黒を反転します。
OCRエンジンは、白黒どちらの文字も学習させていますが、色域を選択して調整する場合に調整しやすいように、設定できるようにしています。色域を制限
0(黒)となる色、1(白)となる色を選択して、コントラスト調節を行います。色域を選択
基準の色から、HSVの各レンジを指定してそれ以外を白に変えます。
取り込んだ画像を見ながら前処理パラメータ調整
この画像処理設定は、既に取り込んだ画像を見ながら調整できるようになっています。
OCR結果から、画像を表示してOriginal表示にします。(後述します)
PreProcessボタンを押すと、メニューが出ます。
色域を制限する方法
ここで地紋を消すために、色域を制限します。
ここで文字はほぼ黒であるので、R:9 G:16 B:16くらいを白に飛ばし、非常に狭い黒い範囲に制限してみます。
Doneを押すと前処理だけかかった画像が見れますので、目視によって、よい具合か調整してください。
右側の影の部分にちょっと残ってしまっていますが、ほぼ地紋を消すことができました。
色域を選択する方法
ここで地紋だけを取るために、色域を選択してみます。
選択の色のころで、RGBの数値のすぐ左にある、色の丸をタップすると、カラーピッカーになります。地紋の部分から色をピックアップします。
Hの範囲を狭くし、SとVの範囲はある程度狭くします。
Doneを押すと前処理されます。
一応、ソフト内で画像の前処理することが可能ですが、おまけの機能なので別のソフトで処理してから入力することをおすすめします。
オプション設定
HEICで保存する
offの場合はPNGで保存します。HEICの方が高圧縮で高品質だと言われています。可能なら48MPで撮影
カメラで48MPモードで撮影するように設定します。画像サイズが大きくなるので、部分選択撮影モードと併用するとよいでしょう。文庫本のふりがなの「ば」と「ぱ」を見分けたいので、できるだけ高解像度で撮りたい、という場合に使っています。タイルの重なり
OCRする際に、画像を小さなブロックに分けて処理します。
そのブロックを隣のブロックとどのくらい重ねるかを調整します。
重ねる幅を大きくすると時間がかかりますが、境界部分の認識ミスが減ります。0.5くらいがちょうどよいかと思われます。
2passOCR、2passの縮小率
画像内に大きな文字と小さな文字が、非常に大きさが異なって混在する場合、20pixel-200pixelという条件に当てはめることが難しくなります。
その際に、オリジナルサイズで検出するのと同時に、縮小率をかけて順次画像を縮小してから検出することによって、大きな文字も取ることができるようにします。遅延シャッター
カメラでの撮影時、シャッターボタンを押してから実際に撮影するまでに時間差をつくります。シャッターボタンを押すことによるブレを防ぐことや、iPhoneを固定して遅延シャッターを使うことで、本を両手で保持することが出来るようにします。連続撮影
遅延シャッターありの場合、タイマーで連続した間隔で撮影を続けます。止めるにはカウントダウン中にもう一度シャッターボタンを押します。Transformerによる文脈補正
このOCRソフトは、2段階に認識しています。
まず、文字の場所とどんな文字であるかを認識します。次に、文の順に文字を並べて、文章として誤字がないようにTransformerで補正します。
前段のどんな文字であるかを認識した段階で、だいたい合っているので、後段のTransformerが要らない場合は、使わないことで高速化できます。
また、後段の補正が余計な修正をして余計間違えることがたまにあるので、その時はOFFにすることもできます。
処理閾値
文字検出閾値
文字として認識する閾値です。あまりにも小さくすると、ゴミまで拾うので、0.35-0.5くらいを想定しています。エンジンが自信をもって認識した文字は、数値が大きくなります。あやふやな文字が低くなります。空白検出閾値
誤って何もない空間を認識したBoxを捨てるのに使います。
文字のある領域は、ヒストグラムを取ったときに、背景の色と文字の色がはっきりと分かれているので、2山のピークができます。このピーク同士の数値を比較してその距離がこの値よりも小さい場合は、そこに文字はなかったこととします。(つまり、1山しかピークがなかった)ゴミと文字の閾値
誤って何もない空間を認識したBoxを捨てるのに使います。
何も無い領域は、文字としてどの文字かを判定した確率が非常に小さくなります。このことを利用して、閾値以下の確率しか取れなかった文字のBoxはゴミであったとして捨てます。ルビ閾値
このOCRモデルでは、その文字がルビの文字であるかどうかの確率を算出しています。微妙なところが、おおむね0.5を超えるくらいに学習されています。確実にふりがなであると確信を持っている部分で、>0.95とかの値になっています。親文字閾値
このOCRモデルでは、その文字にルビがついているかどうかの確率を算出しています。グループルビなど難易度の高いふりがなの場所で、おおむね0.5を超えるくらいに学習されています。簡単な場所では、>0.95とかの値になっています。傍点閾値
圏点とも言いますが、このOCRモデルでは、強調の﹅がふられている箇所かどうかの確率を算出しています。
現在(v2.0)のアプリでは、この値を未処理です。(ふりがなとして処理しています)文字空け閾値
このOCRモデルでは、文字であるBoxの座標は分かりますが、英語の場合単語の切れ目が分かりません。そのため、ある文字が空白の次の文字である確率を算出しています。
英単語のスペースの後や、文頭の字下げを検出します。
あまり間違えないので、デフォルトでは0.9くらいのかなり確実なものを取るようにしています。領域IOU閾値
取得したBoxを、確率順に並べて処理したときに、実際には1つの文字であるのに2回取れてきているBoxをフィルタするために使用します。
あるBoxと別のBoxのIoU(Intersection over Union)指標が閾値以上の場合は、確率の高いBoxを優先します
https://qiita.com/CM_Koga/items/82d446658957d51836cf領域重複閾値
取得したBoxを、確率順に並べて処理したときに、実際には1つの文字であるのに2回取れてきているBoxをフィルタするために使用します。
あるBoxと別のBoxの重なりの領域が、あるBoxの面積に対して閾値以上である場合は、確率の高いBoxを優先します。敷き詰め閾値
前2項の閾値は、2つのBoxでの比較でした。先行した2つのBoxと、あるBoxの3つで、0.5ずつ重なっているような場合を除くために、既に確定したBoxの領域が、次のBoxの面積のどれくらいを占めると排除するかを定めます。
文の検索
無視する文の方向
文を検出した後に、縦書きの部分、もしくは横書きの部分を無視します。行の検出閾値
このOCRモデルでは、文が縦書きと横書きのどちらに続いているかを、線で認識します。その時の検出確信度の閾値です。0.5くらいで上手くいくように学習されています。文の方向
内部で文の連続方向の線が、どのように続いているかをHough変換を用いて線分検出しています。この際に、縦書きのみ、もしくは、横書きのみとして結果を捨てます。
あまり上手くフィルタできないので、無視する文の方向で後処理した方がうまくいくように思います。行の切断閾値1
このOCRモデルでは、文の連続の線分が、段組や枠線によって切断されるべき場所に、切断ラインを引くように認識しています。
閾値1は、行のラインが切断されるかどうかの閾値です。行の切断閾値2
閾値2は、Boxを文章として連結しようとした際に、段組や枠線を越えて連結しないようにする為の閾値です。行の切断閾値3
閾値3は、枠線自体が漢字の「一」などと誤認されるのを防ぐために、認識Box内に、切断ラインが入っている文字は誤認識とするための閾値です。連結する行間隔
行と行とがどのくらい離れていても、同じブロックであるとみなすかの閾値です。行間が広い文章の場合は大きくしてください。
行の幅に対する比率で指定します。小さな文字のブロックを無視する
たいていは本文よりも小さな文字で書かれる、ページ番号や柱書などを無視する設定です。小さな文字のブロックの閾値
普通の文字のブロックに対して、文字の大きさの比率でこの閾値以下の場合、小さな文字のブロックとみなします。
v2.0のこの設定は、誤認識が多いため、違う方法で段組やページ番号などを識別することを計画しています。
そのため、次期バージョンで変わる予定です。
結果文章表示
OCR結果の文章を表示するときの設定です。
フォントの字形を日本語に強制する
三点リーダー…などの字形が、フォントによっては日本語指定しないと日本人の意図通りにならないので、この設定で切り替えます。
英語のとか別の言語の場合はoffの方がよいでしょう。文字種によって色づけ
OCRのミスを発見するため、ひらがなとカタカナと漢字の色を変えて表示します。背景色、文字色
お好きな色で読書をどうぞ
読み上げ
ルビの読み上げ
漢字の方ではなくルビの方の文字を、読み上げエンジンに渡します。読み上げ言語、読み上げ音声
OSの読み上げエンジンを使用しているので、その設定です。
将来的には、読み上げエンジンを自前でつくって小説用にチューンしたいですね。
OCR結果
OCR結果は、各スキャンごとにまとめられます。デフォルトでは名前は処理を始めた時間となります。
左下のソートボタンで、ソート順を逆にできます。
各エントリ行は、左右にスワイプすることができます。(Mac版の場合は2本指スワイプ)
再解析
パラメータ調整して、もう一度同じ画像にOCR処理することができます。編集
タイトルを編集することができます。削除
いらない結果を削除します。
現在(v2.0)のバージョンでは、iCloudにデータが保存され、いろんな端末で見ることが出来るようにしています。
iCloudの容量を使用したくないのでローカルに保存したいという場合は、現時点ではOSの設定からこのアプリのiCloud使用をoffにしてください。
iOS: 設定→Appleアカウント→iCloud→iCloudに保存済み→bunkoOCR
Mac: システム設定>Apple Account>iCloud>iCloudに保存済み>すべて見る>iCloud Drive オン>iCloud Driveに同期しているアプリケーション>bunkoOCR
将来的には、保存場所を切り替えられるようにします。
結果表示
どれか結果の行をタップすると、認識結果が表示されます。
上部にあるアイコンの説明は以下の通りです。
オリジナル画像を表示
詳細な認識結果画像を表示のアイコンをタップすると、以下のようなオリジナル画像を表示する画面になります。
ここでPreProcessボタンを使って、前述の前処理パラメータ調整を行うことができます。
赤いOrignalボタンをタップすると、次のOverlay表示と切り替えることができます。
詳細な認識結果画像(オーバーレイ表示)
画像のOCR認識ボックスを図示します。
ページの編集
ページの編集メニューでは、各OCR済みの結果でページが抜けていたり順番が間違っているものを修正できます。
最初に、編集したい結果をタップして選択します。
左端にページ番号、真ん中に画像、右端に認識文字列が表示されています。
画像をタップすると拡大され、もう一度タップするとこの画面に戻ります。
ちらっと確認する用ですので拡大等はできません。
認識文字列の部分をタップすると、文字列がもっと表示されます。もう一度タップするとこの画面に戻ります。こちらはスクロールはできます。
右上の編集ボタンを押すと、編集モードになり、ページの順番を入れ替えたり、消したり出来るようになります。
編集破棄を押すと、何もせずに戻ります。
幅が足りない場合は、サブメニューから「ページの追加」を選ぶと、既存の結果からどの結果を参照するかの画面が出て、選ぶとどのページを追加するかの選択画面が出ます。
ページを選択する際に、page1とか書いてある部分をタップすると選択したり解除したりできます。
最後にOKを押すと追加されます。
任意のページ場所に移動してください。
購入メニュー
メニュー内容はこんな感じです。
購入してもしなくても、機能は変わりませんが、作者が口座をみて喜びます。
まとめ
アプリのだいたいの説明はこんな感じですが、不明点等あれば、どしどし聞いてください。
GitHubにちょっとしたエンジンの説明がありますが、また詳しく記事にしてみます。


コメント
4ありがとうございます。素晴らしすぎて涙が出ます。
これってアプリの設定画面から飛べるオンラインヘルプよりも詳しいので、そっちと合体させてあげた方がみんな喜ぶんじゃないんでしょうかねとか思いました。とにかく感謝です。ありがとうございます。
あっちに置いているヘルプと合体させた方が確かにいいですね。後で作業しておきます。
なんだか、仕事を増やしてばかりでごめんなさい m(_ _)m
いえいえ。自分で使っているだけでは気付かない点を指摘していただいてありがたいです。せっかく作ったのに使いにくいようではもったいないので。