一、作者的模型自己跑出来的结果
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 |
二、作者的代码自己跑出来的结果
这个代码跑了两次,但每次都是在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 |
三、 更改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的测试结果如下:
Note:左边的是没有加入扰动的结果,中间是在level1预测的结果基础上shift 0.01的结果,最右边是在level1预测的结果基础上shift 0.05的结果。
2. 只对level1的预测结果加入扰动后level3的测试结果如下:
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
测试结果如下图所示: