一款系统能识别逐渐朝你走来的老板,并且自动隐藏正在浏览的屏幕

电子说

1.3w人已加入

描述

在当下网络发达的时代,我们很难抵挡信息的冲击,上班时间总想偷偷刷个微博、看个新闻啥的,才能走在潮流前线嘛!然而此时此刻,最怕老板悄咪咪出现在身后,恐怖指数可以和门外突然出现的班主任相比。

一身冷汗之后,手忙脚乱马上切换屏幕!假装努力工作!但是一切都太晚了,你的小动作都被老板看在眼里、记在心中……

所以,为了躲避老板的监控,日本一程序员自制了一款系统,能识别逐渐朝你走来的老板,并且自动隐藏正在浏览的屏幕。

具体来说,系统使用了基于Keras的神经网络学习辨认人脸,网络摄像头用于判断目标对象是否靠近,并基于判断切换屏幕。以下是论智对这一项目的编译。

任务概述

这一任务的目标是当老板靠近我的时候,屏幕可以自动切换到与工作有关的内容。我和老板的位置大致如下:

神经网络

从他的座位到我的座位大约有6~7米的距离,这之间只需要4~5秒的时间。所以我必须让系统在几秒内完成一系列动作。

制定策略

首先,让电脑通过深度学习掌握老板的脸。然后,在我的工位上设置一个摄像头,当捕捉到老板的脸时,屏幕可以自动切换。我将这套系统称为“老板感应器(Boss Sensor)”,简直完美!

系统架构

“老板感应器”的简单结构如下:

神经网络

摄像头能实时拍摄图像

经过学习的模型从拍摄图像中检测并认出老板的脸

确认之后切换屏幕

简单地说就是拍照、辨认、转换屏幕。让我们一步一步的解释。

拍摄人脸照片

在这里,我用的是BUFFALO BSW20KM11BK作为拍摄工具。

你也可以用相机自带的软件进行拍摄,但是考虑到后期的处理,用自制的程序拍摄会更好。同样,因为接下来会处理人脸识别,所以需要把画面切割成只有人脸的部分。所以我用Python和OpenCV捕捉人脸图像。代码在这里:github.com/Hironsan/BossSensor/blob/master/camera_reader.py

结果我得到了比我想象中更清晰的照片。

认出老板的脸

接下来,我们用机器学习分三步识别出老板的面容:

收集照片

对照片进行预处理

建立机器学习模型

收集照片

首先,我需要收集大量老板的照片用作学习,其中收集方法有三种:

谷歌搜索

从Facebook搜索

拍视频

前面两种方法能找到的照片很少,所以我用拍摄视频的方法,再将视频分解成许多照片。

预处理照片

虽然我得到了大量面部图片,但是学习模型并不能达到预期效果。这是因为照片中还有和面部无关的内容,所以我们要裁剪掉无关内容,只留下面部。这里我用到的是ImageMagick(www.imagemagick.org/script/index.php)。

最终收集到的面部照片如下:

神经网络

现在要开始让模型学习了!

建立机器学习模型

Keras用来建立卷积神经网络(CNN),TensorFlow用作Keras的后端。如果只用来识别面部,你可以请求类似Computer Vision API的网络API进行图片识别,但是这次我决定自己DIY。

网络的框架如下所示。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

代码在这里:github.com/Hironsan/BossSensor/blob/master/boss_train.py

目前为止,只要老板出现在摄像机镜头下,系统就能认出他。

切换屏幕

现在,学习过的模型可以认出老板的脸了,下一步就是切换屏幕。首先放一张假装在工作时候的照片,因为我是程序员,所以以下是我的工作常态:

如果想全屏显示这张图片,可以用PyQt,代码在这里:github.com/Hironsan/BossSensor/blob/master/image_show.py

OK,一切准备就绪。

成品展示

把上面的技术结合在一起,我们的工作就完成了。接下来让我们试验一下。

老板离开了他的座位并向我走来

OpenCV检测到了他的脸然后向模型中输入了图片

屏幕切换成功!

结论

目前我用OpenCV进行面部识别,但是由于OpenCV的准确性不高,我打算尝试一下Dlib提高准确度。我还想试一下自己训练的人脸检测模型。另外,由于摄像头捕捉到的画面也并不准确,我会对此加以改进。

后记

目前知乎上有人已经做出了该项目的Demo,加以改进后可以直接把老板来了的信息发送到手机上。
 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分