簡介
當(dāng)你工作的時候,肯定會瀏覽一些與工作無關(guān)的東西,別說你沒有過。
這時被老板發(fā)現(xiàn)就太尷尬了。當(dāng)然,我也可以馬上切換桌面,但這種舉動太可疑了,而且有的時候我根本沒注意到老板來了。為了表現(xiàn)得不是那么刻意,我做了個人臉識別程序,老板過來的時候自動隱藏桌面內(nèi)容。
具體來說,我用 Keras 來實(shí)現(xiàn)面部識別的神經(jīng)網(wǎng)絡(luò),用網(wǎng)絡(luò)攝像頭來判斷他是否正在接近,然后切換畫面。
任務(wù)
這個程序的目的是在發(fā)現(xiàn)老板接近時自動切換電腦桌面。
場景如下:
老板和我的座位之間隔著 6、7 米,他離開座位后大概 4、5 秒鐘到達(dá)我的工位。因此必須在這個時間內(nèi)切換好桌面,時間緊迫!
策略
可能你們會有很多辦法,以下是我的個人對策。
首先,讓電腦用深度學(xué)習(xí)的技術(shù)記住老板的臉;然后在我的工位安裝一個網(wǎng)絡(luò)攝像頭,一旦捕捉到老板的臉就迅速切換桌面。我認(rèn)為這是個很完美的策略,姑且稱它為 Boss Sensor(老板識別器)吧。
系統(tǒng)架構(gòu)
Boss Sensor 的系統(tǒng)架構(gòu)如下所示。
- 網(wǎng)絡(luò)攝像頭捕捉實(shí)時畫面。
- 學(xué)習(xí)模型對捕捉畫面的面部進(jìn)行檢測和識別。
- 識別出老板的面部后,切換桌面。
這個過程用到了如下技術(shù):
- 捕捉面部畫面
- 面部識別
- 切換桌面
讓我們一步一步分解一下。
捕捉面部畫面
首先,用網(wǎng)絡(luò)攝像頭捕捉畫面。
我用的是 BUFFALO BSW20KM11BK。
你也可以用電腦軟件自帶的攝像頭,但是考慮到接下來的步驟,最好是可以直接獲得圖像。由于接下來需要進(jìn)行面部識別,所以需要對圖像進(jìn)行剪裁。我用 Python 和 OpenCV 獲取面部圖像。這是代碼:
- BossSensor/camera_reader.py
臉部圖像比預(yù)期的更清晰。
面部識別
接下來,我們用機(jī)器學(xué)習(xí)來確保電腦可以識別出老板的臉。
這個過程需要分三步:
- 圖像收集
- 圖像預(yù)處理
- 構(gòu)建機(jī)器學(xué)習(xí)模型
讓我們一步一步分解一下。
圖像收集
首先,
- 從 Google 搜索圖像
- 從 Facebook 收集圖像
- 拍攝視頻
最開始,我試著從網(wǎng)頁搜索和 Facebook 收集圖像,但數(shù)量遠(yuǎn)遠(yuǎn)不夠。后來我拍攝了一段視頻并把視頻分解成無數(shù)個圖像。
圖像預(yù)處理
我收集到了足夠多的圖片,但是里面除去面部還有很多無關(guān)的部分,所以學(xué)習(xí)模型無法準(zhǔn)確識別。我們把面部單獨(dú)剪裁出來即可。
我主要使用 ImageMagick 進(jìn)行提取。通過 ImageMagick 切割來獲得面部圖像。
- ImageMagick
然后我收集到了如下的面部圖像:
可能我是世界上收藏老板照片最多的人,估計(jì)比他爸媽還要多。
接下來構(gòu)建學(xué)習(xí)模型。
構(gòu)建機(jī)器學(xué)習(xí)模型
我用 Keras 來搭建卷積神經(jīng)網(wǎng)絡(luò)(CNN),CNN 可以用來進(jìn)行訓(xùn)練。Keras 的后端使用了 TensorFlow。如果你只需要識別面部,可以調(diào)用 Web API 進(jìn)行圖像識別,如 Cognitive Services 中的 Computer Vision API,但是考慮到實(shí)時性,我決定自己編寫。
以下是網(wǎng)絡(luò)的架構(gòu)。Keras 可以很方便地展示出架構(gòu)。
123456789101112131415161718192021222324252627282930313233343536373839404142======================================Layer(type)