當前位置:
首頁 > 最新 > 用深度學習技術,讓你的眼睛可以控制電腦

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

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

翻譯 | 陶玉龍、老趙 校對 | Lamaric 審核 | Lamaric

GIF

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

註:在你閱讀完本文之後,我邀請你繼續閱讀那些後續專為實現細節而寫的帖子(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

提取眼睛的步驟

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

**注意除了下面的 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 來探測圖像中的眼睛,如何清理圖像以及如何使用圖像差異來幫助進行運動相關的物體。

我們也看到了怎樣人工擴展數據集和使用深度神經網路來擬合數據通過卷積層,全連接層和遞歸層。

我希望你喜歡這個研究,很高興聽到你的反饋。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 AI科技評論 的精彩文章:

從 Google Trends,看各大深度學習框架使用熱度
清華大學Thinker團隊在VLSI 2018發表兩款極低功耗AI晶元

TAG:AI科技評論 |