r3210110 发表于 2017-7-16 03:10:35

如何做到老板来了就自动切换桌面(含源码)

简介

当你工作的时候,肯定会浏览一些与工作无关的东西,别说你没有过。

这时被老板发现就太尴尬了。当然,我也可以马上切换桌面,但这种举动太可疑了,而且有的时候我根本没注意到老板来了。为了表现得不是那么刻意,我做了个人脸识别程序,老板过来的时候自动隐藏桌面内容。

具体来说,我用 Keras 来实现面部识别的神经网络,用网络摄像头来判断他是否正在接近,然后切换画面。

任务

这个程序的目的是在发现老板接近时自动切换电脑桌面。

场景如下:
http://ww4.sinaimg.cn/mw690/6941baebgw1fbtwbd0ljbj20my0h90u2.jpg
老板和我的座位之间隔着 6、7 米,他离开座位后大概 4、5 秒钟到达我的工位。因此必须在这个时间内切换好桌面,时间紧迫!

策略

可能你们会有很多办法,以下是我的个人对策。

首先,让电脑用深度学习的技术记住老板的脸;然后在我的工位安装一个网络摄像头,一旦捕捉到老板的脸就迅速切换桌面。我认为这是个很完美的策略,姑且称它为 Boss Sensor(老板识别器)吧。
http://wx3.sinaimg.cn/mw690/6941baebgy1fbtwbckz3dj20yo0l0ju8.jpg
系统架构

Boss Sensor 的系统架构如下所示。
http://wx1.sinaimg.cn/mw690/6941baebgy1fbtwbar03kj20sg0chgq0.jpg
网络摄像头捕捉实时画面。
学习模型对捕捉画面的面部进行检测和识别。
识别出老板的面部后,切换桌面。
这个过程用到了如下技术:

捕捉面部画面
面部识别
切换桌面
让我们一步一步分解一下。

捕捉面部画面

首先,用网络摄像头捕捉画面。

我用的是 BUFFALO BSW20KM11BK。
http://ww1.sinaimg.cn/mw690/6941baebgw1fbtwbc23b4j20hs0a0wf7.jpg
你也可以用电脑软件自带的摄像头,但是考虑到接下来的步骤,最好是可以直接获得图像。由于接下来需要进行面部识别,所以需要对图像进行剪裁。我用 Python 和 OpenCV 获取面部图像。这是代码:

BossSensor/camera_reader.py
複製代碼https://github.com/Hironsan/BossSensor/blob/master/camera_reader.py

脸部图像比预期的更清晰。
http://ww4.sinaimg.cn/mw690/6941baebgw1fbtwba4g2uj20e0098gmz.jpg
面部识别

接下来,我们用机器学习来确保电脑可以识别出老板的脸。
这个过程需要分三步:

图像收集
图像预处理
构建机器学习模型
让我们一步一步分解一下。

图像收集

首先,

从 Google 搜索图像
从 Facebook 收集图像
拍摄视频
最开始,我试着从网页搜索和 Facebook 收集图像,但数量远远不够。后来我拍摄了一段视频并把视频分解成无数个图像。

图像预处理

我收集到了足够多的图片,但是里面除去面部还有很多无关的部分,所以学习模型无法准确识别。我们把面部单独剪裁出来即可。

我主要使用 ImageMagick 进行提取。通过 ImageMagick 切割来获得面部图像。

ImageMagick
複製代碼http://www.imagemagick.org/script/index.php

然后我收集到了如下的面部图像:
http://ww1.sinaimg.cn/mw690/6941baebgw1fbtwbbnwlij20hs0cb3zb.jpg
可能我是世界上收藏老板照片最多的人,估计比他爸妈还要多。

接下来构建学习模型。

构建机器学习模型

我用 Keras 来搭建卷积神经网络(CNN),CNN 可以用来进行训练。Keras 的后端使用了 TensorFlow。如果你只需要识别面部,可以调用 Web API 进行图像识别,如 Cognitive Services 中的 Computer Vision API,但是考虑到实时性,我决定自己编写。

