关闭

【OpenCv-Python】八、Performance Measurement and Improvement Techniques

42人阅读 评论(0) 收藏 举报
分类:

程序性能检测及优化

目标

在图像处理中你每秒需要做大量的运算,所以你的程序不仅要能给出正确的结果,同时还必须要快。所以这节我们将要学习:

  • 检测程序的效率
  • 一些能够提高程序效率的技巧
  • 你将要学到的函数有:cv2.getTickCount,cv2.getTickFrequency 等

除了 OpenCV,Python 也提供了一个叫 time 的的模块。你可以用它来测量程序的运行时间 。另外一个叫做 profile 的模块会帮你得到一份关于你的程序 的详细报告。其中包含了代码中每个函数运行需要的时间以及每个函数被调用的次数。如果你正在使用 IPython 的话,所有这些特点都以一种用户友好的方式整合在一起了。我们会学习几个重要的。要想学到更加详细的知识就打开更多资源中的链接吧。

8.1 使用OpenCV 检测程序效率

cv2.getTickCount 函数返回从参考点到这个函数被执行的时钟数。所以当你在一个函数执行前后都调用它的话, 你就会得到这个函数的执行时
( 时钟数) 。
cv2.getTickFrequency 返回时钟频率,或者说每秒钟的时钟数。所以
你可以按照下面的方式得到一个函数运行多少秒

e1 = cv2.getTickCount()
# your code execution
e2 = cv2.getTickCount()
time = (e2 - e1)/ cv2.getTickFrequency()

我们将会用下面的例子演示。下面的例子是用窗口大小不同(5,7,9)的核函数来做中值滤波 :



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

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

# Result I got is 0.521107655 seconds

注意

你也可以用 time 模块实现上面的功能。但是,用的函数是 time.time() 而不是 cv2.getTickCount。比较一下,两个结果的差别 吧。

8.2 OpenCv 中的默认优化

OpenCV 中的很多函数都被优化过(使用 SSE2,AVX 等) 。也包含一些没有被优化的代码。因此,如果我们的系统支持这些特性,我们应该利用它们(几乎所有现代处理器都支持它们)。它在编译时默认启用。所以OpenCV如果启用了优化的代码,就会运行未优化的代码。你可以使用函数 cv2.useOptimized() 来查看优化是否被开启了,使用函数 cv2.setUseOptimized() 来开启优化。让我们来看一个简单的例子吧。
# check if optimization is enabled
In [5]: cv2.useOptimized()
Out[5]: True

