Keras 训练自己的人脸特征点提取模型的坑

以下是从入坑到脱坑的全过程

本文的目的是什么?

目前,人脸识别的应用已经非常普遍,人脸识别的技术也非常成熟,(想了解人脸识别原理的同学点这里)一般情况我们可以选择付费的api,如果《穷》就可以选择一些开源的项目加以改进。但是实际项目如果是牛脸识别,猪脸识别,狗脸识别,猫脸识别呢!这种需求是存在的,但是就不会有那么多资源,甚至没有资源供我们自己使用,然后我们自然地就想到能否把人脸识别的相关技术用在上面呢!我不知道这个技术是否可行,但人们总会先把过去成功的经验用在相似的事情上。可以确定的是人脸识别所用到的所有模型不可能拿来直接用,因为它不可能把牛脸当作人脸,但是我们可以用回归模型训练的思路,用相对应的数据,去训练对应的模型。也就是如果一个模型可以通过训练进行人脸识别,那么只要不改变网络结构,只是重新训练模型的权重,那么牛脸识别,猫脸识别也应该能做到。

总结一下本文的目的

最后总结一下就是,我希望可以找到一个模型A,适用于牛脸识别,但苦于没有数据,我只能用现成的/但又黑盒的人脸识别模型生成人脸特征数据,用这批特征数据去验证模型A。(如果能找到开源的人脸特征点提取模型(是提取landmark坐标点的模型,不是将人脸图像降维到一定长度的模型),就不用靠猜的了)

选择模型

这个实验我打算用inception-V3作为基础模型,在后面接上两层全连接,变成一个新的网络。(为什么要加两层全连接,我是猜的,模型搭建经验不足啊!!!)

为什么用inception呢,因为它已经被大量用到一些分类识别的项目上了,说明它的卷积层还是可以抓到图像信息的,所以我将它的卷积部分的权重冻结,算上后加上的两层全连接,这个实验仅训练后三层网络。

数据制作

本次实验我只想训练模型能够提取人脸68个特征点坐标,因此我找到都是人脸图像(不包含复杂背景,只有头的那种),作为训练用到的模型输入数据,同时也做了图像增强,旋转/平移/缩放……

用开源项目把这些人脸图进行特征点标记,并存起来当作我的labels

模型训练代码

 略……

预测结果

模型训练完,无论给模型输入什么图像,输出都一样,无论什么图片,输出总是在图片的同一个位置画出人脸特征点。

分析与再次尝试

2020-8-19:即便是输入模型全零矩阵,也会有同样的输出,输入与输出没有建立一种映射关系,仅仅找到了一个输出,能让所有标签loss平均最小,是模型结构问题?损失函数问题?,很有可能是模型的问题,无论输入什么图像,模型的某些层会消除所有差异,导致输出恒定不变!准备尝试resnet50模型,还不行就尝试自己建立模型,至少做到输出会随着输入不同而变化。

2020-8-20:事实上输出并不一样,只是小数点后几位不同,即便用resnet50也是这样,这是什么原因呢!!!

2020-8-21:准备尝试Hourglass网络,数据已增强,这里用到了人体躯干关节点提取常用的Hourglass网络

2020-8-25:事实证明Hourglass是有效果的,它能够找到眼睛和嘴巴的位置,由于训练次数太少,准确度还不高,但性能是可以提升的,也就是网络结构才是最关键的。

2020-8-26:看到有人用ASM算法做的人脸特征点提取,有机会再试。

未完待续。。。

posted @ 2020-08-18 17:25  牛郎  阅读(935)  评论(0编辑  收藏  举报