採用OpenVINO實現數學刷題自動判卷系統

2021-10-08 15:25:53 字數 1725 閱讀 9048

小學生學習數學,四則運算是比較重要的內容,需要做大量的練習,一次要做幾十甚至上百道題,經常每天都要做,俗稱刷題。對老師和家長來說,判卷也是乙個比較費事的工作。如果我們可以通過攝像頭直接拍攝學生刷題的卷子,識別卷子上的題目和學生答案,並判斷答案是否正確,語音播報答題結果,並給予學生鼓勵、建議。這種自動判卷神器,可以大大減輕老師和家長判卷的壓力,也可以幫學生自己檢查錯誤。

本次專案以加減乘除的四則運算為例,後續可以將這個功能擴充套件到小數、分數的運算,乘方的運算以及帶括號的運算等。對於學生手寫數字的識別率,也可以作為書寫是否規範的乙個評價,對學生提出建議,督促學生書寫盡量規範。

本專案採用如下硬體平台:

在lattepanda上,通過攝像頭採集數學刷題影象或者採用儲存好的數學刷題影象,輸入到部署在ncs2上的訓練好的優化後的網路系統,識別數學題目,自動計算數學題目結果,識別學生答案,並判斷學生答案是否正確,給出判斷結果。可以將錯題高亮顯示標出,存成新的判卷,並將結果在顯示器上輸出,或者通過聲音給出結果(答對多少道題或者多少分)。

刷題試卷如下圖所示:

這張卷子有100道題目,涵蓋百以內的加減法運算,有列印的數字、計算符號、等於號和學生手寫的結果,還有班級姓名等。

軟體流程圖如下:

輸入刷題試卷的影象後,我們要對影象按照每個題目分塊,然後再對每個分塊內的數字、計算符號、「=」,以及手寫答案進行識別,然後組合成算式,計算結果,與手寫答案做對比,然後進行下一題目分塊,直到試卷結尾。

以第一道題為例,我們要識別並分解題目:「53+17=」,其中,「53」 和 「17」 是參與運算的數字,「+」 是運算子,「=」 是等號;我們需要識別單個的數字 「5」 和 「3」,然後根據運算子的間隔,將單個數字組合成相應的運算數字「53」,識別出運算子和參與運算的數字後,我們自動計算此題目的結果「70」,同時識別學生的手寫結果」70」,並判斷學生計算結果是否正確。

以此類推,對所有題目進行類似操作,就可以知道該學生一共作對了多少題目,得到多少分,通過顯示器或者音箱將結果輸出。

實現過程:

採集並標影象資料,借用mnist資料集作為手寫體的資料集,該資料集有手寫的單個數字的資料;我們還需要通過lattepanda的攝像頭採集一定數量的運算子和 「=」 的影象,並做標註;

建立深度學習網路,可以採用已有深度學習網路,做遷移學習;比較幾種深度學習網路,考慮速度和準確率,選取一種比較合適的結構,保證其識別準確率在96%以上。

用標註好的資料訓練網路,達到一定的精度要求;儲存模型為onnx格式;

將訓練好的網路模型,引入到openvino 環境,採用mo.py

對其效能進行評估;

部署到lattepanda和intel計算棒ncs2上,對實時採集影象或者儲存影象,進行推理,識別數學題目,自動計算數學題目結果,識別學生答案,並判斷學生答案是否正確,給出判斷結果,通過語音合成技術,將學生的答題情況,得分播報出來;根據得分情況,對學生進行鼓勵。

結果顯示:

老徐 2020.7

js 採用prototype實現繼承

採用prototype的方式實現js繼承 呼叫a的建構函式時,沒有給他傳遞引數。這是prototype中標準做法,要確保建構函式沒有任何引數 function a a.prototype.acolor red a.prototype.ashowcolor function function b b....

Android採用ListView實現資料列表顯示

要將資料庫中的資料列表顯示在螢幕上,我們要使用listview這個控制項,當使用者從資料庫中取出資料時,要將資料繫結到顯示控制項上,如何繫結呢,我們需要建立介面卡進行繫結,建立介面卡有兩種方式 第一種是用 adapter建立 要求繫結的資料是list 資料型別 第二種是用 cursoradapter...

快速排序,採用遞迴實現

一趟快速排序主要步驟如下 1 設定兩個變數,l r,初始變數分別為left和right,表示待排序列的其實下標和終止下標。2 將第l個記錄暫時存在變數pivot中,這個記錄可以隨意選取,相當於基準值,pivot arr l 3 從下標為r的位置向前搜尋,當找到比基準值小的數時,將其移動到下標為l的位...