通过人脸判断性别

       最近由于课程需要,一直在研究通过人脸来判断性别,在OpenCV的contrib中提供了两种可以用来识别性别的方法:EigenFace和FisherFace,EigenFace主要是使用PCA(主成分分析),通过消除数据中的相关性,将高维图像降低到低维空间,训练集中的样本被映射成低维空间中的一点,需要判断测试图片性别时,先将测试图片映射到低维空间中,然后计算离测试图片最近样本点是哪一个,将最近样本点的性别赋值给测试图片;FisherFace主要利用LDA(线性投影分析)的思想,将样本空间中的男女样本投影到过原点的一条直线上,并确保样本在该线上的投影类内距离最小,类间距离最大,从而分离出识别男女的分界线。

    对于人脸判断性别而言,LDA方法(即FisherFace)更为适合,因为PCA考虑的是所有不同种类样本在哪些方向上分布最广,没有考虑不同类之间的关系,而LDA则考虑了如何使不同类样本尽量分得最开。

    在FisherFace的介绍文档中,作者宣称其在交叉测试中获得了98%左右的性别识别率,但我在实际使用过程中,发现FisherFace并没有作者说得那么好,仅仅不到60%,只比随机猜测略好一些,好悲催 -_-!。

    通过实验观察,本人认为主要原因有以下几点:1.作者在实验时对样本进行了眼睛位置的严格标定,所有样本眼睛的位置都严格重合,因此FisherFace可以找到更稳定的区别信息,但在实际中,前期面部识别工作是由Viola_Jones分类器完成的,由于Viola_Jones分类器无法做到眼睛精确定位,因此测试图片与样本无法较好重合;2.原始样本采用了200*200大小的图片,形成了40000维的特征矢量,其中包含了大量冗余信息和噪声,导致了LDA方法的不准确。

    这里本人通过一种简单方法,克服了FisherFace存在的缺点:首先对原始样本图像进行PCA降维,而后再使用LDA进行分类训练;在进行测试时,也先对原始图像进行PCA降维,再利用LDA进行识别,这样可以有效消除冗余信息和噪声的干扰,压缩后的信息对脸部位置也变得不敏感。通过随机下载一些网络图片进行测试,发现在训练样本库固定不变的情况下,优化过的FisherFace够正确识别约90%左右的人物性别,相比原始的方法提升了约30%左右。

    这里是人脸分类的可执行文件:click here(2012/12/14最新上传,bug已经修改,没有安装cuda环境的电脑也能执行了),需要的童鞋请点击下载。

    给几张效果图:


    

                           


你可能感兴趣的:(机器视觉,模式识别)