酷播亮新聞
最棒的知識補給站

開發 | 用深度學習技術,讓你的眼睛可以控制電腦

文章摘要: 整體模型 最終神經網路需要用成對的影象序列作為輸入視覺特徵—摺積神經網路 爲了從影象中提取資訊

本文為 AI 研習社編譯的技術部落格,原標題 Use your eyes and Deep Learning to command your computer — A.I. Odyssey part. 2,作者為 Julien Despois。

翻譯 | 陶玉龍、老趙 校對 | Lamaric 稽覈 | Lamaric

你有沒有過這樣的經歷,當你在吃東西的時候,發現自己沒有多餘的手來調節電影的音量,或者調節螢幕的亮度?在本文,我們將看到如何使用最先進的人工智慧技術來解決這個問題,通過眼球運動把相應命令下達到你的計算機。

注:在你閱讀完本文之後,我邀請你繼續閱讀那些後續專為實現細節而寫的帖子(https://medium.com/@juliendespois/a-i-odyssey-part-2-implementation-details-f126f18bd320#.t4gpenon3)。

引言

我們想要實現什麼

這個專案的目標是用我們的眼睛來觸發計算機上的動作。這是一個非常綜合的問題,所以我們首先需要明確我們想要實現的內容。

例如,我們可以檢測眼睛什麼時候朝向特定的角落,然後從那個角度進行工作。然而,這是非常有限的,並不是很靈活,加上它需要我們對角落組合。所以作為替代,我們使用遞迴神經網路來學習識別完整的眼球運動。

資料

我們不想使用外部資料集進行工作,作為替代的,我們自己製作資料集。我們在模型的訓練和預測階段用了相同的資料來源以及處理方式,這對於我們這個專案而言具有非常大的益處。

毫無疑問,從我們的眼睛中提取資訊的最有效的方法是使用專用的特寫鏡頭。藉助於這樣的硬體,我們可以直接跟蹤瞳孔中心,從而做出各種各樣的令人驚歎的數據資料。

我不想使用外部相機,所以我決定使用我膝上型電腦破舊的720P攝像頭。

工作流程

在我們直接進入技術討論之前,讓我們回顧一下這個過程的步驟。這裏是我提出的流程:

  • 用攝像頭拍一張照片並找到眼睛。
  • 對影象進行預處理並提取重要的特徵(你是想說是利用神經網路來實現嗎?)。
  • 保持最後幾幀特徵提取的執行記錄。
  • 基於執行記錄實現眼球動作的預測。

我們將使用管道法處理影象。

我們將通過本文下述步驟來實現,讓我們開始吧!

獲取眼睛圖片

探測眼睛

直接通過攝像頭,對影象降取樣並將其轉換為灰度影象(多顏色通道會產生大量冗餘資訊),這會使得接下來的操作更加快速,有助於模型實時執行。

對於探測,我們將使用 HAAR Cascades(Haar 基於特徵的級聯分類器)( http://docs.opencv.org/trunk/d7/d8b/tutorial_py_face_detection.html ),因為它們快捷,通過簡單調整,我們可以得到良好結果,但在直接探測眼睛時會導致許多誤報。爲了消除這些影響,我們在影象中檢測人臉而不是眼睛,然後可以在人臉上找到眼睛。

一旦獲得含有眼睛的邊界框,我們可以從最初的全尺寸攝像頭抓拍中提取影象,這樣就不會丟失任何資訊了。

預處理資料

一旦找到了雙眼,我們就需要為我們的資料集處理它們。 要做到這一點,我們可以簡單地將雙眼重塑為固定正方形,24px 大小,並使用直方圖歸一化來消除陰影。

提取眼睛的步驟

然後我們可以直接使用標準化圖片作為輸入,但我們有機會做更多有用的工作。 我們計算當前幀和前一幀中眼睛之間的差異來代替使用眼睛影象。 這是一種非常有效的動作編碼方式,這是我們最終需要的。

**注意除了下面的 GIF 之外的所有圖表,我將使用眼睛圖片來表示眼睛差異,因為螢幕上的差異看起來很糟糕。**

標準化幀與幀差異之間的比較

現在我們已經處理了雙眼,我們可以選擇將它們分別視為同一類的兩個代表,或者將它們一起使用,就像它們是單個影象一樣。 我選擇後者,因為即使眼睛應該遵循完全相同的運動,兩個輸入都會使模型更加健壯。

*儘管如此,我們要做的還是比將影象拼接在一起更聰明一點。

把雙眼合在一起

建立資料集

記錄

我已經分別為兩個單獨的動作記錄了 50 個樣本(一個看起來像「gamma」,另一個看起來像「Z」)。 我試圖改變樣本的位置、比例和速度,以幫助模型的推廣。 我還新增了 50 個「idle」的例子,其中包含大致一般的無圖案的眼睛動作和靜止幀。

動作示例 – ‘gamma’、’mount’、’Z’、’idle’

不幸的是,150 個樣本對於這樣的任務來說很小,所以我們需要用新樣本來擴充資料集。

資料擴充

我們可以做的第一件事就是修復任意序列長度—100 幀。從那裏,我們可以減慢較短的樣本,加快較長的樣本。因為速度不能定義運動,所以這是可能的。

與此同時,因為在100幀的窗中可以隨時檢測到低於100幀的序列,我們可以增加填充示例。

用於滑動視窗填充低於100幀的樣本。

通過這些技術,我們可以擴充資料集大約到 1000—2000 個示例。

最終資料集

回顧一下,試著理解我們的資料。我們已經記錄了一些帶有相關標籤的樣本。每個樣本都是由一系列的兩個 24px 大小的方形影象組成。

注意每個眼睛都有一個數據集。

資料集的張量描述

模型

現在有了資料集,我們需要構建正確的模型來學習和推廣這些資料。 我們可以寫如下規格:

我們的模型應該能夠在每個時間步驟從兩個影象中提取資訊,結合這些特徵來預測用眼睛執行的運動。

如此複雜的系統要求使用一個強大的人工智慧模型—神經網路。讓我們看看怎樣建造一個符合我們需求的網路。神經網層和搭積木類似,我們只需要選擇合適的塊並把它放到合適的地方。

視覺特徵—摺積神經網路

爲了從影象中提取資訊,我們需要摺積層。這些善於處理影象獲取視覺特徵。(在第一部分已經介紹了)

我們需要分開單獨處理每隻眼睛,然後通過全連線層融合這些特徵。由此產生的摺積神經網路(CNN)會試著從雙眼中提取相關知識。

摺積神經網路—兩個並行的摺積層提取視覺特徵,然後兩者融合。

時間特徵—迴圈神經網路

現在我們對影象有一個簡單描述,我們需要依次處理它們。因此使用遞迴層—長短期記憶網路。長短期記憶網路通過當前時間步驟提取到的特徵和上一個狀態來更新它的狀態。

最後,當我們處理完這些影象序列,長短期記憶網路的狀態傳遞到softmax 分類器來預測每個動作的可能性。

整體模型

最終神經網路需要用成對的影象序列作為輸入,輸出是每個動作的可能性。其中關鍵的是我們在一個單件中建造模型,因此它可以通過後向傳播來進行端到端的訓練。

我們可以稱它為深度摺積的長短期記憶的雙遞迴神經網路,但沒人這樣說。

摺積神經網路從輸入提取特徵,由長短期記憶單元在每個步驟處理。

結果

這個訓練的模型在測試集達到 85% 以上的準確率。考慮到未擴充套件之前的訓練集非常小,這個結果是很好的。有更多的時間和貢獻,我可以記錄每一類至少 100—200 的示例,也許 3—4 個動作而不是 2 個(+空閒),這提高了效果。

唯一剩下的一步是實時使用分類器,調整它避免誤報,並實現觸發操作的邏輯(改變音量、開啟應用程式、執行巨集等)。更多的內容我會寫在後續文章。

結論

在這裏,我們已經看到如何使用 HAAR Cascades 來探測影象中的眼睛,如何清理影象以及如何使用影象差異來幫助進行運動相關的物體。

我們也看到了怎樣人工擴充套件資料集和使用深度神經網路來擬合數據通過摺積層,全連線層和遞迴層。

我希望你喜歡這個研究,很高興聽到你的反饋。 返回搜狐,檢視更多

責任編輯:

如有侵權請來信告知:酷播亮新聞 » 開發 | 用深度學習技術,讓你的眼睛可以控制電腦