DRML(2016-CVPR)重现过程记录---(9)问题解决与最终结果
之前谈到的现象是单个AU用lmdb和softmax可以正常训练,而采用了multi-label数据输入和multi-sigmoid loss函数层却不能正常训练,后来张君鹏帮我检查,发现是因为输入的数据没有shuffle。后来我发现这个错误刘琳学姐也犯了,大概新入门caffe的人在第一次修改输入层时可能容易犯这个错误。因为一般我们用lmdb时会在命令中添加shuffle,但是新的层一般是不会自动设计这个shuffle的,所以需要人为打乱输入再送进神经网络中去。
打乱输入数据之后,处理了BP4D和DISFA数据集,就可以训练测试多个AU了。下面是结果
上面是DISFA数据集在DRML上的测试结果
上面是 DISFA数据集在AlexNet, ConvNet, DRML上的结果对比
上面是DISFA在DRML上的ROC曲线和AUC值
上面的图是BP4D数据集在DRML, ConvNet, AlexNet下的训练loss曲线
上面的图片是BP4D 数据集在DRML训练模型的ROC曲线
上面是BP4D数据集结果与文章的对比(f1-score)
上面是BP4D数据集结果与文章的对比(AUC)
结论与分析
根据DISFA数据集在DRML上的测试结果,其中第一行中的(p/n)(p/n)分别代表ground truth和实验出来AU是否存在,在最后两列求得正负样本比,为0的情况代表负样本数目是正样本数目的10倍及以上,这种情况认为该AU训练无效。所以我们只需要观察样本比非0的这些AU。显然正负样本数目最接近的AU12与AU25是表现最好的,说明正负样本比对神经网络训练影响比较大。而AU26,AU4,AU6,相对来说学习得不是很成功。
看DISFA数据集在DRML上ROC曲线分析,也是AU12和AU25学习得最好,这里有一个有趣的现象,就是AU4和AU6的正负样本比差不多,而AU4的学习效果却比AU6差很多呢?这就要从他们的本质说起了。AU4代表的含义是皱眉头,这个AU一般跟负面情绪有关,AU6代表的是脸颊提升,AU6通常会与AU12同时出现。AU6比AU4好检测的原因有两个:一,AU6的动作幅度较大,脸颊提升造成的脸部变化远比皱眉造成的脸部变化要大;二,AU6与AU12具有强烈的相关性,而AU12嘴角提升这种明显的变化十分容易检测到,两者又一般同时出现,这个强烈的相关性会直接提升AU6的检测性能。
看DISFA数据集在DRML、ConvNet、AlexNet上的结果对比。以AU12为例,仔细观察可以发现,DRML和ConvNet的结果比AlexNet好,说明之前提出的去掉pooling层是有意义的,但是ConvNet和DRML的区别不是很明显,有时候ConvNet比DRML稍微好一点,有时候DRML比ConvNet稍微好一点,都差不太多,这里还不好判断region层是否真的有用。
我们再来看一下BP4D数据集的实验结果。
根据DRML、AlexNet、ConvNet的训练曲线,仅仅看这个曲线只能发现AlexNet是收敛最好最快的。然后让我们看看具体的模型测试结果。
看数据集在DRML训练模型的ROC曲线。根据这个ROC曲线可以看到,同样的,不同的AU训练出来的效果是不一样的,AU6和AU12训练的结果十分好看,这里会发现AU10的结果也很好,这是因为AU10的样本量是最多的。
总的来说,结论是有region层的DRML的确比没有region层的ConvNet结果好,所以region的设计应该是有意义的;而我的结果比作者文章的好看,究其原因应该是因为我在选取数据集时严格控制了样本比例,我这里设置选择BP4D所有正样本,对应负样本数目不得高于正样本数目的两倍,train\val\test都是这么做的,所以结果比作者的好看。
至此,DRML的重现工作已基本完成。感谢作者Kaili Zhao的远程答疑,以及小学弟张君鹏的各种帮忙~