利用scikit-learn进行人脸表面关键点的定位

我们大多数人都照镜子,不知道我们看起来有多好。但是,在判断自己的吸引力时,往往很难客观,而我们往往太尴尬而无法要求别人的意见。如果有一个计算机程序可以为你回答这个问题,你的形象怎么样?很漂亮,是吗?
在这篇文章中,我将向你展示我们如何利用计算机视觉和机器学习从一个单一的照片来预测一个人的面部吸引力。我会用opencv,NumPy和scikit学习开发一个完全自动化的流水线,以一个人的脸的照片为例。
将机器学习应用到机器视觉问题中,视觉数据的高维度是一个非常需要考虑的问题。即使只是一个200x200的小图片,也是有着40000维的特征向量。深度学习模型,如卷机神经网络可以直接用于原始图像,但是他们需要大量的数据集。在这里我们只需要仅仅500张图片,不去直接作用于原图,而是预先从图中提取一些有用的信息。
1.面部特征提取
影响颜值的重要因素就是不同面部器官之间距离的比例关系以及其形状。而这个作为关键点体现则是眼角,鼻尖及下巴等位置。在上图你可以看到这些点在图中用红色标记出来了。为了计算这些点之间的比例,我们需要找一个方法精确定位关键点的位置。所以,在这里我们用了一个开源框架CLM框架去提取这些关键点。
2.脸部吸引力数据集
也就是500个女性的已经被评级的图片,通过这些图片我们将面部分为十级,进而进行预测颜值分数。
3.特征点生成
我们首先在CLM框架中运行这些图片并读取这些图片中的标记点。然后我们利用python脚本去计算所有出现的特征点对,然后存储这些结果。然后得到这些特征值后,我们进一步开始进行机器学习部分。
4.脸部比例的机器学习
虽然有很多机器学习的框架,但是因为用scikit-learn安装最简单,所以这里我们用这个。

Ubuntu

1
sudo apt-get install python-sklearn

Mac OSX

1
pip install -U numpy scipy scikit-learn

Windows

1
pip install -U scikit-learn

一旦我们安装好之后,就可以去提取特征和比率了:

import numpy as np
 
features = np.loadtxt('features_ALL.txt', delimiter=',')
ratings = np.loadtxt('labels.txt', delimiter=',')

如果现在你打开特征文件,那么你能看到文件内数据量很大,如果直接使用的话会变成维度灾难。所以我们要将这个数据进行降维处理,减少维度,使用主成份分析即(PCA)进行降维处理。

from sklearn import decomposition
 
pca = decomposition.PCA(n_components=20)
pca.fit(features_train)
features_train = pca.transform(features_train)
features_test = pca.transform(features_test)
在上面代码中n_components是超参数,可以通过测试模型性能来选择。

现在我们需要选择一个模型来解决我们的问题,很明显我们的问题是回归问题,所以我们可以使用线性回归,SVM,随即森林回归,高斯过程回归等方法。

regr = linear_model.LinearRegression()
regr.fit(features_train, ratings_train)
ratings_predict = regr.predict(features_test)
上面的代码将将建立一个合适的线性回归模型,然后存储预测值。下一步就是进行性能评测。其中一个方法就是计算实际比率和预测比率之间的皮尔森相关性。计算可以利用Numpy

corr = np.corrcoef(ratings_predict, ratings_test)[0, 1]
5.结果

因为本身样本数目就不多,只有500个,所以我们选取499个用来训练,一个用来预测,使用交叉验证的方法。然后我们计算了皮尔森相关性。下图是使用几种常见方法的性能比较:



其中线性回归和随机森林表现最好,相关性有0.64,K邻近有0.6,高斯回归0.52,SVM真的很差。

6.测试

Yoona, Predicted Rating: 3.6



Yuri, Predicted Rating: 3.4



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值