深度好玩!文章開始紅色石頭先在草稿紙上寫一道高數微積分題目給大家看看如何求解:
怎麼算呢?趁著高數知識還沒忘完,趕緊拿起紙演算起來。大部分人是這麼做的。但是如果現在跟你說,可以用 AI 來做,你信嗎?
現在就有這樣一個 AI 程式,你只要輕鬆上傳上面這張手寫算術題,程式就能幫你自動分析,寫出解題步驟和答案!你信嗎?就像下面一樣:
Amazing!有沒有!今天就給大家介紹這個有趣的 mathAI 專案。它是一個拍照做題程式。輸入一張包含數學計算題的圖片,就會自動輸出識別出的數學計算式以及計算結果。
專案介紹
該專案名為:mathAI,是一個自動計算手寫公式的程式。作者是一名中山大學的學霸碩士小哥 Roujack,他的研究方向就是計算機視覺。
整個程式使用 Python 實現,具體處理流程包括了影像預處理、字元識別、數學公式識別、數學公式語義理解、結果輸出。
整個系統流程圖如下:
1. 預處理
首先,需要對手寫圖片進行預處理。圖片預處理以 OpenCV 作為主要工具。預處理的主要目的是把圖片中的字元切割出來,同時避免無關變數對字元識別的影響。
預處理主要包括:灰度化、二值化、高斯濾波、字元切割與細化。
對圖片預處理的效果如下圖所示:
2. 字元識別
預處理之後,下一步就是對字元進行識別。選擇的模型是卷積神經網路 LeNet5,因為不需要提取字元特徵值,而且影像識別精確度高。
訓練網路選用的資料集是國際數學公式識別比賽資料集(CROHME)。CROHME 資料集具有海量字符集圖片,而且圖片型別與實際輸入非常相似。每種字元有 400 張圖片,其中 60% 的圖片用於訓練,40% 的圖片用於測試。
接下來就是結構分析和語義分析。
總的來說,對於數學公式的識別,主要是將識別出的獨立的字元組織成計算機能夠理解的數學公式(這裡的數學公式就是純字元的可求解的數學計算題)。大概的方法是使用編譯原理的算符優先法和遞迴下降法進行實現。 然後根據屬性文法的值傳遞思想,將數學公式的值計算出來。最後使用 Python 的 Matplotlib 庫把計算過程和答案列印出來。
實驗結果
模型訓練完成之後,作者驗證了字元識別的準確率:
然後,作者對 160 道測試題進行測試,系統做對 127 道題目,正確率為 79.38%。可以說相當不錯了!
專案開源
真正令人激動是作者已將這個專案的原始碼釋出在了 GitHub 上,供大家檢視。開源地址為:
https://github.com/Roujack/mathAI
GitHub 上公開了系統程式碼。
其實,這是一個半開源的專案,目前上傳的版本只能處理較簡單的一維算術表示式(如果想要識別更加複雜的表示式,可以參考數學公式識別的論文)。可以參考的程式碼是前面字元識別部分以及整個演算法處理框架。
例如影像預處理程式碼:
例如字元識別程式碼:
執行程式
要執行這個系統分為兩種,一種是網頁模式,一種是介面模式。
1. 網頁模式
在專案的網頁上,輸入圖片,即可獲得處理結果。
2. 介面模式
專案有一個 solver 的 Python package。裡面的 solve 方法封裝了整個系統。其功能是輸入一張圖片路徑,將輸出計算題識別過程和計算結果。
作者還專門錄製了一個影片,講解如何在網頁模式上執行程式並驗證正確率。影片放在下面,感興趣的可以看一下。
https://v.qq.com/x/page/u0871v81oin.html
優點與缺點
優點:這是一整套拍照做題的演算法框架,同時能夠處理多種多樣的計算題,目前市面上還沒有看到實現。OCR 技術如此成熟的今天字元識別已經不算有挑戰的東西了。
缺點:字元空間關係判斷只用了人類啟發式規則,影像預處理不夠魯棒,數學公式的結構識別演算法不夠完美(可以考慮使用二維文法來做)。系統還有很大的提升空間。
總的來說,這個程式相對比較簡單,能夠實現一般的手寫圖片微積分高數題,較複雜的還不能實現。但是該專案確實是一個有意思的嘗試,相信作者也會不斷最佳化。有興趣的可以看一下,試一試你手寫的算術題,看看準確率如何。