给机器准备教材
图像的像素这么多(维度这么高),现实的情况如此复杂,我们没有办法手工地定义好规则然后让计算机执行,因此需要准备足够的训练数据,设计算法让机器自己寻找其中的统计规律,然后对训练数据以外的测试样例进行预测,所谓的机器学习。可是如何表示这些训练数据,怎样描述所谓的规律,设计什么样的算法让机器去寻找规律,这些都不是容易的问题。一篇典型的计算机视觉的论文经常就这几个问题提出一两个新的方法。例如对于表情识别这个问题,在数据的表示方面,是直接使用像素值,还是图像的梯度或其他滤波结果,或是其他手工定义的特征,例如HOG?LBP?是在整张图上提取特征来表示,还是在人脸的关键点附近?是人工定义区域来提取还是让机器自己寻找和表情有关的区域?对于规律的描述,是使用一个生成(generative)模型,例如基于PCA的ASM,AAM来描述人脸的动作?还是使用判别(discriminative)模型,例如random forest,深度卷积网络(CNN)选取或学习有意义的特征来预测分类结果?如何让机器自动地寻找规律,即这些模型的参数?是通过添加约束,使得问题存在一个closed form 的解,还是直接使用梯度下降法获得有个局部最优解?
因此,这里头的学问也是五花八门。在此,我们使用深度卷积网络(deep convolutional network, CNN) 直接从整张图像的像素值学习特征,同时通过线性分类器进行表情的分类。
表情数据库
表情分类在计算机视觉领域一直是个不冷不热的话题。怎么说呢?情感分析应该是人机交互里面一个非常重要的问题,可是情感分析简单地表示成表情分类会带来以下问题。
- 问题定义困难。人的表情应该分为几类?目前学术界使用7个类别:无表情、生气、厌恶、惊讶、开心、伤心、害怕。可是仔细想想,这7个类既不是正交的也不能完全表示人的表情。例如一个人既可以同时惊讶和害怕。又例如人除了这7个表情,还可以有其他表情,例如嘲笑算什么?
- 数据收集困难。一些开心的图片网上一搜一大堆。可是某些表情,例如厌恶、害怕,不太好找。
话虽如此,即便表情分类这个提法有自己的限制,能学习出一个表情分类器仍然是有作用的,例如至少我们能判断一个人是否开心或者伤心啊(否则Microsoft Oxford Project 和indico的表情接口就白做啦:))。
这里我们采用的训练数据来自Kaggle的一个表情分类比赛。其中包含三万多张来自网上的人脸图片,每张图片被标注为“无表情、生气、厌恶、惊讶、开心、伤心、害怕”的其中一种。
开源深度学习库
有了数据&#x