はじめに
WWDC2019でios13から文字認識(OCR)が標準サポートになるとアナウンスがありました。使えそうな気がしたので、調べてみました。英語(アルファベット)や数字の認識ならば使えそう。日本語のサポートは...先なのかな???
Appleから公開されている資料
WWDC2019で発表された資料がApple社から公開されています。英語ですが、WWDC2019の動画とその中で使われているサンプルコードが3つ([1], [2], [3] )。動画では、何ができるか、どう実装できるかが話されています。詳細を知りたい方は、参照してみてください。動画中で使われているサンプルコードは、それなりに複雑で読むのが大変だったので、新規にサポートされる文字認識の部分を取り出して書いていきます。
実装
以下は、文字認識のコードです。UIImage(image)に入っている画像の文字認識を行います。選択できる項目は以下です。
-
文字認識のレベル (recognitionLevel)
今は、.fast
と.accurate
が選択可能です。
.fast
は、リアルタイムで文字認識したい時、.accurate
は、時間はかかるが、文字認識精度を高めたい時に選びます。 -
文字認識言語 (recognitionLanguages)
文字認識の言語の選択。後で述べるサポートしている言語を指定できます。 -
言語ごとの訂正 (usesLanguageCorrection)
文字認識時に言語に基づいた訂正を行うかどうかの選択です。
let image: UIImage // このイメージの文字認識を行う
let cgImage = image.cgImage
let request = VNRecognizeTextRequest(completionHandler: self.recognizeTextHandler)
request.recognitionLevel = .accurate // .accurate と .fast が選択可能
request.recognitionLanguages = ["en_US"] // 言語を選ぶ
request.usesLanguageCorrection = true // 訂正するかを選ぶ
let requests = [request]
let imageRequestHandler = VNImageRequestHandler(cgImage: cgImage, options: [:])
try! imageRequestHandler.perform(requests)
以下は、VNRecognizeTextRequest
に渡すハンドラです。文字認識した結果が渡されます。
ここでは、認識した文字のみ表示していますが、認識結果のスコア(confidence)や文字認識の領域(boundingBox)も取得できます。
func recognizeTextHandler(request: VNRequest?, error: Error?) {
guard let observations = request?.results as? [VNRecognizedTextObservation] else {
return
}
for observation in observations {
let candidates = 1
guard let bestCandidate = observation.topCandidates(candidates).first else {
continue
}
print(bestCandidate.string) // 文字認識結果
// bestCandidate.confidence // 文字認識のスコア
// observation.boundingBox // 文字認識の領域
}
}
文字認識できる言語の習得
文字認識できる言語は、supportedRecognitionLanguages(for:revision:)
で取得できます。引数は、認識レベルとリビジョンの2つ。ドキュメントによると、認識レベルは、.fast
と.accurate
。リビジョンは、VNRecognizeTextRequestRevision1
とのことです。
以下のコードでサポート言語が取得できます。
let fast = try! VNRecognizeTextRequest.supportedRecognitionLanguages(for: .fast, revision: VNRecognizeTextRequestRevision1)
let accurate = try! VNRecognizeTextRequest.supportedRecognitionLanguages(for: .accurate, revision: VNRecognizeTextRequestRevision1)
print(fast)
print(accurate)
参考文献
-
[WWDC2019 Text Recognition in Vision Framework(動画)]
(https://developer.apple.com/videos/play/wwdc2019/234/) -
[サンプルコード(Structuring Recognized Text on a Document)]
(https://developer.apple.com/documentation/vision/structuring_recognized_text_on_a_document) -
[サンプルコード(Reading Phone Numbers in Real Time)]
(https://developer.apple.com/documentation/vision/reading_phone_numbers_in_real_time) -
[サンプルコード(Locating and Displaying Recognized Text on a Document)]
(https://developer.apple.com/documentation/vision/locating_and_displaying_recognized_text_on_a_document) -
[リファレンス(VNRecognizeTextRequest)]
(https://developer.apple.com/documentation/vision/vnrecognizetextrequest)