平均脸

无聊查看学校研究生信息网源码时发现,照片信息竟然是绝对引用另一台数据服务器的地址,并且更严重的是照片是以学号命名的。我试着访问了相邻学号的同学照片,竟然很顺利的看到了。学生学号命名很有规律,11级别硕士,就是11S打头,后面跟着6位数字分别岱庙学院号,系代号以及具体班级号。哈哈,一个python脚本把我们同一届的研究生照片全部拉下来,再一试,08-10级的也都能得到,漏洞竟然已经存在了4!!全部照片一共1w多张,师哥师姐偶对不住了,在此请大家原谅。以下是部分下载到的照片:

 

若是一枚屌丝,看看美女也就罢了,但是我可是有志要做一名骨灰级屌丝的哇,这么好的资源岂能轻易放过。脑子各种东东开始闪现,Fashbook老大曾经做过facemash.com,后来效仿者华科脸pk也一炮成名Hust-facemash.com。想想技术也不难,无非就是前端一个网页,后端一个排序算法就可以搞定。把师哥师姐的照片放到网上也不是太人道,算了,还是回归老本行,图像处理搞起来~

 

想了半天,脸融合我还挺感兴趣,刚好以前有接触过人脸识别的相关内容。找了一下相关的论文以及前人实践的结果,南大的刘靖康曾经用7000照片做了相应的脸融合,提到了用beyond-reality-face.com的库做特征点的提取,但是具体融合技术细节没有透露,后来他跟腾讯联合搞了个各个高校的平均脸。于是我决定,我这次做平均脸的程序将全部开源,算法细节将逐一呈现!那么该如何入手呢?

 

我的思路是这样,首先还是要提取出人脸的特征点,重要的如眼睛的、鼻子、嘴的位置、脸型的轮廓等。如下图所示。 

 

人脸特征点的提取几乎是所有人脸处理的第一步,所以这方面的库也比较多。我选用了一个简单的9特征点提取,包括两眼睛4点,鼻子3点,以及嘴巴两个点。特征点提取的源代码没有仔细研究,有志青年可以仔细看看,其实现用到了opencv的库,算法方面则是采用了Viola&Jones的经典face detection。前人栽树,后人乘凉,有了提取到的特征点,可以说脸融合的工作已经完成了90%了。神马?剩下10%你还是不清楚,那请继续往下看。

 

特征点得到后,我们需要用一个标准脸的模板,来将每个个体不同的点位加以线性变换(非线性变换将会扭曲脸型,最终得到的将不是平均脸,而是扭曲后的标准化脸),线性变换只是旋转以及比例缩放,对脸不会产生扭曲作用。那么采用什么方法来得到线性变换呢? 

Tlinear = cp2tform(input_points,base_points,'linear conformal');

Matlab中使用的命令是cp2tform,该函数由输入的两幅图像的对应点生成变换结构,输入input_points就是由算法得到的9个点base_points则是标定的基准点。

 

3图片融合的结果

得到线性变换的图像之后,直接采用语句

MergeImg(ii,jj,kk) = double(MergeImg(ii,jj,kk))+ double(imgTrans(ii,jj,kk));

便可以得到结果。

接下来就直接给结果啦,激动人心的时刻有木有!50图片融合的结果。看看还是挺标致的哈。

 

所有源代码以及测试程序我将上传至github在此严正声明,所有照片仅仅供学习和研究使用!希望大家准守规则哈~

 

后续,还可以继续挖掘,比如这篇文章中提到了美女的标准,所谓三庭五眼,用以上程序稍加修改就能变成一个美女照片挑选程序,感兴趣大家可以做一做。


  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
2.1 加载 OlivettiFaces 人数据集 OlivettiFaces 数据集包含 400 张 64x64 像素的人图片,每张图片都属于 40 个人中的一个人。这个数据集可以从 scikit-learn 库中直接加载: ```python from sklearn.datasets import fetch_olivetti_faces faces = fetch_olivetti_faces() ``` 2.2 使用 PCA 对人进行降维和特征提取 PCA(Principal Component Analysis)是一种常用的降维算法,可以把高维数据映射到低维空间。在人识别任务中,PCA 可以用来提取特征。 特征是指在训练数据集上通过 PCA 得到的一组基,这些基可以用来描述数据集中的大部分变化。对于每个像素位置,特征都有一个对应的权重,这些权重构成了一个向量,称为人的特征向量。 下面的代码使用 scikit-learn 库中的 PCA 类对 OlivettiFaces 数据集进行降维和特征提取: ```python from sklearn.decomposition import PCA # 将数据展平成二维数组 X = faces.data.reshape((400, -1)) # 创建 PCA 对象,并拟合数据 pca = PCA(n_components=100) pca.fit(X) # 提取特征 eigenfaces = pca.components_.reshape((100, 64, 64)) ``` 2.3 基于特征平均的人重构 特征平均可以用来重构人。具体来说,给定一个人图像,我们可以把它展平成一个向量,然后乘以特征的权重向量,再加上平均。这样就得到了一个新的向量,把它重新变成一个二维数组,就得到了重构后的图像。 下面的代码演示了如何使用特征平均对人进行重构: ```python import matplotlib.pyplot as plt import numpy as np # 选择一张人图像作为示例 face_index = 0 example_face = X[face_index] # 计算该人图像的特征向量 weights = pca.transform([example_face])[0] # 计算重构后的图像 mean_face = pca.mean_ reconstructed_face = np.dot(weights, pca.components_) + mean_face # 将向量重新变成二维数组 reconstructed_face = reconstructed_face.reshape((64, 64)) # 显示原始图像和重构后的图像 fig, axes = plt.subplots(1, 2, figsize=(8, 4)) axes[0].imshow(example_face.reshape((64, 64)), cmap='gray') axes[0].set_title('Original Face') axes[1].imshow(reconstructed_face, cmap='gray') axes[1].set_title('Reconstructed Face') plt.show() ``` 运行以上代码,就可以看到原始图像和重构后的图像。可以发现,重构后的图像与原始图像非常相似,但是有一些细节上的差异。这些差异可能是由于 PCA 降维引入的信息损失造成的。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值