우리는 numexpr
module을 사용하여 모든 후자의 산술 연산을 하나의 평가 식으로 효율적으로 수행 할 수 있습니다. 따라서
다음 단계 :
C = cv2.subtract(ml, mrd)
C = cv2.pow(C,2)
C = np.divide(C, sigma_m)
C = p0 + (1-p0)**(-C)
가 하나의 식으로 대체 될 수 -
import numexpr as ne
C = ne.evaluate('p0 +(1-p0)**(-((ml-mrd)**2)/sigma_m)')
이의 물건을 확인하자.
def original_app(ml, mrd, sigma_m, p0):
C = cv2.subtract(ml, mrd)
C = cv2.pow(C,2)
C = np.divide(C, sigma_m)
C = p0 + (1-p0)**(-C)
return C
검증 - - 데이터 세트의 다양한 크기에서
In [28]: # Setup inputs
...: S = 1024 # Size parameter
...: ml = np.random.randint(0,255,(S,S))/255.0
...: mrd = np.random.randint(0,255,(S,S))/255.0
...: sigma_m = 0.45
...: p0 = 0.56
...:
In [29]: out1 = original_app(ml, mrd, sigma_m, p0)
In [30]: out2 = ne.evaluate('p0 +(1-p0)**(-((ml-mrd)**2)/sigma_m)')
In [31]: np.allclose(out1, out2)
Out[31]: True
타이밍 - FUNC으로 원래의 접근 방식 주위에
In [19]: # Setup inputs
...: S = 1024 # Size parameter
...: ml = np.random.randint(0,255,(S,S))/255.0
...: mrd = np.random.randint(0,255,(S,S))/255.0
...: sigma_m = 0.45
...: p0 = 0.56
...:
In [20]: %timeit original_app(ml, mrd, sigma_m, p0)
10 loops, best of 3: 67.1 ms per loop
In [21]: %timeit ne.evaluate('p0 +(1-p0)**(-((ml-mrd)**2)/sigma_m)')
100 loops, best of 3: 12.9 ms per loop
In [22]: # Setup inputs
...: S = 512 # Size parameter
In [23]: %timeit original_app(ml, mrd, sigma_m, p0)
100 loops, best of 3: 15.3 ms per loop
In [24]: %timeit ne.evaluate('p0 +(1-p0)**(-((ml-mrd)**2)/sigma_m)')
100 loops, best of 3: 3.39 ms per loop
In [25]: # Setup inputs
...: S = 256 # Size parameter
In [26]: %timeit original_app(ml, mrd, sigma_m, p0)
100 loops, best of 3: 3.65 ms per loop
In [27]: %timeit ne.evaluate('p0 +(1-p0)**(-((ml-mrd)**2)/sigma_m)')
1000 loops, best of 3: 878 µs per loop
5x
큰 배열에 대한 더 나은 속도 향상과 다양한 크기에서 속도 향상 !
사이드 노트로, 마지막 단계에서 추가하는 대신 초기화 된 배열을 사용하는 것이 좋습니다. 따라서 우리는 루프에 들어가기 전에 out = np.zeros((len(d), width, height))
/np.empty
을 초기화하고 마지막 단계에서 출력 배열에 out[iteration_ID] = C
을 할당 할 수 있습니다.
또한 OpenCV를 어떻게 작성했는지에 따라 getBuildInformation() 출력을 게시 할 수 있습니다. –
@MarkSetchell'cv2.getBuildInformation()'의 출력이 너무 커서 메모에 쓸 수 없습니다. 당신은 그 산출물로부터 특별한 것을 생각하고 있습니까? – Mira