人脸识别是深度学习最有价值也是最成熟的的应用之一。在研究环境下,人脸识别已经赶上甚至超过了人工识别的精度。一般来说,一个完整的人脸识别项目会包括两大部分:人脸检测与人脸识别。下面就我近期自己练习写的一个“粗糙”的人脸识别小项目讲起,也算是做一个学习记录。

首先 ,整个项目的框架包括四个主要的部分:(1)利用opencv从图像传感器处(比如电脑摄像头)实时的读入视频帧;(2)使用mtcnn网络做人脸检测和对齐;(3)利用facenet网络计算人脸特征,也就是embedding;(4)knn算法进行具体的人脸识别。如下图所示:

其中的mtcnn的人脸检测是很关键的一步,它检测定位的人脸准确与否直接影响到后面的特征计算与识别;facenet实际是一个对人脸进行特征编码的网络,具体的实现后面会讨论;knn的分类算法在用于真正的识别前要经过训练,训练的样本的质量好坏与数量也会对识别的 结果产生很大的影响。今天在这只讨论mtcnn网络的人脸检测对齐部分。

mtcnn网络全称为multi-task convolutinal neural network,意为多任务卷积神经网络。mtcnn由三个神经网络组成,分别是P-Net, R-Net, O-Net。在使用这些网络之前,首先要将原始图片缩放到不同尺寸,形成一个图像金字塔,接着会对每个尺寸的图片通过神经网络计算一遍。其目的在于兼顾图片中的不同大小的人脸,在统一的尺度下检测人脸。

如果你觉得这篇文章看起来稍微还有些吃力,或者想要系统地学习人工智能,那么推荐你去看床长人工智能教程。非常棒的大神之作,教程不仅通俗易懂,而且很风趣幽默。点击这里可以查看教程。

第一个网络P-Net的结构如下图所示:

P-Net的输入是一个12x12的3通道RGB图像,它的作用是要判断这个网络中是否有人脸,并且给出人脸框和关键点位置。第一个部分face classification输出的是判断是人脸的概率和不是人脸的概率,两个值加起来严格等于1;第二个部分输出的是框的精确位置,4个值分别是框的左上角二维坐标和框的高度与宽度;第三个部分输出的是人脸5个关键点:左眼,右眼,鼻子,左嘴角,右嘴角的位置的二维坐标。

第二个网络R-Net的网络结构与P-Net差别不大,如下图:

除了输入大小与中间层大小不同,R-Net的结构与P-Net非常相似,只是在最后的输出层前多加入了一个全连接层。R-Net的输出完全与P-Net一样,同样由人脸判别,框回归,关键点位置预测三部分组成。

第三个网络O-Net结构如下:

O-Net相比R-Net在结构上又多出一个中间层,但是输出结果还是一样的。

从P-Net到R-Net,再到O-Net,网络输入的图片越来越大,中间层的通道数越来越多,识别人脸的准确度也越来越高。实际上mtcnn的工作原理就是P-Net先做一遍过滤,将过滤后的结果交给R-Net进行过滤,最后再将过滤的结果交给O-Net进行判别。它是层层递进的一个筛查机制。

mtcnn中每个网络都有三部分输出,因此训练时损失的定义也由三部分组成。针对人脸判别face classification,使用交叉熵损失,针对框和回归点的判定,直接使用L2损失。最后这三部分损失各自乘以自身的权重再加起来,形成最后的总损失。P-Net和R-Net网络关心框位置的准确性,O-Net关心关键点判定,它们三部分的各自权重是不一样的。

mtcnn网络需要大量的人脸数据进行训练,才能得到合适的网络参数,达到较好的检测效果。在github上有已经训练好的mtcnn模型可以直接使用,点这里可以直达。其中的src/align/detect_face.py与det1.npy,det2.npy,det3.npy就是mtcnn网络的结构与训练模型,可以直接使用。

