(Python)从零开始,简单快速学机器仿人视觉Opencv—第八节:程序性能检测及优化

165
0
2020年12月21日 09时08分

事前准备:

 

使用工具Python3.5
使用包cv2,numpy,time,profile

 

涉及函数:

 

cv2.getTickCount,cv2.getTickFrequency

 

任务1 使用OpenCV检测程序效率

 

cv2.getTickCount函数返回从参考点到这个函数被执行的时钟数。在一个函数执行前后都调用它,可以得到这个函数的执行时间。

 

cv2.getTickFrequency返回时钟频率,或者说每秒钟的时钟数

 

例,窗口大小不同(5,7,9)的核函数来做中值滤波,查看一个函数运行了多少秒

 

import cv2
import numpy as np

img1 = cv2.imread('45.jpg')

e1 = cv2.getTickCount()
for i in range(5,49,2):
    img1 = cv2.medianBlur(img1,i)
e2 = cv2.getTickCount()
time = (e2-e1)/cv2.getTickFrequency()
print(time)

 

注:python中time模块也可以实现,调用的函数是time.time()

 

任务2 OpenCV中的默认优化

 

cv2.useOptimized()来查看优化是否被开启,cv2.setUesOptimized()来开启优化。

 

import cv2 
import numpy as np

# check if optimization is enabled 
In [5]: cv2.useOptimized()
Out[5]: True

In [6]: %timeit res = cv2.medianBlur(img,49) 
10 loops, best of 3: 34.9 ms per loop

# Disable it 

In [7]: cv2.setUseOptimized(False)

In [8]: cv2.useOptimized() 
Out[8]: False

In [9]: %timeit res = cv2.medianBlur(img,49)
10 loops, best of 3: 64.1 ms per loop

 

任务3 在IPython中检测程序效率

 

有时你比两个相似操作的效率时,你可以使用 IPython 为你提供的法命令%time。他会代码好几次从而得到一个准确的时间它也可以用来测试代码的。

 

例如你知下同一个数学算用哪种式的代码会执行得更快吗?

 

x = 5; y = x∗∗2
x = 5; y = x∗x
x = np.uint([5]); y = x∗x
y = np.squre(x)

 

我们可以在 IPython 的 Shell 中使用法命令找到答案。

 

import cv2
import numpy as np

In [10]: x =5

In [11]: %timeit y=x**2 
10000000 loops, best of 3: 73 ns per loop

In [12]: %timeit y=x*x 
10000000 loops, best of 3: 58.3 ns per loop

In [15]: z = np.uint8([5])

In [17]: %timeit y=z*z 
1000000 loops, best of 3: 1.25 us per loop

In [19]: %timeit y=np.square(z)
1000000 loops, best of 3: 1.16 us per loop

 

竟然是第一种写法它居然比 Nump 快了 20 倍。如果考到数组构建的 能到 100 倍的差。

 

注意:Python 的标算比 Nump 的标算快。对于仅包含一两个 元素的操作 Python 标比 Numpy 的数组快。但是当数组稍微大一点时 Numpy 就会胜出了。

 

任务4 效率优化技术

 

有些技术和编程方法可以我们大的发挥 Python 和 Numpy 的威力。 我们仅仅提一下相关的你可以接查找更多细信息。我们 的的一点是先用简单的方式实现你的算法结果正确当结 果正确后再使用上的提到的方法找到程序的瓶来优化它。

 

1.尽免使用循环尤其双层三层循环它们天生就是常慢的。
2.算法中尽量使用向操作因为 Numpy 和 OpenCV 对向操作 了优化。
3.利用缓存一致性。
4.没有必的就不复制数组。使用图来代替复制。数组复制是常浪源的。就算了上优化如果你的程序是很慢或者大的不可免的 你你应尝使用其他的包比如 Cython来加你的程序。

 

总结

 

(本系列每周不定期更新,谢谢大家支持!)

发表评论

后才能评论