摸魚神器:用深度學習實現老闆靠近自動切屏

在當下網絡發達的時代,我們很難抵擋信息的衝擊,上班時間總想偷偷刷個微博、看個新聞啥的,才能走在潮流前線嘛!然而此時此刻,最怕老闆悄咪咪出現在身後,恐怖指數可以和門外突然出現的班主任相比。

摸魚神器:用深度學習實現老闆靠近自動切屏

一身冷汗之後,手忙腳亂馬上切換屏幕!假裝努力工作!但是一切都太晚了,你的小動作都被老闆看在眼裡、記在心中……

所以,為了躲避老闆的監控,日本一程序員自制了一款系統,能識別逐漸朝你走來的老闆,並且自動隱藏正在瀏覽的屏幕。

具體來說,系統使用了基於Keras的神經網絡學習辨認人臉,網絡攝像頭用於判斷目標對象是否靠近,並基於判斷切換屏幕。以下是論智對這一項目的編譯。

任務概述

這一任務的目標是當老闆靠近我的時候,屏幕可以自動切換到與工作有關的內容。我和老闆的位置大致如下:

摸魚神器:用深度學習實現老闆靠近自動切屏

從他的座位到我的座位大約有6~7米的距離,這之間只需要4~5秒的時間。所以我必須讓系統在幾秒內完成一系列動作。

制定策略

首先,讓電腦通過深度學習掌握老闆的臉。然後,在我的工位上設置一個攝像頭,當捕捉到老闆的臉時,屏幕可以自動切換。我將這套系統稱為“老闆感應器”,簡直完美!

摸魚神器:用深度學習實現老闆靠近自動切屏

系統架構

“老闆感應器”的簡單結構如下:

摸魚神器:用深度學習實現老闆靠近自動切屏

  • 攝像頭能實時拍攝圖像
  • 經過學習的模型從拍攝圖像中檢測並認出老闆的臉
  • 確認之後切換屏幕

簡單地說就是拍照、辨認、轉換屏幕。讓我們一步一步的解釋。

拍攝人臉照片

在這裡,我用的是BUFFALO BSW20KM11BK作為拍攝工具。

摸魚神器:用深度學習實現老闆靠近自動切屏

結果我得到了比我想象中更清晰的照片。

摸魚神器:用深度學習實現老闆靠近自動切屏

認出老闆的臉

接下來,我們用機器學習分三步識別出老闆的面容:

  • 收集照片
  • 對照片進行預處理
  • 建立機器學習模型

收集照片

首先,我需要收集大量老闆的照片用作學習,其中收集方法有三種:

  • 谷歌搜索
  • 從Facebook搜索
  • 拍視頻

前面兩種方法能找到的照片很少,所以我用拍攝視頻的方法,再將視頻分解成許多照片。

預處理照片

雖然我得到了大量面部圖片,但是學習模型並不能達到預期效果。這是因為照片中還有和麵部無關的內容,所以我們要裁剪掉無關內容,只留下面部。這裡我用到的是ImageMagick。

最終收集到的面部照片如下:

摸魚神器:用深度學習實現老闆靠近自動切屏

現在要開始讓模型學習了!

建立機器學習模型

Keras用來建立卷積神經網絡(CNN),TensorFlow用作Keras的後端。如果只用來識別面部,你可以請求類似Computer Vision API的網絡API進行圖片識別,但是這次我決定自己DIY。

網絡的框架如下所示。Keras非常方便,因為它能非常容易地輸出這一結構:

____________________________________________________________________________________________________Layer (type) Output Shape Param # Connected to ====================================================================================================convolution2d_1 (Convolution2D) (None, 32, 64, 64) 896 convolution2d_input_1[0][0] ____________________________________________________________________________________________________activation_1 (Activation) (None, 32, 64, 64) 0 convolution2d_1[0][0] ____________________________________________________________________________________________________convolution2d_2 (Convolution2D) (None, 32, 62, 62) 9248 activation_1[0][0] ____________________________________________________________________________________________________activation_2 (Activation) (None, 32, 62, 62) 0 convolution2d_2[0][0] ____________________________________________________________________________________________________maxpooling2d_1 (MaxPooling2D) (None, 32, 31, 31) 0 activation_2[0][0] ____________________________________________________________________________________________________dropout_1 (Dropout) (None, 32, 31, 31) 0 maxpooling2d_1[0][0] ____________________________________________________________________________________________________convolution2d_3 (Convolution2D) (None, 64, 31, 31) 18496 dropout_1[0][0] ____________________________________________________________________________________________________activation_3 (Activation) (None, 64, 31, 31) 0 convolution2d_3[0][0] ____________________________________________________________________________________________________convolution2d_4 (Convolution2D) (None, 64, 29, 29) 36928 activation_3[0][0] ____________________________________________________________________________________________________activation_4 (Activation) (None, 64, 29, 29) 0 convolution2d_4[0][0] ____________________________________________________________________________________________________maxpooling2d_2 (MaxPooling2D) (None, 64, 14, 14) 0 activation_4[0][0] ____________________________________________________________________________________________________dropout_2 (Dropout) (None, 64, 14, 14) 0 maxpooling2d_2[0][0] ____________________________________________________________________________________________________flatten_1 (Flatten) (None, 12544) 0 dropout_2[0][0] ____________________________________________________________________________________________________dense_1 (Dense) (None, 512) 6423040 flatten_1[0][0] ____________________________________________________________________________________________________activation_5 (Activation) (None, 512) 0 dense_1[0][0] ____________________________________________________________________________________________________dropout_3 (Dropout) (None, 512) 0 activation_5[0][0] ____________________________________________________________________________________________________dense_2 (Dense) (None, 2) 1026 dropout_3[0][0] ____________________________________________________________________________________________________activation_6 (Activation) (None, 2) 0 dense_2[0][0] ====================================================================================================Total params: 6489634

目前為止,只要老闆出現在攝像機鏡頭下,系統就能認出他。

切換屏幕

現在,學習過的模型可以認出老闆的臉了,下一步就是切換屏幕。首先放一張假裝在工作時候的照片,因為我是程序員,所以以下是我的工作常態:

摸魚神器:用深度學習實現老闆靠近自動切屏

如果想全屏顯示這張圖片,可以用PyQt。

OK,一切準備就緒。

成品展示

把上面的技術結合在一起,我們的工作就完成了。接下來讓我們試驗一下。

摸魚神器:用深度學習實現老闆靠近自動切屏

老闆離開了他的座位並向我走來

摸魚神器:用深度學習實現老闆靠近自動切屏

OpenCV檢測到了他的臉然後向模型中輸入了圖片

摸魚神器:用深度學習實現老闆靠近自動切屏

屏幕切換成功!

結論

目前我用OpenCV進行面部識別,但是由於OpenCV的準確性不高,我打算嘗試一下Dlib提高準確度。我還想試一下自己訓練的人臉檢測模型。

另外,由於攝像頭捕捉到的畫面也並不準確,我會對此加以改進。


分享到:


相關文章: