《Deep Alignment Network:A convolutional neural network for robust face alignment》
  • CVPR-2017,Marek Kowalski et al,DAN

DAN(Deep Alignment Network),与以往级联神经网络输入的是图像的某一部分不同,DAN各阶段网络的输入均为整张图片。当网络均采用整张图片作为输入时,DAN可以有效的克服头部姿态以及初始化带来的问题,从而得到更好的检测效果。之所以DAN能将整张图片作为输入,是因为其加入了关键点热图(Landmark Heatmaps),关键点热图的使用是本文的重要创新点。
注:速度略差,但想法很好。

创新点:

1)与以往的级联模型不同,网络模型输入是整张人脸图,可获取更多信息。
2)关键点热图。

DAN的基本框架:


迭代处理的框架,可以利用上一帧的预测结果来预测下一帧 Landmark 的位置。
(1)初始
输入灰度图I以及标准关键点模板S0S{_{0}}S0​,预测得到新的关键点位置S1S{_{1}}S1​。
注:S0S{_{0}}S0​可取所有训练样本的平均关键点。
其中“FEED FORWARD NN”结构如下,输出136个值用于预测68个关键点:

新的关键点位置会送入 “CONNECTION LAYERS”,该网络结构如下:

首先计算一个S1S{_{1}}S1​到S0S{_{0}}S0​的相似变换矩阵T1T{_{1}}T1​。
注:这里不采用仿射变换,是为了防止局部畸变,而是采用了相似变换。
通过T1T{_{1}}T1​我们可以对图像进行矫正得到T1(I)T{_{1}}(I)T1​(I),同时对关键点进行变换得到关键点热图H1H{_{1}}H1​。
特征图F1F{_{1}}F1​是通过“FEED FORWARD NN”的fc1层特征进一步得到的。
其中关键点热图通过下式计算得到:(其实就是一个中心衰减,关键点处值最大,越远则值越小)。

其中特征图的计算如下:使用dense layer使fc1层输出单元为3136,使用ReLU激活,reshape为5656,然后上采样到112112,和输入图像一样大。(之所以一开始不直接生成112112,是因为实验发现提升不大但计算量会增大比较多。)目的:人为给CNN增加上一阶段信息。
注:图像的转换使用双线性插值。
(2)初始迭代
每次迭代输入TN(I)T{_{N}}(I)TN​(I),HNH{_{N}}HN​和FNF{_{N}}FN​,它们的维度均为112
112。然后计算新的St+1S{_{t+1}}St+1​。
需要注意的是,由于图像进行了相似变换,因此为了和最初的输入图像相匹配,需要做如下矫正:

IBUG数据集上的第一阶段输出:

从图中发现,DAN要做的“变换”,就是把图片给矫正了。那么DAN对姿态变换具有很好的适应能力,或许就得益于这个“变换”。


实现过程:

数据准备: 扩大1.3倍人脸框裁剪图片,同时计算平均人脸关键点。
输入图像进行灰度化处理
网络学习的是已知标准关键点的偏移量。
第一阶段:
输入灰度图 -> 前向传播 -> 直到fc2层输出136个偏移值,再加上标准的平均关键点来计算损失(L2损失/双眼间距离做归一化)。
第二阶段:
1)计算相似变换矩阵,根据标准关键点和第一阶段输出的关键点。
2)对原始图像和第一阶段输出的关键点应用相似变换。
3)对变换后的输出关键点计算热图
4) 对第一阶段的fc1层增加一个全连接层,输出为56x56,之后reshape为[None,56,56,1],上采样到112x112大小得到特征图。
将变换后的原始图像、热图及特征图进行concat连接,作为第二阶段的输入,不断迭代,输出为fc2。
损失计算:fc2+变换后的关键点来作为最后的预测关键点,因为输入时进行了相似变换,
因此计算损失时,需要对预测的关键点进行反变换回原图。
…综上:可以增加N个阶段,每个阶段都需要关键点对齐操作。

