在當下網(wǎng)絡(luò)發(fā)達的時代,我們很難抵擋信息的沖擊,上班時間總想偷偷刷個微博、看個新聞啥的,才能走在潮流前線嘛!然而此時此刻,最怕老板悄咪咪出現(xiàn)在身后,恐怖指數(shù)可以和門外突然出現(xiàn)的班主任相比。
一身冷汗之后,手忙腳亂馬上切換屏幕!假裝努力工作!但是一切都太晚了,你的小動作都被老板看在眼里、記在心中……
所以,為了躲避老板的監(jiān)控,日本一程序員自制了一款系統(tǒng),能識別逐漸朝你走來的老板,并且自動隱藏正在瀏覽的屏幕。
具體來說,系統(tǒng)使用了基于Keras的神經(jīng)網(wǎng)絡(luò)學習辨認人臉,網(wǎng)絡(luò)攝像頭用于判斷目標對象是否靠近,并基于判斷切換屏幕。以下是論智對這一項目的編譯。
任務概述
這一任務的目標是當老板靠近我的時候,屏幕可以自動切換到與工作有關(guān)的內(nèi)容。我和老板的位置大致如下:
從他的座位到我的座位大約有6~7米的距離,這之間只需要4~5秒的時間。所以我必須讓系統(tǒng)在幾秒內(nèi)完成一系列動作。
制定策略
首先,讓電腦通過深度學習掌握老板的臉。然后,在我的工位上設(shè)置一個攝像頭,當捕捉到老板的臉時,屏幕可以自動切換。我將這套系統(tǒng)稱為“老板感應器(Boss Sensor)”,簡直完美!
系統(tǒng)架構(gòu)
“老板感應器”的簡單結(jié)構(gòu)如下:
攝像頭能實時拍攝圖像
經(jīng)過學習的模型從拍攝圖像中檢測并認出老板的臉
確認之后切換屏幕
簡單地說就是拍照、辨認、轉(zhuǎn)換屏幕。讓我們一步一步的解釋。
拍攝人臉照片
在這里,我用的是BUFFALO BSW20KM11BK作為拍攝工具。
你也可以用相機自帶的軟件進行拍攝,但是考慮到后期的處理,用自制的程序拍攝會更好。同樣,因為接下來會處理人臉識別,所以需要把畫面切割成只有人臉的部分。所以我用Python和OpenCV捕捉人臉圖像。代碼在這里:github.com/Hironsan/BossSensor/blob/master/camera_reader.py
結(jié)果我得到了比我想象中更清晰的照片。
認出老板的臉
接下來,我們用機器學習分三步識別出老板的面容:
收集照片
對照片進行預處理
建立機器學習模型
收集照片
首先,我需要收集大量老板的照片用作學習,其中收集方法有三種:
谷歌搜索
從Facebook搜索
拍視頻
前面兩種方法能找到的照片很少,所以我用拍攝視頻的方法,再將視頻分解成許多照片。
預處理照片
雖然我得到了大量面部圖片,但是學習模型并不能達到預期效果。這是因為照片中還有和面部無關(guān)的內(nèi)容,所以我們要裁剪掉無關(guān)內(nèi)容,只留下面部。這里我用到的是ImageMagick(www.imagemagick.org/script/index.php)。
最終收集到的面部照片如下:
現(xiàn)在要開始讓模型學習了!
建立機器學習模型
Keras用來建立卷積神經(jīng)網(wǎng)絡(luò)(CNN),TensorFlow用作Keras的后端。如果只用來識別面部,你可以請求類似Computer Vision API的網(wǎng)絡(luò)API進行圖片識別,但是這次我決定自己DIY。
網(wǎng)絡(luò)的框架如下所示。Keras非常方便,因為它能非常容易地輸出這一結(jié)構(gòu):
____________________________________________________________________________________________________
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
代碼在這里:github.com/Hironsan/BossSensor/blob/master/boss_train.py
目前為止,只要老板出現(xiàn)在攝像機鏡頭下,系統(tǒng)就能認出他。
切換屏幕
現(xiàn)在,學習過的模型可以認出老板的臉了,下一步就是切換屏幕。首先放一張假裝在工作時候的照片,因為我是程序員,所以以下是我的工作常態(tài):
如果想全屏顯示這張圖片,可以用PyQt,代碼在這里:github.com/Hironsan/BossSensor/blob/master/image_show.py
OK,一切準備就緒。
成品展示
把上面的技術(shù)結(jié)合在一起,我們的工作就完成了。接下來讓我們試驗一下。
老板離開了他的座位并向我走來
OpenCV檢測到了他的臉然后向模型中輸入了圖片
屏幕切換成功!
結(jié)論
目前我用OpenCV進行面部識別,但是由于OpenCV的準確性不高,我打算嘗試一下Dlib提高準確度。我還想試一下自己訓練的人臉檢測模型。另外,由于攝像頭捕捉到的畫面也并不準確,我會對此加以改進。
后記
目前知乎上有人已經(jīng)做出了該項目的Demo,加以改進后可以直接把老板來了的信息發(fā)送到手機上。
-
神經(jīng)網(wǎng)絡(luò)
+關(guān)注
關(guān)注
42文章
4772瀏覽量
100845 -
深度學習
+關(guān)注
關(guān)注
73文章
5504瀏覽量
121229
原文標題:摸魚神器:用深度學習實現(xiàn)老板靠近自動切屏
文章出處:【微信號:jqr_AI,微信公眾號:論智】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論