小白参加EmotiW 2016

来源:互联网 发布:淘宝刷评论有什么影响 编辑:程序博客网 时间:2024/05/16 01:59

当知道老板让我们做一个表情识别的比赛的时候,内心是激动的,同时也是懵比的。在我们自己瞎折腾一个月后,好在老板让实验室里的一个研究生师兄带着我们入了门。那是师兄的一个毕业设计,我们直接拿来当基本框架用了。
刚开始,我们首先对往年的比赛论文做了一个研究,找到了以往比较厉害的方法,但是限于自身水平,很多英文看的不是很明白,一些处理方法也是一知半解,只能提取出一些关键词出来。之后上网搜索的话,又很难找到opencv的相关源码出来。由于还没有上过相关的专业课,没有先行的技术积累,我们的起步有点困难。
这个比赛的难点在于in the wild,不同于识别实验室里的人脸,比赛要去识别的都是电影里的片段以及相关的电视节目里的人物表情,干扰很大, 用OpenCV haar+adaboost的方法识别率很低,经过一番查找,我们采用了 Shiqi Yu 的人脸检测库,识别率很高,使用简单。

#pragma comment(lib,"libfacedetect.lib")#include “facedetect-dll.h”Mat gray, smallImg( cvRound (img.rows/scale), cvRound(img.cols/scale), CV_8UC1 );//将图片缩小,加快检测速度cvtColor( img, gray, CV_BGR2GRAY );//转换成灰度图像resize( gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR );//将尺寸缩小到1/scale,用线性插值equalizeHist( smallImg, smallImg );//直方图均衡int * pResults = NULL;pResults = facedetect_multiview_reinforce((unsigned char*)(smallImg.ptr(0)), smallImg.cols, smallImg.rows, smallImg.step,1.2f, 5, 24);short * p = ((short*)(pResults+1))+6*i;int x = p[0];int y = p[1];int w = p[2];int h = p[3];int neighbors = p[4];int angle = p[5];

其次就是选择采用什么特征去识别了,师兄开始用的是LBP-HF,效果并不是特别好。于是我们在网上又找了HOG行人检测的相关代码,将其特征计算部分移植到我们这里来。经过训练再测试,发现样本大小128*128与64*64的识别率差不多高,于是最后采用了64*64的样本,速度还快些。
HOG的使用也较为简单,在opencv里的代码很简洁:

HOGDescriptor hog(Size(64,64),Size(16,16),Size(8,8),Size(8,8),9);//HOG检测器,用来计算HOG描述子的int DescriptorDim;//HOG描述子的维数,由图片大小、检测窗口大小、块大小、细胞单元中直方图bin个数决定Mat src = image_r;vector<float> descriptors;//HOG描述子向量hog.compute(src,descriptors,Size(8,8));//计算HOG描述子,检测窗口移动步长(8,8)

分类器我们采用了SVM和RandomForest,opencv里都有现成的函数,但是在设置参数方面,由于缺少先行知识,我们有一些疑问无法解决,询问老板也说让我们自己尝试,但是随机森林的训练时间较长,一个一个数值的去试也不太现实,我们也就只能大致用几个数尝试了一下,效果提升不大。

我们的几种组合用大赛组委会提供的数据集Train训练,在Val上测试得到的识别率也就在25%左右, 去汇报工作时,老板显然不太满意,认为我们的方法过于简单,又提出了一些新方法,比如CNN,比如kmeans的单层神经网络,那些都是实验室里的师兄做的项目,让我们自己去尝试。最坑的就是CNN了,采用了NVIDIA的CUDA,新安装了VS2013又安装了NVIDIA的开发包,按照师兄的办法和网上的教程折腾了一两天,发现对于WIN8.1的系统并不支持。。。看着我发红的C盘,心中简直一万匹草泥马奔过。后来师兄说,他试了一下,发现效果也并不是太好。。。只有20%左右的识别率,我想想这其实对我也是一种解脱了。
除此之外,我们自己尝试了通过眼睛定位,来校正脸部旋转角度,采用的是模板匹配,眼睛的检测成功率不高,经常会误识别,也只能放弃。还有聚类分析再降维的方法,因为test里的不同视频的人脸就算表情一样的话,也是形态各异的,直接训练的话,很难在其中找到一个共同的特点,所以想到了聚类分析的方法。即将一个视频里的每一帧图片上检测到的人脸作为一个整体的样本,聚成三类,再对其进行降维处理(PCA)。可惜想法是美好的,最后的识别率也不尽如人意,误差反而越来越大,基本上都是将不同的表情都归为同一个表情。

最后的话,我们也就是在之前的几种老方法上进行不断的测试和修改,样本的选择和对于Val视频的回测花费了较多的时间。在最终test的视频上,我们最好的识别率达到了36.93%,还是比baseline略低一些。最好的组合是SVM+HOG,其次是RF+HOG,SVM+LBP-HF的效果相对是最差的。
我们也引入了这三种组合的投票机制,尝试过根据每种组合对于不同表情的识别率进行一个加权的投票,但是用我们的方法效果也不是特别好。只能使用最简单的方法,少数服从多数的投票方法,识别率相比前者还高了很多,但是依旧没法超过投票的三种组合中最好的识别率。
结果提交之后,我们又接着写比赛论文,要求是英文,描述使用的方法。但是很尴尬的是,我们自己也并没有什么原创的特别好的方法,只是大概照着往年的论文格式勉强的凑齐了四页多,不过写完也是相当的有成就感了。

昨天将最终的论文也提交了上去,今天来回顾这几个月(从今年四五月份开始),特别是七月份这一个月的努力,也是非常感谢导师给了这次机会,让我们能在本科二年级参加这种国际化的比赛;感谢几位师兄的帮助,我们才能很好的从一无所知的小白,到对模式识别有了一定的了解,并去参加了EmotiW 2016的比赛。还有就是两位队友了,三个人利用暑假留在学校,全心全意做了一个月的比赛,去和世界各个大学、实验室里的顶尖人物进行同台竞技,也第一次写了英文论文,其实真的是一次大学里非常难忘的经历。
扯这么多,就是对这次比赛做一个小小的总结,也希望能成为自己在本专业应用方面的一个良好开端。

1 0
原创粉丝点击