Deep Convolutional Network Cascade for Facial Point Detection实践总结

测试代码:https://github.com/luoyetx/mini-caffe/tree/master          (example中deeplandmark例子)

训练代码:https://github.com/luoyetx/deep-landmark


测试代码的配置参考:http://blog.csdn.net/xzzppp/article/details/68495341

训练代码,在配置好GPU版本caffe后,按github步骤,很好配置。


测试阶段:

一,用作者提供的正脸图像进行测试,发现效果较好,如下图所示:


二,思考:是不是对其他图片识别效果也不错,用其他图像进行测试,发现效果如下(贴出部分检测到的图片):



图片效果: 直观上看,关键点定位还行,人脸检测比较差,很多人脸检测不出,人脸检测用opencv实现的。

三,发现:有难度的基本没检测出来,解决方法两个思路:要么换个效果较好的检测器,要么手动截取人脸做landmark。我先手动截取人脸,输入到CNN网络中做landmark。  整图是我抠出的人脸,红色框是程序自带的缩小人脸中关键点检测范围。对于同一个图片,我抠出了不同大小的人脸。但效果测试下来不太理想,甚至比用自带检测器检测做的人脸关键点检测的demo的效果还差

   


        


四、分析和解决问题

分析:可能是检测器的问题,继续试验:对自带检测器检测到的人脸框,分别进行放大、缩小操作,得到几个新人脸框后再分别进行landmark,发现当形变较大时,效果不理想(用自带检测器检测的人脸,不做任何操作,效果较好)。

结论:该方法可能对自带的人脸检测器过拟合了,用自带人脸检测器检测的人脸做关键点定位效果较好,而用手抠图,或对检测框做一些变化时,效果就会变差。

解决思路:
1,做数据增强(旋转,平移,缩放等),防止对检测器等情况的过拟合;
2, 寻找 人脸关键点定位的训练代码,重新训练。


训练阶段:
一、 测试发现以下问题:
1,用3466张测试图片做测试(没有参与训练的图像):
      只用level1时,误报平均在10%附件;
      用level1+level2时,left eye,left mouth,right mouth误报有所下降,但right eye,moth误报提升到99%;
      用level1+level2+level3时,left mouth,right mouth误报有所下降,left eye误报提升到82%,right eye,moth误报仍然维持在99%;

2,用 10000 张训练caffemodel的图片来进行测试,按理说误报应该较低;
     发现:和用测试图像做测试有相似的现象,且误报率数据也差不多。

分析:
     训练的caffemodel训练的不好,可能没有拟合。尤其是level2,level3的caffemodel训练的较差。

解决思路:
    调试训练代码,重新训练。

二、重新训练
1,调试训练部分代码,将之前训练的level2,level3层的caffemodel删除,重新进行训练;
2,用3466张测试图片进行测试,发现:在level1层仅用F网络的时候,准确率高于用F+EN+NM。(F:预测人脸五个点,EN:预测眼睛鼻子三个点,NM:预测鼻子嘴巴三个点,F+EN+NM方法将三个网络预测结果相加,取平均,文章中为level1:F+EN+NM),存在EN,NM两个网络训练不好的问题,故之后的测试level1层仅使用F网络。
3,用3466张测试图片进行测试,发现level1层误报保持在10%以内,level2层能够对其进行优化,降低误报;level3在level2层基础上可以继续优化,幅度小于level2。证明;level2,level3有效果,重新训练后有优化效果。
4,用10000张训练图片进行测试(训练该网络的图片),情况和测试图片基本相同,误报率相对测试图片相对低一点点。

三、调试程序
1,调试level1数据预处理和训练部分代码,level1:F+EN+NM,发现:
    F:
    用10000张图片做训练样本,数据增强后得到40132张图片及对应landmark,具体数据增强方法如下:
    1.1 随机选择近99.1%的训练样本做 水平翻转;
    1.2 随机选择近50%的训练样本顺时针旋转5度,随机选择近50%的训练样本(顺时针旋转5度+水平翻转);
    1.3 随机选择近50%的训练样本逆时针旋转5度,随机选择近50%的训练样本(逆时针旋转5度+水平翻转);

    EN:
    用10000张图片做训练样本,数据增强后得到14912张图片及对应landmark,具体数据增强方法如下:
    1.1 随机选择近50%的训练样本做 水平翻转;

    NM:
    用10000张图片做训练样本,数据增强后得到15065张图片及对应landmark,具体数据增强方法如下:
    1.1 随机选择近50%的训练样本做 水平翻转;

2,训练日志中,3466张测试图片的测试收敛的error:
    F: error=0.2979, 比上一次效果差,上次训练出来网络测试效果较好。
    EN: error=0.0406988
    NM: error=0.301235
   小结:从训练日志中看出,F, NM网络训练的有问题。

3,训练好caffemodel后,用3466张测试图片做测试
    F:  left mouth的错误率达到100%;     F+EN+NM的平均错误率,left eye=0.98,nose=100%,其他正常。

四、 重新训练level1层的F、EN,NM网络
问题:训练时val效果较好,错误率在0.005左右;   但训练后做测试效果较差,达到0.8;
尝试解决实验:
F迭代100w次,EN和NM都迭代10w次,同在level1层,迭代次数不同,我尝试将 EN和NM都迭代100w次,但训练效果不好, 训练时val效果一般,错误率在0.05左右,测试效果更差(注:solver,prototxt超参数EN,NM改为和F 相同)。
最后发现:F、EN,NM都在较低错误率时,F的测试效果比F+EN+NM的效果要好。

下阶段思路:
目前:F + level2+level3效果还行,先用这个网络做公开数据集的测试,测试效果和时间。在这个基础上做改进。


猜你喜欢

转载自blog.csdn.net/xzzppp/article/details/74933489