📚
Visionを使ってオンデバイスで日本語のテキスト認識を行う
iOSでの日本語認識
これまでiOSで日本語認識をするためには外部のライブラリを使用するか、Firebaseのテキスト認識APIのような外部と通信する方法しかありませんでした。しかし、WWDC2022[1]でVisionのテキスト認識に日本語が追加され外部のライブラリを使用することなくオンデバイスで認識できるようになりました。それぞれをまとめると以下のような感じです。
認識方法 | オンデバイス | 認識精度 | 認識速度 |
---|---|---|---|
外部ライブラリ(SwiftyTesseract[2]など) | ⭕️ | 低 | 速 |
Firebaseのテキスト認識API[3] | ❌ | 高 | 遅 |
Visionフレームワーク[4] | ⭕️ | 中 | 速 |
実装
ではVisionを使用して実際に日本語を認識してみます。といっても基本的にはこれまでのVisionでのテキスト認識と変わりなく、対象言語に日本語が追加されただけです。VNRecognizeTextRequest
クラスのsupportedRecognitionLanguages()
メソッドを呼ぶと認識できる言語を確認することができます。
let request = VNRecognizeTextRequest()
print(try! request.supportedRecognitionLanguages())
// ["en-US", "fr-FR", "it-IT", "de-DE", "es-ES", "pt-BR", "zh-Hans", "zh-Hant", "yue-Hans", "yue-Hant", "ko-KR", "ja-JP", "ru-RU", "uk-UA"]
VNRecognizeTextRequest
のインスタンスを作り、recognitionLanguages
プロパティに["ja-JP"]
を代入するだけです。
let request = VNRecognizeTextRequest { (request, error) in
guard let observations = request.results as? [VNRecognizedTextObservation] else { return }
let maximumCandidates = 1
var recognizedText = ""
for observation in observations {
guard let candidate = observation.topCandidates(maximumCandidates).first else { continue }
recognizedText += candidate.string
}
print(recognizedText)
}
// ここで日本語を指定する
request.recognitionLanguages = ["ja-JP"]
let handler = VNImageRequestHandler(cmSampleBuffer: sampleBuffer)
try? handler.perform([request])
終わりに
今回は、Visionを使用して日本語のテキスト認識の実装しました。実際に使用してみて手書き文字の認識もできてかなり精度は高いと思います。デモアプリ(AVFoundationでカメラの映像取得->テキスト認識)はGitHub[5]で公開しているので全体の実装を見たい方はこちらをみる方がいいかと思います。
また、WWDCでテキスト認識をする新しい手段としてVisionKit[6]も発表されました。AVFoundationからカメラ画像取得->認識という処理が内部で実装されているので簡単に使用するならこちらの方が楽かもしません。
Discussion