一个自主设计的人脸表情识别器
在实践了机器学习和人工智能一段时间后,我觉得当下机器学习,尤其是视觉检测遇到了一个瓶颈:神经网络的建立固然可以最大限度地抽取物体特征,但是这个过程对于我们而言是一个黑箱,哪怕我们明白我们所创建的网络的结构;例如,tensorflow中我们所熟悉的mnist训练,其基本操作就已经给出了超过90%的正确率;可是,花费了多得多的时间所进行的高级训练,却并没有带来相应的正确率的提高;究其原因,就在于背后过程是一个黑箱,我们无法从打破这个黑箱入手来提高运行效率。
从底层打破黑箱的尝试
有感于此,我在Matlab的dynare部分源码的基础上,从底层实现了基础性的神经网络创建工作(主要是BP算法)以及常用的logit及SVM算法;在结合OpenCV的基础上,简化了神经网络的创建和训练;最后,用这个简单的算法实现了一个人脸情绪识别器,同时,为了得到一个简单的GUI提示,用java jni来调用。具体步骤如下:
- 在GUI提示下,用OpenCV自带的haarcascade_frontalface_default.xml分别用video抓取普通表情,讨厌表情及高兴表情各三张图片;
- 用基于dynare源码的C代码实现几个基本的haarscade特征的提取,并生成myEmotionCascade.xml;
- 运用SVM算法,采取两两组合的方式定义标签,训练这9个sample,并把训练结果存入data路径下面;
- 训练结束后,读取生成的myEmotionCascade.xml,在相应的haarscade特征的帮助下,完成人脸定位检测;
- 再在读取SVM训练生成数据的基础上,完成人脸情绪的识别。
对应的 github链接: link.
友情提示
最后,有一个经验和各位同仁分享:机器学习得到的结果无论多么精致,本质上都是一个统计概率问题;而统计中有一个著名的行话:Garbage in, garbage out. 所以,建议各位以重视算法的认真态度同样重视样本的质量。
欢迎拍砖!