DCNN Cascade for Facial Point Detection Report

时间:2021-12-01 14:29:48

一、作者的模型自己跑出来的结果

Mean Error Level1 Level2 Level3
Left Eye 0.022130 0.015004 0.013403
Right Eye 0.022816 0.014660 0.013002
Nose 0.029928 0.018022 0.016990
Left Mouth 0.028397 0.019349 0.018095
Right Mouth 0.028878 0.019383 0.018402
Failure(Error>5%) Level1 Level2 Level3
Left Eye 0.059723 0.028275 0.027698
Right Eye 0.062608 0.027986 0.027409
Nose 0.132718 0.035488 0.030583
Left Mouth 0.109925 0.051645 0.049048
Right Mouth 0.124928 0.051933 0.048471

DCNN Cascade for Facial Point Detection Report
DCNN Cascade for Facial Point Detection Report
DCNN Cascade for Facial Point Detection Report

二、作者的代码自己跑出来的结果

这个代码跑了两次,但每次都是在level3的时候结果变差,且每次出错误的点不在同一个位置,详细请看下图level3。

Mean Error Level1 Level2 Level3
Left Eye 0.022864 0.016323 0.015427
Right Eye 0.023370 0.015688 0.014798
Nose 0.030581 0.018785 0.121428
Left Mouth 0.028737 0.019996 0.062793
Right Mouth 0.028528 0.020324 0.019749
Failure(Error>5%) Level1 Level2 Level3
Left Eye 0.062320 0.032891 0.030294
Right Eye 0.060012 0.031737 0.031737
Nose 0.143970 0.038950 0.998557
Left Mouth 0.114830 0.053664 0.783035
Right Mouth 0.119446 0.057992 0.055684

DCNN Cascade for Facial Point Detection Report
DCNN Cascade for Facial Point Detection Report
DCNN Cascade for Facial Point Detection Report
DCNN Cascade for Facial Point Detection Report

三、 更改Level1中三个模型(F,EN,NM)迭代次数跑出来的结果

代码的作者在level1阶段分别对训练的三个模型F和EN,NM使用了1,000,000次和100,000次的迭代,由于level1阶段预测的点要进行位置平均后供level2使用,所以我觉得迭代次数的不平衡可能导致level2的训练结果变差,于是就进行了两次试验,分别把三个模型的迭代次数设置成100,000次和1,000,000次,后来在代码作者的issue里发现,他说level1只是用一个模型F的结果要比用三个模型做位置平均跑出来的效果要好,但是并不知道原因。

Mean Error Level1 Level2 Level3
Left Eye 0.022864 0.016323 0.015427
Right Eye 0.023370 0.015688 0.014798
Nose 0.030581 0.018785 0.121428
Left Mouth 0.028737 0.019996 0.062793
Right Mouth 0.028528 0.020324 0.019749
Failure(Error>5%) Level1 Level2 Level3
Left Eye 0.062320 0.032891 0.030294
Right Eye 0.060012 0.031737 0.031737
Nose 0.143970 0.038950 0.998557
Left Mouth 0.114830 0.053664 0.783035
Right Mouth 0.119446 0.057992 0.055684

四、鲁棒性检测及扰动范围像素值分析

1. 只对level1的预测结果加入扰动后level2的测试结果如下:

DCNN Cascade for Facial Point Detection Report

Note:左边的是没有加入扰动的结果,中间是在level1预测的结果基础上shift 0.01的结果,最右边是在level1预测的结果基础上shift 0.05的结果。


2. 只对level1的预测结果加入扰动后level3的测试结果如下:

DCNN Cascade for Facial Point Detection Report

Note:左边的是没有加入扰动的结果,接着是在level1预测的结果基础上shift 0.01的结果,再接着的是在level1预测的结果基础上shift 0.05的结果,最右边是在level1预测的结果基础上shift 0.1的结果。


3. random_Shift 函数扰动范围的真实像素值分析

def random_Shift(landmarkP, shift):
    """ Random Shift one time """
    diff = np.random.rand(5, 2)            # 0~1的均匀分布
    diff = (2*diff - 1) * shift            # -shift~shift
    landmark_shift = landmarkP + diff      #此处为归一化后的landmark
    return landmark_shift

### landmark的归一化 ###
def project(self, point):
    x = (point[0]-self.x) / self.w
    y = (point[1]-self.y) / self.h
    return np.asarray([x, y])

def projectLandmark(self, landmark):
    p = np.zeros((len(landmark), 2))
    for i in range(len(landmark)):
        p[i] = self.project(landmark[i])
    return p

### landmark的反归一化(得到真实坐标值) ###
def reproject(self, point):
    x = self.x + self.w*point[0]       # x扰动范围像素的真实值为:self.w * diff
    y = self.y + self.h*point[1]       # y扰动范围像素的真实值为:self.h * diff
    return np.asarray([x, y])

def reprojectLandmark(self, landmark):
    p = np.zeros((len(landmark), 2))
    for i in range(len(landmark)):
        p[i] = self.reproject(landmark[i])
    return p

从上面的程序可以看出:扰动范围像素的真实值为bbox的宽和高乘以相应的shift值,以lfw_5590中的第一张测试图片为例,其self.w和self.h的均为77,则shift 0.01, 0.05, 0.1 的扰动范围像素的真实值分别为:

-77*0.01 ~ 77*0.01 = -0.77 ~ 0.77
-77*0.05 ~ 77*0.05 = -3.85 ~ 3.85
-77*0.1 ~ 77*0.1 = -7.7 ~ 7.7

测试结果如下图所示:
DCNN Cascade for Facial Point Detection Report