(点击
上方蓝字
,快速关注我们)
来源:伯乐在线专栏作者 - Ivyw
如有好文章投稿,请点击 → 这里了解详情
如需转载,发送「转载」二字查看说明
简介
当你工作的时候,肯定会浏览一些与工作无关的东西,别说你没有过。
这时被老板发现就太尴尬了。当然,我也可以马上切换桌面,但这种举动太可疑了,而且有的时候我根本没注意到老板来了。为了表现得不是那么刻意,我做了个人脸识别程序,老板过来的时候自动隐藏桌面内容。
具体来说,我用
Keras
来实现面部识别的神经网络,用网络摄像头来判断他是否正在接近,然后切换画面。
任务
这个程序的目的是在发现老板接近时自动切换电脑桌面。
场景如下:
老板和我的座位之间隔着 6、7 米,他离开座位后大概 4、5 秒钟到达我的工位。因此必须在这个时间内切换好桌面,时间紧迫!
策略
可能你们会有很多办法,以下是我的个人对策。
首先,让电脑用深度学习的技术记住老板的脸;然后在我的工位安装一个网络摄像头,一旦捕捉到老板的脸就迅速切换桌面。我认为这是个很完美的策略,姑且称它为
Boss Sensor
(老板识别器)吧。
系统架构
Boss Sensor 的系统架构如下所示。
-
网络摄像头捕捉实时画面。
-
学习模型对捕捉画面的面部进行检测和识别。
-
识别出老板的面部后,切换桌面。
这个过程用到了如下技术:
让我们一步一步分解一下。
捕捉面部画面
首先,用网络摄像头捕捉画面。
我用的是 BUFFALO BSW20KM11BK。
你也可以用电脑软件自带的摄像头,但是考虑到接下来的步骤,最好是可以直接获得图像。由于接下来需要进行面部识别,所以需要对图像进行剪裁。我用 Python 和 OpenCV 获取面部图像。这是代码:
脸部图像比预期的更清晰。
面部识别
接下来,我们用机器学习来确保电脑可以识别出老板的脸。
这个过程需要分三步:
让我们一步一步分解一下。
图像收集
首先,
-
从 Google 搜索图像
-
从 Facebook 收集图像
-
拍摄视频
最开始,我试着从网页搜索和 Facebook 收集图像,但数量远远不够。后来我拍摄了一段视频并把视频分解成无数个图像。
图像预处理
我收集到了足够多的图片,但是里面除去面部还有很多无关的部分,所以学习模型无法准确识别。我们把面部单独剪裁出来即可。
我主要使用 ImageMagick 进行提取。通过 ImageMagick 切割来获得面部图像。
然后我收集到了如下的面部图像:
可能我是世界上收藏老板照片最多的人,估计比他爸妈还要多。
接下来构建学习模型。
构建机器学习模型
我用 Keras 来搭建卷积神经网络(CNN),CNN 可以用来进行训练。Keras 的后端使用了 TensorFlow。如果你只需要识别面部,可以调用 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
)