Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
CameraX × ML Kitで パスポートOCR機能を実装
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Yuto Akaike
September 11, 2022
Programming
0
4k
CameraX × ML Kitで パスポートOCR機能を実装
Yuto Akaike
September 11, 2022
Tweet
Share
Other Decks in Programming
See All in Programming
CSC307 Lecture 05
javiergs
PRO
0
500
並行開発のためのコードレビュー
miyukiw
0
1.2k
LLM Observabilityによる 対話型音声AIアプリケーションの安定運用
gekko0114
2
440
Raku Raku Notion 20260128
hareyakayuruyaka
0
360
開発者から情シスまで - 多様なユーザー層に届けるAPI提供戦略 / Postman API Night Okinawa 2026 Winter
tasshi
0
210
組織で育むオブザーバビリティ
ryota_hnk
0
180
要求定義・仕様記述・設計・検証の手引き - 理論から学ぶ明確で統一された成果物定義
orgachem
PRO
1
230
AWS re:Invent 2025参加 直前 Seattle-Tacoma Airport(SEA)におけるハードウェア紛失インシデントLT
tetutetu214
2
120
AgentCoreとHuman in the Loop
har1101
5
250
Oxlint JS plugins
kazupon
1
1k
OSSとなったswift-buildで Xcodeのビルドを差し替えられるため 自分でXcodeを直せる時代になっている ダイアモンド問題編
yimajo
3
630
そのAIレビュー、レビューしてますか? / Are you reviewing those AI reviews?
rkaga
6
4.6k
Featured
See All Featured
Building AI with AI
inesmontani
PRO
1
710
Side Projects
sachag
455
43k
First, design no harm
axbom
PRO
2
1.1k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
830
Code Review Best Practice
trishagee
74
20k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
170
Ruling the World: When Life Gets Gamed
codingconduct
0
150
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
1
300
Code Reviewing Like a Champion
maltzj
527
40k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
130
How To Stay Up To Date on Web Technology
chriscoyier
791
250k
Transcript
CameraX × ML Kitで パスポートOCR機能を実装 Doroid Kaigi 2022
自己紹介 • Yuto Akaike (@kaikecchi) • 株式会社 令和トラベル 所属 •
海外旅行予約アプリ「NEWT」の開発 • 個人で競馬予想アプリ「ダビフレ」の開発・運営
アジェンダ 1. なぜOCR機能を実装したのか 2. CameraXとML Kitの概要 3. パスポートOCR機能の実装 4. 精度向上への取り組み
アジェンダ 1. なぜOCR機能を実装したのか 2. CameraXとML Kitの概要 3. パスポートOCR機能の実装 4. 精度向上への取り組み
OCRとは?
Optical Character Recognition(Reader) 紙などに書かれている文字を、 カメラなどによって画像データとして取り込み、 画像から文字を認識してテキストデータに変換する技術 CameraX ML Kit
面倒な入力作業をかんたんにする機能
パスポートOCR機能を実装した「NEWT」
None
None
海外旅行にはパスポート情報が必要
旅行者全員分の情報が必要
そこでOCR
面倒な入力作業を少しでもかんたんに
パスポートOCR機能を搭載するための選択肢 CameraX × ML Kit ライブラリA 精度・パフォーマンス 良 かなり良 工数
標準 比較的小 費用 無料 数十万円 /year UIのカスタマイズ 可 一部可 ギャラリーから選択画像の OCR 対応 非対応 メンテナンス状況 Googleが随時更新 ここ数年更新無し 既存アーキテクチャへの組み込み 易 難
パスポートOCR機能を搭載するための選択肢 CameraX × ML Kit ライブラリA 精度・パフォーマンス 良 かなり良 工数
標準 比較的小 費用 無料 数十万円 /year UIのカスタマイズ 可 一部可 ギャラリーから選択画像の OCR 対応 非対応 メンテナンス状況 Googleが随時更新 ここ数年更新無し 既存アーキテクチャへの組み込み 易 難 →精度面での見通しがついたので、拡張性の高さを重視
アジェンダ 1. なぜOCR機能を実装したのか 2. CameraXとML Kitの概要 3. パスポートOCR機能の実装 4. 精度向上への取り組み
CameraX
CameraXの概要 • カメラアプリの開発を容易にするためのJetpackライブラリ • Andeoid5.0以上をサポート • Googleのラボで様々なデバイスが継続的にテストされている • Androidのライフサイクルに連動させて管理を任せられる •
4つのユースケースを提供 https://developer.android.com/training/camerax
4つのユースケース • プレビュー • 画像キャプチャ • 画像解析 • 動画キャプチャ
4つのユースケース • プレビュー • 画像キャプチャ • 画像解析 • 動画キャプチャ
ML Kit
ML Kitの概要 • モバイルで機械学習の機能を利用できるSDK • 無料 • オンデバイスのSDKなのでオフラインでリアルタイムに動作 • 以前はML
Kit for Firebaseとして提供されていたが非推奨になり、 現在はML Kitと、CloudベースのFirebase MLに分割 • Vision API と Natural Language API を提供 https://developers.google.com/ml-kit/guides
Vision API • バーコードスキャン • 顔検出 • テキスト認識 • 画像ラベリング
• 物体検出 & 追跡 • デジタルインク認識 • その他Beta版のAPIがいくつかある
Vision API • バーコードスキャン • 顔検出 • テキスト認識 • 画像ラベリング
• 物体検出 & 追跡 • デジタルインク認識 • その他Beta版のAPIがいくつかある
テキスト認識 画像内のテキストを認識してくれるAPI ML 言語対応 ML Kit Text Recognition ラテン文字 ML
Kit Text Recognition v2 (Beta) ラテン文字 日本語、中国語、韓国語 Firebase ML (Cloud) Text tRecongnition 日本語含む100言語以上
アジェンダ 1. なぜOCR機能を実装したのか 2. CameraXとML Kitの概要 3. パスポートOCR機能の実装 4. 精度向上への取り組み
依存関係
依存関係 UI構築にはJetpack Compose パーミッション取得にはAccompanist
カメラパーミッションを 宣言 AndroidManifest
AndroidManifest MLのモデルをアプリイ ンストール時にダウン ロードする場合
パーミッション Accompanistを利用したパーミッ ション取得の全体像 細かい制御が不要であれば、短 いコードで構築可能
パーミッション rememberPermissio nState(CAMERA)で PermissionStateを取 得・保持
パーミッション PermissionStateで画 面を出し分け
パーミッション パーミッション要求は permissionState.launch PermissionRequest()。 状態に応じてダイアログ が表示される
パーミッション ScreenのOnStart時に毎 回パーミッションを要求し たいため、 LifecycleEventObserver を使用
起動 戻る
PreviewView AndroidViewを使って Composableに PreviewViewを配置
PreviewView PreviewView、 LifecycleOwner、 CameraProviderFutur e、読み取り後の処理 のラムダでカメラをセッ トアップ
プレビューユースケース プレビューユースケースを作成し、PreviewViewのSurafaceProviderをセット
CameraSelector 使用するカメラを指定 し、CameraSelectorを 作成
プレビュー表示 CameraProvider.bindT oLifecycleに、 lifecycleOwnerと CameraSelectorと previewユースケースを 渡してスタート
画像解析ユースケース 画像解析ユースケースを作成してPassportAnalyzerをセット
画像解析ユースケース
Analyzer ImageAnalysis.Analyzerを実装し、オーバーライドしたanalyze内で画像解析処理
Analyzer ML KitのTextRecognitionを取得しておく
Analyzer 画像と回転度から InputImageを作成
Analyzer TextRecognizer.proc essにInputImageを渡 してテキスト認識 登録したリスナー内で 結果を受け取る
TargetRotation screenOrientationを縦固定 にしている場合
TargetRotation 画面が回転し、回転度も再設定さ れ認識する screenOrientationを縦固定 にしている場合
TargetRotation 画面が回転し、回転度も再設定さ れ認識する 画面が回転せず認識しない screenOrientationを縦固定 にしている場合
TargetRotation OrientationEventListenerなどから取得したデバイスの向きを、 ImageAnalysis.targetRotaionに動的に設定
TargetRotation OrientationEventListenerなどから取得したデバイスの向きを、 ImageAnalysis.targetRotaionに動的に設定 画面は縦向きのままだが認識してく れる
Analyzer Text全文やTextBlock のListも取り出せる
TextBlock Block、Line、Elementのそれぞれが、 矩形、コーナー座標、言語情報、その内部のテキスト を持っている https://codelabs.developers.google.com/codelabs/mlkit-android#4
Analyzer 読み取った全文の中で パスポートのMRZを抽 出できた場合のみ読み 取り完了とし、 onRecognizedに渡す
パスポートのMRZ • Machine Readable Zoon • 機械でパスポート情報を読み取 るために印字されているコード • パスポートのレイアウトや言語は
発行国によって様々だが、MRZ の仕様は国際標準として定めら れている この部分
パスポートMRZの仕様 • 44桁 x 2行 • パスポートの場合は必ず 「P<」 から始まる •
発行国・氏名・パスポート番号・国籍・生年月日・性別・有効期限の 情報が入る • 各情報の位置は定められている。例えば氏名は6 - 44桁目に入り、 区切りや余白には<が使用される • 読み取りの整合性確認のためのCheck Digitも組み込まれている https://www.icao.int/publications/pages/publication.aspx?docnum=9303
MRZを抽出 正規表現などでMRZの文字列のみを抽出
Analyzer 繰り返し解析する場合 はImagePloxyをcolse する
OCRスタート CameraProvider.bindToLifecycleに、設定完了したImageAnalysisを追加
OCR起動 読み取り
アジェンダ 1. なぜOCR機能を実装したのか 2. CameraXとML Kitの概要 3. パスポートOCR機能の実装 4. 精度向上への取り組み
社内で精度検証を実施 まずは簡易的な実装をして精度を検証。社内のエンジニア以外のメンバーにも検証に協 力してもらい、読み取りミスのパターンを収集。
社内で精度検証を実施 まずは簡易的な実装をして精度を検証。社内のエンジニア以外のメンバーにも検証に協 力してもらい、読み取りミスのパターンを収集。 →端末によっては読み取りミスがちょこちょこ発生
変換ロジックやバリデーションを追加 P<<YAMADA<<1CHlR0<<<<<<c<<e<<<<<<<<<<<<<<<<< TT12345670JPN0001010F2201010<<<<<<<<<<<<<<01 P<<YAMADA<<ICHIRO<<<<<<<<<<<<<<<<<<<<<<<<<<< TT12345670JPN0001010F2201010<<<<<<<<<<<<<<01 0 → O 1,l →
I c,e → < 変換 MRZの仕様的に問題無いものは変換。一つに絞れないなど勝手に変換したらまずいも のはバリデーションエラーで対応し、再試行や修正を促す。
リリース後のモニタリング 読み取り精度はデバイスごとのカメラ性能 に大きく依存 ユーザーの多い主要メーカーの代表端末 は実機で動作確認 それ以外のメーカーや、メーカー内の 様々な機種を網羅的するのは困難
リリース後のモニタリング 読み取り精度はデバイスごとのカメラ性能 に大きく依存 ユーザーの多い主要メーカーの代表端末 は実機で動作確認 それ以外のメーカーや、メーカー内の 様々な機種を網羅的するのは困難 エラーや再試行イベントなどにログを仕込 み、問題が発生していそうな端末の種類 を特定できるように
まとめ
まとめ • 基本的なユースケースであれば少ないコードで実装できる • 精度やパフォーマンスは状況に応じた取り組みを • CameraX と ML Kit
の組み合わせで色々やってみよう
None