本文由北邮@爱可可-爱生活 老师推荐,阿里云组织翻译。以下为译文:
介绍
在你的工作时间,有没有上网浏览一些与你工作无关的网站呢?
每当这种时候,如果我发现老板不知何时已经站在我背后时,我会感到非常尴尬。当然,我可以迅速地切换屏幕,但这种行为实在是太可疑了,更何况有时我都不会注意到他已经在那了。所以,为了解决这个问题,我创建了一个使用Keras的系统,它能自动识别我的老板是否正在接近我的座位并及时切换我电脑的屏幕。
具体来说,Keras运用于神经网络来学习我老板的脸部,同时网络摄像头用于识别他是否正在接近我的作为,并切换屏幕。
任务
这个系统的任务就是当我的老板接近我时,自动切换屏幕。
运用场景如下:
老板的座位到我的座位大约6到7米。 他在离开座位后4,5秒内可以到达我的座位。 因此,在此这段时间内需要完成屏幕的切换。
策略
这里有多种策略可以选择,而我选择的策略是跟随。首先,让计算机深入学习老板的面部。 然后,在我的桌子上设置一个网络摄像头,当网络摄像头捕捉到他的脸部时切换屏幕。 这是一个完美的策略。 让我们称之为奇妙的老板探测(Boss Sensor)系统。
系统架构
Boss Sensor的简单系统架构如下。
•网络摄像机实时拍摄图像。
•经过学习的脸部识别模型检测并识别所拍摄的面部图像。
•如果识别结果是我的老板则进行屏幕切换。
我们需要以下技术来完成行以上操作:
•拍摄脸部图像
•识别脸部图像
•切换屏幕
让我们逐一完成,然后在最后进行整合。
采取面部图象
首先,用网络摄像头拍摄脸部图像。 我用的是BUFFALO BSW20KM11BK网络摄像头
你也可以使用附带的软件从相机拍摄图像,但最好能够从程序中采取,因为考虑到后面的处理。 此外,由于在随后的处理中需要进行面部识别,因此仅需要剪切面部图像。 所以,我使用Python和OpenCV来拍摄脸部图像。 下面是代码:
我能够获得比预期更清晰的脸部图像。
识别老板的脸部
接下来,我们使用机器学习来让计算机能够识别老板的脸。
我们需要以下三个步骤:
1.收集图像
2.预处理图像
3.构建机器学习模型
让我们逐一来进行分析。
收集图像
首先,我需要收集大量的图像来进行学习。 作为一种收集方法,我使用了以下资源:
•Google图片搜索
•Facebook上的图像收集
•拍摄视频
最初,我用网上搜索和Facebook收集图像,但并没有收集到足够多的图像。 所以,我使用摄像机拍摄视频,并将视频分解出大量的图像。
预处理图像
现在我有了足够多的面部图像,但学习模型不能直接对他们进行学习。这是因为图像中有大量与面部无关的信息。所以我需要先对图像进行脸部剪切。
我主要使用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
代码如下:
至此,系统可以识别出老板的面部了。
切换屏幕
现在,当学习模型识别老板的脸,我需要切换屏幕。 在这个时候,让我们显示准备好的截屏来假装工作。
我是一个程序员,所以我准备了下面的图像。
我只显示这张图片。
由于我想以全屏显示图像,所以使用了PyQt。 下面是代码:
现在,一切都准备就绪。
完成的产品
一旦我们整合所有运用到的技术,我们就大功告成了。
“我的老板离开了他的座位,他正在接近我的座位”
“OpenCV已经检测到面部并将图像输入到学习模型中。”
快切屏!
源代码
你可以从以下链接下载Boss Sensor:
结论
我结合了从Web相机的实时图像采集和面部识别使用Keras来识别我的老板和切换屏幕。目前,我用OpenCV来检测面部,但由于OpenCV中的面部检测的准确性似乎不太好,我想尝试使用Dlib来提高准确性。 另外,我还想试验一下我自己的面部检测模型。最后,由于从网络摄像机获取的图像的识别精度不太好,我还想改进这个方面。
文章原标题《Deep Learning Enables You to Hide Screen when Your Boss is Approaching》,作者:HIRONSAN,译者:friday012
文章为简译,更为详细的内容,请查看原文