使用Tensorflow實現口算檢查器(1):模型選擇

雲水木石發表於2019-03-04

週末在家幫娃檢查口算作業,發現一個非常有意思的應用:拿手機對著作業拍照,立馬就能知道有沒有做錯的題目。如果做錯了,還會標記出來,並給出正確答案。

使用Tensorflow實現口算檢查器(1):模型選擇

出於一名軟體工程師的職業病,看了這個應用,忍不住琢磨其實現,初步判斷這是一款採用了人工智慧的應用。想著自己也在學習人工智慧技術,就拿這個練練手,算是對這段時間學習到的深度學習知識的一個總結。具體形式上,準備做成微信小程式,業務邏輯在伺服器端完成。

按照慣例,我還是會將實現過程詳細的記錄下來,並將原始碼放在github上,敬請關注。原計劃寫一寫生成對抗網路(GAN)的,因為有了這樣一個小目標,只能先暫時放一放。

定下這個小目標之後,這周都在收集相關的資料。

OCR

首先來說一說OCR(Optical Character Recognition,光學字元識別)。OCR是指電子裝置(例如掃描器或數碼相機)檢查紙上列印的字元,通過檢測暗、亮的模式確定其形狀,然後用字元識別方法將形狀翻譯成計算機文字的過程;即,針對印刷體字元,採用光學的方式將紙質文件中的文字轉換成為黑白點陣的影象檔案,並通過識別軟體將影象中的文字轉換成文字格式,供文書處理軟體進一步編輯加工的技術。

OCR技術在印刷、列印行業應用廣泛,可以快速的將紙質資料轉換為電子資料。OCR能識別文字字元,當然識別數字也不在話下,而且OCR技術已經得到多年的發展,非常成熟。在專案開發中,也有成熟的開源方案可供選擇,這其中的佼佼者是Tesseract。

Tesseract的OCR引擎最先由HP實驗室於1985年開始研發,至1995年時已經成為OCR業內最準確的三款識別引擎之一。2005年,Tesseract由美國內華達州資訊科技研究所獲得,並求諸於Google對Tesseract進行改進、消除Bug、優化工作。Tesseract目前已作為開源專案釋出在Google Project。

Tesseract在使用上也非常簡單,藉助於pytesseract python包,在python中使用如下寥寥幾行程式碼就可以實現一個圖片中字元的識別。

import pytesseract
from PIL import Image

image = Image.open('./test_images/image3.jpg')
text = pytesseract.image_to_string(image)
print(text)
複製程式碼

對如下圖片進行識別:

使用Tensorflow實現口算檢查器(1):模型選擇

結果如下:

WHWM$Efifi%

 

35—5: 28-6= 38-8:
27-4: 25—4: 29—2:
25—3: 24—4: 49—4=
22—1: 47—5: 26-6=

 

42—1: 41—1: 44—3:

 

38-5= 46-6= 49-6=
34-3= 48-5= 28-4=
36-4= 39-4= 27-2=
48-6= 28-2= 46-5=
35-4= 26-5= 48-3=
27-3: 47-6: 38-4:
39-3= 33-2= 36-4=

mmz¥sm “mm" ‘x
31
複製程式碼

上述結果是沒有做任何配置和調教的情況下作出的,所以沒有識別出中文,另外也存在一定的錯誤,這都可以通過程式碼進行矯正。

看起來似乎問題可以很快得到解決,將識別出的文字進行分割,然後轉化為算式進行運算就可以求值。但這種方案的最大問題在於,我們沒有得到算式的座標。這樣如果檢查出錯誤後,無法明確標識錯誤的位置,無法滿足需求。

目標檢測(Object detection)

因為之前也稍微瞭解過深度學習中的目標檢測,所以自然就想到藉助目標檢測技術來實現。目標檢測(Object Detection)是人工智慧最基礎的應用,不論是我們常見的人臉識別,還是高大上的自動駕駛,都離不開目標檢測。要從一幅複雜的畫面中識別出物體或人物,需要複雜的演算法,想想就覺得深奧,不過好在有TensorFlow這樣的框架,具有強大的目標檢測API,讓沒有機器學習背景的人也可以快速構建和部署功能強大的影象識別軟體。

使用Tensorflow實現口算檢查器(1):模型選擇

我在前面寫過關於目標檢測的系列文章《使用TensorFlow一步步進行目標檢測》,詳細的過程這裡就不重複,簡單總結一下,大體的過程如下:

  1. 選擇模型

    github上有TensorFlow模型集合,可以通過簡單的命令獲得這些預訓練的模型:

    git clone https://github.com/tensorflow/models.git
    複製程式碼

    在research目錄,裡面有一個object_detection子目錄,這裡面有我們所需的目標檢測模型。object_detections目錄下的內容相當多,有資料集、模型檔案、測試程式碼、示例等等,模型檔案位於models子目錄下:

    使用Tensorflow實現口算檢查器(1):模型選擇

    因為在本專案中,需要識別的場景比較單一,需要識別的目標也不復雜,所以我就選擇了在移動終端上能很好工作的ssd_mobilenet_v1_coco模型。

  2. 準備資料

    訓練需要標註的圖片資料,標註不僅包含類別,還需要包含目標在影象中的座標。圖片標註之後,還需要轉換為TensorFlow所能接受的TFRecord格式。通常我們藉助指令碼來實現,在後續的文章中會詳細說明,這裡先不展開。

  3. 訓練

    有了自己的資料,就可以利用遷移學習原理,在現有的ssd_mobilenet_v1_coco模型上訓練出我們自己的模型。

  4. 識別數字和運算子號

    使用訓練出的模型,進行數字和運算子號識別,識別結果包括類別以及在影象中的座標。

有了識別出的數字和運算子號以及其座標,我們就可以進行一系列的判斷,確定運算式及其位置,這部分的邏輯也有一定的複雜度,但是相比之前的目標檢測,還是簡單不少。

在搜尋資料的過程中,我在github上發現一個開源專案:github.com/stevenobadj… 。該專案也是識別影象中的運算式,並計算出結果,有很多可以借鑑的地方,我會在專案中儘可能多的複用該專案的資料集、指令碼。

在下一篇文章中,我將聊一聊如何使用目標檢測來識別手寫數字。

參考

  1. 使用TensorFlow一步步進行目標檢測(1)
  2. 使用TensorFlow一步步進行目標檢測(2)
  3. 使用TensorFlow一步步進行目標檢測(3)
  4. 使用TensorFlow一步步進行目標檢測(4)
  5. 使用TensorFlow一步步進行目標檢測(5)
  6. github.com/stevenobadj…

image

相關文章