嗨,我是 python 新手,使用 python 实现 Viola-Jones 人脸检测算法。虽然使用 Adaboost 进行 haar 特征选择,但我的代码在每一轮提升中选择一个 haar 特征需要很长时间(大约 18 小时)。不知何故,我发现评估 haar 特征所花费的时间是我的代码中最耗时的工作。我在下面展示python代码:
列表:积分图像列表
(x,y,h,w,f,p):位置 (x,y) 处的 Haar 特征。h 和 w 是 haar 特征中一个矩形的高度和宽度,这意味着两个矩形(|----|----|)的 haar 特征的总高度为 h,总宽度为 2*w。f 是 haar 特征类型,p 是奇偶校验。
def EvaluateHaar(List,(x,y,h,w,f,p)):
def Zero():
if x==0 and y==0:
bright = (i[x+h-1,y+w-1]+0)-(0+0)
dark = (i[x+2*h-1,y+w-1]+0)-(i[x+h-1,y+w-1]+0)
elif y==0:
bright = (i[x+h-1,y+w-1]+0)-(i[x-1,y+w-1]+0)
dark = (i[x+2*h-1,y+w-1]+0)-(i[x+h-1,y+w-1]+0)
elif x==0:
bright = (i[x+h-1,y+w-1]+0)-(0+i[x+h-1,y-1])
dark = (i[x+2*h-1,y+w-1]+i[x+h-1,y-1])-(i[x+h-1,y+w-1]+i[x+2*h-1,y-1])
else:
bright = (i[x+h-1,y+w-1]+i[x-1,y-1])-(i[x-1,y+w-1]+i[x+h-1,y-1])
dark = (i[x+2*h-1,y+w-1]+i[x+h-1,y-1])-(i[x+h-1,y+w-1]+i[x+2*h-1,y-1])
return bright, dark
def One():
if x==0 and y==0:
bright = (i[x+h-1,y+2*w-1]+0)-(0+i[x+h-1,y+w-1])
dark = (i[x+h-1,y+w-1]+0)-(0+0)
elif y==0:
bright = (i[x+h-1,y+2*w-1]+i[x-1,y+w-1])-(i[x-1,y+2*w-1]+i[x+h-1,y+w-1])
dark = (i[x+h-1,y+w-1]+0)-(i[x-1,y+w-1]+0)
elif x==0:
bright = (i[x+h-1,y+2*w-1]+0)-(0+i[x+h-1,y+w-1])
dark = (i[x+h-1,y+w-1]+0)-(0+i[x+h-1,y-1])
else:
bright = (i[x+h-1,y+2*w-1]+i[x-1,y+w-1])-(i[x-1,y+2*w-1]+i[x+h-1,y+w-1])
dark = (i[x+h-1,y+w-1]+i[x-1,y-1])-(i[x-1,y+w-1]+i[x+h-1,y-1])
return bright, dark
options = {0 : Zero,
1 : One,
}
R = []
append1 = R.append
for i in List:
bright,dark = options[f]()
if p == 1:
hf = (dark-bright)
else:
hf = (bright-dark)
append1(hf)
return R
上面的代码评估了两个 haar 特征类型两个矩形水平 haar 特征和两个矩形垂直 haar 特征。
有没有使用 python 评估 haar 特征的最快方法?任何改进上述代码的建议,以便我可以处理时间因素。在这里,我最关心的是时间因素。
谢谢!