2017年11月5日 星期日

2017.11.05 問卷的圖像辨識,opencv - python

2017.11.05 問卷的圖像辨識,opencv - python 

有天,在中心辦完活動後,回收了一大堆的回饋單,目測有上百張左右。回饋單以人工辨識,費時費力,實在覺得很麻煩。填入回饋單的結果是個重複性高且技術性低的工作,以人力執行,時間都大多花在辨識以及騰入回答,若是交給電腦執行,這將會是秒殺的工作,而且十分準確不會誤看。

圖像辨識跟機器學習一直是JN很想嘗試的一塊,而且這兩塊正是未來的大趨勢,雖然以後人類的工作多半會被機器取代,不過人類就可以有比較多時間思考與享受生活,到時一個全新的社會型態會挑戰人們習慣的認知,你我都被這個時代潮流推著走。

問卷圖像辨識,是一個很好的應用。若為了讀問卷而買讀卡機有點太過於浪費讀卡機的效益,而且讀卡機也限制了問卷的形式,出問卷的人就不能隨心所欲的出問題。JN想要寫出一個,問卷格式能相當自由,同時讀取精度也相當準確的問卷圖像辨識程式。

關於圖像辨識,JN第一個就想到opencv這個處理影像的套件。在之前爬youtube的python教學影片,也有教人使用opencv去做辨識碼的破解。但是,JN很快就發現那教學影片對想要做的功能是勾不著邊的,於是只好進去opencv的官網教程慢慢修練功夫。




JN是用visual studio 2017,並且python環境選用anacoda。然後在「python環境」→「封裝」,搜尋「opencv」,找到「opencv - python」安裝,之後等待流程跑完要很久,這時可以去看個電視節目再回來!

終於等到流程跑完了,這時候就能引用cv2這個套件。JN很快就碰到了大問題,就是系統相容的問題。JN的桌電系統是win7,每當執行cv2裡面的一些函式,程式就會停止運作。接下來使用偵錯程式去找原因,幾次原因都指向「ntdll.dll」。ntdll.dll是一個系統檔案,JN檢查桌電的ntdll.dll檔案,並沒有問題或遺失。然而JN換成筆電,筆電系統是win10,在win10下跑python - opencv就沒有任何異常了。中心的電腦也是win10,一樣沒有問題。所以JN推論,

opencv - python,不適用windows 7作業系統執行。而window 10作業系統可以執行。

老實說,這個問題差點讓JN放棄了,現在也在心想是不是該把桌電換上win10,最後還是決定win7再戰10年!

每次看官網的教程,JN都覺得很簡潔,很多細節沒有寫出來,令JN我總要想很久。這次的opencv更是困難,好幾次JN完全複製官網的程式碼,結果執行時各種錯誤,真的很賭爛。除了官網之外,JN也看了很多中國論壇寫的教學,也推薦看官網不得領悟的人去查看看。

關於問卷辨識系統,其實就是要讓程式以圖像判斷每一選項的填寫情形,並且把判斷的結果輸出。圖像判斷是用官網教程的「Template matching」的功能,這功能用來一個模版圖樣(template)去搜尋另一圖片上相同的模版圖樣。其中有個耐人尋味的閥值(Threshold),閥值高會抓不到對的,太低又會抓到錯的,倒底該設多少才會有最高的精準度呢?這就讓機器學習去告訴你答案吧!

實際上,JN走的路程比理論事先想的的路還多好幾倍。核心運作的功能相當好寫,但是「精準度」及「效率」,就是個永無止境的課題。為了達到JN心中所想的精準度,這套問卷圖像辨識系統被重頭寫兩次。要怎麼讓Template matching能順利抓出所有圖案,機器學習要怎麼安排及應用才能輔助精準度提高,此外如果圖像處理太複雜,整個執行下來會太冗,效率很差(雖然還是會比人工快)。

JN心中所想的精準度是99%。雖然在寫出三次後,測試後,精準度達到99%(事實上跟人工辨識相當了),但是JN仍然覺得不夠,不夠的地方在於給某些嚴苛又機掰的圖像測試會失敗,此外機器學習並沒有完美容入進入整個運作中。

JN寫的問卷圖像辨識還有許多地方要改善與編寫,JN期望某一天,能在Android系統上推出,讓大學生還是XX中心都能普及使用,省下時間來去為了更美好的事物。



後續記事(2018.6.18)

結果不到一年,桌電也換成了win10。JN後來就沒有再改良問卷圖像辨識,因為實體問卷數據化的好壞,決定了圖像辨識的成功度,並不是機械學習、也不是參數設定能讓圖像辨識度成功。

輸入資料的品質好壞,才是最應該先把關的,花時間注意的。圖像辨識,相對只是件較不重要的事。如果不會圖像的概念,處理圖像的技巧,矯正圖像,規格化,之後做的圖像辨識就會有很大的侷限性。

一個程式到底要不要完成,要看它後續到底能換來多少好處。對於一百多份問卷,一個細心的人可以一次全對地填寫,但對程式來說,這樣樣本過少,會學習不到最佳狀況,即使讓這次的問卷學到全對(過度學習),接下來面對下一次的問卷,就會判斷得很失敗,這是可以預期的。

大概就是這樣的感悟,JN也就放棄了改良圖像辨識。