给你的电脑做个简单的“人脸识别认证”

2019 年 2 月 23 日 AI研习社

本文为 AI 研习社编译的技术博客,原标题 :

Simple “Face ID” for your PC

作者 | German Gensetskiy

翻译 | callofduty890              

校对 | 约翰逊·李加薪        审核 | 酱番梨       整理 | 立鱼王

原文链接:

https://medium.com/gowombat/simple-face-id-for-your-pc-780168b95321

注:本文的相关链接请点击文末【阅读原文】进行访问


在我们的办公室,锁定屏幕是您需要快速开发的习惯。 因为如果你将你的计算机解锁,有人会玩得开心并改变你的壁纸或别名你sudo( linux系统管理指令,注*文章作者使用Linux系统)的东西。
有一天,我开始思考,为什么我不能自动化呢? 在这里,我来到Face Recognition python库。 它的设置和使用非常简单。
但首先要做的事情。 我们需要检查是否可以从python锁定屏幕以及如何操作。


  锁定屏幕

我在Cinnamon桌面环境中使用Linux Mint。 幸运的是在Cinnamon案例中,使用screensaver命令锁定或解锁屏幕非常容易。

cinnamon-screensaver-command --activate  # to lock the screen
cinnamon-screensaver-command --deactivate  # to unlock the screen

从python运行终端命令并不是什么大问题:

from subprocess import call
LOCK_ARGS = {
   True: '--activate',
   False: '--deactivate',
}

def lock_screen(lock):
   call(('cinnamon-screensaver-command', LOCK_ARGS[lock]))

lock_screen(True)  # will lock the screen
lock_screen(False)  # will unlock the screen


  设置face_recognition



下一步是认出你可爱的脸。 我们将使用人脸识别库。 你可以在数据库中找到很多很好的例子,我相信一个对我们很有用。

它使用OpenCV从相机捕获流。 我还决定使用构造神经网络来定位框架中的面部。 要有更好的准确性。

from threading import Timer
import cv2
import face_recognition

def load_user_encoding():
   user_image = face_recognition.load_image_file(os.path.join(BASE_DIR, 'user.jpg'))
   user_image_face_encoding = face_recognition.face_encodings(user_image, num_jitters=10)[0]

   return user_image_face_encoding

def find_user_in_frame(frame, user_encoding):
   face_locations = face_recognition.face_locations(frame, model='cnn')
   face_encodings = face_recognition.face_encodings(frame, face_locations, num_jitters=2)

   for face_encoding in face_encodings:
       matches = face_recognition.compare_faces((user_encoding, ), face_encoding, tolerance=0.9)

       return any(matches)

if __name__ == '__main__':
   user_encoding = load_user_encoding()
   video_capture = cv2.VideoCapture(0)  # get a reference to webcam #0 (the default one)

   lock_timer = None
   process_this_frame = True
   
   while True:
       ret, frame = video_capture.read()
       small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25)
       rgb_small_frame = small_frame[:, :, ::-1]

       if process_this_frame:
           user_found = find_user_in_frame(rgb_small_frame, user_encoding)

           if user_found:
               print('user found')
               lock_screen(False)

               if lock_timer is not None:  # cancel lock timer if it exists
                   lock_timer.cancel()
                   lock_timer = None
           else:
               print('user not found')

               if lock_timer is None:  # start timer if it's not started already
                   lock_timer = Timer(5, lock_screen, (True,))
                   lock_timer.start()

       process_this_frame = not process_this_frame

如你所见,我使用threading.Timer在5秒后锁定屏幕,以防用户找不到。 我建议在锁定屏幕之前稍等一下,因为有时它无法识别某些画面上的脸部。 或者你可以暂时离开。


  优化

使用该解决方案,它有一个令人讨厌的延迟用于读取帧和坏帧。 所以我决定对其进行优化,并使用多处理将识别过程移到单独的过程中

首先,我们需要重写我们的函数来查找用户,以便它能够被Process和Pipe 调用代替返回:

def find_user_in_frame(conn, frame, user_encoding):
   face_locations = face_recognition.face_locations(frame, model='cnn')
   face_encodings = face_recognition.face_encodings(frame, face_locations, num_jitters=2)

   found_user = False
   for face_encoding in face_encodings:
       matches = face_recognition.compare_faces((user_encoding, ), face_encoding, tolerance=0.9)

       found_user = any(matches)
       if found_user:
           break

   conn.send(found_user)

在此之后我们需要调用该函数multiprocessing.Process在main中的循环当中

现在它工作更顺畅,延迟很小。

