我使用k均值对面部表情进行分类的方法是:
使用opencv检测图像中的人脸
使用ASM和障碍物获取面部特征点
计算面部特征之间的距离(如图所示)。将有5个距离。
计算每个面部表情的每个距离的质心(exp:在距离D1中,每个表情“快乐,生气...”都有7个质心)。
使用5个k均值,每个k均值有一段距离,并且每个k均值将具有最接近第一步中计算的质心的距离表示的表达式。
最终表达式将是出现在最多k均值结果中的表达式
但是,使用该方法我的结果是错误的吗?
我的方法正确还是在某个地方错误?
最佳答案
K均值不是分类算法。运行后,它仅查找K个元素的质心,因此将数据拆分为K个部分,但是在大多数情况下,它与所需的类没有任何关系。当您要探索数据并找到一些可区分的对象时,应使用此算法(作为所有聚类方法)。在任何意义上都是可区分的。如果您的任务是建立一个可以识别某些给定类的系统,那么这是一个classification问题,而不是clustering。 KNN(K近邻)是最容易实现和理解的最简单方法之一,它大致完成了您要完成的工作-检查哪些类的对象与某些预定义的对象最接近。
为了更好地了解差异,让我们考虑一下您的情况-您正在尝试根据面部特征检测情绪状态。在此类数据上运行k均值可以将您的面部照片分成许多组:
如果您使用不同人的照片,则可以将特定人的照片聚在一起(因为他们的距离彼此不同)
它可以将数据分解为例如男人和女人,因为在这些功能上存在性别差异
它甚至可以根据距相机的距离拆分数据,因为视角会改变您的功能,从而形成“集群”。
等等
如您所见,有数十种可能的“合理的”(甚至更完全不可解释的)分裂,而K均值(以及任何其他)聚类算法将简单地找到其中之一(在大多数情况下-不可解释的分裂)。分类方法用于克服此问题,以“解释”算法的期望。