簡介
當你工作的時候,肯定會瀏覽一些與工作無關的東西,別說你沒有過。
這時被老闆發現就太尷尬了。當然,我也可以馬上切換桌面,但這種舉動太可疑了,而且有的時候我根本沒注意到老闆來了。為了表現得不是那麼刻意,我做了個人臉識別程式,老闆過來的時候自動隱藏桌面內容。
具體來說,我用 Keras 來實現面部識別的神經網路,用網路攝像頭來判斷他是否正在接近,然後切換畫面。
任務
這個程式的目的是在發現老闆接近時自動切換電腦桌面。
場景如下:
老闆和我的座位之間隔著 6、7 米,他離開座位後大概 4、5 秒鐘到達我的工位。因此必須在這個時間內切換好桌面,時間緊迫!
策略
可能你們會有很多辦法,以下是我的個人對策。
首先,讓電腦用深度學習的技術記住老闆的臉;然後在我的工位安裝一個網路攝像頭,一旦捕捉到老闆的臉就迅速切換桌面。我認為這是個很完美的策略,姑且稱它為 Boss Sensor(老闆識別器)吧。
系統架構
Boss Sensor 的系統架構如下所示。
- 網路攝像頭捕捉實時畫面。
- 學習模型對捕捉畫面的面部進行檢測和識別。
- 識別出老闆的面部後,切換桌面。
這個過程用到了如下技術:
- 捕捉面部畫面
- 面部識別
- 切換桌面
讓我們一步一步分解一下。
捕捉面部畫面
首先,用網路攝像頭捕捉畫面。
我用的是 BUFFALO BSW20KM11BK。
你也可以用電腦軟體自帶的攝像頭,但是考慮到接下來的步驟,最好是可以直接獲得影像。由於接下來需要進行面部識別,所以需要對影像進行剪裁。我用 Python 和 OpenCV 獲取面部影像。這是程式碼:
臉部影像比預期的更清晰。
面部識別
接下來,我們用機器學習來確保電腦可以識別出老闆的臉。
這個過程需要分三步:
- 影像收集
- 影像預處理
- 構建機器學習模型
讓我們一步一步分解一下。
影像收集
首先,
- 從 Google 搜尋影像
- 從 Facebook 收集影像
- 拍攝視訊
最開始,我試著從網頁搜尋和 Facebook 收集影像,但數量遠遠不夠。後來我拍攝了一段視訊並把視訊分解成無數個影像。
影像預處理
我收集到了足夠多的圖片,但是裡面除去面部還有很多無關的部分,所以學習模型無法準確識別。我們把面部單獨剪裁出來即可。
我主要使用 ImageMagick 進行提取。通過 ImageMagick 切割來獲得面部影像。
然後我收集到了如下的面部影像:
可能我是世界上收藏老闆照片最多的人,估計比他爸媽還要多。
接下來構建學習模型。
構建機器學習模型
我用 Keras 來搭建卷積神經網路(CNN),CNN 可以用來進行訓練。Keras 的後端使用了 TensorFlow。如果你只需要識別面部,可以呼叫 Web API 進行影像識別,如 Cognitive Services 中的 Computer Vision API,但是考慮到實時性,我決定自己編寫。
以下是網路的架構。Keras 可以很方便地展示出架構。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
====================================== 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,程式碼如下:
萬事俱備了。
成品
把上面的技術整合起來就大功告成了,我已經試驗過了。
“老闆離開座位後向我靠近。”
“OpenCV 檢測到了老闆的面部並把資訊傳送給學習模型。”
“確定是老闆後迅速切換桌面!ヽ(‘ ∇‘ )ノ ワーイ”
原始碼
Boss Sensor 的原始碼下載連結如下:
- BossSensor:https://github.com/Hironsan/BossSensor
記得讚我哦m(_ _)m
結論
這一次,我把 Web 相機的實時影像採集和 Keras 的面部識別結合起來,成功地識別老闆並隱藏桌面。
目前,我用 OpenCV 進行面部檢測,但由於 OpenCV 中面部檢測的準確性似乎不太好,我想嘗試使用 Dlib 來提高準確性。另外,我還想嘗試一下自己的面部檢測模型。
由於對從網路攝像機獲取的影像的識別精度不太好,我還會做些改進。
如果你喜歡這篇文章,歡迎轉發或分享 ↓
打賞支援我翻譯更多好文章,謝謝!
打賞譯者
打賞支援我翻譯更多好文章,謝謝!