テキスト認識(OCR — 光学文字認識)は、画像やビデオストリームから印刷または手書きのテキストを抽出する技術です。モバイル開発では、テキスト認識は文書のデジタル化、ナンバープレートの認識、名刺の読み取り、リアルタイムテキスト翻訳に使用されます。主なモバイルOCRソリューションは、ML Kit Text Recognition(Google)、Vision Framework(Apple)、Tesseract OCR(オープンソース)です。Google ML Kit、2025年によると、Text Recognition V2は1フレームを10~30ミリ秒で処理し、ラテン文字で96%、キリル文字で91%の精度です。
重要ポイント
テキスト認識(OCR)は、テキスト画像を機械可読な文字に変換するコンピュータビジョンプロセスです。OCRは、画像前処理(二値化、デスキュー、傾き補正)、セグメンテーション(行、単語、文字への分割)、認識(各文字の分類)、後処理(辞書チェック、誤り訂正)の段階から構成されます。最新のOCRシステム(ML Kit、Vision)は、すべての段階を組み合わせたエンドツーエンドのニューラルネットワークを使用します。
OCRの種類:印刷テキスト — 文書、看板、画面からのタイプ文字の認識 — 精度95~99%;手書きテキスト — 手書き入力の認識 — ラテン文字で80~90%、キリル文字で70~80%の精度;シーンテキスト — 自然シーン内のテキスト:家の番号、道路標識、店名 — 透視歪みや映り込みのため最も困難。
CRNN + CTC Loss — 最新のOCRモデルで使用されるアーキテクチャ。畳み込みリカレントニューラルネットワーク(CNN + LSTM)が画像特徴を抽出し、Connectionist Temporal Classificationが事前セグメンテーションなしで文字シーケンスをデコードします。CRNNは任意の長さのテキストで動作し、傾きや歪みに強いです。arXiv(2025年)によると、CRNNモデルはICDAR 2019ベンチマークで97.5%の精度を達成しています。
| OCRソリューション | 精度 | 速度 | 言語 | プラットフォーム |
|---|---|---|---|---|
| ML Kit V2 | 96% | 10~30ミリ秒 | 45以上 | Android、iOS |
| Apple Vision | 95% | 10~40ミリ秒 | 13以上 | iOS、macOS |
| Tesseract 5 | 90% | 50~200ミリ秒 | 100以上 | クロスプラットフォーム |
| Google Cloud Vision | 98% | 500~1000ミリ秒 | 200以上 | サーバー(API) |
モバイルデバイス向けCRNN — ML KitはINT8量子化を伴うMobileNetV2 + CRNNモデルを使用します。モデルサイズは2~5MB(潜在)で、TFLite Delegateを介してGPU/NPUで実行されます。Tesseract(古典的パイプライン)とは異なり、ニューラルネットワークOCRは個別の文字セグメンテーションを必要とせず、ノイズに対してより堅牢です。欠点:リアルタイムにはGPUまたはNPUが必要 — CPUのみでは速度が5~10FPSに低下します。
ML Kit Text Recognitionは、モバイルアプリケーション向けの主要なOCRツールです。V2(ラテン文字ベース — ラテン文字、キリル文字、数字に最適化)とV1(ラテン文字 + CJK — 日本語、中国語、韓国語対応だが低速)の2バージョンがあります。V2はエンドツーエンドのCRNNモデルを、V1は古いCNN + LSTMを使用します。GoogleはCJK認識が必要な場合を除き、すべてのケースでV2を推奨しています。
ML Kitの結果構造:Text → TextBlock → Line → Element(Word/Symbol)。各レベルにはバウンディングボックス、信頼度(0..1)、認識テキストがあります。TextはルートオブジェクトでfullText(すべての認識テキストを1行で)を持ちます。TextBlockは論理テキストブロック(段落、列)です。Lineはテキスト行です。Elementは単語または記号です。不正確な認識をフィルタリングするにはconfidenceを使用します。
// ML Kit Text Recognition V2
val recognizer = TextRecognition.getClient(
TextRecognizerOptions.DEFAULT_OPTIONS
)
recognizer.process(inputImage)
.addOnSuccessListener { text ->
val fullText = text.text
text.textBlocks.forEach { block ->
val blockText = block.text
val blockRect = block.boundingBox
block.lines.forEach { line ->
line.elements.forEach { element ->
val word = element.text
val confidence = element.confidence
}
}
}
}
.addOnFailureListener { error -> /* error */ }
iOSでのテキスト認識(ML Kit経由):APIはAndroidと似ていますが、InputImageの代わりにUIImage/CVPixelBufferを使用します。ML KitはCore ML Delegateを介してA12+のApple Neural Engineを自動的に使用します。iOSでは、ML Kit Text Recognition V2はiPhone 15 Proで15~30ミリ秒の速度を発揮します。最大のパフォーマンスを得るには、渡す前にUIImageをCVPixelBufferに変換してください — これにより変換オーバーヘッドが削減されます。
Apple Vision Frameworkは、VNRecognizeTextRequest(iOS 13+)を通じてネイティブOCRを提供します。Vision OCRはApple Neural Engine(ANE)を使用し、追加のSDKは不要です。13の言語(EN、FR、IT、DE、ES、PT、ZH、JP、KO、RU、AR、TH、VI)をサポートしています。Visionはテキストの言語を自動検出し(言語補正)、1つのフレーム内で複数の言語をサポートします。速度 — A16+で10~40ミリ秒。
Vision OCRの特徴:recognitionLevel(高速 vs 高精度)、automaticLanguageDetection、customWords(特定の用語の追加)、supportsTop candidates(不明瞭なテキストの複数の認識候補)。高速モードは10~20ミリ秒で90%の精度、高精度モードは30~50ミリ秒で95%の精度を提供します。本番環境では、confidence >= 0.5でフィルタリングしながら高精度モードを使用してください。
import Vision
let request = VNRecognizeTextRequest { request, error in
guard let observations = request.results as? [VNRecognizedTextObservation] else { return }
for observation in observations {
let topCandidate = observation.topCandidates(1).first
let text = topCandidate?.string ?? ""
let confidence = topCandidate?.confidence ?? 0
let boundingBox = observation.boundingBox
}
}
request.recognitionLevel = .accurate
request.usesLanguageCorrection = true
let handler = VNImageRequestHandler(cgImage: cgImage, orientation: .up)
try handler.perform([request])
iOSでのVision vs ML Kit:Visionは内蔵ANEにより古いデバイス(iPhone X~13)で高速です。ML Kitは数百万のシーンテキスト画像でトレーニングされたGoogleのモデルにより、複雑なシーン(歪み、傾き、映り込み)でより正確です。Visionは個々の文字に対するconfidenceをサポートしていません(単語のみ)。そのためフィルタリングが制限されます。文書にはVision(高速)、シーンテキストにはML Kit(高精度)が適しています。
Tesseract OCRは、HP(1985~1998年)によって開発され、Google(2006年以降)によって保守されているオープンソースのテキスト認識エンジンです。Tesseract 5(LSTMベース)はCRNNニューラルネットワークアーキテクチャを使用し、Tesseract 4(クラシック + LSTM)よりも大幅な精度向上を実現しています。Tesseractはキリル文字、アラビア語、ヘブライ語、CJKを含む100以上の言語をサポートしています。Android用 — tess-two(フォーク)、iOS用 — swift-tesseract。
Tesseractの欠点:速度50~200ミリ秒/フレーム(CPUのみ、GPU加速なし)、エンジンに渡す前に画像前処理(二値化、デスキュー、向き検出)が必要、内蔵テキスト検出がない — 画像領域を渡す必要がある(多くの場合OpenCV Text DetectionまたはEASTと併用)。Tesseractはクリーンな文書で90%、シーンテキストで約70%の精度を達成します。
Tesseractを選ぶべき場合:アプリがGoogle Playなしのデバイス(Huawei)で動作する場合、希少言語(サンスクリット語、ヘブライ語)のサポートが必要な場合、またはOCRパイプラインの完全なカスタマイズ(カスタムフォントでのトレーニング)が必要な場合。その他のすべてのケースでは、ML KitまたはVisionの方が高速で正確であり、コードも少なくて済みます。TesseractはサードパーティSDKに制限がある場合にのみ正当化されます。
// Tesseract OCR via tess-two
val tess = TessBaseAPI()
tess.init(dataPath, "rus+eng")
tess.pageSegMode = TessBaseAPI.PageSegMode.PSM_AUTO
val bitmap = BitmapFactory.decodeResource(resources, R.drawable.text)
val gray = Bitmap.createBitmap(bitmap.width, bitmap.height, Bitmap.Config.ARGB_8888)
OpenCV.process(bitmap, gray) // 二値化 + デスキュー
tess.setImage(gray)
val result = tess.utF8Text
tess.recycle()
Tesseractの前処理は必須です:グレースケール変換、二値化(OtsuまたはAdaptive)、デスキュー、ノイズ除去(median blur)。前処理なしでは、Tesseractの精度は50~60%に低下します。前処理にはOpenCVを使用:Imgproc.cvtColor → Imgproc.threshold → Imgproc.erode/dilate → Core.rotate(deskew)。均一な背景の文書には二値化で十分ですが、シーンテキストには完全なパイプラインが必要です。
画像品質はOCR精度の主要な要因です。ML KitとVisionには内蔵の前処理がありますが、困難なケース(暗い写真、ぼやけ、露出オーバー)では、追加処理により精度が10~15%向上します。主な手法:コントラスト強調(CLAHE)、シャープニング(アンシャープマスク)、透視補正(perspective transform)、影や映り込みの除去。
CLAHE(コントラスト制限適応ヒストグラム均等化) — 局所領域のコントラストを改善する適応ヒストグラム均等化。CLAHEは照明が不均一な文書写真(一部が影、一部が明るい)に効果的です。OpenCV Core.createCLAHEをclipLimit=2.0、tileGridSize=(8,8)で使用すると、OCRに最適な結果が得られます。CLAHE後、暗い文書でのML Kitの精度は70%から88%に向上します。
透視補正 — 角度を付けて撮影した文書写真には必須です。文書を整列させるにはOpenCVのfindHomography + warpPerspectiveを使用します。自動文書境界検出には、Canny edge detection + findContours + approxPolyDPを使用します。透視補正後、角度が30°を超える撮影ではOCR精度が20~30%向上します。
// CLAHE + OpenCV前処理
val mat = Mat()
Utils.bitmapToMat(bitmap, mat)
Imgproc.cvtColor(mat, mat, Imgproc.COLOR_RGB2GRAY)
val clahe = Imgproc.createCLAHE(2.0, Size(8.0, 8.0))
clahe.apply(mat, mat)
Imgproc.GaussianBlur(mat, mat, Size(3.0, 3.0), 0.0)
Imgproc.threshold(mat, mat, 0.0, 255.0, Imgproc.THRESH_BINARY or Imgproc.THRESH_OTSU)
val processedBitmap = Bitmap.createBitmap(mat.cols(), mat.rows(), Bitmap.Config.ARGB_8888)
Utils.matToBitmap(mat, processedBitmap)
OCR前のテキスト検出 — シーンテキストの場合、OCRに渡す前にEAST(効率的かつ正確なシーンテキスト検出器)またはCRAFT(文字領域認識によるテキスト検出)を使用します。EASTは5~15ミリ秒でシーン内のテキストバウンディングボックスを検出します。CRAFTはより正確(97%)ですが低速(50~100ミリ秒)です。テキスト検出により、テキストのない領域をフィルタリングし、関連領域のみをOCRに渡すことができ、全体的な処理が高速化されます。
文書スキャン — 最も普及しているOCRアプリケーションです。スキャンアプリ(CamScanner、Adobe Scan、Google Drive)はML KitまたはVisionを使用して文書写真からテキストを認識します。典型的なパイプライン:文書境界検出 → 透視補正 → CLAHE処理 → OCR → フォーマット(PDF、DOCX)。ML Kit Text Recognition V2はA4用紙1枚あたり100~200ミリ秒で処理します。
リアルタイムテキスト翻訳 — OCRと機械翻訳の組み合わせ。Google翻訳、Microsoft Translator、Yandex翻訳はカメラからテキストを認識するためにML KitまたはVisionを使用し、元のテキストの上に翻訳を重ねて表示します(AR翻訳)。要件:快適なUXのためのレイテンシー < 200ミリ秒。ML Kit V2 + NNAPIは1フレームあたり30~80ミリ秒を提供し、翻訳とレンダリングの余裕を残します。
自動データ入力 — 名刺、銀行カード、身分証明書からデータを抽出するOCR。ML Kitがテキストを認識し、後処理が構造を解析します:名前、電話番号、メール(名刺)、またはカード番号、有効期限、CVV(支払いカード)。名刺の場合は、OCR後に正規表現を使用します。銀行カードの場合は、専門のMLモデル(有料、約99%の精度)を使用します。
// OCR + AR翻訳(簡易版)
let request = VNRecognizeTextRequest { req, _ in
guard let results = req.results as? [VNRecognizedTextObservation] else { return }
for observation in results {
let text = observation.topCandidates(1).first?.string ?? ""
let rect = observation.boundingBox
// 翻訳と矩形上へのARレンダリング
DispatchQueue.main.async {
overlayView.showTranslation(text, at: rect)
}
}
}
request.recognitionLevel = .fast
request.usesLanguageCorrection = false
視覚障がい者向けOCR — 支援技術:アプリがパッケージ、メニュー、看板のテキストを音読します。ML Kit OCR + Text-to-Speech(Android TTS / iOS AVSpeechSynthesizer)を使用します。重要な要件 — 低レイテンシー(< 100ミリ秒)でのリアルタイム処理。Seeing AI(Microsoft)やEnvision AIがこのアプローチを使用しています。アクセシビリティアプリでは、高速認識モードを使用し、confidenceでフィルタリングしないでください — どんなテキストでもユーザーにとって価値があります。
よくある質問
テキスト認識(OCR)は、アプリが写真やビデオからテキストを読み取ることを可能にする技術です。スマートフォンのカメラが画像をキャプチャし、デバイス上のニューラルネットワークが文字を認識して機械可読なテキストを返します。モバイルアプリでは、OCRは文書スキャン、カメラ翻訳、名刺からのデータ入力、視覚障がい者向けのアクセシブルなインターフェースの作成に使用されています。
ML Kit Text RecognitionはAndroidに最適な選択肢です:精度96%、速度10~30ミリ秒、45の言語、NNAPIによるGPU加速、あらゆる向きのテキストを検出。Tesseractはオープンソースの代替(精度90%、100以上の言語、CPU)で、Google Playのないデバイスや希少言語に適しています。95%のプロジェクトではML Kitを選んでください — より高速で正確であり、画像の前処理も不要です。
いいえ、ML Kit Text Recognition、Apple Vision、Tesseractはすべてデバイス上で完全に動作します。ML Kitは初回起動時にモデルをダウンロードでき(ダウンロードモード)、その後はオフラインで動作します。Apple VisionはiOSに組み込まれており、インターネットは不要です。Tesseractは完全にオフラインです。クラウドOCR(Google Cloud Vision、AWS Textract)はインターネット経由で動作しますが、モバイルのリアルタイムアプリケーションでは使用されません。
ML Kit Text Recognition V2はラテン語群およびキリル語群の45以上の言語をサポートしています:英語、ロシア語、ドイツ語、フランス語、スペイン語、イタリア語、ポルトガル語、ポーランド語、ウクライナ語、ルーマニア語、トルコ語など。V1(CJK)はさらに中国語、日本語、韓国語をサポートしています。完全なリストはTextRecognizerOptionsのドキュメントを参照してください。アラビア語やヘブライ語を認識するには、Tesseract(100以上の言語)を使用してください。
主な方法:文書の位置合わせ(OpenCVによる透視補正)、コントラスト強調(CLAHE)、シャープニング(アンシャープマスク)、適切な照明(継続的オート露出)、カメラ安定化(OIS/EIS)。ML Kitは基本的な歪みを自動で処理しますが、透視歪み(30°超)のある文書の場合、前処理により精度が20~30%向上します。ビデオには高速認識モードを使用してください。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。