1、序言
HaaS 即 Hardware as a Service,它是加速AIoT開發者創新的一個積木平台.
Python輕應用是跑在HaaS積木平台上的一套應用架構.他是基于MicroPython進行開發,繼承了python優美簡介的文法,同時提供了便捷的嵌入式硬體操作庫。HaaS100作為阿裡雲IoT推出的一款 Iot 開發闆,它适配了MicroPython的運作引擎,提供了各種豐富的硬體操作接口,同時提供阿裡雲物聯網平台和雲端AI相關的能力。通過這塊晶片,可以輕松通過python程式實作硬體控制,雲端AI以及雲端互通的能力。
今天就來講解下,怎麼基于Python輕應用架構,來實作文字識别(OCR)功能.
2、方案
2.1、總體思路
方案涉及主要涉及Minicv,Alibaba Cloud SDK 等功能子產品.
MiniCV 是一套輕量級視覺架構,支援資料擷取,圖像處理,圖像編解碼,視訊編解碼,機器學習,UI呈現。
Alibaba Cloud SDK是阿裡達摩院視覺智能開放平台的端上的引覆寫人臉、人體、視訊、文字等150+場景。
關于視覺視覺智能平台的詳細資訊可以參考官網:
https://vision.aliyun.com/資料處理流程為:通過MiniCV子產品,完成資料源的封裝處理,圖檔的解碼,圖檔資料的格式轉換和縮放等功能,最後将處理好的資料喂給ML 子產品,ML 子產品通過Alibaba Cloud SDK引擎和達摩院的視覺開放智能平台進行互動,得到預期結果.
由于HaaS100的闆子預設沒有配置LCD,是以為了友善開發者使用,我通過列印LOG 的方式将結果輸出.

