仍然感谢助教和队友,本文承接http://blog.youkuaiyun.com/bizer_csdn/article/details/54755843
实验平台为Matlab,并需要一些开源工具包
本次作业共采用了5种方法,其对应实验结果如下:
vgg+PCA+LDA+SVM |
AdaBoost+LBP+LDA |
LBP\Fisherface+KNN |
SIFT特征点+PCA+SVM |
SIFT特征点+随机森林 |
91.70% |
94.80% |
89.80% |
69.1% |
76.30% |
目录
一、vgg网络
本方法首先运用vgg网络提取人脸特征(4096维),然后在此基础上,用PCA、LDA和SVM的方法,对人脸图片进行识别。
vgg是一个37层用于人脸识别,并且已经训练好的网络,输出为“softmax”,把第36层输出的4096维向量作为输入人脸图片提取的特征,然后在此基础上运用传统模式对图片进行分类。
计算流程:
(1)加载vgg网络
加载vgg网络,vgg网络输入为 224*224*3的彩色图,而本次作业的图片是 灰度图,所以对于每张训练图片,要通过“imresize”后变为 ,然后减去vgg网络训练数据的均值(RGB每个通道都有),至此,输入格式也变为 ;然后通过“vl_simplenn”计算训练集中每个人脸图片的输出的4096维特征(每张人脸在输入网络前,必须进行去均值操作)。相关神经网络在上次作业中已经阐释,这里不再赘述。
load data\\train_data
train_num = size(tr_data,3);
% 用vgg网络提取特征特征(4096维),把特征存储在train_block(600*4096)中
% 读取vgg网络
net_path=fullfile(vl_rootnn, 'data', 'models','vgg-face.mat') ;
net=load(net_path);
train_block=zeros(train_num,4096);
for i=1:train_num/200
im=single(tr_data(:,:,i));
%让输入人脸图片符合vgg网络输入大小
im=imresize(im, net.meta.normalization.imageSize(1:2));
%去均值
im= bsxfun(@minus,im,net.meta.normalization.averageImage) ;
res = vl_simplenn(net, im) ;
%提取4096维向量
train_block(i,:)=res(end-2).x;
end
save data\\train_block;
(2)PCA降维
通过Matlab内置的“pca”函数对所提取的特征进行降维,当协方差所对应的特征值占据总能量的98%以上时候,将所对应的特征向量组成投影矩阵。简单介绍一下“pca”函数,用法如下所示:
[coeff,score,latent] =pca(train_block);
函数输入train_block对应训练样本集合,是一个 的矩阵,其中 是样本个数, 是样本维数;PCA实际上是求取一个投影变换矩阵,使得样本投影后尽可能地保留最大有用信息。
为求得投影矩阵,首先求取train_block的协方差矩阵,Matlab中是自动进行去均值操作的,而协方差矩阵为:
latent是对于特征值(按从大到小排序)。
%pca降维
[coeff,score,latent] = pca(train_block);
dim = 150;