Cascaded CNN 方法寻找人脸关键点

论文笔记

阅读论文

第一阶段阅读论文,大约两天大体阅读完论文 Deep Convolutional Network Cascade for Facial Point Detection。感觉还是比较缺乏论文阅读经验,但是比以前快了很多。主要阅读论文 intro、method 和 modeling。作者的思维比较奇特,把损失函数放在 experiment 部分,我找了好久没找到。

编写代码

寻找同学帮助,发现代码变化太快,旧经验有些跟不上。尝试瞎猫撞死耗子的策略,瞎写,显然不能成功,浪费 4+ 天时间。

静下心,阅读 Caffe 框架代码,C++ 不熟悉,读 C++ 代码没经验。硬着头皮读,不得法,痛苦,事倍功半;晚上,脑子突然灵光一闪,读继承关系和头文件(因为 C 的头文件只是函数声明,而宏定义可以临时找),有效,思路清晰。一天时间写完代码。

NaN 和收敛失败

计算结果 J(theta) 是 NaN,天!各种 Debug,找了 3+ 天,代码中没发现和数值相关的 BUG。也许是数值计算方法的问题?不能,这是框架写的代码。后来发是学习率调太大。之前已经调小过,无效,没想到还要继续调小。

再次验证,收敛失败。这是什么原因?后来发现是 loss 的设计存在问题,没有做 normalization。细节在这里。收敛成功。

算法效果验证

最直接的方法当然是输出坐标点,可惜一点都不直观。写了一堆代码用来在图上做各种标记,代码混乱成翔(后来抽取到 我的 github)。从输出来看,总体位置还算靠谱,但是效果并不好,虽然还没量化,但是我知道肯定不好,不用算了。

我天真的觉得是 overfit 了。在 train set 做个测试,underfit。

突然想到会不会是 BUG 导致所有输出都是一样的?检查了输出的坐标,虽然比较相近,但是确实是不同的,所以应该不是 BUG。这说明,没有提取到足够的 inter-face 特征?这个地方要想想。

单点验证

其实我没有完全按照论文实现。论文结构太复杂,存在 3 个级联,第一个级联有 3 个网络做平均。作者的说法是第一个级联最重要,所以我只实现了第一个级联的其中一个网络。有可能没有完全按照结构设计导致的问题?

另外一个思路是,用一个 kernel 去扫描 5 个不同的面部特征真的靠谱么?我也许试试五个 kernel?一时间没有思路为何 underfit。先做一个 left eye 试试吧。我快速 10000 轮迭代做出个 model,输出一百个图像来人力比较,第一印象是单点的确比多点要准确。看一下损失:

左眼坐标网络损失:I0920 16:27:52.355422 11912 solver.cpp:294] Iteration 10000, Testing net (#0)

I0920 16:27:52.606781 11912 solver.cpp:343] Test net output #0: loss = 0.00317065 (* 1 = 0.00317065 loss)

脸部坐标网络损失:I0920 16:19:16.628931 48513 solver.cpp:294] Iteration 10000, Testing net (#0)

I0920 16:19:16.885615 48513 solver.cpp:343] Test net output #0: loss = 0.0263838 (* 1 = 0.0263838 loss)

从数据来看,确实只做一个坐标效果会比较好。

重读论文

我想我一定是弄错论文某些细节了,我决定重新读一遍这篇论文。重新阅读论文过程中,我产生了新的想法。

之前的 network 只有一个 kernel,而作者提出的方案是 locally weight-sharing,开始的时候不甚明了,直接忽略了。我看了 Convolutional Neural Networks 突然想通了 weight-sharing 指的是什么意思。Convolutional layers consist of a rectangular grid of neurons. It requires that the previous layer also be a rectangular grid of neurons. Each neuron takes inputs from a rectangular section of the previous layer; the weights for this rectangular section are the same for each neuron in the convolutional layer. Thus, the convolutional layer is just an image convolution of the previous layer, where the weights specify the convolution filter.

Fully-Connected layer 的输入和输出的尺寸都是固定的,每一个神经元对应一个输出。根据 Andrew NG 的 UFLDL,我产生了这种观念:卷积层只有一个神经元,这个神经元就是 kernel,是 weight 的矩阵。我突然发觉这种观念可能有问题。

我现在的理解是这样的,不知道有没有错。一般看到,kernel 只有一个,而 convolution layer 的输入是没有大小限制的,而输出也固定,根据图像大小产生不同大小的 feature map。如果换个角度看,convolution layer 是一个 (N−m+1)×(N−m+1) 个 m×m 的 kernel 的神经元,每个神经元对应着自己的感受域,产生一个输出:如果这样定义,convolution layer 也是输入输出大小固定的。而 weight-sharing 也很好理解了,就是这 (N−m+1)×(N−m+1) 个 kernel 现在变成了同一个,他们 share weight。而文章提出的方法就是,不再使用整个 feature map 做 weight-sharing,用同一个 kernel,而是分区域使用不同的 kernel。

输入区域似乎也和我想的不一样,原文的 input range 是脸部区域 + 一个百分比...,我觉得我当时没看到是不是不太合适....