热图的计算:
Python代码:

import os
import numpy as np
import itertools
import cv2
from matplotlib import pyplot as plt
np.set_printoptions(suppress=True,threshold=np.NaN)HalfSize = 8   #半径的尺寸
IMGSIZE = 112  #图像的尺寸
#定义16*16*2的矩阵,0为y,从上到下[-8,7];1为x,从左到右[-8,7]。
Offsets = np.array(list(itertools.product(range(-HalfSize, HalfSize), \range(-HalfSize, HalfSize))), dtype=np.int32).reshape((16,16,2))
#限定landmark的值域范围
def clip_by_value(landmark):h,w = landmark.shapefor i in range(h):for j in range(w):if landmark[i][j] <HalfSize:landmark[i][j] = HalfSizeif landmark[i][j] > (IMGSIZE-1-HalfSize):landmark[i][j] = (IMGSIZE-1-HalfSize)return landmark
#针对每个点位,画点热图
def draw_landmark(Point):iniLandmark = Point.astype(np.int)    #对点值取整locations = Offsets + iniLandmark       #移动16*16区域到关键点区域dxdy = Point - iniLandmark.astype(np.float)        #关键点的偏移量offsetsSubPix = Offsets.astype(np.float) - dxdy    #公式中的(x,y)- Sivals = 1/(1 + np.linalg.norm(offsetsSubPix,axis =2))   #公式H(x,y)img = draw_point(locations,vals)return img
#在图像上画点
def draw_point(location,vals):img = np.zeros((IMGSIZE,IMGSIZE,1),np.float32)h,w,c = location.shapefor i in range(h):for j in range(w):img[location[i][j][0]][location[i][j][1]] = vals[i][j] return imgif __name__ == '__main__':aa = '0.162805  0.337997  0.160961  0.434602  *** *** 0.693376'landmark = np.array(aa.strip().split()).astype(np.float32)*112land = landmark.reshape((-1,2))[:,::-1]   #reshape成68*2,并进行x和y转换land = clip_by_value(land)#定义68个点位热图R = np.zeros((68,112,112,1)).astype(np.float32)   for i in range(68):    R[i] = draw_landmark(land[i])
L = np.zeros((112,112)).astype(np.float32)
#选取68个热图中值最大的进行保留for i in range(112):for j in range(112):maxP = 0for k in range(68):if maxP < R[k][i][j][:]:maxP = R[k][i][j][:]L[i][j] = maxPnp.save('p2.6.np',L)plt.imshow(L)plt.show()#pic = L.reshape((112,112,1))#cv2.imshow('aaa',pic)#cv2.waitKey(0)
最终的效果:

参考:https://blog.csdn.net/shuzfan/article/details/77839176


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

