前言
在iOS12時望门,蘋果推出了text detection的能力,有VNDetectTextRectanglesRequest這個request可以調用所灸。但是因為只支持檢測而不支持識別侠驯,所以當時只能檢測是否有文字并且輸出一個boundingbox,并不知道具體的文字是什么。
在iOS13推出時,蘋果推出了text recognition的能力,也就是這次可以檢測+識別文字了崩溪。相當于自帶了OCR的能力砸民,這個是非常重要的更新。因為目前OCR都是第三方庫+公共模型或者是自己訓練模型來實現(xiàn)的,實現(xiàn)的效果和模型+深度學習庫的性能有很大關系。蘋果自帶OCR之后,算是蘋果AI賦能,減少app的實現(xiàn)成本。
示例代碼
步驟很簡單,創(chuàng)建request,獲取圖片,執(zhí)行request并處理結果。
- 新建一個VNRecognizeTextRequest峦椰,寫好識別之后的回調滔金,并且把識別到的字符串拼接
let textRecognitionRequest = VNRecognizeTextRequest { (request, error) in
guard let observations = request.results as? [VNRecognizedTextObservation] else {
print("The observations are of an unexpected type.")
return
}
// 把識別的文字全部連成一個string
let maximumCandidates = 1
for observation in observations {
guard let candidate = observation.topCandidates(maximumCandidates).first else { continue }
self.resultingText += candidate.string + "\n"
}
}
- 設置文字識別request的精度蝌矛,分為fast和accurate,并把request放入一個request array
textRecognitionRequest.recognitionLevel = .fast
self.requests = [textRecognitionRequest]
- 創(chuàng)建一個VNImageRequestHandler氮唯,傳入要處理的圖片瞒渠,然后執(zhí)行request窍箍。最后我們就可以在回調中拿到識別結果了。
if let cgImage = image.cgImage {
let requestHandler = VNImageRequestHandler(cgImage: cgImage, options: [:])
do {
try requestHandler.perform(self.requests)
} catch {
print(error)
}
}
討論
fast和accurate兩個模式有什么區(qū)別祷蝌?
按照蘋果的說法,fast和accurate底層使用了不同的技術帆卓。fast使用了機器學習巨朦,只能按照字符來識別悔橄,而無法按照整句來識別。accurate使用了深度學習睛挚,可以按照整句識別,有更好的識別準確度,兼容大量不同的字體和旋轉的文字污抬。
從應用層面來說射赛,如果你只是需要識別電話號碼,email地址這種文字,并且對速度的要求非常敏感迅脐,或者要做成實時識別隐锭,那么你應該選擇fast。如果要識別形成段落的文字计贰,那么應該使用accurate并且擇機進行perform request钦睡。按照官方的數(shù)據,識別頭圖的文字(本文章第一張圖)躁倒,fast需要的時間是0.25s而accurate需要2s荞怒。
語種支持
遺憾的是,現(xiàn)在VNRecognizeTextRequest僅僅支持英文秧秉。
我們可以使用supportedRecognitionLanguages來查看目前支持的語種:
let supportLanguageArray = try VNRecognizeTextRequest.supportedRecognitionLanguages(for: .accurate, revision: VNRecognizeTextRequestRevision1)
print(supportLanguageArray)
//["en-US"]
并且指定一個語種:
textRecognitionRequest.recognitionLanguages = ["ja-JP"]
語種需要訓練模型才能得以支持褐桌。蘋果會在更新系統(tǒng)+新的SDK時,更新算法的版本福贞,添加語種的支持撩嚼。我們可以通過supportedRevisions來查看算法版本停士,并且指定版本挖帘。通常來說,request的算法版本默認為最新的版本恋技。
let supportRevison = VNRecognizeTextRequest.supportedRevisions
textRecognitionRequest.revision = VNRecognizeTextRequestRevision1;
有識別英文文本的同學可以直接考慮上手拇舀。