深度学习帮你“认”人—人脸模型 by wilson

一、前言:

  在6月底来到鹅厂实习,在这一个多月的时间内,主要将我之前研究的目标跟踪和人脸模型结合起来,完成一些人脸跟踪的应用。其中将之前研究的单目标跟踪(SOT, single object tracking)拓展到多目标跟踪(MOT, multi object tracking),针对人脸的应用引入人脸模型,形成针对人脸的多目标跟踪。

  在这里还是学习到不少东西的:面向业务应用的算法开发;关注预研的过程;跨任务地思考;把控时间点。

整体和在实验室的感觉是差不多的,但是要比在实验室严肃一些,需要在一段时间内要有产出,不能说像在实验室一样,研究了半年,说没研究出来成果就过了。毕竟要有kpi的要求,要对自己要求严格一些。抛开心态来说,我反而觉得实验室要求还要更严一些:周报、每周的组会等等。在这里只要简单几句话的周报就可以了,但是这句话的周报含义和实验室是差很多的。 - -!

  言归正传,这篇博文主要总结我在这段时间调研过的内容和尝试过的一些应用。其实百度一下“人脸检测、人脸识别”等等关键词也会出现很多相关博文,但是这篇主要是我在这段时间的总结。

  特别要感谢https://github.com/corberan/video_clipper,奠定了我实现的算法的基本流程,在我迷茫不知道如何完成任务的时候,提供了重要的思路。

