您好我是python的新手,并使用python实现Viola-Jones面部检测算法。在使用Adaboost进行haar-feature选择时,我的代码需要花费极长的时间(大约18个小时)才能在每轮增强中选择一个haar-feature。不知怎的,我发现评估haar功能所花费的时间是我代码中最耗时的工作。我将在下面展示python代码:
列表:积分图像列表
(x,y,h,w,f,p):位置(x,y)处的哈尔特征。 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-feature和两个矩形垂直haar功能。
有没有最快的方法来使用python评估haar-features? 任何建议改进上面的代码,以便我可以处理时间因素。 在这里,我最关心的是时间因素而不是其他任何因素。
谢谢!