謝作如 邱奕盛








涉及學科:物理、技術、藝術
在《哈利·波特》系列電影中有各種各樣的魔法棒,配合著不同角度的揮動,就可以實現奇特的效果,如點燃火把、拉開窗簾等。從物理學的角度分析,揮動魔法棒其實是改變魔法棒的運動速度,而衡量運動速度變化的物理量是加速度。從理論上講,只要給魔法棒安裝一個加速度傳感器,就能感知所有的速度變化。
恰好,掌控板上自帶三軸加速度傳感器,那么,能否利用掌控板來準確判斷魔法棒的手勢呢?實際上很多人都嘗試過用掌控板的加速度傳感器來識別手勢,但都因為編程太復雜、難度太大而放棄。目前,加速度傳感器僅僅應用在“搖一搖”的判斷和x、y軸的角度識別上,有大材小用的感覺。
● 用加速度識別手勢的難度分析
為什么用加速度傳感器識別手勢很困難呢?因為在魔法棒揮動的過程中,加速度是不斷變化的。因此,識別手勢需要得到揮動過程中所有的數據變化,需要在手勢軌跡中連續采樣加速度數值,在得到的一組數據中尋找數據變化的規律。但是,每次人工繪制的手勢數據不可能完全相同,總會因為快慢、形狀的偏差而產生相近但不相同的數據,這就給編程帶來了很大的難度。
在2018年,筆者曾經在本欄目寫過《用掌控板體驗機器學習》一文,介紹用曼哈頓距離公式來計算兩組數據的偏差,即先繪制一次樣本數據,作為手勢的特征,當新采集的數據與樣本數據的手勢特征相近,誤差小于某個閾值時,就可以識別為正確的手勢。然而,這種方式需要人為計算均方根誤差,并且不斷調整閾值以達到較好的效果,識別算法設計難度高。再加上掌控板的存儲和計算資源有限,也很難通過保存多次數據取均值改進識別效果,或者部署AI算法進行識別。
● 換一種思路來識別手勢
1.深度學習
在學習人工智能的時候,大家都知道用機器學習的方式來尋找數據中的關系,是一種非常有效的方式。假設已經擁有一系列不同手勢的加速度傳感器數據(簡稱加速度數據集),那么搭建一個BP(Back Propagation)神經網絡(如圖1),不斷將數據“喂給”這個網絡模型,就能訓練出一個能夠識別手勢的AI模型。借助于BP神經網絡的機器學習,因為擁有神經網絡分為多層,屬于深度學習中的一種。
深度學習主要分為數據收集、模型訓練和模型推理這三個環節。數據收集也就是制作數據集,類似于人類的學習經驗知識庫,每條數據包含連續的加速度信息x和手勢類別信息y。通過收集大量手勢數據,并給數據正確標注類別信息,就可以讓機器學習這些數據了。模型訓練是讓深度學習模型通過不斷學習數據集信息,達到手勢識別的能力。當模型訓練好后,只要輸入一組數據,就能輸出識別的結果了(如圖2)。
2.物聯網技術
雖然我們沒有辦法在掌控板上部署一個深度學習的計算框架,但是可以借助物聯網技術,將數據傳輸到PC機上處理。例如,我們可以通過發送MQTT消息將每條數據傳輸到物聯網平臺數據庫保存,完成手勢數據的收集,也可以將需要識別的手勢數據,通過MQTT消息傳入PC上的深度學習系統中進行推理(手勢識別),然后得到結果(如圖3)。
● 手勢數據的收集
為了手勢識別更加準確,筆者規定每一個手勢在1秒鐘內完成,在這個過程中平均采集128個加速度傳感器的數據。采集的程序比較簡單,用mPython就能編寫。如圖4所示,每次按下A鍵開始采集數據,聽到“滴”的一聲采集完成,如果確認采集無誤,按B鍵發送到SIoT服務器(消息主題為“shoushi/caiji”)。
重復多次揮動手中的掌控板,在空中畫出相同的路徑,如畫三角形,這樣就可以采集多條數據。當數據達到一定數量(筆者分別收集了100條)時,登錄SIoT找到對應主題,可以導出數據到本地。然后更換一個手勢,如“×”號,重復以上操作。筆者采集的手勢分別是三角形、對號、錯號、五角星和圓形。
接下來整理數據,為保存到本地的各種手勢數據添加標簽,保存為csv文件。文件中每行是一條數據,第一個數據是標簽名,第二個數據是標簽序號,后面的128個數值是一次完整手勢軌跡的加速度值序列。
● 手勢模型的訓練
1.安裝MMEdu
深度學習框架有很多,如Keras、TensorFlow、PyTorch等。MMEdu開發團隊基于Pytorch和OpenMMLab,簡化了神經網絡模型搭建和訓練的參數,降低了編程的難度,因此筆者以它為例介紹神經網絡模型訓練環境的搭建。
通過地址gitee.com/openxlab-edu/OpenMMLab-Edu可以下載項目文件。解壓后即可使用,在Demo文件夾中能夠找到范例代碼。MMEdu內置了Pyzo,但筆者推薦使用jupyter作為IDE。
2.訓練數據模型
根據數據格式,筆者將第二列作為類別信息y,后面的128個數組成的序列作為加速度數據x,以圖5所示的方式讀入。
接下來,搭建一個BP神經網絡模型進行機器學習,神經網絡模型的輸入層為128個神經元,因為每條數據有128個特征,輸出層為5,所以手勢共有5類。中間有3個隱藏層,神經元個數分別為64、32、16,隱藏層的作用是增加模型特征提取的效果。隱藏層層數和神經元個數可以自行調整。每個隱藏層后面緊跟一個激活層,用于增強模型的非線性擬合能力,代碼如圖6所示。
然后將數據載入到網絡中,進行訓練。這里的lr指的是學習率,epochs是訓練輪數,可以根據實際情況修改(如圖7)。每訓練一輪,會輸出一次訓練情況,其中Loss越小,表明學習的效果越好。
如果想在此基礎上再繼續訓練,可以重復執行model.train,也可以修改其中的參數lr和epochs繼續訓練,以達到較好的效果(如圖8)。
當效果滿意時,也就是當Loss數字不再明顯下降時,就可以停止訓練,執行model.save("mynet.pkl")來保存模型。
● AI魔法棒的部署和測試
筆者將訓練好的模型部署在計算機上,將從SIoT的主題shoushi/caiji收到的信息傳入神經網絡進行推理,根據推理結果決定是否發送消息給SIoT的主題shoushi/jieguo。代碼編寫如圖9所示。
在掌控板原來代碼的基礎上,添加一段代碼,使得在掌控板上也能查看識別的結果(如第108頁圖10)。
經過上述步驟的操作,基本已經完成了部署。接下來,就可以測試一下“AI魔法棒”的效果了。識別率還不錯,大部分情況能夠正確分辨出所做的手勢(如圖11)。
● 小結
當實現了對魔法棒的“手勢”識別后,下一步就是要實現一些有趣的創意功能了,如識別出手勢后點亮不同的LED或者在屏幕上顯示相應的圖案。當然,這樣還太簡單,因為筆者的實驗室部署了智能家居系統,并且部署了HASS(具體請參考前幾期的文章),那么這個魔法棒就能和智能家居結合了。例如,畫個圓形燈光就點亮,畫個心形燈光就變成粉色,畫個“×”號燈就關閉等,是不是很有魔法的感覺?
有了深度學習和物聯網技術的加持,學生各種天馬行空的想象都更有可能成為現實。那么,還等什么,當人工智能遇上物聯網,精彩的世界正拉開帷幕。