二、主要内容:

  1. dlib: 基于C++实现的人脸应用库,具有python的接口。

  安装:https://github.com/corberan/video_clipper/wiki/Installation

  文档:http://dlib.net/python/index.html#dlib.full_object_detection

  这是个非常方便的工具,不只是人脸的相关应用,还具有很多机器学习的算法:聚类算法、svm算法等等。最突出的就是其中的人脸检测、人脸描述子模型等等。应用非常方便,简单几句代码就可以完成功能,基于C++的底层实现,决定了他的高效。

  2. MTCNN:人脸检测+对齐模型

  参考:https://blog.csdn.net/qq_36782182/article/details/83624357

  repo:FaceNet中的MTCNN-tf:https://github.com/davidsandberg/facenet/tree/master/src/align

  MTCNN-pytorch:https://github.com/kuaikuaikim/DFace

  MTCNN是中科院在2016年提出来的算法,在做图片预处理或者人脸检测应用中得到大量应用,是一个效果和运算效率都挺优秀的算法。这个算法的流程很简单,通过特征金字塔优化对不同大小目标的检测效果,后续通过三个大小不同的网络,实现从粗略到精细的检测,最后输出人脸目标框和5个人脸关键点(眼睛+鼻子+嘴巴)。但是在使用的过程中需要关注超参的设置:factor和minisize,这些决定了其中的特征金字塔的层数,对检测速率和效果有直接影响。pytorch的运行速率有60fps,但是tf的只有41。但是tf的代码知名度要高一些。

  3. 人脸识别模型

  综述文章:https://zhuanlan.zhihu.com/p/56414557https://arxiv.org/pdf/1811.00116.pdf

  论文集合:https://zhuanlan.zhihu.com/p/35339201

  人脸数据集:lfw、webFace、celebraA、youtubeFace……

  人脸模型和ReID模型是一脉相传,都是对人脸或者行人的图像提取有辨别性高鲁棒性的特征,后续用欧式距离或者余弦距离来进行度量,实现1对1或者1对N的人脸识别,是典型的度量学习。这两者模型的优化都是基于相同的思想:增强网络的表达能力:拉近相同类别的人物在特征域中的距离,拉远不同类别的人物在特征域中的距离。除了增强网络结构和引入外挂组建(attention mechanism)外,主要是针对损失函数进行改进。(这些损失函数的发展历程,非常值得参考。)

  

  

    1?? FaceNet:

    google-CVPR2015

    repo: 基于tf的官方代码:https://github.com/davidsandberg/facenet

    参考博文:(非常详细)https://zhuanlan.zhihu.com/p/24837264

    引入了三元子损失函数:triplet loss (在跟踪领域的siamese-based的跟踪器也参考了这个损失函数,最后发了ECCV2018[http://openaccess.thecvf.com/content_ECCV_2018/papers/Xingping_Dong_Triplet_Loss_with_ECCV_2018_paper.pdf]);经过主干网络和L2规范化后,得到128维的特征向量作为人脸描述子,后续通过triplet loss作为目标函数来训练。

    基本网络:

    triplet loss示意图:

    triplet loss 表达式:

    上标含义:a代表某一个样本;p代表a的正样本;n代表a的负样本,$alpha代表两个类别的最小距离,是一个自定义的阈值。+号代表是取正数,小于0则取。其实整个损失函数就是合页损失函数。triplet loss的创新点还有三元子的筛选方式:选取一个batch中距离最远的正样本和距离最近的负样本进行训练。其实这个就是构造困难负样本的方法。

    2?? CenterFace:

    ECCV2016

    repo:损失函数https://github.com/KaiyangZhou/pytorch-center-loss|基于centerloss的人脸模型:https://github.com/wujiyang/Face_Pytorch

    参考博文:https://blog.csdn.net/u014380165/article/details/76946339

    主要思想是:softmax-cross-entropy训练的结果是使不同类别的特征拉开,但是忽视相同类别的特征之间的距离。意思就是只关注不同类别的特征。center loss的目的就是将相同类别的特征的距离拉近,使相同、不相同类别的特征都具有更好的辨别性。

    softmax-cross-entropy-loss的训练结果(将特征映射到其中的某两维进行可视化):

    center loss+cross-entropy-loss的训练结果:

    center loss 表达式:

    难点在于如何决定一个类别的中心,解决方法是每个batch取计算一次中心,计算方法为:(c为中心点)

    最后center loss结合cross-entropy loss共同进行训练。这个center loss和实验室LNN学姐的center loss是类似的,但是不同之处在于类别中心的决定方法。其实center loss也就是普通discriminative loss的改进版本。如果涉及特征工程,不妨尝试一下这个损失函数,在一定程度可以弥补交叉熵损失函数的缺点。

    discriminative loss表达式:

    从表达式中可以看出,discriminative loss、center loss、triplet loss是具有很大的关联的。

    3?? Sphere face | Arc face | Cos face:(增加特征之间的角度)

      这三篇思想都是非常类似,算是同一个时期的论文

      repo(同时实现了这三篇论文): https://github.com/wujiyang/Face_Pytorch

      cosFace(基于Pytorch实现的cosFace): https://github.com/MuggleWang/CosFace_pytorch

      cosFace的论文:https://arxiv.org/pdf/1801.09414.pdf

      主要思想:

      不同于交叉熵函数、center loss和triplet loss,这三个face的损失函数将特征映射到一个球上,并且设定特征之间的cos角度之间的margin,从而增大特征之间的差异。注意这三个损失函数都是基于余弦相似度来做度量,所以在1v1或者1vN的应用中,也需要基于余弦相似度。不同之处是这三者添加margin的方法。如图所示:

      首先将全连接层的权重W和提取的特征x进行l2归一化,使得softmax-cross-entropy loss变成以角度度量分类的形式。如图所示:

      s是将特征x归一化后scale到s的长度,cos(i,j)是指特征x_i和权重W_j之间的角度差的余弦值。具体的推倒步骤,cosFace的论文中有详细的解释。SphereFace是乘性的余弦margin,cosFace和ArcFace是加性的余弦magin,加性的margin会比较容易实现和优化,其中arcFace直接将margin加在角度上,具有更好的集合解释方式,效果会更加明显。其中arcFace现在在人脸识别或者人脸验证的benchmark上,都排名第一,cosFace紧随其后,这大大说明了损失函数的主要性,基于损失函数进行小小的改进,也许会收获大大的性能提升。得到的效果如图所示:

三、一些应用:

  1?? dlib库应用:

    参考repo:https://github.com/corberan/video_clipper/blob/master/face_clustering.py

    要实现人脸识别的功能,要分为四个步骤:人脸检测、人脸对齐、人脸模型提取特征、分类器

    人脸检测

    定义cnn人脸检测器:

    face_detector = api.dlib_cnn_face_detector(models.cnn_face_detector_model_location())

    进行人脸检测:

    face_detections = face_detector(frames, 0)

    人脸对齐

    定义人脸关键点检测器:

    sp = dlib.shape_predictor(models.pose_predictor_model_location())

    detection_sp = sp(frame, face_detection.rect)

    人脸模型提取人脸描述子(128D)

    定义人脸描述子模型:

    face_rec = dlib.face_recognition_model_v1(models.face_recognition_model_location())

    face_detections = face_rec.compute_face_descriptor(frame, sp(frame, face_detection.rect))

    人脸识别:

    人脸识别就是对描述子进行分类,分类的模型可以是:决策树、SVM、KNN、神经网络等等。神经网络的方法比较直接,但是随着识别的人脸数量增加,需要的参数量和计算量需要大大增加;这里采用SVM和KNN的方法来实现。这两个实现的模型,都是用sklearn的库来实现。

    SVM参考:https://github.com/corberan/video_clipper/blob/master/face_classifier.py | https://github.com/corberan/video_clipper/blob/master/face_recognition.py

    SVM文档:https://www.jianshu.com/p/a9f9954355b3?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

    KNN参考:https://github.com/shanren7/real_time_face_recognition/blob/master/train%20your%20classifier.ipynb

    KNN文档:https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html#sklearn.neighbors.KNeighborsClassifier.score

    More:

    dlib不只是实现这四个功能,其中也是一个机器学习的算法库,更多可以参考文档

  2?? face_recognition:一个基于dlib库的更抽象的人脸检测+识别库

    repo: https://github.com/ageitgey/face_recognition

    基于几句代码即可实现功能,repo里面有许多example,但是不推荐使用这个库,因为这个库也是基于dlib实现的,完全可以用dlib来实现。

  3?? video_cut:

    repo:https://github.com/corberan/video_clipper

    博文:https://zhuanlan.zhihu.com/p/51210714

    顾名思义就是找出各个明星出现的时间段,这个应用是基于dlib来实现的。

  4?? 人脸跟踪

    MTCNN人脸检测+Sort多目标跟踪实现,是一个很简单直接的实现

    repo:https://github.com/Linzaer/Face-Track-Detect-Extract

 

  5?? 实时人脸检测与识别:

    repo:https://github.com/zj19941113/Face_Recognition_dlib

    技术路线:MTCNN+faceNet+KNN

    

总结:

  面对公司的实际应用,只拘泥于自己的领域是远远不够的。我的感悟是,在阅读资料和文献时,也该多了解其他领域的做法和改进。最后希望能成功转正吧!拜托??。

原文地址:https://www.cnblogs.com/bupt213/p/11372987.html

时间: 2024-10-10 10:22:58

深度学习帮你“认”人—人脸模型 by wilson的相关文章

人脸识别---基于深度学习和稀疏表达的人脸识别算法

介绍 基于深度学习和稀疏表达的人脸识别算法 1 利用VGGFace提取人脸特征 2 PCA对人脸特征进行降维 3 稀疏表达的人脸匹配 Code 1 介绍 本文将介绍一种基于深度学习和稀疏表达的人脸识别算法.首先,利用深度学习框架(VGGFace)提取人脸特征:其次,利用PCA对提取的特征进行降维:最后,利用稀疏表达分类实现特征匹配.我采用CMC曲线评价在AR数据库上的识别性能.最后我还提供了整个过程的code. 2 基于深度学习和稀疏表达的人脸识别算法 2.1 利用VGGFace提取人脸特征 下

深度学习(八):生成模型

一.引入 最开始知道生成模型和判别模型,是在李航的统计学习方法里,当时的理解是:生成模型,就是同时考虑了X和Y的随机性,也就是说二者都是随机变量:判别模型,就是只考虑了Y的随机性,而X并不是个随机变量,即使X存在于条件中,但是并没有p(x)这种说法.当时同时也知道了,朴素贝叶斯和隐马尔可夫都是生成模型,最主要的原因就是在这两个模型中涉及到的变量都是随机变量.生成模型可以转变成判别模型,也就是生成模型由于考虑的都是随机变量,可以通过条件概率公式计算出条件概率:反之不行,因为判别模型无法描述联合概率

用深度学习做命名实体识别(四)——模型训练

通过本文你将了解如何训练一个人名.地址.组织.公司.产品.时间,共6个实体的命名实体识别模型. 准备训练样本 下面的链接中提供了已经用brat标注好的数据文件以及brat的配置文件,因为标注内容较多放到brat里加载会比较慢,所以拆分成了10份,每份包括3000多条样本数据,将这10份文件和相应的配置文件放到brat目录/data/project路径下,然后就可以从浏览器访问文件内容以及相应的标注情况了. 链接:https://pan.baidu.com/s/1-wjQnvCSrbhor9x3G

深度学习中几种常用的模型

最近再从事深度学习方面的工作,感觉还有很多东西不是很了解,各种网络模型的结构的由来还不是很清晰,在我看来所有的网络都是一层层的卷积像搭积木一样打起来的,由于还没实际跑所以还没很深刻感受到几种网络类型的区别,在此我想梳理一下几种常见的网络结构,加深一下理解. 本文转自此文https://www.cnblogs.com/houkai/p/6553221.html,此文条理清晰,总结较为到位. 目前常见的网络结构:AlexNet.ZF.GoogLeNet.VGG.ResNet等等都可谓曾一战成名,它们

《神经网络与深度学习》(二) 常用模型之自编码器

转自:http://www.cnblogs.com/flippedkiki/p/7765693.html Deep Learning的常用模型或者方法 1.AutoEncoder自动编码器 Deep Learning最简单的一种方法是利用人工神经网络的特点,人工神经网络(ANN)本身就是具有层次结构的系统,如果给定一个神经网络,我们假设其输出与输入是相同的,然后训练调整其参数,得到每一层中的权重.自然地,我们就得到了输入I的几种不同表示(每一层代表一种表示),这些表示就是特征.自动编码器就是一种

如何在python 深度学习Keras中计算神经网络集成模型

神经网络的训练过程是一个挑战性的优化过程,通常无法收敛. 这可能意味着训练结束时的模型可能不是稳定的或表现最佳的权重集,无法用作最终模型. 解决此问题的一种方法是使用在训练运行结束时看到的多个模型的权重平均值. 平均模型权重 学习深度神经网络模型的权重需要解决高维非凸优化问题. 解决此优化问题的一个挑战是,有许多“ 好的 ”解决方案,学习算法可能会反弹而无法稳定. 解决此问题的一种方法是在训练过程即将结束时合并所收集的权重.通常,这可以称为时间平均,并称为Polyak平均或Polyak-Rupp

Teaching Machines to Understand Us 让机器理解我们 之二 深度学习的历史

Deep history 深度学习的历史 The roots of deep learning reach back further than LeCun's time at Bell Labs. He and a few others who pioneered the technique were actually resuscitating a long-dead idea in artificial intelligence. 深度学习的研究之根是在LeCun在Bell实验室研究之前的.

一箭N雕:多任务深度学习实战

1.多任务学习导引 多任务学习是机器学习中的一个分支,按1997年综述论文Multi-task Learning一文的定义:Multitask Learning (MTL) is an inductive transfer mechanism whose principle goal is to improve generalization performance. MTL improves generalization by leveraging the domain-specific inf

深度学习在图像识别中的研究进展与展望

深度学习在图像识别中的研究进展与展望 深度学习是近十年来人工智能领域取得的最重要的突破之一.它在语音识别.自然语言处理.计算机视觉.图像与视频分析.多媒体等诸多领域都取得了巨大成功.本文将重点介绍深度学习在物体识别.物体检测.视频分析的最新研究进展,并探讨其发展趋势. 1.深度学习发展历史的回顾 现在的深度学习模型属于神经网络.神经网络的历史可以追溯到上世纪四十年代,曾经在八九十年代流行.神经网络试图通过大脑认知的机理,解决各种机器学习的问题.1986年Rumelhart.Hinton和Will