0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何使用TensorFlow Lite從Android設(shè)備圖像提取文本

Tensorflowers ? 來(lái)源:TensorFlow ? 作者:魏巍 ? 2021-11-02 15:34 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

俗話說(shuō):“一圖勝千言”。圖像包含豐富的視覺(jué)信息,但有時(shí)關(guān)鍵信息位于圖像的文本當(dāng)中。雖然識(shí)字的人可以輕松理解圖像中嵌入的文字,但我們?nèi)绾卫?a href="http://www.wenjunhu.com/v/tag/3744/" target="_blank">計(jì)算機(jī)視覺(jué)機(jī)器學(xué)習(xí)來(lái)教計(jì)算機(jī)做到這一點(diǎn)呢?

今天,我們將向您展示如何使用 TensorFlow Lite 從 Android 設(shè)備上的圖像中提取文本。我們將引導(dǎo)您完成最近開(kāi)源的光學(xué)字符識(shí)別 (OCR) Android 參考應(yīng)用的關(guān)鍵步驟,您可參考該處獲取完整代碼。在下方動(dòng)畫(huà)中,可以看到該應(yīng)用如何從三款 Google 產(chǎn)品徽標(biāo)圖片中提取產(chǎn)品名稱。

該處

https://github.com/tensorflow/examples/tree/master/lite/examples/optical_character_recognition/android

從圖像中識(shí)別文本的過(guò)程即為 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

一般來(lái)說(shuō),OCR 是一個(gè)包含多個(gè)步驟的流水線。相關(guān)步驟通常包含文本檢測(cè)和文本識(shí)別:

使用文本檢測(cè)模型查找文本周?chē)倪吔缈颍?/p>

執(zhí)行一些后處理操作,以轉(zhuǎn)換邊界框;

將這些邊界框內(nèi)的圖像轉(zhuǎn)換為灰度圖像,如此一來(lái),文本識(shí)別模型便可繪制出文字和數(shù)字。

在示例中,我們將利用 TensorFlow Hub 中的文本檢測(cè)和文本識(shí)別模型。多個(gè)不同的模型版本可用來(lái)權(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ī)視覺(jué)庫(kù),適用于非極大值抑制 (NMS) 和透視變換(我們稍后會(huì)對(duì)此展開(kāi)討論),以對(duì)檢測(cè)結(jié)果進(jìn)行后處理。此外,我們還會(huì)使用 TFLite 支持庫(kù)對(duì)圖像進(jìn)行灰度和標(biāo)準(zhǔn)化處理。

非極大值抑制

https://www.coursera.org/lecture/convolutional-neural-networks/non-max-suppression-dvrjH

TFLite 支持庫(kù)

https://tensorflow.google.cn/lite/inference_with_metadata/lite_support

對(duì)于文本檢測(cè),由于檢測(cè)模型支持 320x320 的固定像素,我們會(huì)使用 TFLite 支持庫(kù)調(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)

接下來(lái),我們使用 TFLite 運(yùn)行檢測(cè)模型:

detectionInterpreter.runForMultipleInputsOutputs(detectionInputs, detectionOutputs)