人脸关键点检测9——DAN相关推荐

  1. 「每周CV论文推荐」 初学深度学习人脸关键点检测必读文章

    人脸关键点检测是人脸图像中重要的基石,今天给大家介绍入门深度学习人脸关键点检测必读的文章. 作者&编辑 | 言有三 1 DCNN Cascade 听这个名字就知道是一个很早期的,使用Casca ...

  2. 【每周CV论文推荐】 初学深度学习人脸关键点检测必读文章

    欢迎来到<每周CV论文推荐>.在这个专栏里,还是本着有三AI一贯的原则,专注于让大家能够系统性完成学习,所以我们推荐的文章也必定是同一主题的. 人脸关键点检测是人脸图像中重要的基石,今天给 ...

  3. 【face-landmarks】人脸关键点检测汇总

    2019.01.06 2018比较新的人脸关键点 https://blog.csdn.net/daniaokuye/article/details/82748599#commentBox FAN:时间 ...

  4. 人脸关键点检测综述(含论文、数据集、方法等)

    人脸关键点 人脸关键点检测是人脸识别和分析领域中的关键一步,它是诸如自动人脸识别.表情分析.三维人脸重建及三维动画等其它人脸相关问题的前提和突破口.近些年来,深度学习(http://www.rainc ...

  5. caffe 人脸关键点检测_人脸关键点对齐

    摘要: 从传统方法到深度学习方法,对人脸关键点定位/人脸对齐的发展进行梳理,对该领域中经典的方法,最新成果进行汇总,并给出相应的paper原文,项目主页及代码链接.重点介绍深度学习的几种最新方法. 1 ...

  6. 【技术综述】人脸关键点检测的数据集与核心算法

    人脸关键点检测是诸如人脸识别.表情分析.三维人脸重建等其它人脸相关任务的基础.近些年来,深度学习方法已被成功应用到了人脸的关键点检测,本章将介绍深度学习方法在人脸关键点检测方向的研究.包括人脸关键点任 ...

  7. paddle2.0高层API实现人脸关键点检测(人脸关键点检测综述_自定义网络_paddleHub_趣味ps)

    paddle2.0高层API实现人脸关键点检测(人脸关键点检测综述_自定义网络_paddleHub_趣味ps) 本文包含了: - 人脸关键点检测综述 - 人脸关键点检测数据集介绍以及数据处理实现 - ...

  8. 【机器视觉案例】(11) 眨眼计数器,人脸关键点检测,附python完整代码

    各位同学好,今天和大家分享一下如何使用 mediapipe+opencv 实现眨眼计数器.先放张图看效果. 下图左侧为视频图像,右侧为平滑后的人眼开合比曲线.以左眼为例,若眼眶上下边界的距离与左右边界 ...

  9. python人脸识别、人脸关键点检测、性别检测

    python人脸识别.人脸关键点检测.性别检测 文章目录 根据人脸预测年龄性别和情绪 (python + keras)(三) 一款入门级的人脸.视频.文字检测以及识别的项目. age-gender-e ...

最新文章

  1. 插件化知识梳理(7) 类的动态加载入门
  2. 【oracle】sqlnet.ora 访问控制策略
  3. android,iOS,win8我的观点
  4. Java设计模式-观察者模式(订阅发布模式)
  5. 160 - 2 Afkayas.1
  6. 程序员成长之路--软件架构
  7. 1.3亿豪宅被拆 抱头痛哭的房主,真实身份竟是保健品大佬,曾涉嫌传销...
  8. 第三节课-损失函数和优化
  9. Smartmontools检测硬盘坏道
  10. python脚本性能分析
  11. 疯狂连连看之加载界面的图片
  12. mysql与nagios的结合使用
  13. SQLite不同插入方法的效率对比测试
  14. oracle数据库的监听配置
  15. 胖子哥的大数据之路(二)- 大数据结构化数据存储应用模式
  16. 极力推荐--不错的delphi 学习网站与论坛---有待补充
  17. 论文重复率一般要求是多少?
  18. http://t.cn/xxx的短链接如何生成?(附15款新浪短链接生成器)
  19. Preparing transaction:done Verifying transaction:failed RemoveError:‘requests‘ is a dependency of **
  20. echarts使用复选框样式legend控制显隐

热门文章

  1. 利用C语言完成倒计时关机
  2. kvm上添加万兆网卡_万兆网卡使用经验总结
  3. 易语言大漠插件模块制作后台设置后台绑定窗口句柄
  4. 手动启动fabric例子marbles02
  5. android开发笔记之多媒体—撕衣服(开心一下)
  6. 没钱如何创业,在这告诉你。
  7. VUE-PDF 实现pdf在线预览
  8. 计算机组装与维修图文,{企业管理流程图}电脑组装与维护培训讲义版十二课电脑组装流程图解(50页)-原创力文档...
  9. c语言课程设计图书馆管理系统例子,C语言课程设计图书馆管理系统源程序
  10. Linux常用PDF阅读软件