在Python中使用OpenCV訓練神經網路來檢測手勢!

格伯納發表於2018-12-18

在Python中使用OpenCV訓練神經網路來檢測手勢!

手勢→預測→行動

您可以在此處找到Github專案儲存庫中的程式碼,或在此處檢視最終的簡報幻燈片。

(github傳送門:

https://github.com/athena15/project_kojak

PPT傳送門:

https://docs.google.com/presentation/d/1UY3uWE5sUjKRfV7u9DXqY0Cwk6sDNSalZoI2hbSD1o8/edit#slide=id.g49b784d7df_0_2488)

靈感

想象一下,你正在舉辦一個生日聚會,每個人都玩的很開心,音樂也嗨到了極限,我們經常在抖音上看到的大聲呼喚天貓精靈、小米小愛等智慧音響的場景,在這種時候就不起作用了,很可能它們根本聽不到你的聲音,基本上你也找不到遙控器,但如果這個時候你在談話當中張開一隻手,某個手勢,你的智慧家居裝置就可以識別這種姿勢,關閉音樂,然後調亮燈光打到生日壽星的臉上。那確實是有點浪漫,也有點酷的。

背景

很長時間我都對手勢檢測感到好奇。我記得當第一部微軟Kinect問世的時候- 我只用一揮手就可以玩遊戲並控制螢幕。慢慢地,谷歌主頁和亞馬遜Alexa等裝置釋出,似乎手勢檢測失去了語音的雷達的支援。不過,隨著Facebook入口網站和亞馬遜回聲秀(Amazon Echo Show)等視訊裝置的推出,我想看看是否有可能構建一個能夠實時識別我的手勢的神經網路,並執行我的智慧家居裝置!

資料和我的早期模型

我對這個想法感到很興奮,並迅速採取了行動,就像我被射出大炮一樣。我開始在Kaggle.com上使用手勢識別資料庫,並探索資料。它由20,000個標記的手勢組成,如下面所示。

在Python中使用OpenCV訓練神經網路來檢測手勢!

奇怪的影像,但標籤豐富

當我閱讀影像時,我遇到的第一個問題是我的影像是黑白的。這意味著NumPy陣列只有一個通道而不是三個通道(即每個陣列的形狀是(224,224,1))。因此,我無法將這些影像與VGG-16預訓練模型一起使用,因為該模型需要RGB的3通道影像。這是通過在影像列表上使用np.stack解決的,X_data:

在Python中使用OpenCV訓練神經網路來檢測手勢!


一旦我克服了這個障礙,我就開始建立一個模型,使用一個訓練-測試分割,完全顯示照片10個人中的2個。在重新執行基於VGG-16架構的模型後,我的模型獲得了總體0.74的F1分數。這是非常好的,因為超過10個類的隨機猜測平均只能得到10%的準確率。

但是,訓練模型以識別來自同質資料集的影像是一回事。另一個方法是訓練它以識別以前從未見過的影像是另一種。我嘗試調整照片的光線,並使用深色背景- 模仿模特訓練過的照片。

我也嘗試過影像增強——翻轉、傾斜、旋轉等等。雖然這些影像比以前做得更好,但我仍然無法預測,而且在我看來是不可接受的——結果。我需要重新思考這個問題,並提出一種創造性的方法來使這個專案發揮作用。

要點:訓練你的模型,讓它儘可能接近真實世界中的影像

重新思考問題

我決定嘗試新的東西。在我看來,訓練資料的奇怪外觀與我的模型在現實生活中可能看到的影像之間存在明顯的脫節。我決定嘗試構建自己的資料集。

我一直在使用OpenCV,一個開源計算機視覺庫,我需要一個工程師一個解決方案,從螢幕上抓取一個影像,然後調整大小並將影像轉換成我的模型可以理解的NumPy陣列。我用來轉換資料的方法如下:

在Python中使用OpenCV訓練神經網路來檢測手勢!


簡而言之,一旦您啟動並執行相機,您可以抓取框架,對其進行轉換,並從模型中獲取預測:

在Python中使用OpenCV訓練神經網路來檢測手勢!


在網路攝像頭和我的模型之間的連線管道取得了巨大成功。我開始思考什麼是理想的影像,輸入到我的模型之中。一個明顯的障礙是很難將感興趣的區域(在我們的例子中,一隻手)與背景區分開來。

提取手勢

我採用的方法是任何熟悉Photoshop的人都熟悉的方法- 背景減法。從本質上講,如果你在你的手進入場景中先拍了一張照片,你可以建立一個“蒙版”,除了你的手之外,它將刪除新影像中的所有內容。

在Python中使用OpenCV訓練神經網路來檢測手勢!

背景掩蔽和二進位制影像閾值

一旦我從我的影像中減去背景,然後我使用二進位制閾值使目標手勢完全變白,背景完全變黑。我選擇這種方法有兩個原因:它使手的輪廓清晰明瞭,這使得模型更容易在不同膚色的使用者之間進行推廣。這創造了我最終訓練模型的照片“輪廓”般的照片。

構建新資料集

現在我可以準確地檢測到我的手中的影像,我決定嘗試新的東西。我的舊模型沒有很好地概括,我的最終目標是建立一個能夠實時識別我的手勢的模型- 所以我決定建立自己的資料集!

我選擇專注於5個手勢:

在Python中使用OpenCV訓練神經網路來檢測手勢!


我策略性地選擇了4個手勢,這些手勢也包含在Kaggle資料集中,所以我可以在以後對這些影像交叉驗證我的模型。

從這裡開始,我通過設定我的網路攝像頭來構建資料集,並在OpenCV中建立一個點選繫結來捕獲和儲存具有唯一檔名的影像。我試圖改變幀中手勢的位置和大小,這樣我的模型就會更完善。很快,我建立了一個每個包含550個輪廓影像的資料集。是的,你沒看錯,我拍攝了超過2700張圖片。

訓練新模型

然後我使用Keras和TensorFlow構建了一個卷積神經網路。我開始使用優秀的VGG-16預訓練模型,並在頂部新增了4個密集層和一個drop層。

然後,我採取了不尋常的步驟,選擇在我之前嘗試過的原始Kaggle資料集上交叉驗證我的模型。這是關鍵,如果我的新模型無法概括為之前沒有訓練過的其他人的手的影像,那麼它並不比我原來的模型好多少。

為了做到這一點,我將相同的變換應用到我應用於訓練資料的每個Kaggle影像——背景減法和二進位制閾值處理。這給了他們一個類似我的模型熟悉的“外觀”。

在Python中使用OpenCV訓練神經網路來檢測手勢!

L,好吧,Palm轉換後的Kaggle資料集手勢

結果

該車型的效能超出了我的預期。它幾乎可以對測試集中的每個手勢進行正確分類,最終獲得98%的F1分數,以及98%的精確度和準確度分數。這是個好訊息!

正如任何經驗豐富的研究人員所知道的那樣,在實驗室中表現良好而在現實生活中表現不佳的模型價值不大。在我的初始模型遇到同樣的失敗後,這個模型在實時手勢上表現良好。

智慧家居整合

在測試我的模型之前,我想補充一點,我一直都是一個智慧家居愛好者,我的願景一直是用我的手勢控制我的Sonos(無線wifi音響)和飛利浦Hue燈。為了方便地訪問Philips Hue和Sonos API,我分別使用了phue和SoCo庫。它們都非常簡單易用,如下所示:

在Python中使用OpenCV訓練神經網路來檢測手勢!


使用SoCo通過Web API控制Sonos可以說更容易:

在Python中使用OpenCV訓練神經網路來檢測手勢!


然後,我為不同的手勢建立了繫結,以便使用我的智慧家居裝置執行不同的操作:

在Python中使用OpenCV訓練神經網路來檢測手勢!


當我最終實時測試我的模型時,我對結果非常滿意。模型在絕大部分時間都準確地預測了我的手勢,並且我能夠使用這些手勢來控制燈光和音樂。有關演示,請參閱:

在Python中使用OpenCV訓練神經網路來檢測手勢!


來源:https://towardsdatascience.com/training-a-neural-network-to-detect-gestures-with-opencv-in-python-e09b0a12bdf1


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31509949/viewspace-2285569/,如需轉載,請註明出處,否則將追究法律責任。

相關文章