Firebase Machine Learningの文字認識機能を使ってみる

公開:2020/12/21
更新:2020/12/23
5 min読了の目安(約4800字TECH技術記事

この記事は Firebase Advent Calendar 2020 の22日目の記事です。

Firebase Machine Learning を使ってiOSアプリで日本語文字認識(OCR)を試す機会があったので記事にしました。カメラで撮影した文字を認識する様子はこちらです。

Firebase Machine Learning

Firebase Machine LearningはGoogleが提供している機械学習の機能をiOSやAndroidで使用するためのSDKです。数行のコードを追加するだけで機械学習の機能が利用できます。現時点ではベータ版のようです。

Firebase ML | Machine learning for mobile developers

他の文字認識フレームワークとの比較

モバイルアプリで利用できる文字認識フレームワークについて調査しました。

iOSで利用できる機械学習系のText Recognitionフレームワークの調査

  • iOS標準の文字認識機能(Text Recognition)は日本語に対応していなかった、オンデバイス専用であることが理由の一つかと思われる
  • Google の ML Kit もオンデバイス版は日本語に対応していなかった

そのようなこともあり日本語対応した文字認識機能を探した結果、Firebase MLに辿り着きました。

利用するための手順

実際にFirebase MLをアプリ(iOS)に組み込む際につまずきやすい

  • プロジェクトのセットアップ
  • 文字認識を実行する処理

について簡単に解説します。

Firebaseでプロジェクトを作成したらプロジェクトの横にあるSparkボタンを押して従量制のBlazeへの変更します。Firebaseは無料プランでも利用できますがFirebase MLのクラウド版のText Recognitionを使うためにBlazeへの変更が必要です。

Firebase MLのクラウド文字認識が内部的にCloud Vision APIを使用していて、呼び出し回数に応じて料金が発生するためです(無料枠あり)。

Use Firebase ML to train and deploy custom models, or use a more turn-key solution with the Cloud Vision APIs.

切り替えが完了すると以下の画面が表示されます。

ここでは省略しますが念の為、予算アラートを設定しておくことをお勧めします。
また、検証目的で利用する際は作業が終わったらSparkプランへ戻しておくことをお勧めします。

iOSアプリを追加します、バンドルIDは実際にアプリで使用するものを入力します。

GoogleService-Info.plist をダウンロードしておきます。

GoogleService-Info.plistをGitHubなどのpublicな場所にコミットするのは避けた方が良さそうです。
https://stackoverflow.com/questions/44937175/firebase-should-i-add-googleservice-info-plist-to-gitignore

Firebase SDKの追加手順が表示されるのでiOSのプロジェクトをセットアップします。

Xcodeを起動して新規プロジェクトを立ち上げます、Bundle Identifierは先ほど入力したものと同じになるようにします。

プロジェクトが表示されたらXcodeを一旦終了して、先ほどのSDK追加手順に従ってSDKを追加します。Firebase MLを使うためにFirebase/MLVisionも追加します。

  # Pods for firebase-ml-ocr
  pod 'Firebase/Analytics'
  pod 'Firebase/MLVision'

SDKを追加したら *.xcworkspace を開きます。ダウンロードしておいたGoogleService-Info.plist をプロジェクトに追加します。

初期化コードを追加します。

SwiftUIでは以下のようにアプリケーションのメインクラスに追加します。

--- a/firebase-ml-ocr/firebase_ml_ocrApp.swift
+++ b/firebase-ml-ocr/firebase_ml_ocrApp.swift
@@ -6,9 +6,13 @@
 //

 import SwiftUI
+import Firebase

 @main
 struct firebase_ml_ocrApp: App {
+    init() {
+      FirebaseApp.configure()
+    }
     var body: some Scene {
         WindowGroup {
             ContentView()

ここまでで一旦ビルドしてみます、問題なければアプリが起動します。

Firebaseの画面に戻ってメニューから Machine Learning を選択して始めるをクリックします。

Machine Learningの画面が表示されます、右側にあるクラウドベースの API を有効化をクリックしてAPI有効にします。

注意書きの記載の通りに不正なAPIアクセスを防止するための設定を行うことをお勧めします。
検証が終わったらAPIを無効化しておくことをお勧めします。

以上でFirebaseとCloud Vision APIの設定は完了です。

Swiftから文字認識を行う処理を解説します。

まず、Visionオブジェクトを初期化します

let vision = Vision.vision()

VisionCloudTextRecognizerOptionsを初期化、日本語と英語をセットします。

let options = VisionCloudTextRecognizerOptions()
options.languageHints = ["ja", "en"]

cloudTextRecognizer()メソッドを呼んでVisionTextRecognizerを生成します。

let textRecognizer = vision.cloudTextRecognizer(options: options)

UIImageからVisionImageオブジェクトを作成します。

let visionImage = VisionImage(image: image)

VisionTextRecognizerのprocess()メソッドにVisionImageオブジェクトを渡して文字認識を行います。

textRecognizer.process(visionImage)

UIImageの画像から文字認識を行う最小限のコードはこちらです。

import Firebase

func recognize(image: UIImage) {
    let vision = Vision.vision()
    let options = VisionCloudTextRecognizerOptions()
    options.languageHints = ["ja", "en"]
    let textRecognizer = vision.cloudTextRecognizer(options: options)

    let visionImage = VisionImage(image: image)
    textRecognizer.process(visionImage) { result, error in
        guard error == nil, let result = result else {
            return
        }
        print(result.text)
    }
}

サンプルコードはこちらに置いておきます。

おわり

Firebaseから機械学習の文字認識機能を利用しました。手順が分かってしまえばとても簡単でしたね。

参考資料