謝作如
機器學(xué)習(xí)(Machine Learning, ML)是一門多領(lǐng)域交叉學(xué)科,涉及概率論、統(tǒng)計學(xué)、逼近論、凸分析、算法復(fù)雜度理論等多門學(xué)科,專門研究計算機怎樣模擬或?qū)崿F(xiàn)人類的學(xué)習(xí)行為,以獲取新的知識或技能,重新組織已有的知識結(jié)構(gòu),使之不斷改善自身的性能,是人工智能的核心。
機器學(xué)習(xí)從詞面上理解就是讓機器進行“學(xué)習(xí)”的技術(shù),其最基本的做法是讓計算機利用已有數(shù)據(jù)得出某種模型,并利用此模型預(yù)測結(jié)果。最近國內(nèi)一線創(chuàng)客教師發(fā)布了一款開源硬件——掌控,掌控板支持Python語言,于是我們嘗試用它做了一個簡單的機器學(xué)習(xí)方面的案例——識別簡單手勢。
解決思路
市面上的手勢識別解決方案有很多,如利用數(shù)據(jù)手套或光學(xué)標(biāo)記。數(shù)據(jù)手套由多個傳感器件組成,通過傳感器將用戶手的位置、手指的方向等信息傳送到計算機系統(tǒng)中。光學(xué)標(biāo)記則需要戴在用戶手上,通過紅外線可獲得手指的各種變化。更高級的解決方案是對視頻采集設(shè)備拍攝到的包含手勢的圖像序列,通過計算機視覺技術(shù)進行處理,進而對手勢加以識別。
我們采取的方案是利用掌控板自帶的重力加速度傳感器。當(dāng)用戶佩戴掌控完成一個固定手勢時,掌控會在空中沿著一定的軌跡運動,在整個過程中加速度不斷改變,將這個不斷改變的加速度數(shù)據(jù)記錄下來分析,可以發(fā)現(xiàn)同一種手勢的數(shù)據(jù)變化規(guī)律是相同的?;谶@個原理,我們能夠?qū)?dāng)前正在進行的手勢與事先“學(xué)習(xí)”過的手勢做實時對比,如果相似度較高,則判定識別成功。
判定手勢是否相似的算法,我們選擇了曼哈頓距離(Manhattan Distance)算法,因為實現(xiàn)起來比較簡單,也容易理解。曼哈頓距離算法先計算一系列數(shù)據(jù)對中每對數(shù)據(jù)差值的絕對值,并將這些值累加起來判斷數(shù)據(jù)之間的差異。曼哈頓距離中距離d的定義為:
當(dāng)我們記錄下完成一個手勢的加速度數(shù)值后,可以得到時間(橫軸)-加速度(縱軸)的對應(yīng)關(guān)系(如圖1)。通過圖1可以大致判斷出這是一個讓掌控加速運動的手勢。
錄入該手勢之后,我們再做一個手勢與其作對比(如圖2)。
根據(jù)曼哈頓距離的定義,兩個手勢之間的差異,可以等價于圖中陰影部分的面積大小(如圖3)。面積越大差異越大,面積越小則差異越小。
由此,我們可以通過此標(biāo)準(zhǔn)判斷一下圖4中a和b兩張圖的相似度。a圖的面積大于b圖,說明b圖與錄入的手勢更接近。
兩個手勢的圖形完全重合當(dāng)然是不可能做到的。需要設(shè)置一個閾值,只要小于這個閾值,就表示兩個手勢是一致的。閾值設(shè)置太大會誤判,太小則容易導(dǎo)致難以正確識別。
硬件準(zhǔn)備
手勢識別利用的是掌控板自帶的重力加速度傳感器,因此硬件設(shè)備只需要一塊掌控板即可。為了做手勢更加方便,建議使用電池供電,或者安裝供電擴展板、接小型充電寶。圖5為加了供電底板的掌控板。
解決過程
1.流程設(shè)計
掌控板要識別手勢,首先要錄制需識別的手勢數(shù)據(jù),然后以此為模型判斷新手勢數(shù)據(jù)與錄制的手勢是否一致,即先學(xué)習(xí),再識別,具體步驟如下:
①錄制動作。開機后,按住A鍵進入到動作錄制模式,錄入固定長度的動作,如在空中寫一個字母,將每個時間點的加速度記錄在一個原始數(shù)組中。錄制完成后,生成一個固定長度的原始數(shù)組。
②識別動作。完成動作后松開A鍵結(jié)束錄制,自動進入識別模式。再次在空中比劃手勢,每過一固定時間間隔錄入新的即時加速度,更新在樣本數(shù)組中。將樣本數(shù)組的每一個數(shù)值與原始數(shù)組對應(yīng)的數(shù)值做差值,并取絕對值。
③結(jié)果判斷。將絕對值做累加,如果絕對值小于一定閾值則判定為動作被識別,即證明動作與之前錄入的動作相似,顯示屏?xí)@示“識別成功”,表示識別成功。
2.代碼編寫
用Python語言編寫手勢識別的代碼,核心還是“學(xué)習(xí)”和“識別”兩大功能,即實現(xiàn)按下A鍵時錄入動作的原始數(shù)據(jù),松開A鍵默認進入識別模式。識別模式中要記錄實時時間戳,并將即時的加速度數(shù)據(jù)記錄下來,和原始數(shù)據(jù)做對比。下面為實現(xiàn)機器學(xué)習(xí)的關(guān)鍵代碼:
①導(dǎo)入掌控必要的庫以及數(shù)學(xué)運算的庫,如圖6。
②定義采樣率和數(shù)組長度,如圖7。
③按下A鍵時錄入動作的原始數(shù)據(jù),如下頁圖8。
④錄入動作方差計算,如下頁圖9。
⑤默認進入識別模式并記錄實時時間戳,如下頁圖10。
⑥將即時的加速度數(shù)據(jù)記錄下來,并和原始數(shù)據(jù)做對比,如下頁圖11。
完整代碼可通過筆者博客或者DF創(chuàng)客社區(qū)索取。
3.實驗測試
將掌控握于手心,OLED屏朝外,方便查看提示消息。開啟電源后,按住A鍵,屏幕出現(xiàn)“開始記錄”,此時可以預(yù)先錄入一個手勢,如在空中比劃大寫字母A。錄入完畢后,屏幕顯示記錄完成。任意比劃時,屏幕一直顯示“正在識別……”,當(dāng)比劃的手勢也是A時,屏幕將出現(xiàn)“識別成功”。
思考與總結(jié)
圍棋界Master的橫空出世,讓人們對機器學(xué)習(xí)充滿了敬畏,或?qū)⑵湎氲眠^于神秘,或?qū)⑵湎氲眠^于萬能。本案例通過Python語言讓一塊小小的智能硬件具有簡單的機器學(xué)習(xí)能力,掀開了機器學(xué)習(xí)的神秘面紗。雖然這是一個小數(shù)據(jù)環(huán)境下的淺層學(xué)習(xí)案例,但原理上完全符合機器學(xué)習(xí)的技術(shù)要求,編程實現(xiàn)也容易,大多數(shù)人都可以進行研究并實現(xiàn)。智能時代已然來到,學(xué)有余力且具備一定編程能力的中學(xué)生需要了解一些機器學(xué)習(xí)的相關(guān)知識,并且,借助智能硬件來一次真刀真槍的實操是很有必要的。
注:本案例也可以使用micro:bit實現(xiàn),掌控板和micro:bit的Python代碼規(guī)范是一致的。