由于本学期课程设置有计算机视觉与机器学习,故试图将两者结合,通过机器学习的一般算法而非深度学习的方式,给出自己设计的简单的图像分类问题的解决方案,即预先通过PCA(主成分分析)将图像进行“降维”,提取有效的特征,利用SVMs(多分类支持向量机)进行模型的参数学习。
一般地,常用的机器学习算法对于数据处理和分析具有很强的优势和很好的可解释性,但对于图像识别问题则并不如有着“暴力美学”的神经网络学习,导致这一结果的原因是直观的,机器学习模型往往模型参数更小,对于图像这种大宗的数据,并不能很好地进行规律统计和描述。但是对于某些任务,比如人脸识别,许多数据集的人脸信息表达是十分稀疏的,一张人脸图像中,含有许多的冗余信息(背景等),如果将这些冗余信息视作噪声,我们可以采取一定的方法将其去除,从而保有最关键的一些特征,依据关键特征进行分类,或许可以为图像这种大宗数据的分类问题找到突破口。
何为关键特征?基于SIFT,SURF等传统的特征点提取算法提出的关键点适合做分类的特征点吗?
SIFT等算法能够提取丰富的稳定的兴趣点,但是这些兴趣点包括但不仅限于人脸部特征(容易受环境影响引入噪声),并且这些特征点容易受光照,尺度变换(可以理解为远近),旋转等影响,并且由于特征点描述子非常庞大(对于SIFT一个特征点需要一个128维的特征向量描述),所以这些传统提取算法提取的特征点并不能为这个问题带来简化。
换个思路,如果我们将每一个像素点视为一个特征,是否我们抛弃一些“噪声点”,就可以简化运算复杂度?这一思路是直观且可解释的。那么我们设计的重点就落脚到了如何设计一个原则进行“抛弃”。哪些点属于“噪声点”,而哪些像素点又属于“关键特征”。
报告将试图从PCA和SVM一般原理出发,解释本联合算法的合理性和实验效果。
主成分分析是一种非常常用的分析思路,即使我们预先没有了解过这个概念,但是对于算法的思想我们却无时无刻不在使用。比如我们参加一次party,会上我们认识了许多朋友,其中有两个新朋友是郭德纲和吴某凡,假如说我们参加party的主人公是个脸盲(这意味着不能依靠颜值判断)并且记忆力没那么好(这意味着需要足够少的特征进行判断),他怎么快速的区分开这两位新朋友呢?于是他搜集了两人的一些特征如下,他迅速检索着,发现其实对于发型和性别特征是无法将两人分开的,但是单靠身高一项特征就可以完美将凡凡和刚刚分开。于是下一次再见面,他可以只对两人的身高进行比较即可判断出哪个可以让他开怀大笑,哪个可以让他快速充电。
回顾这一过程,大致上经历了这样一个过程,即“提取特征—去冗余特征—学习判别依据—实例验证”,我们聚焦到去冗余这一关键步骤上,对于我们人类而言,是可以快速找到判别的依据(身高)的,但是对于机器而言,我们怎么描述这一判别依据的有效性呢,即怎么评判哪些特征是有用的呢?我们发现有一个直观的表述,那就是两者的差异性体现最为明显的特征,往往可以将两者进行很好的区分。众所周知,在数学中,用方差来描述样本数据的差异性。下面将从数学原理入手,解释算法的合理性。
后补充:事实上,举例只是为了说明我们可以采用差异性来作为有效特征的选择依据,但是对于PCA算法,它不仅仅是挑选一部分有用的特征出来,而是利用一些现有特征做线性组合,构造出新的特征,作为判别依据,当然,我们希望这些新的特征维数足够少以达到我们降维的目的。
首先生成50条样本数据(分布在y = x附近),为了方便可视化,每个样本具有两个特征。试图将这50个样本数据在一个直线上表示,即达到了降维的目的。数据可视化如图1-2,经过PCA降维,重新投影得到绿色的圈,如图1-3。并用连线的方式指出了对应的投影关系,大致上“投影线”和“投影面“呈现一个正交关系。
我采用了FaceDB_orl人脸数据集进行试验,该数据集发布于1994年,共有40个人的人脸数据,每个人有10张人脸图像,包含了不同的光线条件,不同的表情(睁眼,闭眼),有轻微遮挡(戴眼镜和不戴眼镜),分辨率为92*112。此处我将每个人取5张图存在矩阵中,方便读取,其中五个人的图像如图1-4。对其进行PCA降维,其中生成的特征脸如图1-5。
在第一次实验中,我取了前30维特征来描述一张人脸,恢复后效果对比如图1-6.依次增加保留的维数,可以从视觉上明显感觉到细节还原的逼近程度。降维的程度越大(保留的维数越少),细节丢失越严重。
更换小数据集之后重新验证,发现仍有此规律,因此使用PCA算法确实可以达到压缩数据的目的,从而为进一步的分类学习节省运算提供了可能性。
由于在之前的支持向量机笔记中已经较为详细地将该算法的原理和推导等做了比较详细的记录,节省篇幅起见,在这里主要对支持向量机的求解方法SMO(第一次没有将其视为重点,故在此处作为补充)以及几种常用的基于支持向量机解决多分类问题的实现方法进行学习。
见代码说明文档。
见代码说明文档。
训练时依次把某个类别的样本归为一类,其他剩余的样本归为另一类,这样k个类别的样本就构造出了k个SVM。分类时将未知样本分类为具有最大分类函数值的那类。
优点:分类速度快,分离超平面个数为数据类别数。缺点:存在分类重叠与不可分类现象。
分类重叠现象:在进行测试时,对于每一类label,svm模型都会选择说测试数据属于这一类,导致都想“争抢”测试样本;此类问题比较容易解决,选择一个置信度最高的类即可(几何间隔最大)。
不可分类现象:在进行测试时,对于每一类label,svm都会说不属于自己这一类,导致都选择“排斥”测试样本,这导致多分类svm失效。
数据集偏斜现象:训练集本身,对于每一类样本数据个数不对等,相差较多的情况,这样学得的超平面,为了保证间隔最小,会导致让小数据类别更多地被误分类,这是不难理解的,因为牺牲小部分样例误分类如果可以让大数目样本更多的被正确分类,这种牺牲对于损失函数下降是有意义的,从而导致在测试时本属于小数目样本的数据可能被误分类为大数目的样本类别中。One-Versus-Rest 方案正是人为的造成了数据集偏斜。
解决方法有数据集平衡,可以采取上采样或者下采样的方式进行数据集再平衡。
具体做法是在任意两类样本之间设计一个SVM,因此k个类别的样本就需要设计k(k-1)/2个SVM。当对一个未知样本进行分类时,最后得票最多的类别即为该未知样本的类别。在训练时往往比一对多花的时间少,并且由于采用了投票表决的方式,一定程度上解决了样本不可分问题,但是分类的类别多的时候,会使svm数目爆炸。
DAG存在的一个问题是单分类器的误判代价较高。如上图若根分类器判断错误,输入真实类别为A,却被错分至右边,这次误判将直接导致输入不会被正确分类。故而在选择根分类器时需选择鲁棒性较强的一个二分类器,子树的根分类器同理。
综合考量本实验选择的数据集以及编程难度实现的性价比,我最终选择了1v1的方式实现支持向量机多分类问题。这种方法只需要将之前解决二分类问题的svm算法直接应用于任意两类数据上即可,在分类判别时每一类维护一个“投票箱”,最终得票多者即为算法最终的判别结果。
对于 FaceDB_orl 数据集,每一例样本具有92 * 112 = 10304维特征,如果单纯利用支持向量机处理,算法的需要承受的复杂度是难以想象的,查阅资料了解到支持向量机算
可见,支持向量机算法复杂度是非常依赖于样本特征维数,如果对样本点的特征维数大幅度压缩,是有望提升算法实际运行的效率的。
中需要引入激活函数(非线性映射关系)来打破层与层之间的仿射关系。
那么idea又出现了,如果将PCA降维后的特征进行非线性映射再重新降维是否会有出其不意的效果?对于这个问题本着不负责任的态度,我认为对于本联合算法而言,非为不能,亦是不必。因为在支持向量机算法的核技巧事实上正是通过内积将特征进行了非线性的映射,因此即使真实的特征之间有非线性的耦合关系,支持向量机已经在一定程度上能够应对。
Mapping这个操作的表述是我特意与归一化(normalization)区别开来,两者是有一定区别的。首先我们知道对于许多问题,归一化是极有可能带来性能上提升的,我个人理解的原因在于不同特征之间的“相对描述“比”绝对描述“更有意义。比如我们在对两个来自不同地区的学生的assess的时候,我们有他们的高考成绩,但不幸的是一位是全国卷考生(总分750),一位是江苏考生(总分485分),如果两人都考了400分,我们人是可以”智能“的认为江苏卷考生是更为优秀的(假设试题难度都大致相当的情况下),因为我们自动地进行了一种”重映射“,如果更为科学和量化的描述,我们可能会想到对其排名进行统计,最终可能得到江苏考生位列前3%,而全国卷考生位列70%,这一差异是显著的。那么对于机器而言,它对于数据是敏感的,因此我们将各维度特征都取归一化,是有希望让机器也获得这种”智能“的。
为什么我的选择是Mapping而不是normalization?在深度学习中,往往对图像进行零均值化(zero-mean)处理,从而加快算法的收敛速度。在本联合算法中,不牵扯到梯度运算的过程,因此对于加快算法的收敛应该是无意义的,有一点可以指出的是,我所说的Mapping是可以选择映射的范围的,同时又是零均值的,这至少有一点优点是显而易见的,如果映射范围较大,是有利于提高计算精度的。同时为特征引入符号上的不同,或许会带来意想不到的效果(纯瞎猜),而事实上经过实验,对于支持向量机分类的问题并没有产生明显的影响,不过最终仍保留了Mapping操作,为以后引进其他策略做好准备。
由于采用的数据集样本数量少,并且实际中也可能存在训练集样本数少这种问题,应对策略有图像增广,包括但不限于剪切,对比度调整,旋转,镜像。对本数据集来说,广泛存在弱镜像关系的图片,如图4-2.可以明显观察到有此规律,因此可以在图像预处理阶段进行对训练集的图像增广,即做镜像对称处理后的图片加入到训练集中。这样有效地增加了样本数量。
在进行非对齐人脸测试时,有一种较为明显的现象即SMO算法测得的测试集准确率往往略高于内点法测得的测试集准确率,猜想应该是内点法力求得到的是训练集上的最优解,此时可能已经过拟合了,而SMO算法求得的是近似解,虽然对于训练集拟合程度没有特别高,但一定程度上应对了过拟合现象发生。
如何通俗易懂地讲解什么是 PCA 主成分分析?
https://www.zhihu.com/question/41120789/answer/481966094
主成分分析(PCA)原理详解
https://blog.csdn.net/program_developer/article/details/80632779
支持向量机SVM—实现多分类问题的解决方案
https://blog.csdn.net/weixin_44822636/article/details/110820652
支持向量机(Support Vector Machine,SVM)算法复杂度详解
https://blog.csdn.net/weixin_36474809/article/details/103986845
t-SNE降维方法
http://www.360doc.com/content/18/0125/20/99071_725086942.shtml
你知道PCA的四种写法么
https://zhuanlan.zhihu.com/p/62902515
深度学习图像预处理中为什么使用零均值化(zero-mean)
https://blog.csdn.net/mooneve/article/details/81943904