专栏名称: Python开发者
人生苦短,我用 Python。伯乐在线旗下账号「Python开发者」分享 Python 相关的技术文章、工具资源、精选课程、热点资讯等。
目录
相关文章推荐
Python开发者  ·  OpenAI ... ·  昨天  
Python中文社区  ·  “快得飞起,不卡不掉线!”量化交易必备的De ... ·  17 小时前  
Python爱好者社区  ·  《Machine Learning ... ·  2 天前  
Python中文社区  ·  三年稳赚40倍!用布林带挤压策略跑赢特斯拉 ·  2 天前  
Python爱好者社区  ·  DeepSeek彻底爆了! ·  4 天前  
51好读  ›  专栏  ›  Python开发者

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

Python开发者  · 公众号  · Python  · 2017-01-21 20:34

正文

(点击 上方蓝字 ,快速关注我们)


来源:伯乐在线专栏作者 - Ivyw

如有好文章投稿,请点击 → 这里了解详情

如需转载,发送「转载」二字查看说明


简介


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


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


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


任务


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


场景如下:



老板和我的座位之间隔着 6、7 米,他离开座位后大概 4、5 秒钟到达我的工位。因此必须在这个时间内切换好桌面,时间紧迫!


策略


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


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



系统架构


Boss Sensor 的系统架构如下所示。



  • 网络摄像头捕捉实时画面。

  • 学习模型对捕捉画面的面部进行检测和识别。

  • 识别出老板的面部后,切换桌面。


这个过程用到了如下技术:


  • 捕捉面部画面

  • 面部识别

  • 切换桌面


让我们一步一步分解一下。


捕捉面部画面


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


我用的是 BUFFALO BSW20KM11BK。



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


  • BossSensor/camera_reader.py


脸部图像比预期的更清晰。



面部识别


接下来,我们用机器学习来确保电脑可以识别出老板的脸。

这个过程需要分三步:


  • 图像收集

  • 图像预处理

  • 构建机器学习模型


让我们一步一步分解一下。


图像收集


首先,


  • 从 Google 搜索图像

  • 从 Facebook 收集图像

  • 拍摄视频


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


图像预处理


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


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


  • ImageMagick


然后我收集到了如下的面部图像:



可能我是世界上收藏老板照片最多的人,估计比他爸妈还要多。


接下来构建学习模型。


构建机器学习模型


我用 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 [ 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 )







请到「今天看啥」查看全文