快切屏,老板来了!记一次有趣的深度学习实践


本文由北邮@爱可可-爱生活 老师推荐,阿里云组织翻译。以下为译文:

介绍

在你的工作时间,有没有上网浏览一些与你工作无关的网站呢?

每当这种时候,如果我发现老板不知何时已经站在我背后时,我会感到非常尴尬。当然,我可以迅速地切换屏幕,但这种行为实在是太可疑了,更何况有时我都不会注意到他已经在那了。所以,为了解决这个问题,我创建了一个使用Keras的系统,它能自动识别我的老板是否正在接近我的座位并及时切换我电脑的屏幕。

具体来说,Keras运用于神经网络来学习我老板的脸部,同时网络摄像头用于识别他是否正在接近我的作为,并切换屏幕。

任务

这个系统的任务就是当我的老板接近我时,自动切换屏幕。

运用场景如下:

老板的座位到我的座位大约6到7米。 他在离开座位后4,5秒内可以到达我的座位。 因此,在此这段时间内需要完成屏幕的切换。

策略

这里有多种策略可以选择,而我选择的策略是跟随。首先,让计算机深入学习老板的面部。 然后,在我的桌子上设置一个网络摄像头,当网络摄像头捕捉到他的脸部时切换屏幕。 这是一个完美的策略。 让我们称之为奇妙的老板探测(Boss Sensor)系统。

系统架构

Boss Sensor的简单系统架构如下。

•网络摄像机实时拍摄图像。

•经过学习的脸部识别模型检测并识别所拍摄的面部图像。

•如果识别结果是我的老板则进行屏幕切换。

我们需要以下技术来完成行以上操作:

•拍摄脸部图像

•识别脸部图像

•切换屏幕

让我们逐一完成,然后在最后进行整合。

采取面部图象

首先,用网络摄像头拍摄脸部图像。 我用的是BUFFALO BSW20KM11BK网络摄像头

你也可以使用附带的软件从相机拍摄图像,但最好能够从程序中采取,因为考虑到后面的处理。 此外,由于在随后的处理中需要进行面部识别,因此仅需要剪切面部图像。 所以,我使用Python和OpenCV来拍摄脸部图像。 下面是代码:

BossSensor/camera_reader.py

我能够获得比预期更清晰的脸部图像。

识别老板的脸部

接下来,我们使用机器学习来让计算机能够识别老板的脸。

我们需要以下三个步骤:

1.收集图像

2.预处理图像

3.构建机器学习模型

让我们逐一来进行分析。

收集图像

首先,我需要收集大量的图像来进行学习。 作为一种收集方法,我使用了以下资源:

•Google图片搜索

•Facebook上的图像收集

•拍摄视频

最初,我用网上搜索和Facebook收集图像,但并没有收集到足够多的图像。 所以,我使用摄像机拍摄视频,并将视频分解出大量的图像。

预处理图像

现在我有了足够多的面部图像,但学习模型不能直接对他们进行学习。这是因为图像中有大量与面部无关的信息。所以我需要先对图像进行脸部剪切。

我主要使用ImageMagick来进行脸部提取。 通过使用ImageMagick我们可以提取图像中的面部部分。

ImageMagick

我收集到的大量面部图像如下:

也许我是这个世界上有我老板面部照片最多的人了,比他父母还多。

现在已经准备好进行机器学习了。

构建机器学习模型

Keras用于建立已经经过学习的卷积神经网络(CNN)。 TensorFlow用于Keras的后端。 如果你只识别面部,那就可以直接调用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)           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

代码如下:

BossSensor/boss_train.py

至此,系统可以识别出老板的面部了。

切换屏幕

现在,当学习模型识别老板的脸,我需要切换屏幕。 在这个时候,让我们显示准备好的截屏来假装工作。

我是一个程序员,所以我准备了下面的图像。

我只显示这张图片。

由于我想以全屏显示图像,所以使用了PyQt。 下面是代码:

BossSensor/image_show.py

现在,一切都准备就绪。

完成的产品

一旦我们整合所有运用到的技术,我们就大功告成了。

“我的老板离开了他的座位,他正在接近我的座位”

“OpenCV已经检测到面部并将图像输入到学习模型中。”

快切屏!

源代码


你可以从以下链接下载Boss Sensor:

BossSensor

结论


我结合了从Web相机的实时图像采集和面部识别使用Keras来识别我的老板和切换屏幕。目前,我用OpenCV来检测面部,但由于OpenCV中的面部检测的准确性似乎不太好,我想尝试使用Dlib来提高准确性。 另外,我还想试验一下我自己的面部检测模型。最后,由于从网络摄像机获取的图像的识别精度不太好,我还想改进这个方面。

文章原标题《Deep Learning Enables You to Hide Screen when Your Boss is Approaching》,作者:HIRONSAN,译者:friday012

文章为简译,更为详细的内容,请查看原文

时间: 2024-09-08 09:10:24

快切屏,老板来了!记一次有趣的深度学习实践的相关文章

qml-QML 如何实现多页面滑动切屏?求大神解答...

