现在在做毕设,有一部分要用到前景目标提取,我打算用VIBE算法来做,但是同样的算法,Python运行时初始化都要20-50s,我朋友用matlab基本就是1s内最多1s多一点就能完成初始化,虽然Python运行慢,但是也不至于慢这么多吧,而且理论上vibe算法的运行速度应该是比较快的,大佬们看一下是不是写的代码的问题。。。
def initial_background(I_gray, N):
t1 = cv2.getTickCount()
I_pad = np.pad(I_gray, 1, 'symmetric')#对称填充
height = I_pad.shape[0]
width = I_pad.shape[1]
samples = np.zeros((height, width, N))
t2 = cv2.getTickCount()
time = (t2 - t1) * 1000 / cv2.getTickFrequency()
print(time)
for i in range(1, height - 1):
for j in range(1, width - 1):
for n in range(N):
x, y = 0, 0
while (x == 0 and y == 0):
x = np.random.randint(-1, 1)
y = np.random.randint(-1, 1)
ri = i + x
rj = j + y
samples[i, j, n] = I_pad[ri, rj]
t3 = cv2.getTickCount()
time2 = (t3 - t1) * 1000 / cv2.getTickFrequency()
print(time2)
samples = samples[1:height - 1, 1:width - 1]
return samples
上面是Python的初始化部分代码,大佬们帮忙看看这部分代码有哪些可以优化的。matlab代码我看不懂,也不知道该发哪个,第一次在CSDN上问问题,不知道会不会有人回答。。。
我改写了一下,效果一样速度应该可以快100倍吧
def __init_params(self, grayFrame):
for k in range(self.__defaultNbSamples):
c = np.random.randint(-1,2,size=(self.__Height,self.__Width))
self.__samples[k] = np.maximum(grayFrame + c, 0)
height, width, N都是什么量级的,循环完一次后时间复杂度至少就是height*width*N,可以尝试用numpy重写
下面这一段while的实现很低效,直接先把所有合法组合对(x,y)加到list中,然后random.choice来选取
while (x == 0 and y == 0):
x = np.random.randint(-1, 1)
y = np.random.randint(-1, 1)
如果用逐像素遍历的方式建模,用python实现肯定很慢,应充分发挥python对数组的批量操作来实现。可参考https://blog.csdn.net/ywxuan/article/details/100739132