我正在使用PCA和SVM进行人脸识别。在Matlab中使用libSVM来实现SVM。我试图实现一对所有分类。我有一个三重问题。
首先:如果类1中有10张图片(面孔1),那么类2应该有60张图片(每张面孔10张图片,共6个面孔)吗?
其次:准确率是否取决于我在两个类别中使用的图片数量?如果是,那么由于类二中有大量图片,准确率是否可能达到100%(不合理的高)?
第三:可以使用单张图片进行测试吗?
任何帮助将不胜感激。
回答:
你提出了三个问题:
(1) EDIT: 是的,正如你在评论中解释的那样。如果你有7个类别,你将训练7个分类器。对于每个分类器i,你将针对个体i的正类图片进行训练,而针对所有其他个体的图片作为负类进行训练。
你描述的是一对所有分类,这是一种常用的方法,用于通过基本的二元分类器(如SVM)进行多类分类。让我补充一点,还有其他方法可以将二元分类器扩展到多类分类,例如一对一和错误校正锦标赛。
EDIT #2:让我补充一点,一对一分类已经在LIBSVM中实现,你真的不需要做任何特殊操作。你所需要做的就是在训练数据中为每个类别添加不同的双精度数(所以你可以使用类0, 1, … 7)。
如果你真的想做一对所有(也称为一对其余),你也可以使用它。由于你似乎在使用MATLAB,有代码(它没有在LIBSVM中直接实现),但LIBSVM的作者提供了实现该功能的代码:直接链接到常见问题解答
(2) 准确率将取决于图片的数量。在理想情况下,你将有许多个体的图片用于训练。但你可能会遇到不平衡数据集的情况,例如,如果你用类x的一百万张图片和类y的仅2张图片以及类z的2张图片进行训练,你会遇到问题,因为你的分类器对类x的了解比另外两个类更详细。为了评估,你需要一个完整的混淆矩阵(即,类x的真实对象中有多少被分类为类y,以及类y的真实对象中有多少被分类为类x,等等,对于每一对类别都是如此)。
(3) 是的,可以。
EDIT #3:
从LIBSVM作者的评论来看,一对一的准确率与一对所有的准确率相似,区别在于训练一对一更快,这就是他们在系统中实现一对一的原因。
要使用LIBSVM训练多类模型,你将使用svmtrain并只调用一次。类1是个体1的图片,类2是个体2的图片,…类7是个体7的图片。
预测时,在训练你的模型后,你将使用svmpredict