以下是网络的架构。Keras 可以很方便地展示出架构。
複製代碼
======================================
Layer (type)                  Output Shape          Param #    Connected to

======================================
convolution2d_1 (Convolution2D)(None, 32, 64, 64)    896      convolution2d_input_1

activation_1 (Activation)      (None, 32, 64, 64)    0          convolution2d_1

convolution2d_2 (Convolution2D)(None, 32, 62, 62)    9248      activation_1

activation_2 (Activation)      (None, 32, 62, 62)    0          convolution2d_2

maxpooling2d_1 (MaxPooling2D)    (None, 32, 31, 31)    0          activation_2

dropout_1 (Dropout)            (None, 32, 31, 31)    0          maxpooling2d_1

convolution2d_3 (Convolution2D)(None, 64, 31, 31)    18496      dropout_1

activation_3 (Activation)      (None, 64, 31, 31)    0          convolution2d_3

convolution2d_4 (Convolution2D)(None, 64, 29, 29)    36928      activation_3

activation_4 (Activation)      (None, 64, 29, 29)    0          convolution2d_4

maxpooling2d_2 (MaxPooling2D)    (None, 64, 14, 14)    0          activation_4

dropout_2 (Dropout)            (None, 64, 14, 14)    0          maxpooling2d_2

flatten_1 (Flatten)            (None, 12544)      0          dropout_2

dense_1 (Dense)                  (None, 512)          6423040    flatten_1

activation_5 (Activation)      (None, 512)          0          dense_1

dropout_3 (Dropout)            (None, 512)          0          activation_5

dense_2 (Dense)                  (None, 2)            1026      dropout_3

activation_6 (Activation)      (None, 2)            0          dense_2

======================================
Total params: 6489634

这是代码:

BossSensor/boss_train.py
複製代碼https://github.com/Hironsan/BossSensor/blob/master/boss_train.py

现在,如果老板出现在摄像机镜头里就可以被识别出来了。

切换桌面

当学习模型识别出老板在接近后,就需要切换桌面了。我选择了下面这张图像来假装我在工作。

选择这样的图片是因为我是个程序员。
http://ww1.sinaimg.cn/mw690/6941baebgw1fbtwbb6xjuj20sg0hs415.jpg
我展示的仅仅是一张图片。

我希望图片可以全屏展示,所以使用了 PyQt,代码如下:

BossSensor/image_show.py
複製代碼https://github.com/Hironsan/BossSensor/blob/master/image_show.py

万事俱备了。

成品

把上面的技术整合起来就大功告成了,我已经试验过了。

“老板离开座位后向我靠近。”
http://wx3.sinaimg.cn/mw690/6941baebgy1fbtwf9ucd9j20b4082mx9.jpg
“OpenCV 检测到了老板的面部并把信息传送给学习模型。”
http://wx3.sinaimg.cn/mw690/6941baebgy1fbtwb9b0auj208c061mx3.jpg
“确定是老板后迅速切换桌面!
http://wx2.sinaimg.cn/mw690/6941baebgy1fbtweg6ftdj20b406y3yn.jpg
源代码

Boss Sensor 的源代码下载链接如下:

複製代碼https://github.com/Hironsan/BossSensor
记得赞我哦m(_ _)m

结论

这一次,我把 Web 相机的实时图像采集和 Keras 的面部识别结合起来,成功地识别老板并隐藏桌面。

目前,我用 OpenCV 进行面部检测,但由于 OpenCV 中面部检测的准确性似乎不太好,我想尝试使用 Dlib 来提高准确性。另外,我还想尝试一下自己的面部检测模型。

由于对从网络摄像机获取的图像的识别精度不太好,我还会做些改进。
页: [1]
查看完整版本: 如何做到老板来了就自动切换桌面(含源码)