问题描述 QML 如何实现多页面滑动切屏?求大神解答... 我想要用QML实现左右滑动切屏,就像手机那样效果,求大神帮助 解决方案 http://www.qtcn.org/bbs/read-htm-tid-53204.html 这个论坛帖讨论了和你类似的问题,你可以点击进去看看. 如果回答对你有帮助,请采纳

jQuery模拟360浏览器切屏效果幻灯片(附demo源码下载)_jquery

本文实例讲述了jQuery模拟360浏览器切屏效果幻灯片,分享给大家供大家参考,具体如下: 运行效果截图如下: 点击此处查看在线演示效果. 具体代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://w

利用深度学习开发老板探测器,再也不担心刷着微博一回头突然看到老板了

如果上班的时候想放松一下,或者直说想偷偷懒,看点和工作无关的网页,这时候万一老板突然出现在背后,会不会感到很难堪呢? 有的浏览器设置了boss按键,手快的人还可以切换屏幕,不过总会显得不自然,而且经常搞的手忙脚乱的. 一个日本程序员决定自己动手,编写一个一劳永逸的办法,我们来看看他是怎么实现的吧~ 思路很直接:用网络摄像头自动识别在工位通道走过的人脸,如果确认是老板的话,就用一张写满了代码的截图覆盖到整个屏幕上. 整个工程中应用了Keras深度学习框架来建立识别人脸的神经网络,和一个网络摄像头用

用不到1000美元攒一台深度学习用的超快的电脑:继续深度学习和便宜硬件的探奇!

是的,你可以在一个39美元的树莓派板子上运行TensorFlow,你也可以在用一个装配了GPU的亚马逊EC2的节点上跑TensorFlow,价格是每小时1美元.是的,这些选择可能比你自己攒一台机器要更现实一点.但是如果你和我是一样的人,你绝对想自己攒一台奇快无比的深度学习的电脑. 好吧,一千块钱对于一个DIY项目来说是太多了.但是一旦你把机器搞定,你就能构建数百个深度学习的应用啦,从拥有增强大脑的机器人到艺术创作(至少这是我为花这些钱找的理由).最差的理由也是,这个机器至少能轻松打败那个2800

LSTM长短记,长序依赖可追忆(深度学习入门系列之十四)

系列文章一入侯门"深"似海,深度学习深几许(入门系列之一)人工"碳"索意犹尽,智能"硅"来未可知(深度学习入门系列之二)神经网络不胜语, M-P模型似可寻(深度学习入门系列之三)"机器学习"三重门,"中庸之道"趋若人(深度学习入门系列之四)Hello World感知机,懂你我心才安息(深度学习入门系列之五)损失函数减肥用,神经网络调权重(深度学习入门系列之六)山重水复疑无路,最快下降问梯度(深度学习入门系列

山重水复疑无路,最快下降问梯度(深度学习入门系列之七)

更多深度文章,请关注:https://yq.aliyun.com/cloud 系列文章: 一入侯门"深"似海,深度学习深几许(深度学习入门系列之一)人工"碳"索意犹尽,智能"硅"来未可知(深度学习入门系列之二)神经网络不胜语,M-P模型似可寻(深度学习入门系列之三)"机器学习"三重门,"中庸之道"趋若人(深度学习入门系列之四)Hello World感知机,懂你我心才安息 (深度学习入门系列之五)损失函数减肥

比深度学习快几个数量级,详解Facebook最新开源工具——fastText

Facebook声称fastText比其他学习方法要快得多,能够训练模型"在使用标准多核CPU的情况下10分钟内处理超过10亿个词汇",特别是与深度模型对比,fastText能将训练时间由数天缩短到几秒钟.   Facebook FAIR实验室在最新博客中宣布将开源资料库fastText,声称相比深度模型,fastText能将训练时间由数天缩短到几秒钟. | 使用fastText实现更快.更好的文本分类 理解人们交谈时的内容,或者敲打文章时的内容--这对于人工智能研究者来说是最大的技术

IBM 联合英伟达开发“最快的商用深度学习系统”

IBM和NVIDIA宣布将合作开发IBM PowerAI,一款可以加速训练人工智能的系统,也将会增强IBM Watson能力的软件工具. 在这周一公布的IBM PowerAI是一款训练人工智能和机器学习系统的软件工具.它所使用的是IBM一款专门为人工智能生产的服务器,并采用了NVIDIA的NVLink技术,可以把电脑学习的速度大大提高. 在提供给媒体的发布邮件中,IBM PowerAI被称为"世界上最快的商用深度学习软件",可以"帮助训练电脑更快的达到可以像人类思考和学习的境

切屏-设置configChanges后跳转再回来的问题

问题描述 设置configChanges后跳转再回来的问题 今天做视频的横竖屏切换,我添加了configChanges="orientation|keyboardHidden|screenSize",保证activity不重新创建. 但是在这个activity里我还有个listview,在点击listview后,跳转到其他页面,再返回到该activity时,listview不显示了,因为listview是在oncreat方法里创建的,返回时,不再调用oncreat方法. 应该怎么解决这