if __name__ == '__main__':
   user_encoding = load_user_encoding()
   video_capture = cv2.VideoCapture(0)  # get a reference to webcam #0 (the default one)

   lock_timer = None

   parent_conn, child_conn = Pipe()
   find_user_process = None
   while True:
       ret, frame = video_capture.read()

       small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25)

       rgb_small_frame = small_frame[:, :, ::-1]

       # if process of finding user is not working - start new one
       if find_user_process is None:
           find_user_process = Process(target=find_user_in_frame, args=(child_conn, rgb_small_frame, user_encoding))
           find_user_process.start()
       # if process of finding user is already working - check is it done
       elif find_user_process is not None and not find_user_process.is_alive():
           user_found = parent_conn.recv()
           find_user_process = None

           if user_found:
               print('user found')
               lock_screen(False)
               if lock_timer is not None:
                   lock_timer.cancel()
                   lock_timer = None
           else:
               print('user not found')
               if lock_timer is None:
                   lock_timer = Timer(LOCK_TIMEOUT, lock_screen, (True,))
                   lock_timer.start()

谢谢阅读! 希望它很有趣,你很喜欢它。

源代码可以在github上找到:https://github.com/Ignisor/face-screenlock


想要继续查看该篇文章相关链接和参考文献?

长按链接点击打开或点击底部【阅读原文】:

https://ai.yanxishe.com/page/TextTranslation/1258


AI研习社每日更新精彩内容,观看更多精彩内容:

盘点图像分类的窍门

深度学习目标检测算法综述

生成模型:基于单张图片找到物体位置

注意力的动画解析(以机器翻译为例)


等你来译:

如使用深度学习玩Pong游戏 

教程:使用iPhone相机和openCV来完成3D重建(第三部分)

高级DQNs:利用深度强化学习玩吃豆人游戏

深度强化学习新趋势:谷歌如何把好奇心引入强化学习智能体 



点击下方阅读原文,查看本文更多内容

↓↓↓ 

登录查看更多
0

相关内容

【新书】傻瓜式入门深度学习,371页pdf
专知会员服务
187+阅读 · 2019年12月28日
【新书】Python编程基础,669页pdf
专知会员服务
194+阅读 · 2019年10月10日
[综述]深度学习下的场景文本检测与识别
专知会员服务
77+阅读 · 2019年10月10日
机器学习入门的经验与建议
专知会员服务
92+阅读 · 2019年10月10日
计算机视觉最佳实践、代码示例和相关文档
专知会员服务
17+阅读 · 2019年10月9日
C# 10分钟完成百度人脸识别
DotNet
3+阅读 · 2019年2月17日
(Python)3D人脸处理工具Face3d
AI研习社
7+阅读 · 2019年2月10日
人脸识别入门实战
人工智能头条
4+阅读 · 2018年12月12日
实战 | 40行代码实现人脸识别
七月在线实验室
3+阅读 · 2018年3月7日
深度学习人脸识别系统DFace
深度学习
17+阅读 · 2018年2月14日
推荐|基于Python的人脸识别库,离线识别率高达99.38%!
全球人工智能
3+阅读 · 2017年12月25日
深度学习人脸检测和识别系统 DFace | 软件推介
开源中国
7+阅读 · 2017年12月9日
开源 | 基于Python的人脸识别:识别准确率高达99.38%!
全球人工智能
4+阅读 · 2017年7月29日
基于Python的开源人脸识别库:离线识别率高达99.38%
炼数成金订阅号
5+阅读 · 2017年7月28日
可怕,40 行代码的人脸识别实践
51CTO博客
3+阅读 · 2017年7月22日
Neural Image Captioning
Arxiv
5+阅读 · 2019年7月2日
Arxiv
3+阅读 · 2017年11月12日
VIP会员
相关VIP内容
【新书】傻瓜式入门深度学习,371页pdf
专知会员服务
187+阅读 · 2019年12月28日
【新书】Python编程基础,669页pdf
专知会员服务
194+阅读 · 2019年10月10日
[综述]深度学习下的场景文本检测与识别
专知会员服务
77+阅读 · 2019年10月10日
机器学习入门的经验与建议
专知会员服务
92+阅读 · 2019年10月10日
计算机视觉最佳实践、代码示例和相关文档
专知会员服务
17+阅读 · 2019年10月9日
相关资讯
C# 10分钟完成百度人脸识别
DotNet
3+阅读 · 2019年2月17日
(Python)3D人脸处理工具Face3d
AI研习社
7+阅读 · 2019年2月10日
人脸识别入门实战
人工智能头条
4+阅读 · 2018年12月12日
实战 | 40行代码实现人脸识别
七月在线实验室
3+阅读 · 2018年3月7日
深度学习人脸识别系统DFace
深度学习
17+阅读 · 2018年2月14日
推荐|基于Python的人脸识别库,离线识别率高达99.38%!
全球人工智能
3+阅读 · 2017年12月25日
深度学习人脸检测和识别系统 DFace | 软件推介
开源中国
7+阅读 · 2017年12月9日
开源 | 基于Python的人脸识别:识别准确率高达99.38%!
全球人工智能
4+阅读 · 2017年7月29日
基于Python的开源人脸识别库:离线识别率高达99.38%
炼数成金订阅号
5+阅读 · 2017年7月28日
可怕,40 行代码的人脸识别实践
51CTO博客
3+阅读 · 2017年7月22日
Top
微信扫码咨询专知VIP会员