首先我們了解下 android系統(tǒng)常用的 圖像識(shí)別框架
一:調(diào)用一些不開源庫(kù)進(jìn)行識(shí)別曠視的圖像識(shí)別及 O CR 文字識(shí)別庫(kù),及其他廠家如阿里,百度,華為,騰訊的 OCR 文字識(shí)別庫(kù)等。
二:調(diào)用一些開源庫(kù)進(jìn)行識(shí)別一): tensorflow 訓(xùn)練自定義圖像并識(shí)別 1. 是先在 ubuntu 上對(duì)很多圖片進(jìn)行訓(xùn)練得到自己的類別模型文件, xxx.pb 文件及 xxx_labels.txt 文件 2. 把上一步生成的文件放到 Android studio ( AS )工程里 3.AS 添加 tensorflow 依賴 4. 在 tensorflow 給的 android 工程上做改動(dòng),寫出自己的工程 5. 運(yùn)行工程開始識(shí)別。
要在 android 上使用 tensorflow ,官方提供兩種方式工程: 一) tensorflow for mobile, 成熟,功能方法多 只需配置 buildgradle, 調(diào)用 tensorflow 相關(guān)接口進(jìn)行識(shí)別 2) tensorflow lite. 輕量,允許設(shè)備端的機(jī)器學(xué)習(xí)模型的低延遲推斷 下載移動(dòng)端的模型 model 和標(biāo)簽 labels 文件并解壓到 assert 下,導(dǎo)入 tensorflow 項(xiàng)目,調(diào)用 tensorflow 相關(guān)接口進(jìn)行識(shí)別 注意此種方法不能直接使用 tensorflow 的模型,需要對(duì)模型進(jìn)行轉(zhuǎn)換。
二): opencv 訓(xùn)練自定義圖像并識(shí)別 1. 配置 AS 中 opencv 的環(huán)境,下載并配置 opencv 的 sdk 2. 在 windows 上用 opencv 工具訓(xùn)練自定義圖像數(shù)據(jù)集 3. 將訓(xùn)練好的數(shù)據(jù)集加載到 AS 4. 編寫自己的 android 工程 5. 運(yùn)行 android 工程進(jìn)行識(shí)別
三): tensorflow 訓(xùn)練自定義圖像,實(shí)時(shí)處理 openCV 獲取的攝像頭圖像( openCV 對(duì)圖像進(jìn)行分割)并識(shí)別( https://blog.csdn.net/qq_33200967/article/details/82773677 ) 此方法與單獨(dú)使用 tensorflow 的區(qū)別是使用了 opencv 中的圖像分割,將所有分割物體進(jìn)行識(shí)別
四)其他: 另外有些開源的圖像識(shí)別方法, Tesseract (支持 OCR 文字識(shí)別)等,可以將其加入 android 并進(jìn)行識(shí)別。 OK3399-C 平臺(tái) android 系統(tǒng)的圖像識(shí)別實(shí)現(xiàn) OK3399 的 android 圖像識(shí)別實(shí)現(xiàn)是使用 tensorflow 在 ubuntu 上訓(xùn)練自定義圖像,用 tensorflow lite 在 android 上進(jìn)行的識(shí)別,識(shí)別部分使用了 rk3399 內(nèi)部的 mali400 gpu 。
關(guān)于模型 首先,我們有訓(xùn)練好的 tensorflow 模型文件: xxx.pb 。 其次,將模型文件進(jìn)行轉(zhuǎn)換,先轉(zhuǎn)換成 tensorflow lite 支持的 xxx.tflite 模型文件,然后轉(zhuǎn)換成 rk3399 的 SSD ( Single Shot MultiBox Detector )支持的 xxx.rkl 模型文件。 然后,把此轉(zhuǎn)換后的模型文件加入 android 工程。 此 android 例程的基本實(shí)現(xiàn)為: 打開 camera 的預(yù)覽,同時(shí)創(chuàng)建一個(gè)跟蹤線程。跟蹤線程不斷的檢測(cè)是否有可用的圖片,一旦有可用圖片就調(diào)用識(shí)別 api 進(jìn)行識(shí)別,識(shí)別函數(shù)會(huì)返回識(shí)別目標(biāo)的位置及類型,然后得到 物體在圖片中的范圍,并繪制出來。
此例程除 java 實(shí)現(xiàn)的部分外,還涉及到三個(gè)庫(kù): librkssd4j.so , librga.so 和 librkssd.so 。 以下是三個(gè)庫(kù)的介紹。 librkssd4j.so 調(diào)用說明:由 android 例程直接調(diào)用的庫(kù)。 源碼位置: rk_ssd_demo_rk3399\app\src\main\cpp 作用:調(diào)用 librga.so 對(duì)于圖像進(jìn)行格式轉(zhuǎn)換或翻轉(zhuǎn)及壓縮,然后調(diào)用 librkssd.so 進(jìn)行識(shí)別。
librga.so 調(diào)用說明:被 librkssd4j.so 加載 源碼位置: OK3399-android7-source/hardware/rockchip/librga/ 作用:用來判斷平臺(tái)是否支持 rga ,及做 yuv 轉(zhuǎn) rgb 處理, rga 主要對(duì)圖片數(shù)據(jù)進(jìn)行一些格式轉(zhuǎn)換,翻轉(zhuǎn),縮放等運(yùn)算。
librkssd.so 調(diào)用說明:被 librkssd4j.so 加載 作用:對(duì)圖片進(jìn)行識(shí)別。其使用了 rk3399 內(nèi)部的 Mali400 gpu 。
以下為運(yùn)行效果:
參考資料: 瑞芯微原廠資料 RKDocs/rk3399/ RK3399_SSD_Android& Linux_V1.0_20180522.pdf https://github.com/tesseract-ocr/tesseract.git https://github.com/tensorflow/tensorflow.git |
|