如何用技术改变生活 哪个瞬间你突然觉得读书真有用?
作者:南慕倫
鏈接:https://www.zhihu.com/question/35720340/answer/262160679
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
?
我覺得寫的很好,所以就轉載了,已注明出處。希望能擴大影響力。
這是一篇實實在在技術改變生活的點,也是我們技術人不忘的初心。
?
?
背景
我的爸爸媽媽都是一個西南小城的大學老師。自從有記憶的時候開始,每次到他們期末考試的時候,他們就要花上好幾天的時間改卷。最近幾年,步入中年的他們開始老花了,改卷越來越費力,特別是我媽媽本身就高度近視,所以有時候得讓學生幫忙。但是每張試卷四十到六十道選擇題,我爸上的還是公共課,學生更多。
今年過年的時候,我剛畢業還沒入職,賦閑在家,就請了兩個研究生同學跑來家里玩,然后他們也“順便”改了一下選擇題。整個過程非??菰?#xff0c;得吃好幾碗螺絲粉才能補回來。然后我忽然意識到,我們三個可能是家鄉歷史上出現過計算機水平最高的三顆大腦,還都是CMU畢業搞智能信息系統的,竟然還要做這種本應該交給計算機干的活兒,于是我自然而然想到了把它自動化。
痛點
答題卡讀卡機是很早很早就有的東西了,但是主要有幾點原因爸爸媽媽他們學校一直沒有用上:
- 設備太貴
淘寶答題卡讀卡器5000元起。加上反腐之后,審計收緊,這種價格的設備需要統一通過政府采購,價格更加高昂,如果要購買這種設備手續非常復雜。
- 需要專用答題卡
這進一步提升了使用成本,一般一張答題卡的采購價是一毛錢。
- 使用復雜
爸爸媽媽雖然電腦已經用得很溜了,但是現在已有的軟件的操作界面還是讓老一輩教師望而卻步——所以有的院校得專門雇人來操作答題卡讀卡器。
初期調研與設計
剛好我本科接觸過圖像和視頻處理技術,在CMU的時候某個課程項目是識別手寫公式轉換成Latex,個人有一定的技術積累。剛好簽證例行被行政審查,暫時沒法入職,過年期間就開始設計這么一個系統。針對上面三點,這個系統需要有以下幾個特性,我一并做了調研:
- 設備盡可能簡單易用
之前,在我印象中掃描還是手動模式,需要掃完一張,再放下一張……
直到我到CMU才第一次見識了自動送紙(Auto Document Feeder)掃描儀。
同時我在網上看了一下價格,自動進紙掃描儀最便宜的新品是國產的 清華紫光-F20S,只要1150元包郵,這個價格就算我自己掏腰包也可以承受,而且50張的紙匣已經基本足夠一般教學的使用了。
- 普通打印機就能打印的黑白答題卡
常見的答題卡的框線一般都做成紅、綠、藍三種顏色:
彩色硬紙答題卡
對應計算機中RGB的顏色表示方式,這樣在做圖像處理的時候,能夠用閾值法輕松把框線等非答案的內容篩掉篩掉,只剩下學生填涂的結果。這樣,再根據四周的定位塊來確定學生的填涂內容。
如果變成黑白的,就需要把學生填涂的內容答案從背景中分離出來,這其實增加了一點難度,但是考慮到之前在CMU的課程設計里做過類似的事情,技術上是可以解決的。
- 操作步驟盡可能簡單
所以我需要盡可能簡化使用流程,讓使用者少做選擇,盡可能只需要三步:選擇文件——處理——得到結果
?
除此之外,我還想整個東西看起來厲害一點。
前面說道我在CMU做過類似的事情,大概的項目效果是把手寫公式轉換成Latex公式:
手寫公式識別
看上去很酷,但實際上做了如下兩個假設之后一點也不難:
難點就在有的字符是被分成兩部分的,需要合并,比如等號,階乘號和i,j……可以“啟發式”合并,或者實在太難可以假設他們不存在好了……(科學就是這么進步的嘛,基礎性、積累性的工作靠大部分普通人解決,挑戰性的工作由少部分天才解決)
識別這一塊,機器學習的庫現在封裝得太好用了,基本上搜集到數據丟進去無腦訓練就行,更何況這個只是機器學習入門必讀教程——識別手寫數字的升級版。只需要多采集一些手寫數據就好了。
當時我搞了這么一個表格,讓爸爸媽媽在上課的時候找學生去填:
手寫字符采集卡
然后用了一些框線檢測的算法和字符提取的算法搞出了個數據集,訓練模型的測試效果也還行。
所以我剛開始做的時候野心比較大,想把填涂式改為手寫式的答題卡,因為選項最多只有ABCDEFG和勾叉。
實現
有了之前的想法,我就開始動手實現。
答題卡
第一步肯定是核心功能,識別。第一版的答題卡設計我已經找不到了,但是大致思想跟第二版差不多,學號部分也是手寫的:
手寫版答題卡
不定向選擇題之所以設計成這樣,是因為實際使用中讓學生寫多個選項的時候不連筆這個假設很難成立:一方面自然是學生書寫習慣的問題;另一方面,即便學生書寫沒有問題,也可能會因為紙張、掃描儀的問題意外出現一些筆跡的斷裂和符號的粘連。
一旦出現筆跡斷裂、字母粘連的情況,就需要加入切割算法——這恰恰是驗證碼中一個比較難解決的問題——更何況,驗證碼識別器只需要30%的準確率就能湊合用,達到60%的準確率就基本滿足需求了,而評卷時的準確率是以人的識別準確率(95%以上)作為標準的。
同時,就算能夠成功切割,往往也會引入一些變形,對識別準確率造成負面影響。
所以,這個表格定下來后,大致處理方法是這樣:提取出三塊最大的矩形,然后利用框線檢測方法去掉框線,提取出表格中的字母,標準化(居中、放大、填補邊緣)之后利用上次收集的手寫字符數據訓練分類器并識別。
然而,這時候我才發現,訓練出來的模型能夠平均達到97%的準確率,但是具體測試總會出現一些匪夷所思的識別錯誤,有點類似One pixel attack for fooling deep neural networks(針對深度神經網絡的單像素攻擊)里面提到的問題。雖然97%的準確率也算可以接受了,因為要是我自己來改看走眼一兩個很正常,但是我自己很不滿意,畢竟如果有人剛好因為一個識別錯誤冤枉掛了那是很不好的(明明沒過的過了那就不管了)。而且有一部分識別錯誤發生在學號部分,這會導致登記分數的時候需要額外的人工核對工作,盡管把學號改成填涂式能夠解決這個問題。
主要原因我估計是數據集不夠(總共加起來有效樣本才一千來份),加上采集數據時示例字體是我手寫的,可能很多人的寫法會受到我的影響,然而真正測試的時候則會用自己的寫法。再進行大規模采集的話,估計比較困難,所以我最后放棄了手寫識別這個想法。
由于基于框線的定位在實際使用中并不是特別讓人滿意,我也沒想出來什么簡單可靠的算法,于是我打算另辟蹊徑,尋找更好的定位的方法。普通識別卡是在角上放色塊,但是色塊本身也比較容易受干擾,調試起來也比較麻煩,還是不方便。
經過反復思考,第三版答題卡設計成了這樣:
第三版答題卡
沒錯,就是這么簡單粗暴。角上借鑒了二維碼的定位塊技術。二維碼還有一個名稱叫做Quick Response Code,原因就在于這三個定位塊,它能夠讓程序很方便地定位二維碼的區域。定位這三個方塊的算法有很多,具體實現我參照的是這篇文章:OPENCV: QR CODE DETECTION AND EXTRACTION
大致的原理是對圖像進行邊沿檢測,然后根據邊沿的嵌套關系提取出候選塊,最后抽出最可能的三個。
然后四周的黑塊用于輔助答案的定位。其實,因為掃描儀掃描的圖像基本沒有形變,所以可以不需要的。但是當時考慮到我需要一次性設計多種滿足不同需求的答題卡,所以采取了這種實現。后來想想其實如果在提交的時候已經知道答卷類型,其實完全可以去掉這些黑色輔助定位方塊,以降低印刷難度(有的打印機在打印黑色色塊的時候會有油墨不均勻的情況)和油墨消耗。
之后媽媽在年級搞英語能力競賽,試用了一下,識別上沒有什么大問題,但是這張答題卡的設計上卻有些問題:由于空間不足的關系,我把學號拆成了兩欄,內部橫向填寫,兩欄卻是縱向擺放,同時既有手寫的框,又有填涂的框(主要想順便采集手寫數字的數據)。這樣很多學生在填涂學號的時候就出現了如下情況:
- 寫了學號沒填涂
- 只填上面一欄學號,同時前五位學號手寫,后五位學號填涂
- 漏填學號某一位
- ……
真是感嘆,你永遠不知道用戶會以什么奇怪的姿勢用你的產品。于是,最后我把答題卡設計成了這樣:
最終版全頁答題卡
這樣之后,學生犯錯誤的概率大大降低,也基本達到效果了,有時間的話,下一步就是把四周的黑色定位塊給去掉。
評卷系統
答題卡設計好之后,識別算法基本上水到渠成,只不過實際情況中會有一些瑣碎的細節和特殊情況需要仔細調較。
下一步就是評卷系統了,從提交答案、答題卡到匯總成績,要盡可能簡單。首先我不想讓他們安裝任何軟件,因為這會引入額外的操作步驟,每多一步他們就會困惑一點;其次,我要使用他們盡可能熟悉的操作模式和軟件來完成我的功能。
于是我最后采用的是:掃描成PDF文件——網頁提交——網頁預覽——下載詳表的模式。
我自己買回來測試的是富士通(Fujitsu) IX500的掃描儀,這個掃描儀實在是太給力了,一鍵掃描保存成PDF,這給我省了很大的事。
后面的網頁處理看似簡單,但是實際上瑣碎的事情非常多:
首先說網頁提交吧,一個班掃描出來的文件往往3~20M大小(有的掃描儀掃出來的灰度模式,沒有壓縮),考慮到國內網站需要備案,而且國內運營商的上傳帶寬都小得可憐,所以我得把服務器放在大陸之外,這樣一來上傳時間過長會導致他們忍不住刷新,所以必須至少有一個上傳進度條,更好的實現是切片上傳。
其次,盡管識別算法已經足夠強壯,但是仍然免不了一些識別不了的情況,比如學生把識別塊給整個涂黑了(真有這樣的學生),印刷缺陷等等,這時候必須把識別出錯的答題卡給列出來,悄無聲息地出錯然后把學生的答題卡吞了就不好了。
還有,因為大部分情況下最后的個人總分、單項總分、平均分、每一題的正確率等信息都是需要匯總給教務處的,我需要一個方便他們提取這些信息的方式。
說起來上一次寫這種網站還是三年前在大摩實習的時候,當時前端Bootstrap+jQuery,后端Django還是主流,本著先讓它跑起來的目的我沿用了當時的架構,雖然可能已經有一點老了,但是至少一切都在我的控制之內。
具體實現細節沒太多可以說的,三個字概括的話就是:糙快猛,要是在公司寫這種代碼的話是會被拖出去打的,就給大家簡單看看效果吧。
提交界面
預覽界面1
預覽界面2
Excel
值得一提的是,我在做Excel輸出的時候費了很大的力氣,因為我想做到以下幾點:
為了保證一致性,我需要使用大量的公式,大部分公式還是比較簡單,主要是公式多了工作比較瑣碎,可謂牽一發而動全身。但是有少部分公式要寫起來還是非常蛋疼的,主要原因是我想避免使用VBA,因為大部分老師的電腦安全設定是屏蔽VBA的,這大大增加了工作量,比如答案分值是一列,而學生的得分是一行,EXCEL里行列乘法是沒有的。
還有第三點,大家可以想想怎么用EXCEL的公式實現這一點,我的實現方法非常的猥瑣……
實戰
經過三個月的開發和不停地調較,現在整個系統的穩定性和識別率都非常不錯,后來給我中學老師拿去試用反饋也非常好,這可能是我目前為止自己做的最有用的一個項目了。
只是爸爸媽媽最后想拿去期末考試使用的時候,遇到了學院里面的一些阻力,某些認識了十幾年的人以種種奇怪的理由作梗,最后我媽媽三番五次打報告,一再聲明不要錢,并請計算機系的老師寫書面測試證明了之后才同意使用。爸爸那邊則只在他自己教的班級使用,不過這也就夠了。
好在我寫的代碼質量還是可以的,成功經受住了接近兩千多份的試卷的考驗,辦公室的老師也紛紛表示好使,寫試卷分析也爽多了。他們也進一步提供了一些意見,比如最后每個學生的選項需要打印存檔確認,所以需要用下劃線標識對的、錯的、部分對的各種細節等等。
總結
從工程上說,這其實算是我寫的第一個比較大的實用型項目,給我最大的感受就是,你永遠不知道客戶以什么姿勢用你的產品。在發布前進行內部封測還是很必要的,的的確確能夠發現很多的問題和改進建議。
我最近在讀《人月神話》,里面提到一點就是,如果說程序需要一倍的工作量,那么到程序系統產品組件需要九倍的工作量。我第一次切切實實感受到,此言不虛。寫識別算法的時候尤其感受到回歸測試的重要性——然而我一直沒有寫回歸測試,因為工作量有點太大了。
回到題主的問題,什么時候覺得讀書有用?我曾經回答過這樣一個問題:知乎用戶:為什么軟件工程專業要學習大學物理?這個回答引起了很多人的討論,包括我一些很厲害的同學也有表示反對的。這一次,我覺得又可以增加一條論據了:在答題卡識別的算法中我使用了仿射變換,如果不是學過線性代數、大學物理、機器視覺,我可能會卡在那兒很久甚至放棄。
可能因為爸爸媽媽是老師的緣故,我一直覺得讀書、做題、工作是一件很有意思的事情,有時候理論的確枯燥,但是絕大部分理論都是出自生活中非常有意思的問題。所以,就知識而言,它一定是有用的,只是需要在合適的地方發揮作用。
本科有一個同學是學臨床醫學的,但是他課余在心理學上花費了很多的時間。我們當時就問,心理學畢業的話,除了能做心理醫生還能干嘛呢?他跟我說,很多啊,心理學有一個分支叫工程心理學,專門研究人、機器與環境的關系。很多畢業生都跑去飛機制造業,研究飛行員的心理,以設計出盡可能讓飛行員操縱簡單、不犯錯的飛行控制系統。很多產品功能上完全一樣,但是就是交互上有天壤之別,比如前面我提到的答題卡中學號的排布,以及飛機上操縱桿的位置,等等。
所以說,保持眼界開闊,多接觸新知識,往往在意想不到的時候會對自身有所幫助。
另一方面,說實話,這個項目拉給任何一個合格的一流計算機專業畢業生來做應該都不是問題,現實中這樣不需要太多技術就可以改進和提高的東西還有很多。哈哈,“改變世界”的門檻似乎并沒有那么高嘛。很多人不太喜歡李開復老師的“雞湯”,但是我很欣賞他自傳《世界因你不同》中的信念,并且努力踐行。女朋友一直說我是情懷黨,做這個項目我慢慢感覺到,可能還真是。我很享受這種利用自己所學來產生正面影響的事情,哪怕只是一丁點。這一次,當滿頭華發的爸媽不再費勁地批閱選擇題,遠在他鄉的我感到了一點點慰藉,我的所學似乎賺回了一點點學費。
最后,羅哩羅嗦寫了這么多,非常感謝你能夠聽我分享這個故事。:)
其它
其實,我現在最想做的功能是手機拍照了之后就能識別,就像全能掃描王那樣的,不需要專門掃描儀。這樣會大大方便一些沒法購買ADF掃描儀的老師。
但是手機拍照最大的問題是成像質量不穩定。可能會由于光照的原因導致現有的二值化算法不適用,同時在不同情況下會有形變和畸變,形變尚好解決,只需要一個坐標變換,但是畸變就難了。我有一些初步的想法,基于網格變換搞一個估價函數然后做梯度下降來尋找最優變換,但是這個工作量比較大也不知道效果如何,感覺這應該是一個很有趣的問題。
總結
以上是生活随笔為你收集整理的如何用技术改变生活 哪个瞬间你突然觉得读书真有用?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言在TXT文件中搜索字符串
- 下一篇: Solaris 10 怎么从命令行进入图