AI Smart-V1.0.0
一、安裝
- Windows(Win7或以上)。進入aismart在Github上的地址。下載aismart-res目錄。下載後執行aismart.exe。註:確保讓aismart-res所在目錄是純英文。
- iOS(iOS 8.0或以上)。在App Store中的搜索「AI Smart of Leagor」。
- Android(Android 5.0或以上)。進入aismart在Github上的地址,下載aismart-debug.apk。
- 從源碼編譯出安裝程序。AI Smart是個基於Rose編寫的app,編譯它有兩種方法,一是直接根據app包編譯,二是把app包導入到本地工作包,然後編譯。具體操作參考《Rose編程指南》第一章。
二、主要功能
- 以攝像頭或特定圖像作輸入,在手機端測試TensorFlow Lite模型。
- 圖形化顯示*.tflite文件的內部結構,通過它可大致知道模型的複雜度。
- 提供前置的定位階段,像OCR、車牌識別,使得輸入的已是按模型要求預處理過的「小」圖像。
三、在手機端測試TensorFlow Lite模型
四、圖形化顯示*.tflite文件的內部結構
參考「TensorFlow Lite(2/3):tflite文件和AI Smart」。
五、文檔目錄和資源目錄
app數據包括兩類:資源數據和文檔數據。資源數據特點是安裝時複製過去,之後app運行時不會增加、減少、修改,即一直保持不變。文檔數據則是安裝時沒有,但伴隨運行會不斷變化。
為什麼要說這個,讓看這麼個問題。4月1日發布了app,當中用到一個叫ocr.tflite的模型,15號模型有了改進,如何做到不發布新版app的情況下更新已有app中的ocr.tflite?讓看下面這麼個解決方案。
- app啟動時檢查網上一個地址,通過它發現ocr.tflite有新模型了,於是把它下載到文檔目錄。
- 要使用模型進行預測了,app代碼用類似以下的語句查找模型。tflite_file = get_binary_file_location("tflites", "ocr.tflite");get_binary_file_location首先在文檔目錄中找ocr.tflite,沒有就改在資源目錄。由於文檔目錄中存在了,於是就使用上了新版演算法。
不論Windows,還是iOS、Android,AI Smart都遵循文檔目錄、資源目錄的使用規則。在「網路」頁,下載下來的模型、腳本、圖像都放在文檔目錄。當文檔目錄和資源目錄存在同名的模型、圖像時,優先使用文檔目錄。
六、場景以及關聯的定位技術
分類器(classifier)。定位基於模型輸入張量要求的寬、高比,以圖像的中心為中心,取出最大可能的矩形區。舉個例子,模型輸入張量的寬度、高度都是224,輸入圖像是640x1136時,它截取當中的(0, 248, 640, 640)。
ocr。定位包括兩個步驟,一是定位區塊,核心技術是OpenCV中的MSER。二是用戶調整區塊並綁定欄位,當中就是些GUI操作。經過以上步驟後,對定位出的字元縮放到模型輸入張量要求的尺寸,內容則通過cv::threshold、cv::MORPH_OPEN形成白底黑字。相關技術細節參考「OCR框架」。
車牌識別(pr)。車牌識別部分直接使用一個叫EasyPR的開源項目。EasyPR包括了用OpenCV定位車牌,以及用SVM識別字元。AI Smart只是對車牌定位階段出來的cv::Mat,經過些處理讓輸入到TensorFlow Lite模型。作為對比,AI Smart會在界面上同時顯示SVM(EasyPR)和TensorFlow Lite的識別結果。
七、測試腳本
[script] tflite = "mobilenet_quant_v1_224" source = "camera" scenario = "classifier" width = 224 height = 224 color = bgr[/script]
- tflite。模型名稱。
- source。圖像輸入源,camera指示使用攝像頭。misc/<>.png指示一張png圖像,像misc/classifier.png。
- scenario。使用場景。分類器(classifier)、OCR(ocr)、車牌識別(pr)。
- width、height。模型輸入張量要求的寬度、高度。
- color。模型輸入張量要求的顏色格式。gray(灰度圖像,一個像素一個位元組)、bgr(對應OpenCV中的BGR)、rgb(對應OpenCV中的RGB)。
- kthreshold。場景是classifier時,還可使用一個叫kthreshold的欄位,它指示要考慮的最小匹配率,只有>=它時,AI Smart才會考慮是否要把它計入TopN。值的計算方法是輸出張量值除以255,默認是0.1。
八、模型的輸入、輸出張量
用深度學習去識別圖像,classifier、ocr、pr都屬於最簡單的圖像分類,只不過classifier分類的是物體,ocr、pr分類的是字元。和外界的介面上,它們都只要一個輸入張量和一個輸出張量。
圖中88是輸入張量,它是個類型是uint8的四維張量,第一維是batch,對app來說,一次只需預測一張,因而用1。第二維是圖像高度,第三維是圖像寬度,第四維表示圖像深度,一般不是1就是3。
87是輸出張量,它是個類型是uint8的二維張量。第一維是1,第二維是能識別的物體種類。上面說的kthreshold就是第二維的那個值除以255。
九、labels.txt
AI Smart要求標註文件的文件名必須叫labels.txt,和*.tflite放在同一目錄。
labels.txt有兩種格式,第一種當中的項是名稱,第二種當中的項是unicode碼。
- 當中的項是名稱。各項用換行分開。第一行是無效項。不支持注釋。用於的場景:classifier。
- 當中的項是unicode碼。各項用換行或逗號隔開。行首是「#」時表示該行是注釋。用於的場景:ocr、pr。
十、發展
找不到開源的字元分類模型,AI Smart在用的ocr_chinese_v1_224其實是mobilenet_quant_v1_224,因而識別出的字元肯定是錯的。而且由於輸入是224x224,會使得識別花費過多時間。如果誰有興趣訓練用於字元分類的TensorFlow Lite模型,我可以幫忙製作印刷體的數據集,見「識別漢字圖像的數據集」。
推薦閱讀:
※《Learning WebRTC中文版》試讀 + 簽名優惠版
※Kurento是否可以讓客戶端選擇不同的實時監控視頻?
※使用 WebRTC 構建簡單的前端視頻通信
※基於 WebRTC 的視頻聊天技術在 iOS 端的實現
※web AR系統-1 架構探索
TAG:OpenCV | TensorFlow | WebRTC |