In [6]: %timeit res = cv2.maedianBlur(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
可见,优化的中值滤波比未优化的版本快2倍。如果您检查它的源代码,您可以看到中值筛选是SIMD优化的。因此,您可以使用此方法在代码的顶部启用优化(请记住它是默认启用的)。

8.3 在IPython 中检测程序效率

有时您可能需要比较两个类似操作的性能。IPython给您一个神奇的命令%timeit来执行此操作。它运行代码几次以获得更准确的结果。它们同样适用于测量单行代码。
例如,你知道下面哪个加法操作更好,x = 5; y = x**2, x = 5; y = x*x, x = np.uint8([5]); y = x*x还是y = np.square(x) ?我们将在IPython shell中找到它的%timeit。


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
你可以看到,x = 5;y = x*x是最快的,比Numpy快20倍。如果您考虑数组的创建,它可能会更快地达到100倍。很酷,对吧?(Numpy devs正在研究这个问题)

注意:

Python标量操作比Numpy标量操作快。对于包含一两个元素的操作,Python标量比Numpy数组好。当数组的大小稍微大一点时,Numpy就占了优势。
我们再试一个例子。这一次,我们将比较cv2.countNonZero()和np.count_nonzero()的性能。

In [35]: %timeit z = cv2.countNonZero(img)
100000 loops, best of 3: 15.8 us per loop

In [36]: %timeit z = np.count_nonzero(img)
1000 loops, best of 3: 370 us per loop

看,OpenCV函数比Numpy函数快25倍。

注意:

通常,OpenCV函数比Numpy函数快。因此,对于相同的操作,OpenCV函数是首选。但是,也有例外,尤其是当Numpy使用视图而不是副本时。

8.4 更多的 IPython 黑魔法

还有其他一些神奇的命令可以用来度量性能、分析、行分析、内存测量等等,它们都有很好的文档记录。所以这里只提供给这些文档的链接。有兴趣的读者可以尝试一下。

8.5 效率优化技术

有几种技术和编码方法可以利用Python和Numpy的最大性能。这里只注意到相关的信息,并链接到重要的来源。这里需要注意的是,首先尝试以一种简单的方式实现该算法。一旦它开始工作,剖析它,找出瓶颈并优化它们。

  1. 尽量避免在Python中使用循环,特别是双/三重循环等。
  2. 将算法/代码量化到最大可能的程度,因为Numpy和OpenCV对向量操作进行了优化。
  3. 利用缓存一致性。
  4. 除非需要,否则不要复制数组。尽量使用视图。数组复制是一项开销很大的操作。

即使在完成所有这些操作之后,如果代码仍然很慢,或者使用大的循环是不可避免的,那么使用像Cython这样的额外的库使它更快。

0
0
查看评论

OpenCV-Python教程(4、形态学处理)

提示: 转载请详细注明原作者及出处,谢谢! 本文介绍使用OpenCV-Python进行形态学处理本文不介绍形态学处理的基本概念,所以读者需要预先对其有一定的了解。 定义结构元素 形态学处理的核心就是定义结构元素,在OpenCV-Python中,可以使用其自带的getStructuringElem...
  • sunny2038
  • sunny2038
  • 2013-06-23 10:17
  • 45357

读书摘要-Efficient C++ performance programming techniques

Chp 1 The Tracing war story       当你的代码规模超过几千行后,tracing就变得很必要了。     当在一个很小却被频繁调用的函数中加入tracing 机制时,如果不注意的话,tracing可...
  • lovekatherine
  • lovekatherine
  • 2008-04-06 11:23
  • 2753

Performance Measurement on ARM

Performance Measurement on ARM After working mostly with different ARM processors in the 200...400 MHz range in lots of Embedded Linux projects ove...
  • samssm
  • samssm
  • 2015-05-07 09:49
  • 833

Optimizing Program Performance-- Summary, Performance Improvement Techniques

Although we have only considered a limited set of applications, we can draw important lessons on how towrite efficient code. We have described a numbe...
  • RichardYSteven
  • RichardYSteven
  • 2010-01-22 15:57
  • 853

Atmospheric Measurement Techniques (AMT)

Atmospheric Measurement Techniques (AMT) http://www.atmospheric-measurement-techniques.net/home.html http://www.atmos-meas-tech.net/
  • tengh
  • tengh
  • 2011-08-31 09:54
  • 642

TI81XX UDP Performance Improvement

TI81XX UDP Performance Improvement Linux PSP Contents  [hide]  1 UDP Performance Analysis 1.1 EMAC Receive DM...
  • penzchan
  • penzchan
  • 2014-12-05 17:53
  • 566

Performance Improvement Methods

Performance Improvement Methods This chapter discusses Oracle Database improvement methods and contains the following sections: ■ The Oracle Perfor...
  • JasonLiu_2012
  • JasonLiu_2012
  • 2013-03-28 18:37
  • 560

[Tomcat]Improvement performance of tomcat

At first use command ulimit -n 65533 set max file descriptor server can open in same time is 65533 Edit tomcat configuration file 1.ad
  • skill1986
  • skill1986
  • 2011-09-08 14:42
  • 253

推荐一本介绍linux调试方法的书

我觉这本书对于linux调试非常有用,里面介绍了几乎所有常用的调试软件和方法。每一种软件/方法都给出了简单的介绍,但并不非常具体。可以从这本书出发,当涉及到其中某些软件和方法的时候,再去google和baidu.网上有chm的版本下载。自己去找了。书名:《Linux® Debugging ...
  • uestc_huan
  • uestc_huan
  • 2008-12-27 12:17
  • 2158

WPF在3D Cad模型中利用TextureCoordinates实现颜色渐变显示偏差值的变化

注:最近在做3D机械模型重建方面的软件,需要根据光栅传感器采集的数据绘制3D图形,并显示出色差以及填充和线框图。 以下转载自:http://blog.csdn.net/wmjcom/article/details/6019460 1、本文的目的:  ...
  • xiangshimoni
  • xiangshimoni
  • 2014-03-12 15:15
  • 1739
    个人资料
    • 访问:126516次
    • 积分:3214
    • 等级:
    • 排名:第12600名
    • 原创:187篇
    • 转载:4篇
    • 译文:9篇
    • 评论:33条
    RUNNING|~_~|My web
    微信公众号
    课程设计、视频资源、有料趣文
    Worldhello


    微信公众号:Worldhello
    期待您的关注!
    博客专栏
    最新评论