本次所有代碼都是「深度學習DIY」博主貢獻,主要是手勢識別應用到簡單的機器人。有興趣的同學可以關注獲取原始碼!
回家看到小外甥存了很多零用錢,作為舅舅,最近手頭有點緊。於是經過幾天的籌劃,決定製作一個剪刀石頭布機器人,向小外甥挑戰。以小外甥好勝的性格,一定會欣然應答。然後憑藉神經網絡出色的性能,贏光他的零花錢不是問題。。。嘿嘿,想想還有點美呢。
首先展示下最終的成果:
上面這個是做好的成品,效果不錯,小外甥被忽悠的一愣一愣,輕鬆拿下他的存錢罐。
2. 原理介紹
主要就是一個圖像分類的神經網絡。通過攝像頭,判斷小外甥出拳一瞬間的手型,然後根據規則顯示克制他的手型即可。例如攝像頭檢測到小外甥出了剪刀,那麼機器人就出一個布,只要模型訓練的好,妥妥的百戰百勝。——數據收集——
用過深度學習的人都知道,這貨需要訓練數據,而且越多越好,各種背景,光照,遠近最好都能擼一些圖片,這樣模型的魯棒性就會很好。我編寫了一個python代碼,配合opencv調用攝像頭來獲取手勢圖片。將剪刀的標籤設為0,石頭的標籤設為1,布的標籤設為2,每種採集1000張圖片左右。如下圖所示:剪刀(0)對應的數據
石頭(1)對應的數據
布(2)對應的數據
此時我們已經收集好了需要訓練的數據,那麼下一步就是設計網絡了。
——網絡設計——
由於只需要判斷三種手勢,所以一個分類網絡就足夠了,考慮到電腦的CPU能力有限,為了實現實時的檢測,需要一個輕量級的分類網絡。開源的mobilent系列,shufflenet系列,efficeentlite等都是很好的選擇。這裡我選擇了shufflenetV2版本。通過實際測試,這個網絡的效果最好。shufflenetv2的結構圖如下圖所示:
shufflenetv2提供了一個通道係數來平衡速度和精度。如上面表格中的0.5X,1X,1.5X,2X所示。這裡我選擇使用0.5X的通道係數,參數量只有1.4M,計算量只有41M,在筆記本的CPU上面足夠實現實時的檢測。
下圖a展示了基本ResNet輕量級結構,這是一個包含3層的殘差單元:首先是1x1卷積,然後是3x3的depthwise convolution(DWConv,主要是為了降低計算量),這裡的3x3卷積是瓶頸層(bottleneck),緊接著是1x1卷積,最後是一個短路連接,將輸入直接加到輸出上。
下圖b展示了改進思路:將密集的1x1卷積替換成1x1的group convolution,不過在第一個1x1卷積之後增加了一個channel shuffle操作。值得注意的是3x3卷積後面沒有增加channel shuffle,按paper的意思,對於這樣一個殘差單元,一個channel shuffle操作是足夠了。還有就是3x3的depthwise convolution之後沒有使用ReLU激活函數。
下圖c展示了其他改進,對原輸入採用stride=2的3x3 avg pool,在depthwise convolution卷積處取stride=2保證兩個通路shape相同,然後將得到特徵圖與輸出進行連接(concat,借鑑了DenseNet?),而不是相加。極致的降低計算量與參數大小。
——網絡訓練——
訓練選擇使用pytorch框架,因為pytorch基於動態圖機制,調試簡單,而且訓練速度也比較快,在我的筆記本上面,訓練了半個小時,就能達到0.99的top1精度。下圖是訓練的loss和top1曲線圖。
——模型部署——
其實直接使用pytorch進行推理也是可以的,知識pytorch的推理速度一般,因為網絡沒有做優化(量化以及層的融合),所以這裡採用一種更為普遍的方式進行推理。轉換成ncnn模型,使用騰訊開源的ncnn庫進行推理。ncnn庫的官方地址為:https://github.com/Tencent/ncnn
騰訊優圖ncnn是騰訊社交網絡事業群公布的首個AI開源項目,也是騰訊優圖實驗室第一次對外公開深度學習的研究成果。ncnn於2017年7月正式開源,作為一個為手機端極致優化的高性能神經網絡前向計算框架,在設計之初便將手機端的特殊場景融入核心理念,是業界首個為移動端優化的開源神經網絡推斷庫。ncnn無第三方依賴,跨平臺,在手機端cpu運算速度在開源框架中處於領先水平。基於該平臺,開發者能夠輕鬆將深度學習算法移植到手機端,輸出高效的執行,進而產出人工智慧APP,將AI技術帶到用戶指尖。
不同框架間的模型轉換是目前AI項目應用落地的一大痛點。ONNX是Facebook主推的開放文件格式,pytorch/caffe2原生支持。作為目前已知同類框架中CPU運算最快的ncnn,不僅具有最小的安裝包體積,還擁有最佳的跨平臺兼容性。在ncnn支持ONNX格式轉換後,pytorch/caffe2訓練的模型便能通過平臺輕鬆部署到手機端。與此同時,ncnn也能藉助ONNX良好的項目生態,對眾多框架和運行庫的高兼容性,以及結構定義清晰的ONNX格式,進一步降低各框架間的轉換成本,促進AI移動端生態的創新和部署。
據統計,目前Googleplay商店已有QQ、微信、微視、京東、支付寶、愛奇藝、美顏相機、快手短視頻、LIKE短視頻、玩美彩妝等超過30款APP,選用ncnn作為手機CNN推斷庫,實現包括人臉檢測跟蹤、人臉配準、人臉識別、人體檢測跟蹤、人體姿態估計、圖像分類、圖像美化、目標分割、風格畫生成、物體檢測、文本檢測和識別等AI場景應用。
京東APP使用ncnn
支付寶APP使用ncnn
騰訊一直以來秉承「開放」戰略,不斷推動技術研發向共享、復用和開源邁進。截至目前,騰訊正式發布的開源項目共計58個。今年3月,憑藉在AI開源領域卓越的技術影響,騰訊受邀成為LF深度學習基金會初始白金會員,與基金會共同維護、支持和推動人工智慧領域的技術開源和革新。
騰訊優圖ncnn(https://github.com/Tencent/ncnn)作為騰訊代表性的AI開源項目之一,將持續為人工智慧發展助力,促進深度學習研究成果的落地應用。
轉入正題:
將ncnn模型封裝成一個動態庫,這樣可以使用python直接調用。然後結合pyqt,opencv來實現最終的剪刀石頭布機器人。opencv負責讀取攝像頭並解碼,ncnn庫負責對解碼後的攝像頭畫面進行圖像分類,然後根據分類結果,找到克制手勢,例如檢測到「剪刀」,就出「石頭」,然後將圖像展示在pyqt上面。
我們開創「計算機視覺協會」知識星球一年有餘,也得到很多同學的認可,我們定時會推送實踐型內容與大家分享,在星球裡的同學可以隨時提問,隨時提需求,我們都會及時給予回復及給出對應的答覆。如果想加入我們「計算機視覺研究院」,請掃二維碼加入我們。我們會按照你的需求將你拉入對應的學習群!