在当下网络发达的时代,我们很难抵挡信息的冲击,上班时间总想偷偷刷个微博、看个新闻啥的,才能走在潮流前线嘛!然而此时此刻,最怕老板悄咪咪出现在身后,恐怖指数可以和门外突然出现的班主任相比。
一身冷汗之后,手忙脚乱马上切换屏幕!假装努力工作!但是一切都太晚了,你的小动作都被老板看在眼里、记在心中……
所以,为了躲避老板的监控,日本一程序员自制了一款系统,能识别逐渐朝你走来的老板,并且自动隐藏正在浏览的屏幕。
具体来说,系统使用了基于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,加以改进后可以直接把老板来了的信息发送到手机上。
-
神经网络
+关注
关注
42文章
4772浏览量
100823 -
深度学习
+关注
关注
73文章
5504浏览量
121212
原文标题:摸鱼神器:用深度学习实现老板靠近自动切屏
文章出处:【微信号:jqr_AI,微信公众号:论智】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论