2.2、具備功能
文字識别技術基于阿裡雲深度學習技術,為您提供通用的印刷文字識别和文檔結構化等能力。文字識别技術可以靈活應用于證件文字識别、發票文字識别、文檔識别與整理等行業場景,滿足認證、鑒權、票據流轉稽核等業務需求
2.3、效果呈現
測試資源圖檔:"/data/python-apps/ml/recognize-character/res/test.jpg"
輸出結果:
# -------------------Welcome HaasAI MicroPython--------------------
-----ml ucloud RecognizeCharacter demo start-----
results size:1
index:0
probability:0.441612
text:飛豬旅行
left:199
angle:-5
top:166
height:373
width:781
bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
-----ml ucloud RecognizeCharacter demo end-----
3、OCR技術介紹
3.1、概念介紹
OCR是Optical Character Recognition的縮寫,意思是光學字元識别,簡稱文本識别。
- 光學輸入: 掃描器,錄影機等
- 算法處理,文字提取和識别
- 文本輸出
簡單來說就是提取圖像中文本資訊。
一張圖檔上能涵蓋的文本資訊是非常多的,如果我們手工錄入這些文本,勢必會很慢。但是通過OCR,就能一次性擷取圖檔中所有的文本資訊,效率大幅提升。
正是由于OCR是一種非常快捷、省力的文字輸入方式,是以在文字量比較大的今天,很受人們歡迎。比如說銀行卡識别,身份證識别,電子名片。
3.2、文本檢測之DB技術分析
DB即Differentiable Binarization,從字面意思就可以知道,它的主要特點就是一個可變的二值化門檻值。它可以通過訓練,動态設定不同場景,不同像素點的二值化門檻值,進而更加精準的定位文本的位置。
如上圖所示:
藍色箭頭部分代表了傳統的分割流程。
原始圖-->分割圖-->二值圖-->目标圖,在這個流程中,分割圖到二值圖的轉換是通過一個固定的門檻值來完成的,是以,當文字比較密集,并且不規則的時候,生成的二值圖的文字邊界就不太準确。
紅色部分是DB的流程。它的主要功能就是在進行圖檔分割的同時,會基于文本邊界生成一個動态的門檻值圖,也就是圖中的threshold map. 通過segmentation map 和 threshold map 共同決定如何生成二值圖。
segmentation map: 有文字的區域有值P
threshhold map: 文字邊界才有值T
binary map: B = 1或者B=0
如果上圖所示
文字區域内部:
P = 0.99 , T= 0.2 , P –T > 0, B = 1
文字區域邊界:
P = 0 , T= 0.99 , P –T < 0, B = 0
非文字區域:
P = 0 , T= 0.2 , P –T < 0, B = 0
對于原始圖中的每個像素點,都計算依據P 和T 值的不同,計算得到最終的二值圖B,最後将二值圖還原到原始圖檔中,生成精确的文本區域。
3.3、文本識别
文本識别指的是将 文本檢測得到的文本框的的内容,轉化為具體文字的過程。通常情況下,文本識别可以分為兩大類:
定長文字識别
定長文字的識别比較簡單,使用場景也比較有限,常見的有驗證碼識别。這種文字識别的網絡結果也會比較簡單,可以參考LeNet ,建構一個CNN網絡,通常情況下三個卷積和一個全連接配接層就可以實作,本文中不做詳細介紹。
不定長文字識别
在日常生活,很多場景我們是不知道需要被識别的文字長度。是以我們需要一個更加複雜的網絡,通過深度學習,自主判定文字的長度,并加以分割可轉換。目前不定長文字的識别通常有兩種實作方式:
- CNN + Seq2Seq + Attention
- CRNN 這兩種方法主要差别在輸出層,他們都抛棄了softMax, 分辨采用拉Attention 和 CTC 來将序列特征資訊轉化為識别結果。Attention 由于機制原因,模型比較大,是以在Iot 端上我們采用的是CRNN 。
3.4、CRNN
CRNN(Convolutional Recurrent Neural Network,卷積循環神經網絡)是目前比較流行的文字識别模型,不需要對樣本資料進行字元分割,可識别任意長度的文本序列,模型速度快、性能好。
CRNN的主要特點是:
- 可訓練
- 序列化識别任意長度字元,無需分割
- 速度快,性能好,模型小
CRNN模型主要由以下三部分組成:
- 卷積層:從輸入圖像中提取出特征序列
- 循環層:預測從卷積層擷取的特征序列的标簽分布;
- 轉錄層:把從循環層擷取的标簽分布通過去重、整合等操作轉換成最終的識别結果。
3.4.1、卷積層
- 預處理 對輸入圖像先做了縮放處理,把所有輸入圖像縮放到相同高度
- 卷積運算 7個卷積 加上 4 pooling , 引入 2 個bn(BatchNormalization) 加速模型收斂,縮短訓練過程
- 特征提取 從左到右,按列生成特征向量,作為循環層的輸入
3.4.2、循環層
循環層由一個雙向的 LSTM 組成。
LSTM(Long Short Term Memory,長短期記憶網絡)是一種特殊結構的RNN(循環神經網絡),用于解決RNN的長期依賴問題,也即随着輸入RNN網絡的資訊的時間間隔不斷增大,普通RNN就會出現“梯度消失”或“梯度爆炸”的現象
從上圖可以看出,LSTM跟RNN最大的差別就是增加一個儲存長期狀态的單元,并且通過三個門開關,控制這個單元的狀态
- 輸入門:決定目前時刻的網絡狀态,儲存多少到這個長期狀态
- 遺忘門:決定上一個時刻的長期狀态,保留多少到目前時刻的長期狀态
- 輸出門:目前的長期狀态,有多少作為目前網絡的結果輸出
3.4.3、轉錄層
轉錄層是将LSTM網絡預測的特征序列的結果通過CTC進行整合,轉換為最終輸出的結果。
CTC模型(Connectionist Temporal Classification,聯接時間分類),主要用于解決訓練時字元無法對齊問題。
如上圖所示:輸入字元CTC ,由于字元間隔,圖像變形等原因,導緻經過CNN+RNN 處理後的結果變成--CC----TT--CC
其中-代表空白區域,它是在CTC在訓練階段加上去的,目的就是為了避免解碼的去重友善。
在解碼階段,先去掉連貫的重複字元,然後去掉插入的空白字元,最後得到識别結果CTC。
4、Demo體驗
4.1、代碼下載下傳和編譯
參考
《HaaS100快速開始》下載下傳,編譯,燒錄,AliOS Things代碼.(解決方案選擇:py_engine_demo)
燒錄完成,啟動裝置,通過序列槽輸入:
(指令中的 ssid password 是開發者自己工作環境的wifi 使用者名和密碼)
python /data/python-apps/wifi/main.py ssid password
python /data/python-apps/ml/recognize-character/main.py
4.2、示例代碼
from minicv import ML
print("-------------------Welcome HaasAI MicroPython--------------------")
print("-----ml ucloud RecognizeCharacter demo start-----")
OSS_ACCESS_KEY = "xxxx"
OSS_ACCESS_SECRET = "xxxx"
OSS_ENDPOINT = "xxxx"
OSS_BUCKET = "xxxx"
ml = ML()
ml.open(ml.ML_ENGINE_CLOUD)
ml.config(OSS_ACCESS_KEY, OSS_ACCESS_SECRET, OSS_ENDPOINT, OSS_BUCKET, "NULL")
ml.setInputData("/data/python-apps/ml/recognize-character/res/test.jpg")
ml.loadNet("RecognizeCharacter")
ml.predict()
responses_value = bytearray(10)
ml.getPredictResponses(responses_value)
print(responses_value)
ml.unLoadNet()
ml.close()
print("-----ml ucloud RecognizeCharacter demo end-----")
4.3、裝置端配置
4.3.1、賬号注冊
注冊連結:
https://www.aliyun.com/點選紅色框圈中的“立即注冊”按鈕進行注冊.
4.3.2、OSS參數擷取
使用OSS功能的時候涉及到四個配置參數:AccessKeyId,AccessKeySecret,Endpoint,BucketName.
AccessKey 擷取:
登入
https://ram.console.aliyun.com/賬号管理平台檢視AccessKeyId,AccessKeySecret(賬号為上一節中注冊的賬号)
點選賬号頭像框中的"AccessKey管理"按鈕.
點選按鈕"檢視Select",擷取AccessKeyId,AccessKeySecret
Bucket賬号擷取:
登陸OSS控制台
https://oss.console.aliyun.com/建立Bucket,建立時地域一定要選擇上海
在Bucket建立好後,從上圖我們可以看到:
Endpoint:oss-cn-shanghai.aliyuncs.com
BucketName就是我們建立Bucket取的名字oss-ai-dev。
4.3.3、Bucket檔案夾建立
4.4.4、Bucket檔案夾權限
建立好檔案夾後,記住一定要修改檔案夾權限,否則通路失敗.
開發者技術支援
Python輕應用繼承了Python易學易用的特點,同時提供了基于嵌入式硬體的基礎庫封裝,讓開發者可以很友善的通過互動式的環境,實時進行嵌入式開發,讓嵌入式開發也變得簡單友善。
如需更多技術支援,可加入釘釘開發者群,擷取一對一的技術支援!
更多技術與解決方案介紹,請通路HaaS官方網站
https://haas.iot.aliyun.com/