通过改进算法来优化程序性能的真实案例(Ransac)
来源:互联网 发布:seo系统培训 编辑:程序博客网 时间:2024/06/05 02:34
转 http://www.cnblogs.com/xiaotie/archive/2009/11/19/1605769.html
对于运行不了几次,一次运行不了多久的方法,我们不需要考虑性能优化,对于那些需要经常运行几百次几千次的方法,我们头脑里还是要有性能这根弦。C#太优雅方便了,以至于很多人写程序时根本就把性能抛到脑后了,不愿意耗费心思去进行代码优化和算法优化,结果写出来的程序奇慢无比。不明真相的群众把这怪罪给C#语言。这不是C#的杯具,是程序员的无能。
2个月前,我研究sift(一种重要的图像分析算法)。最先找到了一个C#实现的library——libsift,这个library处理一张正常大小的图像,要耗时2-3分钟。后来,又找到一个C实现的library,处理同样的图像,耗时在1秒以内——秒杀。
昨天,我写Ransac(随机抽样一致性)算法代码时参考了libsift里的Ransac实现。不看不知道,一看吓一跳。那代码性能低下得无以复加。我随手优化了一下算法,就将随机抽样那部分的性能提高了上千倍。
下面详细道出。
一、Ransac
Ransac是用途很广泛的算法,详细介绍请看http://en.wikipedia.org/wiki/RANSAC。下面简单介绍一下(没兴趣的可以略过不看)。
我们分析世界,需要对世界建模,把世界中的现象抽象成模型。每个模型,又存在一些参数,通过调节参数,可以得到不同的实例,进行推演。我们观察现象,得到一堆数据。如何为这堆数据找一个合适的模型,再确定合适的模型参数,这是很重要的问题,是人类理性的基础。
数据分两种:有效数据(inliers)和无效数据(outliers)。那些偏差不大的数据是有效数据,偏差大的数据是无效数据。
如果有效数据占大多数,无效数据只是很少量时,我们可以通过最小二乘法或类似的方法来确定模型的参数和误差。如果无效数据很多(比如,超过了50%的数据是无效数据),最小二乘法就失效了,我们需要新的算法。
上图左图是观察的数据。直觉可以看出,外面的散点是outliers,中间近似分布为一直线的是inliers。怎么设计一个算法,算出这条直线,使它对inliers的拟合度较高(如上图右图所示)?
再举一个更直观的例子:
上图左侧是一个验证码,我们将它看作“数据”。右侧是一个字符,我们将它看作“模型”,如何通过算法去除“数据”中的outlier,剩下inliner来和“模型”进行匹配
Ransac 是解决这类问题的代表性算法。它是一种随机算法,步骤如下:
二、libsift中Ransac算法的实现
Ransac算法中,model,model的拟合,不同参数model之间的比较都是因问题不同而不同,因此,可以将model抽象成接口。将model 抽象之后,Ransac 算法的骨干就只剩下一个随机采样的过程:
下面是libsift中Ransac算法的实现代码:
- 通过改进算法来优化程序性能的真实案例(Ransac)
- 6.1 通过改进算法来优化程序性能的真实案例(Ransac)
- 通过改进算法来优化程序性能的真实案例(Ransac)
- 局部优化的RANSAC算法
- 优化程序,性能改进遵循
- asp.net程序性能优化的七个方面 (c#(或vb.net)程序改进)
- asp.net程序性能优化的七个方面 (c#(或vb.net)程序改进)
- Asp.net程序性能优化的七个方面之三(程序改进)
- 如何通过优化代码来实现性能的优化
- 通过内存配置来优化SQL Server的性能
- 通过内存配置来优化SQL Server的性能
- 通过内存配置来优化SQL Server的性能
- 通过内存配置来优化SQL Server的性能
- 清算/报表/日终跑批程序之性能优化案例(一)
- RANSAC算法的学习(一)
- 经典的RANSAC算法
- 【OpenCV】 基于 ransac 算法的 sift 特征匹配程序(开发环境为OpenCV2.3.1+VS2010)
- 【OpenCV】 基于 ransac 算法的 sift 特征匹配程序(开发环境为OpenCV2.3.1+VS2010)
- 由于目标计算机积极拒绝,无法连接的原因
- 工厂模式与其他几种模式的联系
- 数据库事务的隔离级别(oracle)
- mysql的一些语句
- 映射模式
- 通过改进算法来优化程序性能的真实案例(Ransac)
- java学习笔记---异常
- 学习笔记(二)分治排序
- poj 1321——棋盘问题(DFS)
- XE2安装Frmdesign
- Linux/Ubuntu下安装VMWare Tools .
- 读书笔记:MVC在前端中的数据存储于管理部分
- vim+ctags+taglist
- 01.写在开篇