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