俗話說:“一圖勝千言”。圖像包含豐富的視覺信息,但有時(shí)關(guān)鍵信息位于圖像的文本當(dāng)中。雖然識(shí)字的人可以輕松理解圖像中嵌入的文字,但我們?nèi)绾卫?a href="http://www.xsypw.cn/v/tag/3744/" target="_blank">計(jì)算機(jī)視覺和機(jī)器學(xué)習(xí)來教計(jì)算機(jī)做到這一點(diǎn)呢?
今天,我們將向您展示如何使用 TensorFlow Lite 從 Android 設(shè)備上的圖像中提取文本。我們將引導(dǎo)您完成最近開源的光學(xué)字符識(shí)別 (OCR) Android 參考應(yīng)用的關(guān)鍵步驟,您可參考該處獲取完整代碼。在下方動(dòng)畫中,可以看到該應(yīng)用如何從三款 Google 產(chǎn)品徽標(biāo)圖片中提取產(chǎn)品名稱。
該處
https://github.com/tensorflow/examples/tree/master/lite/examples/optical_character_recognition/android
從圖像中識(shí)別文本的過程即為 OCR,該技術(shù)在多個(gè)領(lǐng)域中廣泛使用。例如,Google 地圖運(yùn)用 OCR 技術(shù)從地理定位圖像中提取信息,進(jìn)而完善 Google 地圖。
Google 地圖運(yùn)用 OCR 技術(shù)
https://ai.googleblog.com/2017/05/updating-google-maps-with-deep-learning.html
一般來說,OCR 是一個(gè)包含多個(gè)步驟的流水線。相關(guān)步驟通常包含文本檢測(cè)和文本識(shí)別:
使用文本檢測(cè)模型查找文本周圍的邊界框;
執(zhí)行一些后處理操作,以轉(zhuǎn)換邊界框;
將這些邊界框內(nèi)的圖像轉(zhuǎn)換為灰度圖像,如此一來,文本識(shí)別模型便可繪制出文字和數(shù)字。
在示例中,我們將利用 TensorFlow Hub 中的文本檢測(cè)和文本識(shí)別模型。多個(gè)不同的模型版本可用來權(quán)衡速度/準(zhǔn)確率的取舍;我們?cè)诖耸褂玫氖?float16 量化模型。如需有關(guān)模型量化的更多信息,請(qǐng)參閱 TensorFlow Lite 量化文檔。
文本檢測(cè)
https://hub.tensorflow.google.cn/sayakpaul/lite-model/east-text-detector/fp16/1
文本識(shí)別
https://hub.tensorflow.google.cn/tulasiram58827/lite-model/keras-ocr/float16/2
TensorFlow Lite 量化
https://tensorflow.google.cn/lite/performance/model_optimization
我們還會(huì)使用 OpenCV,這是一款廣泛使用的計(jì)算機(jī)視覺庫,適用于非極大值抑制 (NMS) 和透視變換(我們稍后會(huì)對(duì)此展開討論),以對(duì)檢測(cè)結(jié)果進(jìn)行后處理。此外,我們還會(huì)使用 TFLite 支持庫對(duì)圖像進(jìn)行灰度和標(biāo)準(zhǔn)化處理。
非極大值抑制
https://www.coursera.org/lecture/convolutional-neural-networks/non-max-suppression-dvrjH
TFLite 支持庫
https://tensorflow.google.cn/lite/inference_with_metadata/lite_support
對(duì)于文本檢測(cè),由于檢測(cè)模型支持 320x320 的固定像素,我們會(huì)使用 TFLite 支持庫調(diào)整輸入圖像的大小并對(duì)其進(jìn)行標(biāo)準(zhǔn)化處理:
檢測(cè)模型
https://hub.tensorflow.google.cn/sayakpaul/lite-model/east-text-detector/fp16/1
val imageProcessor =
ImageProcessor.Builder().add(ResizeOp(height, width, ResizeOp.ResizeMethod.BILINEAR)).add(NormalizeOp(means, stds)).build()
var tensorImage = TensorImage(DataType.FLOAT32)
tensorImage.load(bitmapIn)
tensorImage = imageProcessor.process(tensorImage)
接下來,我們使用 TFLite 運(yùn)行檢測(cè)模型:
detectionInterpreter.runForMultipleInputsOutputs(detectionInputs, detectionOutputs)
檢測(cè)模型的輸出是一些經(jīng)過旋轉(zhuǎn)且圖像內(nèi)包含文本的邊界框。我們會(huì)運(yùn)行非極大值抑制,借助 OpenCV 為每個(gè)文本塊確定一個(gè)邊界框:
NMSBoxesRotated(
boundingBoxesMat,
detectedConfidencesMat,
detectionConfidenceThreshold.toFloat(),
detectionNMSThreshold.toFloat(),
indicesMat
)
有些時(shí)候,圖像內(nèi)的文本會(huì)出現(xiàn)變形(例如,我的筆記本電腦上的“kubernetes”貼紙),并伴隨一個(gè)透視角度:
如果我們只是將原始旋轉(zhuǎn)邊界框直接“喂”給識(shí)別模型,則該模型不太可能正確識(shí)別字符。在本例中,我們需要使用 OpenCV 來進(jìn)行透視變換:
val rotationMatrix = getPerspectiveTransform(srcPtsMat, targetPtsMat)
warpPerspective(
srcBitmapMat,
recognitionBitmapMat,
rotationMatrix,
Size(recognitionImageWidth.toDouble(), recognitionImageHeight.toDouble()))
之后,我們會(huì)再次使用 TFLite 支持庫,在邊界框內(nèi)調(diào)整變換圖像的大小,并對(duì)其進(jìn)行灰度和歸一化處理:
val imageProcessor =
ImageProcessor.Builder().add(ResizeOp(height, width, ResizeOp.ResizeMethod.BILINEAR)).add(TransformToGrayscaleOp()).add(NormalizeOp(mean, std)).build()
最后,我們會(huì)運(yùn)行文本識(shí)別模型、根據(jù)模型輸出繪制出字符與數(shù)字,然后更新應(yīng)用界面:
recognitionInterpreter.run(recognitionTensorImage.buffer, recognitionResult)
var recognizedText = “”for (k in 0 until recognitionModelOutputSize) {
var alphabetIndex = recognitionResult.getInt(k * 8)if(alphabetIndex in 0..alphabets.length - 1)
recognizedText = recognizedText + alphabets[alphabetIndex]}
Log.d(“Recognition result:”, recognizedText)if (recognizedText != “”) {
ocrResults.put(recognizedText, getRandomColor())}
這樣就完成了,就是這么簡(jiǎn)單。此時(shí),我們可以在我們的應(yīng)用中使用 TFLite 來提出輸入圖像中的文本。
最后我想指出的是,如果您只是需要一個(gè)即用型 OCR SDK,您可以直接使用 Google ML Kit 的文字識(shí)別功能。ML Kit 底層使用了 TFLite,并且對(duì)于大多數(shù) OCR 用例而言足矣。在以下情況下,您可以使用 TFLite 來構(gòu)建專屬 OCR 解決方案:
您有自己想要使用的專屬文本檢測(cè)/識(shí)別 TFLite 模型;
您有特殊的業(yè)務(wù)需求(例如識(shí)別顛倒的文本),并且需要自定義 OCR 流水線;
您希望支持 ML Kit 沒有覆蓋的語言;
您的目標(biāo)用戶設(shè)備不一定要安裝 Google Play 服務(wù);
您想要控制用于運(yùn)行模型的硬件后端(CPU、GPU 等)。
ML Kit
https://developers.google.cn/ml-kit/vision/text-recognition
Google Play 服務(wù)
https://developers.google.cn/android/guides/overview
在這些情況下,我希望本教程和我們的實(shí)現(xiàn)示例可以助您開啟在您的應(yīng)用中構(gòu)建專屬 OCR 功能的旅程。
責(zé)任編輯:haq
-
應(yīng)用
+關(guān)注
關(guān)注
2文章
438瀏覽量
34160 -
OCR
+關(guān)注
關(guān)注
0文章
144瀏覽量
16361 -
tensorflow
+關(guān)注
關(guān)注
13文章
329瀏覽量
60536 -
TensorFlow Lite
+關(guān)注
關(guān)注
0文章
26瀏覽量
626
原文標(biāo)題:基于 TensorFlow Lite 的 OCR:一款嶄新的示例應(yīng)用
文章出處:【微信號(hào):tensorflowers,微信公眾號(hào):Tensorflowers】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論