DCNN Cascade for Facial Point Detection Report

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

Mean ErrorLevel1Level2Level3
Left Eye0.0221300.0150040.013403
Right Eye0.0228160.0146600.013002
Nose0.0299280.0180220.016990
Left Mouth0.0283970.0193490.018095
Right Mouth0.0288780.0193830.018402
Failure(Error>5%)Level1Level2Level3
Left Eye0.0597230.0282750.027698
Right Eye0.0626080.0279860.027409
Nose0.1327180.0354880.030583
Left Mouth0.1099250.0516450.049048
Right Mouth0.1249280.0519330.048471

author_1
author_2
author_3

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

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

Mean ErrorLevel1Level2Level3
Left Eye0.0228640.0163230.015427
Right Eye0.0233700.0156880.014798
Nose0.0305810.0187850.121428
Left Mouth0.0287370.0199960.062793
Right Mouth0.0285280.0203240.019749
Failure(Error>5%)Level1Level2Level3
Left Eye0.0623200.0328910.030294
Right Eye0.0600120.0317370.031737
Nose0.1439700.0389500.998557
Left Mouth0.1148300.0536640.783035
Right Mouth0.1194460.0579920.055684

log_author_1
log_author_2
log_author_3
dcnn

三、 更改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 ErrorLevel1Level2Level3
Left Eye0.0228640.0163230.015427
Right Eye0.0233700.0156880.014798
Nose0.0305810.0187850.121428
Left Mouth0.0287370.0199960.062793
Right Mouth0.0285280.0203240.019749
Failure(Error>5%)Level1Level2Level3
Left Eye0.0623200.0328910.030294
Right Eye0.0600120.0317370.031737
Nose0.1439700.0389500.998557
Left Mouth0.1148300.0536640.783035
Right Mouth0.1194460.0579920.055684

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

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

level2

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


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

level3_shift

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

测试结果如下图所示:
landmark_shift

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值