カメラ OCR は、ローカルにフォークされた vision_text_recognition パッケージを使用して OCR を実行します。ラテン文字、中国語(簡体字および繁体字)、日本語、韓国語のスクリプトをサポートしています。認識のためにアップロードされるデータはありません。OCR エンジンから返される各ブロックには独自の境界ボックスと検出テキストが含まれ、結果ページでは同じ座標に翻訳が描画されるため、元のレイアウトが保持されます。
撮影パイプライン
- カメラの初期化。 カメラコントローラーは明示的な
initializing / ready / failed状態で非同期に初期化されます。失敗時には再試行ボタンが表示され、initializingガードに再入することなく初期化を再実行できます。 - 実際の方向。 アプリが縦向きにロックされていると、iOS の
DeviceOrientationと EXIF は信頼できません。アプリはsensors_plusを介して生の加速度計を読み取り、最新のフレームをキャッシュするため、UI がロックされていても、シャッターは実際 のグリップ方向でキャプチャします。EXIF の方向はこの真値と照合されます。 - シャッター。 タップで現在 のプレビューアスペクト比で撮影します。キャプチャしたフレームは、OCR の前に設定可能な最大辺長にダウンスケールされます。ほとんどのページでは、精細な文字をメモリを肥大化させずに読み取るために長辺 1500〜2000 ピクセルが必要です。
- フラッシュ。 ファインダーには 4 つのモード(オート、オフ、オン、トーチ)が公開されており、トグルはシステムフラッシュ API にバインドされています。
OCR が返すもの
- ブロックごとの境界ボックス。 各 TextBlock には独自の矩形があります。結果ページではこれらを使用して、翻訳テキストをソーステキストの正確に同じ位置に配置します。
- ブロックのテキストと順序。 ブロックごとのソース言語テキスト。エンジンが出力した順序(デフォルトでは上から下、左から右)。
- 信頼度。 各ブロックには独自の信頼度があります。閾値を下回るブロックは結果ページにレンダリングされますが、ユーザーが確認できるように「低信頼度」としてフラグが付けられます。
なぜデバイス上で処理するのか
- プライバシー。 街中の看板、契約書、医療フォームの写真は OCR のためにデバイスを離れることはありません。
- レイテンシ。 ネットワークのラウンドトリップはありません。典型的なスマホ撮影ページの OCR は、最近のデバイスでは 1 秒以内に完了します。
- オフライン。 OCR は飛行機内、地下室、通信圏外の地域で動作します。認識を実行する同じエンジンがオンデバイスモデルから完全に実行されます。
正確な OCR のためのベストプラクティス
- 均一で間接的な光。 窓からの光はオーバーヘッドのスポットライトよりも優れています。ページを横切る影は、文字の誤読の最も一般的な原因です。
- タップしてフォーカス。 オートフォーカスが間違った被写体(デスク、指、ページの端)を選択した場合は、キャプチャ前にテキストの中心をタップしてください。
- 平らなページ。 本の背に向かって弓状になったページは、ガター付近の文字を失います。可能であれば、もう一方の手でページを平らに押してください。
- 1 回のキャプチャで 1 つの言語。 混合スクリプトのページは 1 回のパスで動作 but、ラテン文字と縦書きの日本語が混在するページは 2 回のキャプチャに分割することをお勧めします。