大数跨境
0
0

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

快切屏,老板来了!记一次有趣的深度学习实践 阿里云云栖号
2016-12-15
0
导读:在你的工作时间,有没有上网浏览一些与你工作无关的网站呢?每当这种时候,如果我发现老板不知何时已经站在我背后时,我会感到非常尴尬。为了解决这个问题,我创建了一个使用Keras的系统,自动识别我的老板是否

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


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


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


任务


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


运用场景如下:




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


策略


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




系统架构


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


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

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

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


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


  • 拍摄脸部图像

  • 识别脸部图像

  • 切换屏幕


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


采取面部图象


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




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


BossSensor/camera_reader.py


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




识别老板的脸部


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


我们需要以下三个步骤:


  1. 收集图像

  2. 预处理图像

  3. 构建机器学习模型


让我们逐一来进行分析。


收集图像


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



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


预处理图像


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


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


ImageMagickhttp://www.imagemagick.org/script/index.php?spm=5176.100239.blogcont66464.13.GavB7h


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




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


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


构建机器学习模型


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:https://github.com/Hironsan/BossSensor?spm=5176.100239.blogcont66464.16.GavB7h


结论


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


文章原标题《Deep Learning Enables You to Hide Screen when Your Boss is Approaching》,作者:HIRONSAN,译者:friday012。文章为简译,更为详细的内容,请阅读原文。


-END-


云栖社区

ID:yunqiinsight

云计算丨互联网架构丨大数据丨机器学习丨运维

【声明】内容源于网络
0
0
阿里云云栖号
云栖官方内容平台,汇聚云栖365优质内容。
内容 3553
粉丝 0
阿里云云栖号 云栖官方内容平台,汇聚云栖365优质内容。
总阅读949
粉丝0
内容3.6k