人脸关键点检测3——DCNN[通俗易懂]

人脸关键点检测3——DCNN[通俗易懂]《DeepConvolutionalNetworkCascadeforFacialPointDetection》2013年,通过3级卷积神经网络来估计人脸关键点(5点),属于级联回归方法。级联的卷积网络结构:Level1,采用了3个CNN,输入区域分别为整张脸(F1),眼睛和鼻子(EN1),鼻子和嘴(EM1)。F1输入尺寸为39*39,输出5个关键点的坐标;EN1输入…

大家好,又见面了,我是你们的朋友全栈君。

######《Deep Convolutional Network Cascade for Facial Point Detection》
2013年,通过3级卷积神经网络来估计人脸关键点(5点),属于级联回归方法。
级联的卷积网络结构:
这里写图片描述
Level1,采用了3个CNN,输入区域分别为整张脸(F1),眼睛和鼻子(EN1),鼻子和嘴(EM1)。F1输入尺寸为3939,输出5个关键点的坐标;EN1输入尺寸为3139,输出是3个关键点的坐标;NM1输入尺寸为3139,输出是3个关键点。Level-1的输出是由三个CNN输出取平均得到,来较少变动。
Level-2,由10个CNN构成,输入尺寸均为15
15,每两个组成一对,一对CNN对一个关键点进行预测,预测结果同样是采取平均。
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),作者认为传统的全局权值共享是考虑到,某一特征可能在图像中任何位置出现,所以采用全局权值共享。然而,对于类似人脸这样具有固定空间结构的图像而言,全局权值共享就不奏效了。因为眼睛就是在上面,鼻子就是在中间,嘴巴就是在下面的。作者通过实验证明了局部权值共享给网络带来性能提升。
网络结构:
这里写图片描述
这里写图片描述
注:Level1中F1采用S0,EN1和NM1采用S2;Level2和Level3全部采用S2。
多级回归:
我们发现几种有效的方法结合多重卷积网络。第一个是多级回归。脸部bounding box是仅有的先验知识。一个面部点对bounding box的相对位置可能分部在一个很大的范围,这是由于脸部检测器的不稳定性和姿态的多样性。所以第一级的输入区域应该是足够大来覆盖所有可能的预测。但大的输入区域是主要的不准确原因,因为不相关的区域可能退化网络最后的输出。第一级的网络输出为接下来的检测提供了一个强大的先验知识。真实的脸部点伪装分布在第一级预测的一个小领域内。所以第二级的检测可以在一个小范围内完成。但没有上下文信息,局部区域的表现是不可靠的。为了避免发散,我们不能级联太多层,或者过多信任接下来的层。这些网络只能在一个小范围内调整初始预测。
为了更好的提高检测精度和可靠性,我们提出了每一级都有多个网络共同地预测每一个点。这些网络的不同在于输入区域。最后的预测可以用公式表达如下:
这里写图片描述
对n-级级联,在i级有li个预测。第一级的预测是绝对位置,接下来的级的预测是调整。
训练:
第一级,训练和边界相关的小块,通过小的变换和旋转增强数据。在接下来的级中,我们训练以ground truth 位置随机变换得到的位置为中心的小块,第二级在水平和竖直最大的shift为0.05,第三级为0.02,这个距离是以bounding box的大小为基准。参数通过随机初始化和随机梯度下降法得到。
测试:
这里写图片描述
DCNN采用级联回归的思想,从粗到精的逐步得到精确的关键点位置,不仅设计了三级级联的卷积神经网络,还引入局部权值共享机制,从而提升网络的定位性能。最终在数据集BioID和LFPW上均获得当时最优结果。速度方面,采用3.3GHz的CPU,每0.12秒检测一张图片的5个关键点。


注:博众家之所长,集群英之荟萃。

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/141868.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • oracle删除索引_创建普通索引sql

    oracle删除索引_创建普通索引sql1.索引分类a)唯一索引,作用是数据约束,保证数据唯一,还有就是数据索引,提高查询效率b)一般索引,只有数据索引的作用,2.唯一索引的建立createuniqueindex索引名on表名(字段名)ok,假设有一个Emploeyy表,里面有一个empName字段,我们来为empName添加唯一索引createuniqueindexidx_empnameone…

  • 缓存解决方案SpringDataRedis

    缓存解决方案SpringDataRedis

  • layoutSubviews的使用

    layoutSubviews的使用-(void)layoutSubviews{ }layoutSubviews是对subviews的重新布局以下情况会被调用1.直接调用layoutSubviews.如:[selflayoutSubviews];2.用addSubview添加视图时会触发3.滚动UIScrollView时会触发4.旋转屏幕的时候会触发父视图的layoutSu

  • c语言list的使用方法,c语言list操作

    c语言list的使用方法,c语言list操作#includetypedefstructLnode{intdata;structLnode*next;}LND,*lnd;lndmalloclist(lndl){l=(lnd)malloc(sizeof(LND));returnl;}intinitlist(lndl,intn){l->data=n;l->next=NULL;lndp;for(…

  • Java爬取先知论坛文章

    Java爬取先知论坛文章0x00前言上篇文章写了部分爬虫代码,这里给出一个完整的爬取先知论坛文章代码,用于技术交流。0x01代码实现pom.xml加入依赖:<dependencie

    2021年12月12日
  • C语言学习——sprintf函数详细解释及其用法

    C语言学习——sprintf函数详细解释及其用法sprintf指的是字符串格式化命令,函数声明为 int sprintf(char *string, char *format [,argument,…]);,主要功能是把格式化的数据写入某个字符串中,即发送格式化输出到 string 所指向的字符串。sprintf 是个变参函数。使用sprintf 对于写入buffer的字符数是没有限制的,这就存在了buffer溢出的可能性。解决这个问题,可以…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号