看完我大概是怎么一个思路:先修改输入区域;

实现 locally weight-sharing 看看效果;

进一步提高再实现 cascaded 结构,这是后话。

调整输入范围

根据上次阅读论文的想法,先测试左眼的检测,进行数据清洗,只截取左眼。结果发现,虽然输出的 cost 变小了,但是看图片依然是 underfit。

进行 64 样本的测试,发现依旧是 underfit,这实在诡异,难道是 Bug?那么测试 1 样本试试,还是不准。输出预测值和坐标试试....咦,数据绩小,所以几乎完美重合,那么打印怎么会有那么巨大的位置错误,这只能解释为我的程序哪里写错了。

理理思路,程序的逻辑大概是:

Created with Raphaël 2.1.2Create DBLE DataLayerCNNLE Feature Extract

很可能是某个数值忘记加减,导致的偏移。检查输出值后发现,输出的训练坐标和预测坐标是几乎相同的。这就说明:训练数据生成错了

训练图像框错了

测试后发现,确实是自己 normalize 监督信号的时候把监督信号弄错了。在选取 sub-region 时候并不需要 normalize 坐标,只有 resize 才需要,大脑故障了。调整后发现,无论是损失函数,还是肉眼观察结果,比起之前大大靠谱,非常好。

cascade down_Cascaded CNN 方法寻找人脸关键点相关推荐

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

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

  2. 人脸关键点: DCNN-Deep Convolutional Network Cascade for Facial Point Detection

    近期学习关键点检测相关内容,基于CNN的方法已经替代以往经典的方法(ASM,AAM等),于是乎得看看CNN是如何应用到关键点检测上的. 创新点: 1.将CNN应用到人脸关键点检测当中 2.提出级联CN ...

  3. 人脸识别之人脸关键点(仅供本人参考)

    深度学习人脸关键点检测方法----综述 转自人脸关键点检测综述 不知道为什么在ubuntu下知呼中的图片无法显示 人脸关键点检测是人脸识别和分析领域中的关键一步,它是诸如自动人脸识别.表情分析.三维人 ...

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

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

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

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

  6. 基于人脸关键点修复人脸,腾讯等提出优于SOTA的LaFIn生成网络

    作者 | Yang Yang.Xiaojie Guo.Jiayi Ma.Lin Ma.Haibin Ling 译者 | 刘畅 编辑 | Jane 出品 | AI科技大本营(ID:rgznai100) ...

  7. 人脸关键点:TCDCN-Facial Landmark Detection by Deep Multi-task Learning

    <Facial Landmark Detection by Deep Multi-task Learning>发表于ECCV-2014,作者来自香港中文大学汤晓鸥团队的Zhanpeng Z ...

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

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

  9. CNN人脸关键点检测

    CNN人脸关键点检测 参考文献<Deep Convolutional Network Cascade for Facial Point Detection>\ 摘要 提出一种利用精心设计的 ...

最新文章

  1. 在ASP.NET中指定出错页面,不让代码外泄!
  2. How to attack a windows domain
  3. 机器学习理论《统计学习方法》学习笔记:第十章 隐马尔可夫模型(HMM)
  4. matlab中存档算法代码,MATLAB 智能算法超级学习手册中程序代码
  5. 慢速HTTP拒绝服务攻击
  6. elk入门_ELK堆栈入门
  7. 地球化学图解系统GCDPlot 0.33
  8. 萤火虫pte小程序_【PTE战报】84炸的Maggie,RS试试这样入手开始练习
  9. 如何在不联网的情况下安装 Silverlight Tools
  10. ABAQUS单位统一
  11. 2022年全球市场光学软件总体规模、主要企业、主要地区、产品和应用细分研究报告
  12. 选择华为帐号作为第三方登录的三个理由!
  13. 芥川龙之介《烟草与魔鬼》
  14. 如何修改jadx的默认内存
  15. poi根据模板导出word(包含图片、动态生成表格、合并单元格)(亲测有效)
  16. 带你走进缓存世界(1):漫谈缓存
  17. 解决win10外接高分辨率显示器,软件界面字体模糊问题
  18. 软件工程师的硬件与软件
  19. 位图和矢量图谁的色彩更丰富_更少的更多色彩
  20. 《树莓派4B家庭服务器搭建指南》第九期:用树莓派低成本给热心老哥搭个窝,在树莓派建立BBS论坛flarum并映射到公网全攻略...

热门文章

  1. dotnetConf 2016 线上虚拟大会
  2. MySQL - 触发器
  3. 将excel多个工作表(表结构相同)合并后生成csv文件
  4. 城市遥感动态监测管理系统
  5. 自定义sql_一个简单易用的开源BI软件,专为SQL用户设计的开源库
  6. 测试眉形的有哪个软件_这五款自动化软件测试工具,你最喜欢用哪个?
  7. 豆瓣评分9分+,每一部看完不禁感慨!这里是神州大地!
  8. 颜宁课题组再发Cell!1个月时间内4篇顶刊!
  9. Python程序员的30个常见错误
  10. 老板啥都懂,还天天套路我?!