檢測(cè)模型的輸出是一些經(jīng)過(guò)旋轉(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 來(lái)進(jìn)行透視變換:

val rotationMatrix = getPerspectiveTransform(srcPtsMat, targetPtsMat)

warpPerspective(

srcBitmapMat,

recognitionBitmapMat,

rotationMatrix,

Size(recognitionImageWidth.toDouble(), recognitionImageHeight.toDouble()))

之后,我們會(huì)再次使用 TFLite 支持庫(kù),在邊界框內(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 來(lái)提出輸入圖像中的文本。

最后我想指出的是,如果您只是需要一個(gè)即用型 OCR SDK,您可以直接使用 Google ML Kit 的文字識(shí)別功能。ML Kit 底層使用了 TFLite,并且對(duì)于大多數(shù) OCR 用例而言足矣。在以下情況下,您可以使用 TFLite 來(lái)構(gòu)建專(zhuān)屬 OCR 解決方案:

您有自己想要使用的專(zhuān)屬文本檢測(cè)/識(shí)別 TFLite 模型;

您有特殊的業(yè)務(wù)需求(例如識(shí)別顛倒的文本),并且需要自定義 OCR 流水線;

您希望支持 ML Kit 沒(méi)有覆蓋的語(yǔ)言;

您的目標(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)示例可以助您開(kāi)啟在您的應(yīng)用中構(gòu)建專(zhuān)屬 OCR 功能的旅程。

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 應(yīng)用
    +關(guān)注

    關(guān)注

    2

    文章

    439

    瀏覽量

    34512
  • OCR
    OCR
    +關(guān)注

    關(guān)注

    0

    文章

    161

    瀏覽量

    16789
  • tensorflow
    +關(guān)注

    關(guān)注

    13

    文章

    330

    瀏覽量

    61170
  • TensorFlow Lite
    +關(guān)注

    關(guān)注

    0

    文章

    26

    瀏覽量

    747

原文標(biāo)題:基于 TensorFlow Lite 的 OCR:一款嶄新的示例應(yīng)用

文章出處:【微信號(hào):tensorflowers,微信公眾號(hào):Tensorflowers】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 0人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    無(wú)法將Tensorflow Lite模型轉(zhuǎn)換為OpenVINO?格式怎么處理?

    Tensorflow Lite 模型轉(zhuǎn)換為 OpenVINO? 格式。 遇到的錯(cuò)誤: FrontEnd API failed with OpConversionFailure:No translator found for TFLite_Detection_PostP
    發(fā)表于 06-25 08:27

    無(wú)法使用OpenVINO?在 GPU 設(shè)備上運(yùn)行穩(wěn)定擴(kuò)散文本圖像的原因?

    在OpenVINO? GPU 設(shè)備上使用圖像大小 (1024X576) 運(yùn)行穩(wěn)定擴(kuò)散文本圖像,并收到錯(cuò)誤消息: RuntimeError: Exception from
    發(fā)表于 06-25 06:36

    FlexBuild構(gòu)建Debian 12,在“tflite_ethosu_delegate”上構(gòu)建失敗了怎么解決?

    /workspace/tn_debian_FlexBuild 構(gòu)建/components_lsdk2412/apps/ml/tflite/tensorflow/lite/tools/cmake
    發(fā)表于 04-01 06:53

    把樹(shù)莓派打造成識(shí)別文本的“神器”!

    在許多項(xiàng)目中,RaspberryPi被用作監(jiān)控?cái)z像頭或執(zhí)行機(jī)器學(xué)習(xí)任務(wù)。在這些場(chǎng)景中,圖像中經(jīng)常包含應(yīng)用程序感興趣的文本信息。我們希望提取這些信息并將其轉(zhuǎn)換,以便通過(guò)程序分析文本
    的頭像 發(fā)表于 03-25 09:30 ?405次閱讀
    把樹(shù)莓派打造成識(shí)別<b class='flag-5'>文本</b>的“神器”!

    為什么無(wú)法將自定義EfficientDet模型TensorFlow 2轉(zhuǎn)換為中間表示(IR)?

    將自定義 EfficientDet 模型 TensorFlow* 2 轉(zhuǎn)換 為 IR 時(shí)遇到錯(cuò)誤: [ ERROR ] Exception occurred during running replacer \"REPLACEMENT_ID\" ()
    發(fā)表于 03-05 06:29

    EE-300:Blackfin EZ-KIT Lite電路板與CMOS圖像傳感器的接口

    電子發(fā)燒友網(wǎng)站提供《EE-300:Blackfin EZ-KIT Lite電路板與CMOS圖像傳感器的接口.pdf》資料免費(fèi)下載
    發(fā)表于 01-05 10:00 ?0次下載
    EE-300:Blackfin EZ-KIT <b class='flag-5'>Lite</b>電路板與CMOS<b class='flag-5'>圖像</b>傳感器的接口

    傅立葉變換在圖像處理中的作用

    ,然后利用低通濾波器濾除高頻噪聲,再通過(guò)逆傅里葉變換將圖像轉(zhuǎn)換回空間域,從而實(shí)現(xiàn)圖像的去噪。 增強(qiáng) :另一方面,圖像的邊緣也是高頻分量。為了增強(qiáng)圖像的邊緣,可以
    的頭像 發(fā)表于 12-06 16:55 ?2289次閱讀

    高通AI Hub:輕松實(shí)現(xiàn)Android圖像分類(lèi)

    高通AI Hub為開(kāi)發(fā)者提供了一個(gè)強(qiáng)大的平臺(tái),以優(yōu)化、驗(yàn)證和部署在Android設(shè)備上的機(jī)器學(xué)習(xí)模型。這篇文章將介紹如何使用高通AI Hub進(jìn)行圖像分類(lèi)的程式碼開(kāi)發(fā),并提供一個(gè)實(shí)際的例子來(lái)展示其在
    的頭像 發(fā)表于 11-26 01:03 ?913次閱讀
    高通AI Hub:輕松實(shí)現(xiàn)<b class='flag-5'>Android</b><b class='flag-5'>圖像</b>分類(lèi)

    RK3588 技術(shù)分享 | 在Android系統(tǒng)中使用NPU實(shí)現(xiàn)Yolov5分類(lèi)檢測(cè)

    HIDL實(shí)現(xiàn)的librknn_api_android.so。對(duì)于需要通過(guò)CTS/VTS測(cè)試的設(shè)備,建議使用后者,而對(duì)于不需要測(cè)試的設(shè)備,直接鏈接librknnrt.so可以提供更好的性能。 在開(kāi)發(fā)板網(wǎng)
    發(fā)表于 10-24 10:13

    第四章:在 PC 交叉編譯 aarch64 的 tensorflow 開(kāi)發(fā)環(huán)境并測(cè)試

    本文介紹了在 PC 端交叉編譯 aarch64 平臺(tái)的 tensorflow 庫(kù)而非 tensorflow lite 的心酸過(guò)程。
    的頭像 發(fā)表于 08-25 11:38 ?2586次閱讀
    第四章:在 PC 交叉編譯 aarch64 的 <b class='flag-5'>tensorflow</b> 開(kāi)發(fā)環(huán)境并測(cè)試

    RK3588 技術(shù)分享 | 在Android系統(tǒng)中使用NPU實(shí)現(xiàn)Yolov5分類(lèi)檢測(cè)

    HIDL實(shí)現(xiàn)的librknn_api_android.so。對(duì)于需要通過(guò)CTS/VTS測(cè)試的設(shè)備,建議使用后者,而對(duì)于不需要測(cè)試的設(shè)備,直接鏈接librknnrt.so可以提供更好的性能。 在開(kāi)發(fā)板網(wǎng)
    發(fā)表于 08-20 11:13

    丟掉數(shù)據(jù)線,你還會(huì)調(diào)試Android設(shè)備嗎?

    ADB(AndroidDebugBridge)作為Android開(kāi)發(fā)中非常重要的工具,開(kāi)發(fā)者可以使用ADB設(shè)備在電腦上對(duì)Android設(shè)備進(jìn)
    的頭像 發(fā)表于 08-14 17:09 ?714次閱讀
    丟掉數(shù)據(jù)線,你還會(huì)調(diào)試<b class='flag-5'>Android</b><b class='flag-5'>設(shè)備</b>嗎?

    如何在Android 10設(shè)備上通過(guò)App控制GPIO

    本文檔提供了在 Android 10 設(shè)備上通過(guò)應(yīng)用程序(App)控制通用輸入輸出(GPIO)的詳細(xì)指南。這涵蓋了創(chuàng)建 gpio驅(qū)動(dòng)到App 配置 以及 SELinux 策略以允許特定訪問(wèn)的所有必要步驟。
    的頭像 發(fā)表于 07-22 17:59 ?2011次閱讀

    圖像識(shí)別算法的核心技術(shù)是什么

    圖像識(shí)別算法是計(jì)算機(jī)視覺(jué)領(lǐng)域的一個(gè)重要研究方向,其目標(biāo)是使計(jì)算機(jī)能夠像人類(lèi)一樣理解和識(shí)別圖像中的內(nèi)容。圖像識(shí)別算法的核心技術(shù)包括以下幾個(gè)方面: 特征提取 特征
    的頭像 發(fā)表于 07-16 11:02 ?1322次閱讀

    Android設(shè)備開(kāi)始連接,軟AP模式連接需要很長(zhǎng)時(shí)間怎么解決?

    使用ESP8266_NONOS_SDK_V1.5.2_16_01_29 fw) 我們將簡(jiǎn)單的數(shù)據(jù) Android 發(fā)送到 ESP8266。帶 TCP 端口。 當(dāng) ESP 處于軟 AP 模式并準(zhǔn)備就緒時(shí)。我們Android
    發(fā)表于 07-16 08:25

    電子發(fā)燒友

    中國(guó)電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品