精华内容
下载资源
问答
  • 目标检测中的关键点检测

    千次阅读 2019-04-10 20:53:46
    在图像处理中,关键点本质上是一种特征,是对一个固定区域或者空间物理关系的抽象描述,描述的是一定邻域范围内的组合或上下文关系。... 关键点检测技术原理:经典关键点检测网络设计简单:一个分支...

           在图像处理中,关键点本质上是一种特征,是对一个固定区域或者空间物理关系的抽象描述,描述的是一定邻域范围内的组合或上下文关系。它不仅仅是一个点信息,或代表一个位置,更代表着上下文与周围邻域的组合关系。

           关键点检测有两种方法:点回归的方法,点分类的方法。这两种方法都可以找出点在图像当中的位置与关系。

           关键点检测技术原理:经典关键点检测网络设计简单:一个分支去提取点特征,回归它的点,输出点的位置;另一个分支去提取关系特征,回归它的关系,输出关系回归的位置。

    展开全文
  • 人脸关键点检测总结

    万次阅读 多人点赞 2018-05-31 10:38:21
    人脸关键点检测也称为人脸关键点检测、定位或者人脸对齐,是指给定人脸图像,定位出人脸面部的关键区域位置,包括眉毛、眼睛、鼻子、嘴巴、脸部轮廓等。 人脸关键点检测方法大致分为三种: - 基于模型的ASM(Active...

    概述

    人脸关键点检测也称为人脸关键点检测、定位或者人脸对齐,是指给定人脸图像,定位出人脸面部的关键区域位置,包括眉毛、眼睛、鼻子、嘴巴、脸部轮廓等。

    人脸关键点检测方法大致分为三种:
    - 基于模型的ASM(Active Shape Model)AAM(Active Appearnce Model)
    - 基于级联形状回归CPR(Cascaded pose regression)
    - 基于深度学习的方法


    ASM(Active Shape Model)算法

    1. 概要

    这是一种1995年提出的很老的关键点检测方法。ASM是基于特征点分布模型(Point Distribution Model,PDM)提取的一种方法。在PDM中,外形相似的物体,例如人脸、人手、心脏、肺部等的几何形状可以通过若干关键特征点(landmarks)的坐标依次串联形成一个形状向量来表示。

    ASM跟大多数统计学习方法一样,也包括train和test两部分,也就是形状建模build和形状匹配fit。这个算法其实很简单,可以用来做实时性的检测。

    步骤
    ==人工标定训练集->对齐构建形状模型->搜索匹配==

    2. 特征点标记

    为了建立ASM,需要一组标有n个特征点的N幅人脸图象(包括多个人的不同表情和姿态)作为训练数据。特征点可以标记在脸的外部轮廓和器官的边缘,需要注意的是各个标定点的顺序在训练集中的各张照片需要一致。

    image

    得到特征点集,可以看做一个2n维的向量,n表示特征点数量:

    {(x1,y1),(x2,y2),...,(xn,yn)},x=(x1,...,xn,y1,...,yn)T

    3. 模型训练

    1)对齐

    为了研究训练图象的形状变化,比较不同形状中相对应的点,应先对这些图象进行对齐。

    对齐是指以某个形状为基准,对其它形状进行旋转,缩放和平移使其尽可能的与基准形状接近的过程。

    首先选择一幅基准图像。训练集中其他图片经过变换尽可能的接近该基准图像,具体的变化过程可以用一个缩放幅度参数s,旋转参数theta以及平移参数矩阵t表示。假设我们要将第2幅图像经过变换尽可能的接近第1幅图像,变换后的图像矩阵表示为:

    M(s,θ)[X2]t

    与基准形状尽可能接近,在数学上我们经常用欧式距离的大小衡量接近的程度。假设图像i的标定点矩阵为Xi,图像j的标定点矩阵为Xj,二者的欧式距离大小为
    dik2=(XiXj)T(XiXk)

    2) 构建局部特征

    对对齐后的形状特征做PCA处理。接着,为每个关键点构建局部特征。目的是在每次迭代搜索过程中每个关键点可以寻找新的位置。局部特征一般用梯度特征,以防光照变化。有的方法沿着边缘的法线方向提取,有的方法在关键点附近的矩形区域提取。

    形状搜索

    首先:计算眼睛(或者眼睛和嘴巴)的位置,做简单的尺度和旋转变化,对齐人脸;接着,在对齐后的各个点附近搜索,匹配每个局部关键点(常采用马氏距离),得到初步形状;再用平均人脸(形状模型)修正匹配结果;迭代直到收敛。

    优点

    1. 得到的特征点是有序;
    2. 能根据训练数据对于参数的调节加以限制,从而将形状的改变限制在一个合理的范围内。
    

    缺点

    1. 需要人工对特征点进行顺序标注,工作量超大;
    2. 其近似于穷举搜索的关键点定位方式在一定程度上限制了其运算效率。
    

    AAM(Active Appearance Models)算法

    1. 概要

    1998年,Cootes对ASM进行改进,不仅采用形状约束,而且又加入整个脸部区域的纹理特征,即:Appreance = Shape + Texture,提出了AAM算法。

    AAM主动外观模型主要分为两个阶段,模型建立阶段模型匹配阶段。其中模型建立阶段包括了对训练样本分别建立形状模型(Shape Model)和纹理模型(Texture Model),然后将两个模型进行结合,形成AAM模型。模型匹配阶段是指在视频序列中将已建立好的AAM模型在当前帧图像中寻找最匹配的目标的过程。

    image

    2. 样本选取与标定

    1)要建立AAM模型,就需要采集目标的样本,建立样本库。
    2)要建立关于人脸的AAM模型,就需要把目标从样本中提取出来而去除背景等的影响。而提取目标的方法就是在样本中手动把人脸的轮廓标定出来。
    3)在手动标定了样本中的点后,通过程序把样本的点的位置{x,y}保存为向量的形式

    3. 形状模型(shape model)

    对输入数据首先建立活动形状模型ASM。建立ASM模型包括Procrustes变换和PCA降维两个步骤。Procrustes变换就是ASM中的对齐操作。样本和形状模型的建立步骤与ASM相同。

    4. 纹理模型(Texture Model)

    纹理模型(Texture Model)描述了目标的纹理特征。纹理模型的输入数据和形状模型一样,在这里可以看做是n张图片,每张图片上有一个点集。
    1)Delaunay三角划分:将空间点连接为三角形,使得所有三角形中最小的角最大的一个技术。三角划分的要点是任何三角形的外接圆都不包括任何其他顶点,即外接圆性质。

    image

    2)三角映射:使用Delaunay三角划分后,每一个样本都可以划分为一系列三角形,而不同样本间这些三角形是对应的。要得到平均纹理模型,就需要把样本中的目标的纹理通过分片仿射投影到同一个样本上,而这种分片仿射就是三角映射。

    先设定一个样本为平均脸,既然在样本中的点与平均脸的所有三角形都是一一对应的,就可以根据三角形中每一点的位置计算其对应平均脸中某一点的位置,然后把该点的像素值复制到平均脸对应点的位置上。最终每一个样本都可以转化到平均脸上,然后把这n个脸求平均,就得到了平均纹理模型。

    5. 组合模型(Combine Model)

    在得到形状模型和纹理模型后,我们就可以对这两个模型进行加权组合,得到组合模型,也就是AAM模型。同时我们也得到了p+q个参数,再降维得到r个参数,这些参数就是用来改变AAM模型的特征的。

    6. 搜索模型(Search Model)

    AAM模型建立以后,就可以实际在视频序列中跟踪人脸。

    初始时记AAM模型的r个参数为向量,然后对输入的图像,首先假设某个位置有人脸,得到人脸的实际参数c,然后我们通过不断地调整使c和r之间的距离最小,若这个最小值小于某个阀值,就可以认为当前位置出现人脸,我们就能够在视频中检测到了人脸。

    image

    优点

    1. 与ASM相比有增加了纹理信息
    2. 模型简单直接,架构清晰明确,易于理解和应用
    

    缺点

    1. 需要人工对特征点进行顺序标注,工作量超大;
    2. 对噪声非常敏感。
    

    CPR(Cascaded pose regression)

    1. 概要

    2010年,Dollar提出CPR(Cascaded Pose Regression, 级联姿势回归),CPR通过一系列回归器将一个指定的初始预测值逐步细化,每一个回归器都依靠前一个回归器的输出来执行简单的图像操作,整个系统可自动的从训练样本中学习。

    2. 回归器训练

    人脸关键点检测的目的是估计向量,K表示关键点的个数,由于每个关键点有横纵两个坐标,所以S的长度为2K。

    在每个阶段中首先进行特征提取,这里使用的是shape-indexed features,也可以使用诸如HOG、SIFT等人工设计的特征,或者其他可学习特征(learning based features)。

    姿态θ训练过程是先初始化一个θ,然后提取特征,再用特征进行回归,再更新θ。

    image

    然后通过训练得到的回归器R来估计增量ΔS( update vector),把ΔS加到前一个阶段的S上得到新的S,这样通过不断的迭代即可以得到最终的S(shape)。加上训练R的损失函数:

    L=i=1Nd(θiT,θi)

    作者用到的回归方法为Random Fern Regressors,这种算法思想类似于随机森林。级联回归器的训练过程为:

    根据θ的不断更新,关键位置的预测结果如图

    3. 姿势聚类

    用不同的初始姿态θ训练级联分类器会得到不同的预测结果,有时候初始化姿态选的不合适就会导致错误预测。所以作者对每一个图像,初始化K个不同姿态,CPR运行K次得到K个不同结果。对这些结果进行聚类,选取密度最高的结果作为最终结果。

    4. 人脸关键点

    作者用了Caltech人脸数据集,对三个关键点即双眼和嘴巴进行位置预测。

    优点

    1. 算法思想类似于随机森林回归,是一种回归算法,结构清晰简单。
    2. 可以用较少的训练数据训练出较好的模型、
    

    缺点

    1. 只对人脸的3个关键点进行检查;
    2. 特征提取方式很传统,且作者并没有明确说人脸回归方法预测的准确度。
    

    Face Alignment at 3000 FPS via Regressing Local Binary Features(LBF)

    1. 概要

    CVPR14年的文章,这篇论文主要讲:Face Alignment 问题,即给人脸确定位置68个标点 (landmark)。而这些标点位置肯定是最能区别不同人的位置。

    https://github.com/FaceDetect/jointCascade_py
    https://github.com/FacialLandmark/landmark_py

    2. 算法步骤

    算法步骤可以分为三个过程:
    1)提取特征(shape index feature)
    2)LBF编码(learning local binary feature)
    3)获取shape 增量(learning global linear regression)

    image

    训练过程中,先初始化一个shape St-1,用一种特征映射方法Φt生成local binary features。根据特征和目标shape的增量生成最终shape。权值通过线性回归进行更新。在测试阶段,直接预测形状增量,并应用于更新当前估计的形状。形状增量:

    ΔSt=WtΦt(I,St1)

    3. 提取shape index feature

    shape index feature 也就是特征和现有的一系列标定点是相关的,3000fps的做法是在landmark周围随机出两个偏移量,形成两个点,用这两个点的像素差作为特征。

    刚开始的时候,shape和ground truth差距太大,因此需要取样特征的半径大一些,最后的shape和ground truth已经很接近了,半径要小一些。
    image

    4. 学习local binary features

    使用标准随机森林训练Φt

    image

    (b)所示是标点j用随机森林得到二进制特征,再串联成(a),组成全局特征,最后训练全局线性投影Wt.

    随机森林的思想:随机是随机抽取n对像素,这n个像素就成为一个模板(template),以后一直不变。再比较每一对像素,第一个像素大于第二个就为1,第二个大于第一个就为0,再串联n对像素比较值,组成二进制向量就为随机森林特征。如图取的是到达叶子节点为1,道理一样(大于节点遍历左子节点,小于遍历右子节点).

    5. 权值学习

    使用的双坐标下降方法,使下公式最小:

    minWti=1N||ΔSitWtΦt(Ii,Sit1)||22+λ||Wt||22

    λ是控制Wt长度,即让Wt尽量稀疏。

    测试的时候,先对一幅图像提取shape index feature, 然后使用随机森林进行编码,最后使用w估计shape 增量。

    优点

    1. 速度快,在笔记本上跑了3000FPS,智能手机是300FPS
    2. 是最先进算法(the state of the art)有更高的精确性,做为人脸验证底层实现,实时性显然重要。
    

    缺点

    1. 只对人脸的3个关键点进行检查;
    2. 参数很难调。
    

    Joint Cascade Face Detection and Alignment

    1. 概要

    这篇是MSRA在14年发表在ECCV上的论文,这篇文章直接在30ms的时间里把detection和alignment都给做了,PR曲线彪到很高,时效性高,内存占用却非常低。这篇文章的思想继承了CPR,使用级联树+简单特征的结构,将分类与回归都完成,计算简单,高效。

    image

    文章的思想是训练一棵决策树同时做Face Alignment和Face Detection。

    2. Post classifier

    在人脸对齐前需要先将人脸检测出来。

    1)样本准备:首先作者调用opencv的Viola-Jones分类器,将recall阀值设到99%,这样能够尽可能地检测出所有的脸,但是同时也会有非常多的不是脸的东东被检测出来。于是,检测出来的框框们被分成了两类:是脸和不是脸。这些图片被resize到96*96。

    2)特征提取:接下来是特征提取,怎么提取呢?作者采用了三种方法:

    第一种:把window划分成6*6个小windows,分别提取SIFT特征,然后连接着36个sift特征向量成为图像的特征。
    
    第二种:先求出一个固定的脸的平均shape(27个特征点的位置,比如眼睛左边,嘴唇右边等等),然后以这27个特征点为中心提取sift特征,然后连接后作为特征。
    
    第三种:用他们组去年的另一个成果Face Alignment at 3000 FPS via Regressing Local Binary Features (CVPR14) ,也就是图中的3000FPS方法,回归出每张脸的shape,然后再以每张脸自己的27个shape points为中心做sift,然后连接得到特征。
    

    3)分类:将上述的三种特征分别扔到线性SVM中做分类,训练出一个能分辨一张图是不是脸的SVM模型。紧接着作者将以上三种方法做出的分类器和初始分类器进行比对,画了一个样本分布的图:

    image

    这个图从左到右依次是原始级联分类器得到的样本分类分布和第一种到第三种方法提取的特征得到的样本分类分布。可见做一下shape alignment可以得到一个更好的分类效果。但是效率很渣,recall 99%一张图可以检测出3000个框。

    3. 级联分类器

    和随机森林很相似,级联分类器就是一种bagging的思想。定义形状S为一个2L维的向量,L是标点总数。逐步回归的过程是:

    St=St1+Rt(x,St1),t=1,...,T

    每一个Rt是一个回归函数,它会在前一级形状的基础上增加一个形状增量。学习时使当前形状St与真实形状S之间的误差最小。

    一个关键的创新点在于,在级联标点框架中,每一个回归器Rt依赖于前一个形状S(t-1),在训练学习的过程中,特征定义为与S(t-1)相关,所以称之为姿态/形状索引特征,这种特征对面部形状变化时,呈现出很好的几何不变性。

    将这种姿态/形状索引特征同样的应用在检测环节,则文章统一两个训练学习任务,将分类器定义为:

    f=t=1Tk=1KCkt(x,St1)

    这样的分类器相当于结合了形状标定S和分类检测C。算法过程

    训练结果:

    image

    4. 实验效果

    使用像素差作为特征使得高性能得到保证。算法在VGA图像(640*480pixel)上的检测性能是28.6ms/张。检测器只占用15MB内存。在FDDB数据集上。算法的Recall为80.07%。
    优点

    1. 速度快,占用内存小。
    2. 可以同时做人脸和人脸关键点检测
    

    缺点

    1. 参数难调。
    

    One Millisecond Face Alignment with an Ensemble of Regression Trees(ETR)

    1. 概要

    CVPR 2014的一篇关于人脸关键点检测的论文,基于Ensemble of Regression Tress算法(以下简称 ERT),速度极快(单人人脸关键点检测耗时约为1ms),效果也不错。同时又能处理训练集中部分关键点标定缺失的情况。LBF(Face Alignment at 3000 FPS via Regressing Local Binary Features)这篇论文的进阶版本。

    2. 算法思想

    LBF是基于Tree的方法,学习每个关键点的局部二值特征,然后将特征组合起来,使用线性回归检测关键点。与 LBF 不同的是, ERT 是在学习 Tree的过程中,直接将 shape 的更新值 ΔS存入叶子结点 leaf node. 初始位置 S 在通过所有学习到的 Tree后,mean shape 加上所有经过的叶子结点的ΔS,即可得到最终的人脸关键点位置。总体流程如下图所示:

    image

    公式表达是:

    St+1=St+1+rt(I,St)

    其中 t 表示级联序号,rt(∙,∙)表示当前级的回归器regressor。回归器的输入参数为图像 I 和上一级回归器更新后的 shape, 采用的特征可以是灰度值或者其它。

    为了训练每一级的 rt,文章采用了 gradient tree boosting算法减小 initial shape 和 ground truth 的平方误差总和。

    每个回归器由很多棵树(tree)组成,每棵树参数是根据 current shape 和 ground truth 的坐标差和随机挑选的像素对训练得到的。

    优点

    1. 速度快,占用内存小;
    2. 改进了参数难调的问题。
    

    缺点

    1. 模型稍大(随机数算法的通病)。
    

    Deep Convolutional Network Cascade for Facial Point Detection

    1. 概要

    2013年,Sun等人首次将CNN应用到人脸关键点检测,提出一种级联的CNN(拥有三个层级)——DCNN(Deep Convolutional Network),此种方法属于级联回归方法。作者通过设计拥有三个层级的级联卷积神经网络对面部5个关键点左眼、右眼、鼻子、嘴巴两侧进行检测。

    https://github.com/zhaoyuzhi/Deep-Convolutional-Network-Cascade-for-Facial-Point-Detection

    2. 整体结构

    如图所示,DCNN由三个Level构成。Level-1 由3个CNN组成;Level-2由10个CNN组成(每个关键点采用两个CNN);Level-3同样由10个CNN组成。

    image

    1)Level-1分3个CNN,分别是F1(Face1)、EN1(Eye,Nose)、NM1(Nose,Mouth);F1输入尺寸为39*39,输出5个关键点的坐标;EN1输入尺寸为39*31,输出是3个关键点的坐标;NM11输入尺寸为39*31,输出是3个关键点。Level-1的输出是由三个CNN输出取平均得到。

    2)Level-2,由10个CNN构成,输入尺寸均为15*15,每两个组成一对,一对CNN对一个关键点进行预测,预测结果同样是采取平均。

    3)Level-3与Level-2一样,由10个CNN构成,输入尺寸均为15*15,每两个组成一对。Level-2和Level-3是对Level-1得到的粗定位进行微调,得到精细的关键点定位。

    Level-1之所以比Level-2和Level-3的输入要大,是因为作者认为,由于人脸检测器的原因,边界框的相对位置可能会在大范围内变化,再加上面部姿态的变化,最终导致输入图像的多样性,因此在Level-1应该需要有足够大的输入尺寸。Level-1与Level-2和Level-3还有一点不同之处在于,Level-1采用的是局部权值共享(Locally Sharing Weights)

    3. 网络结构

    第一级的网络深度要深,
    image

    分析3个选择网络的重要因素。讨论集中在最难训练的第一级网络。

    1)第一级的网络必须要深。从大的输入区域中预测关键点是一个高级任务。更深的结构有利于形成全局的高级特征,在低层,由于局部感受野,神经元提取的特征是局部的。通过结合空间上相邻的低层特征,高层的神经元能从更大的区域提取特征。此外,高层的特征是高度非线性的,增加额外的层增强了从输入到输出的非线性,更有可能代表输入和输出的关系。

    2)第二,对卷积层上的神经元,在双曲正切激活函数后的绝对值校正(下一章)能有效提高效果。

    3)第三,局部地共享权值有利于更好的表现。

    多级回归

    由于脸部检测器的不稳定性和姿态的多样性。所以第一级的输入区域应该是足够大来覆盖所有可能的预测。但大的输入区域是主要的不准确原因,因为不相关的区域可能退化网络最后的输出。

    第一级的网络输出为接下来的检测提供了一个强大的先验知识。真实的脸部点伪装分布在第一级预测的一个小领域内。所以第二级的检测可以在一个小范围内完成。但没有上下文信息,局部区域的表现是不可靠的。为了避免发散,我们不能级联太多层,或者过多信任接下来的层。这些网络只能在一个小范围内调整初始预测。

    为了更好的提高检测精度和可靠性,作者提出了每一级都有多个网络共同地预测每一个点。这些网络的不同在于输入区域。最后的预测可以用公式表达如下:

    x=x1(1)+...+xl1(1)l1+i=2nΔx1(i)+...+xl1(i)li

    优点

    1. 改善初始不当导致陷入局部最优的问题;
    2. 借助于CNN强大的特征提取能力,获得更为精准的关键点检测。
    

    缺点

    1. 只有5个关键点检测
    2. 3.3GHz的CPU单张图片检测速度0.12s,网络结构复杂。
    

    Extensive Facial Landmark Localization with Coarse-to-Fine Convolutional Network Cascade

    这篇是ICCV2013年face++在DCNN模型上改进提出的从粗到精的人脸关键点检测算法。实现了68个人脸关键点的高精度定位。该算法将人脸关键点分为内部关键点和轮廓关键点,内部关键点包含眉毛、眼睛、鼻子、嘴巴共计51个关键点,轮廓关键点包含17个关键点。

    整体结构

    网络采用四级级联结构,与上一篇文章相似。本篇最大的创新点在于:在网络的输入方面,不是用人脸检测器检测到的人脸区域图片作为网络的输入,而是采用CNN预测人脸的bounding box,这个改进对初始level定位精度提高非常多。

    image

    1)Level-1主要作用是获得面部器官的边界框,上面是inner的bounding box,下面是contour的bounding box;

    2)Level-2的输出是51个关键点预测位置,这里起到一个粗定位作用,目的是为了给Level-3进行初始化;

    3)Level-3会依据不同器官进行从粗到精的定位;

    4)Level-4的输入是将Level-3输出的inner point进行一定的旋转,最终将51个关键点的位置进行输出。

    针对外部17个关键点contour point,仅采用两个层级的级联网络进行检测。

    网络结构

    N1表示为inner point各个特征点的初始位置预测,也就是相当于inner 的level 2。
    image

    网络结构方面基本上与传统的CNN模型,差不多,最大的区别在于locally sharing weights,也就是上面的unshared conv层,我们平时所遇到的CNN都是global sharing weights的。但是对于特征点的预测,五官的高层特征差别比较大,所以需要在高层采用unshared weight的方式,在低层采用global sharing weights。

    优点

    1. 把人脸的关键点定位问题,划分为内部关键点和轮廓关键点分开预测,有效的避免了loss不均衡问题;
    2. 内部关键点检测部分,并未像DCNN那样每个关键点采用两个CNN进行预测,而是每个器官采用一个CNN进行预测,从而减少计算量。
    

    缺点

    1. 模型多,运算复杂。
    

    Facial Landmark Detection by Deep Multi-task Learning(TCDCN)

    1. 概述

    这篇文章发表于ECCV2014,来自香港中文大学汤晓鸥课题组。

    文章提出了人脸特征点检测的新方法,使用与人脸相关的属性共同学习人脸的特征点位置。具体而言,就是在人脸特征点检测的时候,同时进行多个任务的学习,这些任务包括:性别,是否带眼镜,是否微笑和脸部的姿势。使用这些辅助的属性帮助更好的定位特征点,根据论文结果,这样的确对人脸特征点检测有一定的帮助。

    这种Multi-task learning的困难在于:不同的任务有不同的特点,不同的收敛速度。针对这两个问题,文章给出前者的解决办法是tasks-constrained deep model,对后者解决办法是task-wise early stopping。文章中的方法在处理有遮挡和姿势变化时表现较好,而且模型比较简单。

    image

    https://github.com/zhzhanp/TCDCN-face-alignment
    https://github.com/flyingzhao/tfTCDCN

    2. 多任务检测模型

    传统的多任务学习(multi-task learning)把每个任务都赋予相同的权重:

    argminwt=1Ti=1Nl(yit,f(xit;wt))+ϕ(wt)

    损失函数就是不同任务的损失函数直接相加。而在人脸特征点检测的任务中,不同的任务具有不同的loss,特征点检测是平方和误差,而其它分类任务是交叉熵误差,因此最后的loss就是:
    argminwt,wa12i=1N||yirf(xi;Wr)||2i=1NaAλayialog(p(yia|xi;Wa))+t=1T||W||22

    从这个式子可以看到,损失函数的前部分就是特征点检测,后部分是不同的分类任务loss相加,最后一项是正则项。在训练时,各个任务使用相同的特征,只有在最后一级才根据任务的不同做不同处理(线性回归或者分类)。

    3. 网络结构

    image

    输入图片为40*40的黑白图片,然后经过4个卷积层变成2*2*64的图像,其中激活函数采用|tanh|,即对tanh取绝对值。在最后的全连接层将2*2*64的多层结构变成100个shared feature,以上部分都可以看成特征提取的操作。在最后一层由这些特征进行不同操作,对特征点检测问题就是linear regression,对于其他分类问题就是logistic regression(softmax)。

    4. Task-wise early stopping

    针对多任务学习的特点,本文提出了一种新的early stopping方法。当辅助任务达到最好表现以后,这个任务就对主要任务没有帮助了,就可以停止这个任务。如下式所示,Eaval是任务a的验证集loss,Eatr是训练集loss,如果下面式子超过了某个阈值ϵ就会停止这个任务。

    kmedj=tktEtar(j)j=tktEtra(j)kmedj=tktEtra(j)Evala(t)minj=1..tEtra(j)λaminj=1..tEtra(j)>ϵ

    优点

    1. 采用多任务学习方法对人脸关键点进行检测;
    2. 对比于级联CNN方法,在Intel Core i5 cpu上,级联CNN需要0.12s,而TCDCN仅需要17ms,速度提升七倍有余。 
    

    缺点

    1. 论文中很很多超参数需要调整。
    

    Multi-task Cascaded Convolutional Networks(MTCNN)

    1. 概述

    2016年,Zhang等人提出一种多任务级联卷积神经网络(MTCNN, Multi-task Cascaded Convolutional Networks)用以同时处理人脸检测和人脸关键点定位问题。作者认为人脸检测和人脸关键点检测两个任务之间往往存在着潜在的联系,然而大多数方法都未将两个任务有效的结合起来,本文为了充分利用两任务之间潜在的联系,提出一种多任务级联的人脸检测框架,将人脸检测和人脸关键点检测同时进行。
    https://github.com/xiangrufan/keras-mtcnn

    2. 网络结构

    MTCNN包含三个级联的多任务卷积神经网络,分别是Proposal Network (P-Net)、Refine Network (R-Net)、Output Network (O-Net),每个多任务卷积神经网络均有三个学习任务,分别是人脸分类、边框回归和关键点定位。网络结构如图所示:

    image

    TCNN实现人脸检测和关键点定位分为三个阶段。

    1)第一阶段,通过一个浅层的CNN快速生成候选窗口。该阶段是一个全部由卷积层组成的CNN,取名P-Net,获取候选人脸窗口以及人脸框回归向量。基于人脸框回归向量对候选窗口进行校正。之后采用NMS合并高重叠率的候选窗口。
    image

    2)第二阶段,通过一个更复杂的CNN否决大量非人脸窗口从而精化人脸窗口。第一阶段输出的候选窗口作为R-Net的输入,R-Net能够进一步筛除大量错误的候选窗口,再利用人脸框回归向量对候选窗口做校正,并执行NMS。

    image

    3)使用更复杂的CNN进一步精化结果并输出5个人脸特征点。与stage2相似,但这一阶段用更多的监督来识别人脸区域,而且网络能够输出五个人脸特征点位置坐标。
    image

    3. 训练阶段

    在具体训练过程中,作者就多任务学习的损失函数计算方式进行相应改进。在多任务学习中,当不同类型的训练图像输入到网络时,有些任务时是不进行学习的,因此相应的损失应为0。例如,当训练图像为背景(Non-face)时,边界框和关键点的loss应为0,文中提供计算公式自动确定loss的选取,公式为:

    mini=1NjαjβijLij,j{det,box,landmark}

    其中, αj表示任务的重要程度,在P-Net和R-Net中,αdet=1,αbox=0.5,αlandmark=0.5 ,在O-Net中,由于要对关键点进行检测,所以相应的增大任务的重要性,αdet=1,αbox=0.5 , αlandmark=1 。 作为样本类型指示器。

    实验结果表明,MTCNN在人脸检测数据集FDDB 和WIDER FACE以及人脸关键点定位数据集LFPW均获得当时最佳成绩。在运行时间方面,采用2.60GHz的CPU可以达到16fps,采用Nvidia Titan Black可达99fps

    优点

    1. 采用CNN方法同时预测人脸和人脸关键点;
    2. 对于速度和精度都有一定的提升。 
    

    缺点

    1. 网络结构较复杂。
    

    Facial Landmark Detection with Tweaked Convolutional Neural Networks(TCNN)

    1. 概述

    2016年,Wu等人研究了CNN在人脸关键点定位任务中到底学习到的是什么样的特征,在采用GMM(Gaussian Mixture Model, 混合高斯模型)对不同层的特征进行聚类分析,发现网络进行的是层次的,由粗到精的特征定位,越深层提取到的特征越能反应出人脸关键点的位置。针对这一发现,提出了TCNN(Tweaked Convolutional Neural Networks)。

    https://github.com/flyingzhao/mxnet_VanillaCNN

    2. 网络结构

    其网络结构如图所示:

    image

    图为Vanilla CNN,针对FC5得到的特征进行K个类别聚类,将训练图像按照所分类别进行划分,用以训练所对应的FC6K 。测试时,图片首先经过Vanilla CNN提取特征,即FC5的输出。将FC5输出的特征与K个聚类中心进行比较,将FC5输出的特征划分至相应的类别中,然后选择与之相应的FC6进行连接,最终得到输出。

    3. 特征聚类

    作者对Vanilla CNN中间各层特征进行聚类分析,并统计出关键点在各层之间的变化程度,如图所示:

    image

    从图中可知,越深层提取到的特征越紧密,因此越深层提取到的特征越能反应出人脸关键点的位置。作者在采用K=64时,对所划分簇的样本进行平均后绘图如下:

    image

    从图上可发现,每一个簇的样本反应了头部的某种姿态,甚至出现了表情和性别的差异。因此可推知,人脸关键点的位置常常和人脸的属性相关联。因此为了得到更准确的关键点定位,作者使用具有相似特征的图片训练对应的回归器。网络结构修改为FC5不同的类别对应不同的FC6。FC6用回归的方法对人脸的5个关键点进行检测。

    image

    优点

    1. 对CNN提取的特征进行聚类,将各簇对应的样本进行分析,最后发现同一簇表现出“相同属性”(姿态,微笑,性别)的人脸。对此,设计了K个FC5和K个FC6层,用以对不同“面部属性”的人脸进行关键点检测。
    

    缺点

    1. TCNN相当于按照姿态的不同,细分了K个“子模型”,只不过K个“子模型”共用卷积层用以提取特征,然后对应的有自己的FC5,FC6层。感觉这个模型的鲁棒性和泛化性不太好。
    

    DAN-Deep Alignment Network: A convolutional neural network for robust face alignment

    1. 概述

    DAN-Deep Alignment Network,发表于CVPR-2017。以往级联神经网络输入的是图像的某一部分,与以往不同,DAN各阶段网络的输入均为整张图片。当网络均采用整张图片作为输入时,DAN可以有效的克服头部姿态以及初始化带来的问题,从而得到更好的检测效果。之所以DAN能将整张图片作为输入,是因为其加入了关键点热图(Landmark Heatmaps),关键点热图的使用是本文的主要创新点。
    https://github.com/MarekKowalski/DeepAlignmentNetwork

    2. 网络结构

    DAN基本框架如图所示:

    image

    DAN包含多个阶段,每一个阶段含三个输入和一个输出,输入分别是被矫正过的图片、关键点热图和由全连接层生成的特征图,输出是面部形状(Face Shape)。其中,CONNECTION LAYER的作用是将本阶段得输出进行一系列变换,生成下一阶段所需要的三个输入,具体操作如下图所示:

    image

    第一阶段的输入仅有原始图片和S0。面部关键点的初始化即为S0,S0是由所有关键点取平均得到,第一阶段输出S1。对于第二阶段,首先,S1经第一阶段的CONNECTION LAYERS进行转换,分别得到转换后图片T2(I)、S1所对应的热图H2和第一阶段fc1层输出,这三个正是第二阶段的输入。如此周而复始,直到最后一个阶段输出SN。文中给出在数据集IBUG上,经过第一阶段后的T2(I)、T2(S1)和特征图,如图所示:

    image

    3. 前馈神经网络

    前馈神经网络的网络结构如图,其输出为landmark的偏移量,这里与以往用回归方法求偏移不同,这里用神经网络输出计算shape的偏移。

    image

    DAN要做的“变换”,就是把图片给矫正了,DAN对姿态变换具有很好的适应能力,或许就得益于这个“变换”。St是如何由St-1以及该阶段CNN得到,先看St计算公式:

    St=Tt1(Tt(St1)+ΔSt)

    该CNN的输入均是经过了“变换”Tt的操作,因此得到的偏移量 ΔSt是在新特征空间下的偏移量,在经过偏移之后应经过一个反变换T−1t 还原到原始空间。而这里提到的新特征空间,或许是将图像进行了“矫正”,使得网络更好的处理图像。

    4. Landmark热力图

    关键点热度图的计算就是一个中心衰减,关键点处值最大,越远则值越小,公式如下:

    H(x,y)=11+minsiTt(St1)||(x,y)si||

    优点

    1. DAN是一个级联思想的关键点检测方法;
    2. 通过引入关键点热图作为补充,DAN可以从整张图片进行提取特征,从而获得更为精确的定位。
    

    缺点

    1. 网络结构很复杂,还需要计算heatmap;
    2. 在1070 GPU上单张图片检测为73fps,连续图片检测为45fps。
    

    How far are we from solving the 2D & 3D Face Alignment problem?

    概述

    ICCV 2017的论文,结合最先进的人脸特征点定位(landmark localization)架构和最先进的残差模块(residual block),首次构建了一个非常强大的基准,在一个超大2D人脸特征点数据集(facial landmark dataset)上训练,并在所有其他人脸特征点数据集上进行评估。

    image

    https://github.com/1adrianb/face-alignment

    2D-FAN结构

    通过堆叠四个HG(HourGlass)构建的人脸对齐网络(Face Alignment Network, FAN),其中所有的 bottleneck blocks(图中矩形块)被替换为新的分层、并行和多尺度block。

    本质上来说就是一个小卷积网络的4层堆叠来预测人脸。输入2D图片,输出2D图片的Heatmap。

    2D 检测结果:

    2D-to-3D-FAN网络架构

    文章首先构建人脸对齐网络“FAN”(Face Alignment Network),然后基于FAN,构建2D-to-3D-FAN,也即将给定图像2D面部标注转换为3D的网络。文章表示,据测试所知,在大规模2D/3D人脸对齐实验中训练且评估FAN这样强大的网络,还尚属首次。

    基于人体姿态估计架构HourGlass,输入是RGB图像和2D图片的heatmaps,输出是对应的3D Heatmaps。

    image

    3D检测结果:

    优点

    1. 提出了一种新的FAN网络结构来预测人脸关键点;
    2. 实现了2D到3D关键点的一种转换。
    

    缺点

    1. 3D的检测结果还是不够准确;
    2. 文章工作还包括标注3D数据集,所以技术细节提及不多。
    

    OpenFace: A general-purpose face recognition library with mobile applications

    1. 概述

    OpenFace是很热门的人脸检测和人脸对齐开源库,这个pipeline可以看做是使用深度卷积网络处理人脸问题的一个基本框架,她结合了Dlib和传统的决策树人脸对齐方法。

    https://github.com/cmusatyalab/openface

    2. 基本结构

    它的结构如下图所示:

    image

    1)Input Image -> Detect
    输入:原始的可能含有人脸的图像。
    输出:人脸位置的bounding box。

    这一步一般我们称之为“人脸检测”(Face Detection),在OpenFace中,使用的是dlib、OpenCV现有的人脸检测方法。此方法与深度学习无关,使用的特征是传统计算机视觉中的方法(一般是Hog、Haar等特征)。

    2)Detect -> Transform -> Crop
    输入:原始图像 + 人脸位置bounding box
    输出:“校准”过的只含有人脸的图像

    对于输入的原始图像 + bounding box,这一步要做的事情就是要检测人脸中的关键点,然后根据这些关键点对人脸做对齐校准。所谓关键点,就是下图所示的绿色的点,通常是眼角的位置、鼻子的位置、脸的轮廓点等等。有了这些关键点后,我们就可以把人脸“校准”,或者说是“对齐”。解释就是原先人脸可能比较歪,这里根据关键点,使用仿射变换将人脸统一“摆正”,尽量去消除姿势不同带来的误差。这一步我们一般叫Face Alignment。

    image

    在OpenFace中,这一步同样使用的是传统方法,特点是比较快,对应的论文是: 《One Millisecond Face Alignment with an Ensemble of Regression Trees》

    3)Crop -> Representation
    输入:校准后的单张人脸图像
    输出:一个向量表示。

    这一步就是使用深度卷积网络,将输入的人脸图像,转换成一个向量的表示。在OpenFace中使用的向量是128x1的,也就是一个128维的向量。
    优点

    1. openface相当于是做了一个整合,把人脸检测,人脸对齐方法结合了一下。
    2. 前面的检测和对齐用到的是传统方法,所以速度比较快。
    

    缺点

    1. 只是做了整合,神经网络实际只是用于后续的人脸分类。
    
    展开全文
  • OpenCV实现人体姿态估计(人体关键点检测)OpenPose

    万次阅读 多人点赞 2019-08-04 11:53:03
    OpenCV实现人体姿态估计(人体关键点检测)OpenPose OpenPose人体姿态识别项目是美国卡耐基梅隆大学(CMU)基于卷积神经网络和监督学习并以Caffe为框架开发的开源库。可以实现人体动作、面部表情、手指运动等姿态...

    OpenCV实现人体姿态估计(人体关键点检测)OpenPose


    OpenPose人体姿态识别项目是美国卡耐基梅隆大学(CMU)基于卷积神经网络和监督学习并以Caffe为框架开发的开源库。可以实现人体动作、面部表情、手指运动等姿态估计。适用于单人和多人,具有极好的鲁棒性。是世界上首个基于深度学习的实时多人二维姿态估计应用,基于它的实例如雨后春笋般涌现。

    其理论基础来自Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields ,是CVPR 2017的一篇论文,作者是来自CMU感知计算实验室的曹哲(http://people.eecs.berkeley.edu/~zhecao/#top),Tomas Simon,Shih-En Wei,Yaser Sheikh 。

    人体姿态估计技术在体育健身、动作采集、3D试衣、舆情监测等领域具有广阔的应用前景,人们更加熟悉的应用就是抖音尬舞机。

    OpenPose的效果并不怎么好,强烈推荐《2D Pose人体关键点检测(Python/Android /C++ Demo) 》https://panjinquan.blog.csdn.net/article/details/115765863 ,提供了C++推理代码和Android Demo

    OpenPose项目Github链接:https://github.com/CMU-Perceptual-Computing-Lab/openpose

    OpenCV实现的Demo链接:https://github.com/PanJinquan/opencv-learning-tutorials/blob/master/opencv_dnn_pro/openpose-opencv/openpose_for_image_test.py


    1、实现原理

    输入一幅图像,经过卷积网络提取特征,得到一组特征图,然后分成两个岔路,分别使用 CNN网络提取Part Confidence Maps 和 Part Affinity Fields;


    得到这两个信息后,我们使用图论中的 Bipartite Matching(偶匹配) 求出Part Association,将同一个人的关节点连接起来,由于PAF自身的矢量性,使得生成的偶匹配很正确,最终合并为一个人的整体骨架;
    最后基于PAFs求Multi-Person Parsing—>把Multi-person parsing问题转换成graphs问题—>Hungarian Algorithm(匈牙利算法)
    (匈牙利算法是部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法。)


    2、实现神经网络

    阶段一:VGGNet的前10层用于为输入图像创建特征映射。

    阶段二:使用2分支多阶段CNN,其中第一分支预测身体部位位置(例如肘部,膝部等)的一组2D置信度图(S)。 如下图所示,给出关键点的置信度图和亲和力图 - 左肩。

    第二分支预测一组部分亲和度的2D矢量场(L),其编码部分之间的关联度。 如下图所示,显示颈部和左肩之间的部分亲和力。

    阶段三: 通过贪心推理解析置信度和亲和力图,对图像中的所有人生成2D关键点。


    3.OpenCV-OpenPose实现推理代码

    # -*-coding: utf-8 -*-
    """
        @Project: python-learning-notes
        @File   : openpose_for_image_test.py
        @Author : panjq
        @E-mail : pan_jinquan@163.com
        @Date   : 2019-07-29 21:50:17
    """
    
    import cv2 as cv
    import os
    import glob
    
    BODY_PARTS = {"Nose": 0, "Neck": 1, "RShoulder": 2, "RElbow": 3, "RWrist": 4,
                  "LShoulder": 5, "LElbow": 6, "LWrist": 7, "RHip": 8, "RKnee": 9,
                  "RAnkle": 10, "LHip": 11, "LKnee": 12, "LAnkle": 13, "REye": 14,
                  "LEye": 15, "REar": 16, "LEar": 17, "Background": 18}
    
    POSE_PAIRS = [["Neck", "RShoulder"], ["Neck", "LShoulder"], ["RShoulder", "RElbow"],
                  ["RElbow", "RWrist"], ["LShoulder", "LElbow"], ["LElbow", "LWrist"],
                  ["Neck", "RHip"], ["RHip", "RKnee"], ["RKnee", "RAnkle"], ["Neck", "LHip"],
                  ["LHip", "LKnee"], ["LKnee", "LAnkle"], ["Neck", "Nose"], ["Nose", "REye"],
                  ["REye", "REar"], ["Nose", "LEye"], ["LEye", "LEar"]]
    
    
    def detect_key_point(model_path, image_path, out_dir, inWidth=368, inHeight=368, threshhold=0.2):
        net = cv.dnn.readNetFromTensorflow(model_path)
        frame = cv.imread(image_path)
        frameWidth = frame.shape[1]
        frameHeight = frame.shape[0]
        scalefactor = 2.0
        net.setInput(
            cv.dnn.blobFromImage(frame, scalefactor, (inWidth, inHeight), (127.5, 127.5, 127.5), swapRB=True, crop=False))
        out = net.forward()
        out = out[:, :19, :, :]  # MobileNet output [1, 57, -1, -1], we only need the first 19 elements
        assert (len(BODY_PARTS) == out.shape[1])
        points = []
        for i in range(len(BODY_PARTS)):
            # Slice heatmap of corresponging body's part.
            heatMap = out[0, i, :, :]
            # Originally, we try to find all the local maximums. To simplify a sample
            # we just find a global one. However only a single pose at the same time
            # could be detected this way.
            _, conf, _, point = cv.minMaxLoc(heatMap)
            x = (frameWidth * point[0]) / out.shape[3]
            y = (frameHeight * point[1]) / out.shape[2]
            # Add a point if it's confidence is higher than threshold.
            points.append((int(x), int(y)) if conf > threshhold else None)
        for pair in POSE_PAIRS:
            partFrom = pair[0]
            partTo = pair[1]
            assert (partFrom in BODY_PARTS)
            assert (partTo in BODY_PARTS)
    
            idFrom = BODY_PARTS[partFrom]
            idTo = BODY_PARTS[partTo]
    
            if points[idFrom] and points[idTo]:
                cv.line(frame, points[idFrom], points[idTo], (0, 255, 0), 3)
                cv.ellipse(frame, points[idFrom], (3, 3), 0, 0, 360, (0, 0, 255), cv.FILLED)
                cv.ellipse(frame, points[idTo], (3, 3), 0, 0, 360, (0, 0, 255), cv.FILLED)
    
        t, _ = net.getPerfProfile()
        freq = cv.getTickFrequency() / 1000
        cv.putText(frame, '%.2fms' % (t / freq), (10, 20), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0))
    
        cv.imwrite(os.path.join(out_dir, os.path.basename(image_path)), frame)
        cv.imshow('OpenPose using OpenCV', frame)
        cv.waitKey(0)
    
    
    def detect_image_list_key_point(image_dir, out_dir, inWidth=480, inHeight=480, threshhold=0.3):
        image_list = glob.glob(image_dir)
        for image_path in image_list:
            detect_key_point(image_path, out_dir, inWidth, inHeight, threshhold)
    
    
    if __name__ == "__main__":
        model_path = "pb/graph_opt.pb"
        # image_path = "body/*.jpg"
        out_dir = "result"
        # detect_image_list_key_point(image_path,out_dir)
        image_path = "./test.jpg"
        detect_key_point(model_path, image_path, out_dir, inWidth=368, inHeight=368, threshhold=0.05)

    参考资料:

    [1].https://blog.csdn.net/m0_38106923/article/details/89416514

    展开全文
  • 人体姿态估计(Human Posture Estimation),是通过将图片中已检测到的人体关键点正确的联系起来,从而估计人体姿态。 人体关键点通常对应人体上有一定自由度的关节,比如颈、肩、肘、腕、腰、膝、踝等,如下图。 ...

    目录

    1、人体姿态估计简介

    2、人体姿态估计数据集

    3、OpenPose库

    4、实现原理

    5、实现神经网络

    6、实现代码


    1、人体姿态估计简介

    人体姿态估计(Human Posture Estimation),是通过将图片中已检测到的人体关键点正确的联系起来,从而估计人体姿态。

    人体关键点通常对应人体上有一定自由度的关节,比如颈、肩、肘、腕、腰、膝、踝等,如下图。

     

    通过对人体关键点在三维空间相对位置的计算,来估计人体当前的姿态。

    进一步,增加时间序列,看一段时间范围内人体关键点的位置变化,可以更加准确的检测姿态,估计目标未来时刻姿态,以及做更抽象的人体行为分析,例如判断一个人是否在打电话等。

    人体姿态检测的挑战:

    1. 每张图片中包含的人的数量是未知的。
    2. 人与人之间的相互作用是非常复杂的,比如接触、遮挡等,这使得联合各个肢体,即确定一个人有哪些部分变得困难。
    3. 图像中人越多,计算复杂度越大(计算量与人的数量正相关),这使得实时检测变得困难。

    2、人体姿态估计数据集

    由于缺乏高质量的数据集,在人体姿势估计方面进展缓慢。在近几年中,一些具有挑战性的数据集已经发布,这使得研究人员进行研发工作。人体姿态估计常用数据集:

    3、OpenPose库

     OpenPose人体姿态识别项目是美国卡耐基梅隆大学(CMU)基于卷积神经网络和监督学习并以Caffe为框架开发的开源库。可以实现人体动作、面部表情、手指运动等姿态估计。适用于单人和多人,具有极好的鲁棒性。是世界上首个基于深度学习的实时多人二维姿态估计应用,基于它的实例如雨后春笋般涌现。

    其理论基础来自Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields ,是CVPR 2017的一篇论文,作者是来自CMU感知计算实验室的曹哲(http://people.eecs.berkeley.edu/~zhecao/#top),Tomas Simon,Shih-En Wei,Yaser Sheikh 。

    人体姿态估计技术在体育健身、动作采集、3D试衣、舆情监测等领域具有广阔的应用前景,人们更加熟悉的应用就是抖音尬舞机。

    OpenPose项目Github链接:https://github.com/CMU-Perceptual-Computing-Lab/openpose

    4、实现原理

    1. 输入一幅图像,经过卷积网络提取特征,得到一组特征图,然后分成两个岔路,分别使用 CNN网络提取Part Confidence Maps 和 Part Affinity Fields;
    2. 得到这两个信息后,我们使用图论中的 Bipartite Matching(偶匹配) 求出Part Association,将同一个人的关节点连接起来,由于PAF自身的矢量性,使得生成的偶匹配很正确,最终合并为一个人的整体骨架;
    3. 最后基于PAFs求Multi-Person Parsing—>把Multi-person parsing问题转换成graphs问题—>Hungarian Algorithm(匈牙利算法)

    (匈牙利算法是部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法。)

    5、实现神经网络

    阶段一:VGGNet的前10层用于为输入图像创建特征映射。

    阶段二:使用2分支多阶段CNN,其中第一分支预测身体部位位置(例如肘部,膝部等)的一组2D置信度图(S)。 如下图所示,给出关键点的置信度图和亲和力图 - 左肩。

    第二分支预测一组部分亲和度的2D矢量场(L),其编码部分之间的关联度。 如下图所示,显示颈部和左肩之间的部分亲和力。

    阶段三: 通过贪心推理解析置信度和亲和力图,对图像中的所有人生成2D关键点。

    6、实现代码

    import cv2 as cv
    import numpy as np
    import argparse
    
    parser = argparse.ArgumentParser()
    parser.add_argument('--input', help='Path to image or video. Skip to capture frames from camera')
    parser.add_argument('--thr', default=0.2, type=float, help='Threshold value for pose parts heat map')
    parser.add_argument('--width', default=368, type=int, help='Resize input to specific width.')
    parser.add_argument('--height', default=368, type=int, help='Resize input to specific height.')
    
    args = parser.parse_args()
    
    BODY_PARTS = { "Nose": 0, "Neck": 1, "RShoulder": 2, "RElbow": 3, "RWrist": 4,
                   "LShoulder": 5, "LElbow": 6, "LWrist": 7, "RHip": 8, "RKnee": 9,
                   "RAnkle": 10, "LHip": 11, "LKnee": 12, "LAnkle": 13, "REye": 14,
                   "LEye": 15, "REar": 16, "LEar": 17, "Background": 18 }
    
    POSE_PAIRS = [ ["Neck", "RShoulder"], ["Neck", "LShoulder"], ["RShoulder", "RElbow"],
                   ["RElbow", "RWrist"], ["LShoulder", "LElbow"], ["LElbow", "LWrist"],
                   ["Neck", "RHip"], ["RHip", "RKnee"], ["RKnee", "RAnkle"], ["Neck", "LHip"],
                   ["LHip", "LKnee"], ["LKnee", "LAnkle"], ["Neck", "Nose"], ["Nose", "REye"],
                   ["REye", "REar"], ["Nose", "LEye"], ["LEye", "LEar"] ]
    
    inWidth = args.width
    inHeight = args.height
    
    net = cv.dnn.readNetFromTensorflow("graph_opt.pb")
    
    cap = cv.VideoCapture(args.input if args.input else 0)
    
    while cv.waitKey(1) < 0:
        hasFrame, frame = cap.read()
        if not hasFrame:
            cv.waitKey()
            break
    
        frameWidth = frame.shape[1]
        frameHeight = frame.shape[0]
        
        net.setInput(cv.dnn.blobFromImage(frame, 1.0, (inWidth, inHeight), (127.5, 127.5, 127.5), swapRB=True, crop=False))
        out = net.forward()
        out = out[:, :19, :, :]  # MobileNet output [1, 57, -1, -1], we only need the first 19 elements
    
        assert(len(BODY_PARTS) == out.shape[1])
    
        points = []
        for i in range(len(BODY_PARTS)):
            # Slice heatmap of corresponging body's part.
            heatMap = out[0, i, :, :]
    
            # Originally, we try to find all the local maximums. To simplify a sample
            # we just find a global one. However only a single pose at the same time
            # could be detected this way.
            _, conf, _, point = cv.minMaxLoc(heatMap)
            x = (frameWidth * point[0]) / out.shape[3]
            y = (frameHeight * point[1]) / out.shape[2]
            # Add a point if it's confidence is higher than threshold.
            points.append((int(x), int(y)) if conf > args.thr else None)
    
        for pair in POSE_PAIRS:
            partFrom = pair[0]
            partTo = pair[1]
            assert(partFrom in BODY_PARTS)
            assert(partTo in BODY_PARTS)
    
            idFrom = BODY_PARTS[partFrom]
            idTo = BODY_PARTS[partTo]
    
            if points[idFrom] and points[idTo]:
                cv.line(frame, points[idFrom], points[idTo], (0, 255, 0), 3)
                cv.ellipse(frame, points[idFrom], (3, 3), 0, 0, 360, (0, 0, 255), cv.FILLED)
                cv.ellipse(frame, points[idTo], (3, 3), 0, 0, 360, (0, 0, 255), cv.FILLED)
    
        t, _ = net.getPerfProfile()
        freq = cv.getTickFrequency() / 1000
        cv.putText(frame, '%.2fms' % (t / freq), (10, 20), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0))
    
        cv.imshow('OpenPose using OpenCV', frame)

    本项目实现代码及模型参见网址:https://download.csdn.net/download/m0_38106923/11265524

     关注公众号,发送关键字:关键点检测,获取资源。

    展开全文
  • 人脸关键点检测-递归编解码网络

    千次阅读 2016-09-05 11:44:34
    本次介绍一篇关于人脸关键点检测(人脸对齐)的文章:《ECCV16 A Recurrent Encoder-Decoder Network for Sequential Face Alignment》.作者主页:...
  • 人体骨骼关键点检测综述

    万次阅读 多人点赞 2018-06-11 12:53:45
    其它机器学习、深度学习算法的全面系统讲解可以阅读《机器学习-原理、算法与应用》,清华大学出版社,雷明著,由SIGAI公众号作者倾力打造。...近年来,随着深度学习技术的发展,人体骨骼关键点检测效果不断...
  • 人体骨骼关键点检测

    千次阅读 2019-05-16 17:05:27
    AI Challenger 其中的人体骨骼关键点检测主要依赖的技术背景为Human pose estimation。 该领域分为单人和多人两类,根据竞赛数据集来看,该任务为mult-person pose estimation。以下先介绍该竞赛的相技术背景。 --...
  • 一、人脸关键点检测数据库 (2001年发布)BioID :约1000幅图像,每个人脸标定20个关键点。 https://www.bioid.com/About/BioID-Face-Database (2011年发布)LFPW:1132幅图像,每个人脸标定29个关键点 ...
  • DirectPose: Direct End-to-End Multi-Person Pose Estimation ...1.出发 最近,anchor-free的思想在CV的各个...多数anchor-free的目标检测算法利用对图像中特征的定位,实现目标检测。很容易看出,一个人体实例...
  • 关键点检测——无监督

    千次阅读 2018-07-14 23:42:08
    《Unsupervised Discovery of Object ...本文使用无监督的方式来发现结构表现的目标关键点网络结构: 采用的是名为 hourglass 的网络构架,以图片作为输出,该网络输出 k+1 个 channel,含有 k 个...
  • CNN人脸关键点检测

    千次阅读 2016-10-13 10:31:16
    CNN人脸关键点检测
  • 人脸关键点检测

    千次阅读 2017-12-08 11:38:30
    人脸关键点检测是在人脸检测的基础上,对人脸上的特征点例如眼睛、鼻子、嘴巴等进行定位。本例是使用caffe框架实现的结果,效果如下: 二:数据源的制作 因为lmdb不支持多标签,所以这里使用的是hdf5格式,支持...
  • 人脸关键点检测PFLD论文解读

    千次阅读 2019-08-31 17:29:57
    最近做了一个人脸关键点相关的项目,选择了PFLD方案,在这里顺便写一下...人脸关键点检测论文《PFLD: A Practical Facial Landmark Detector》 在2019年2月提出的,是由天津大学、武汉大学、腾讯AI Lab等共同提出...
  • 参考: ... ... 1. 导言 人体骨骼关键点对于描述人体姿态,预测人体行为至关重要。因此人体骨骼关键点检测是诸多计算机视觉任务的基础,例如动作分类,异常行为...
  • 关键点检测的总结

    万次阅读 2019-05-23 10:38:35
    交大MVIG组提出RMPE的两步法框架(ICCV 2017论文),并基于此开发了AlphaPose这一人体关键点检测系统。 RMPE框架采用自顶向下的方法,先检测人,再去做姿态估计。该框架有三个主要组成部分: 首先是对称空间...
  • 基于PaddlePaddle实现人脸关键点检测模型MTCNN

    千次阅读 多人点赞 2019-04-30 22:28:59
    MTCNN,Multi-task convolutional neural network(多任务卷积神经网络),将人脸区域检测与人脸关键点检测放在了一起,总体可分为P-Net、R-Net、和O-Net三层网络结构。它是2016年中国科学院深圳研究院提出的用于...
  • 基于深度学习的手部21类关键点检测

    万次阅读 多人点赞 2021-05-03 19:49:12
    基于深度学习的手部21类关键点检测 开发环境 * Python 3.7 * PyTorch >= 1.5.1 * opencv-python 数据源 普通USB彩色(RGB)网络摄像头 已经存储下来的视频或者图片 数据集 本项目数据集百度网盘下载地址:...
  • 人脸关键点检测3——DCNN

    千次阅读 2018-05-31 21:50:50
    2013年,通过3级卷积神经网络来估计人脸关键点(5点),属于级联回归方法。 级联的卷积网络结构: Level1,采用了3个CNN,输入区域分别为整张脸(F1),眼睛和鼻子(EN1),鼻子和嘴(EM1)。F1输入尺寸为39*...
  • 基于OpenCV和tensorflow的人脸关键点检测引言人脸关键点数据集tensorflow模型搭建pb文件的生成ckpt文件的生成结合pb文件和opencv的人脸关键点实时检测CKPT文件的调用 引言 最近利用tengine平台做了一个移植到...
  • 人脸关键点检测9——DAN

    千次阅读 2018-07-14 22:05:25
    《Deep Alignment Network:A convolutional neural network for robust...DAN(Deep Alignment Network),与以往级联神经网络输入的是图像的某一部分不同,DAN各阶段网络的输入均为整张图片。当网络均采用整张图片...
  • 人脸关键点检测8——Face++(4)

    千次阅读 2018-05-31 23:21:39
    CVPR2017,Face++改进关键点检测 整体的网络结构: 本文提出了一个四阶段简到繁的框架去处理关键点检测任务 Satge1:一个人脸检测器去定位目标区域,接着预测旋转角度,对目标图片进行对齐,然后,对...
  • 关键点检测——标签(Ground Truth)构建

    千次阅读 热门讨论 2019-01-02 21:55:24
    关键点检测——标签(Ground Truth)构建 Coordinate、Heatmap和Heatmap + Offsets 首先介绍一下关键点回归的Ground Truth的构建问题,主要有两种思路,Coordinate和Heatmap,Coordinate即直接将关键点坐标...
  • 关键点检测方法、人体姿态估计

    千次阅读 2019-04-01 20:08:56
    NIPS 2018(oral):通过端到端几何推理发现潜在3D关键点 https://www.itcodemonkey.com/article/9143.html
  • Mask R-CNN 关键点检测

    万次阅读 热门讨论 2018-05-18 18:47:43
    Mask R-CNN阅读笔记 摘要: 应用maskrcnn参加的阿里举办的一个比赛,效果还可以,不过有人做的更好,工程... 1.Intrduction 物体检测和语义分割(semantic segmentation)发展很快,像用于物体检测的Fast/Faster R...
  • 深度学习人脸关键点检测方法----综述

    万次阅读 多人点赞 2017-12-25 10:55:50
    近期对人脸关键点相关方法进行了研究,在深度学习大行其道的背景之下,此博客对近期人脸关键点检测深度学习方法进行了记录和总结,希望给广大朋友一点点启发,也希望大家指出我阅读过程中的错误~ 主要有如下模型: ...
  • 文章目录一、CornerNet二、ExtremeNet三、CenterNet3.1 关键步骤:3.2 关键点检测网络:3.3 目标大小的回归3.4 从点到b-box: 持续添加哦~ 一、CornerNet 目前的单阶段检测因为引入了anchor机制,获得可以和两阶段...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 134,864
精华内容 53,945
关键字:

关键点检测网络