测试mtcnn的部分代码:


  1. def test():
  2. video = cv2.VideoCapture(0)
  3. print('Creating networks and loading parameters')
  4. with tf.Graph().as_default():
  5. gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=1.0)
  6. sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options, log_device_placement=False))
  7. with sess.as_default():
  8. pnet, rnet, onet = detect_face.create_mtcnn(sess, None)
  9. minsize = 20 
  10. threshold = [0.6, 0.7, 0.7
  11. factor = 0.709
  12. while True:
  13. ret, frame = video.read()
  14. bounding_boxes, _ = detect_face.detect_face(frame, minsize, pnet, rnet, onet, threshold, factor)
  15. nrof_faces = bounding_boxes.shape[0]
  16. print('找到人脸数目为:{}'.format(nrof_faces))
  17. for face_position in bounding_boxes:
  18. face_position = face_position.astype(int)
  19. cv2.rectangle(frame, (face_position[0], face_position[1]),(face_position[2], face_position[3]), (0, 255, 0), 2)
  20. cv2.imshow('show', frame)
  21. if cv2.waitKey(5) & 0xFF == ord('q'):
  22. break
  23. video.release()
  24. cv2.destroyAllWindows()
  • 1

经过测试,mtcnn的实时性和准确性都非常好。

TensorFlow框架做实时人脸识别小项目相关推荐

  1. GitHub 6大热门实时人脸识别开源项目!哪个最适合初级开发者?

    实时人脸识别系统在计算机视觉领域仍然是一个非常热门的话题,许多公司已经开发了自己的解决方案来尝试进入不断增长的市场. 与传统的识别方法相比,实时人脸识别系统的优势在于在连续帧中使用同一个人的多个实例. ...

  2. Python Day 70 利用Django框架做的一个bbs小项目

    ##项目开发流程 #1.项目需求分析产品经理+架构师+开发经理/组长 去到客户的公司谈需求(博弈的过程) #2.项目架构设计 架构师设计(数据库(主库:MySQL,从库:redis,mongodb), ...

  3. 基于python,虹软sdk3.0实现的实时人脸识别

    前言: 虹软sdk3.0是目前用过的最方便,效果最好的且免费的离线人脸识别SDK. 提供的编程语音没有python,有大佬用c++代码接口转成python调用的, 我在此基础上完善了一些功能,能够实现 ...

  4. gpu训练cnn人脸识别准确率_opencv+mtcnn+facenet+python+tensorflow 实现实时人脸识别

    opencv+mtcnn+facenet+python+tensorflow 实现实时人脸识别 Abstract:本文记录了在学习深度学习过程中,使用opencv+mtcnn+facenet+pyth ...

  5. mtcnn人脸检测python_opencv+mtcnn+facenet+python+tensorflow 实现实时人脸识别

    Abstract:本文记录了在学习深度学习过程中,使用opencv+mtcnn+facenet+python+tensorflow,开发环境为ubuntu18.04,实现局域网连接手机摄像头,对目标人 ...

  6. 个人学习日志——树莓派实时人脸识别项目

    这是我运行的第一个项目,源代码来自于GitHub.第一次接触树莓派,python编程 学习目标: 1.了解树莓派的python基础知识 2.了解程序如何运行 3.了解程序的框架 4.如何调用接口 硬件 ...

  7. opencv python 人脸识别 相似度_OpenCV+Tensorflow实现实时人脸识别演示

    原标题:OpenCV+Tensorflow实现实时人脸识别演示 Facenet网络介绍 FaceNet是谷歌提出的人脸识别模型,它跟其他人脸识别模型最大的一个不同就是它不是一个中间层输出,而是直接在欧 ...

  8. python人脸识别库_基于facenet的实时人脸识别系统

    facenet_facerecognition opencv+mtcnn+facenet+python+tensorflow 实现实时人脸识别 Abstract:本文记录了在学习深度学习过程中,使用o ...

  9. 微信小程序 |基于百度AI从零实现人脸识别小程序

    写在前面 针对互联网上已有的人脸识别小程序项目,很多只是基于手动拍照,然后上传到SDK进行识别.这一过程完全脱离实际场景!无法直接使用! 本文项目是基于微信摄像头中的实时视频帧数据,通过实时动态识别小 ...

最新文章

  1. python恶搞表情包-用 Python 把你的朋友变成表情包
  2. Compmgmtlauncher.exe问题解决方法
  3. 【SpringBoot零基础案例07】【IEDA 2021.1】多环境下.yml/.yaml配置文件的使用
  4. 【PKUWC2018】随机算法【状压dp】【组合计数】
  5. github 公钥 私钥_理解公钥与私钥
  6. 马尔可夫链蒙特卡罗法(Markov Chain Monte Carlo,MCMC)
  7. 详解NLP技术中的:预训练模型、图神经网络、模型压缩、知识图谱
  8. 互联网早报 | 3月16日 星期二 | 微信AI直播助理开放内测;汽车之家港交所挂牌上市;美团App内测“群聊”功能...
  9. npm以及gulp相关操作
  10. javascript Control flow(控制语句)
  11. 入我新美大的Java后台开发面试题总结
  12. 超详细!使用 LVS 实现负载均衡原理及安装配置详解
  13. 使c语言程序变成流程图的软件6,下载_AutoFlowchart(C语言流程图生成器) V3.5.3 英文版_6z6z下载站...
  14. Qt随机数生成器:QRandomGenerator
  15. 【学习笔记】数据结构-单链表
  16. 操作系统——大题——空闲分区表问题
  17. conda安装python虚拟环境+配置channels
  18. RPG游戏制作-02-游戏世界主角的诞生
  19. 智能家居云服务器设计规格
  20. VISUAL STUDIO入门使用教程

热门文章

  1. 在线Excel转公式工具
  2. java实现数字签名算法
  3. 三星泰泽Tizen系统挑战Android系统
  4. Some Self-limited Belief in my Machine Learning Goals
  5. 如何制作绿盾终端静默安装包
  6. 物联网RFID测试点-方向
  7. Ubuntu磁盘扩展
  8. Echarts绘制乡镇地图方法心得
  9. ae编程语言as_【微教程】从编程的思路学习AE表达式
  10. 单片机脉冲微盘_单片机产生脉冲波