这里主要通过对人脸的分析,得出,年龄,性别,种族,表情,魅力值等属性。

所有的这些问题中,有分类问题也有回归问题,准确的说是一个多标签的分类+回归问题。

 对于多标签问题,对于caffe有2种处理思路,一种是使用HDF5格式,另一种就是修改caffe源码。

 

1.数据准备

这里同时进行2种方式的说明。

(1)修改源码,主要修改cafferoot/tools/convert_imageset.cpp。使得其支持多标签的读取。下载链接:http://download.csdn.net/detail/qq_14845119/9864928

修改完,重新编译后,caffe的LMDB读取方式就支持多标签了。这里将需要分类的标签都存储在LMDB中。

 

生成图片和用于分类的标签的LMDB

../../build/tools/convert_imageset  --resize_height=96  --resize_width=96 /dataSet/myPIC/img_align_96_96/ /dataSet/myPIC/train_class.txt  ./img_train_lmdb  ./img_train_label_lmdb  5

../../build/tools/convert_imageset  --resize_height=96  --resize_width=96 /dataSet/myPIC/img_align_96_96/ /dataSet/myPIC/val_class.txt  ./img_val_lmdb  ./img_val_label_lmdb  5

 

(2)将用于回归的标签存储在HDF5中,因为HDF5支持小数格式的标签。例如将年龄,魅力值存储在HDF5中,

traindata=importdata('/dataSet/myPIC/train_regress.txt');
valdata=importdata('/dataSet/myPIC/val_regress.txt');
traindata=traindata/100;
valdata=valdata/100;

% train
h5create('train.h5','/label_age',[1 size(traindata,1)],'Datatype','single');
h5create('train.h5','/label_attractive',[1 size(traindata,1)],'Datatype','single');
age_label = reshape(traindata(:,1),[1 size(traindata,1)]);
attractive_label = reshape(traindata(:,2),[1 size(traindata,1)]);
h5write('train.h5' ,'/label_age', single(age_label));
h5write('train.h5' ,'/label_attractive', single(attractive_label));
% val
h5create('val.h5','/label_age',[1 size(valdata,1)],'Datatype','single');
h5create('val.h5','/label_attractive',[1 size(valdata,1)],'Datatype','single');
age_label = reshape(valdata(:,1),[1 size(valdata,1)]);
attractive_label = reshape(valdata(:,2),[1 size(valdata,1)]);

h5write('val.h5' ,'/label_age', single(age_label));
h5write('val.h5' ,'/label_attractive', single(attractive_label));

 

2.网络设计

网络结构图,

 

3.开始训练

下面就可以进行训练操作了,

../../build/tools/caffe  train  --solver=solver.prototxt  --gpu=0


 

 

从曲线上还是可以看出数据不够干净,有噪声在里面,不过整体还是很会的收敛了。

 

4.实验效果:


————————————————