简介:

RANSAC的流程是:
1.随机取一组点model_points,求解出模型方程;model_points为求取模型的最小点数;
2.计算满足该模型方程的点数占总点数的比例(即内点占比);
3.若内点占比满足一定阈值,或者当前迭代次数大于最大值,则停止迭代;
4.若当前内点占比大于当前统计得到的最大内点占比,则根据内点占比更新最大迭代次数;
5.继续迭代;

那么最大迭代次数是如何更新的?

首先,RANSAC的目的是找出内点占比最大的模型;
假设当前统计的最大内点占比是(1-ep),也就是对应的外点占比是ep;对应的模型是model S
我们并不确定当前的最大内点占比是否就是实际内点占比最大的模型;假设实际内点占比最大的模型是model Max;我们假设Model S和Model Max不是同一个模型,计算当求取出S的时候,我们离求取出Max还需要多少次迭代;首先Max的内点占比肯定要大于S,那么找出Max模型的迭代次数肯定小于S;所以我们先以S的内点占比为基准计算出找出model S所需要的迭代次数是多少;
仅根据现有信息我们知道:

对于单次迭代,找出modelS的概率是 ( 1 − e p ) m o d e l p o i n t s (1-ep)^{modelpoints} (1−ep)modelpoints
那么找到除S以外其他模型的概率是 1 − ( 1 − e p ) m o d e l p o i n t s 1-(1-ep)^{modelpoints} 1−(1−ep)modelpoints
iters次迭代每次都找到除S以外其他模型的概率是 ( 1 − ( 1 − e p ) m o d e l p o i n t s ) i t e r {(1-(1-ep)^{modelpoints})}^{iter} (1−(1−ep)modelpoints)iter
iters次迭代只要有一次及一次以上都找到过S模型的概率是 1 − ( 1 − ( 1 − e p ) m o d e l p o i n t s ) i t e r 1-{(1-(1-ep)^{modelpoints})}^{iter} 1−(1−(1−ep)modelpoints)iter
然后我们希望这个概率大于一定的置信度p,则可以得到:
1 − ( 1 − ( 1 − e p ) m o d e l p o i n t s ) i t e r > = p 1-{(1-(1-ep)^{modelpoints})}^{iter}>=p 1−(1−(1−ep)modelpoints)iter>=p
将以上公式进行化简得到:
i t e r > = ( l o g ( 1 − p ) / l o g ( 1 − ( 1 − e p ) m o d e l p o i n t s ) ) iter>=(log(1-p)/log(1-(1-ep)^{modelpoints})) iter>=(log(1−p)/log(1−(1−ep)modelpoints))
其对应的代码如下图所示:
RANSAC更新迭代次数源码:

CV_IMPL int
cvRANSACUpdateNumIters( double p, double ep,int model_points, int max_iters )
{//p--置信度,ep---外点占比,model_points---模型点数  max_iers--迭代次数if( model_points <= 0 )CV_Error( CV_StsOutOfRange, "the number of model points should be positive" );p = MAX(p, 0.);p = MIN(p, 1.);ep = MAX(ep, 0.);ep = MIN(ep, 1.);// avoid inf's & nan'sdouble num = MAX(1. - p, DBL_MIN);double denom = 1. - pow(1. - ep,model_points);if( denom < DBL_MIN )return 0;num = log(num);denom = log(denom);return denom >= 0 || -num >= max_iters*(-denom) ?max_iters : cvRound(num/denom);
}

整个RANSAC流程的整体代码如下图所示:

bool CvModelEstimator2::runRANSAC( const CvMat* m1, const CvMat* m2, CvMat* model,CvMat* mask0, double reprojThreshold,double confidence, int maxIters )
{bool result = false;cv::Ptr<CvMat> mask = cvCloneMat(mask0);cv::Ptr<CvMat> models, err, tmask;cv::Ptr<CvMat> ms1, ms2;int iter, niters = maxIters;//count --图像总点数,总的候选点数int count = m1->rows*m1->cols, maxGoodCount = 0;CV_Assert( CV_ARE_SIZES_EQ(m1, m2) && CV_ARE_SIZES_EQ(m1, mask) );if( count < modelPoints )return false;models = cvCreateMat( modelSize.height*maxBasicSolutions, modelSize.width, CV_64FC1 );err = cvCreateMat( 1, count, CV_32FC1 );tmask = cvCreateMat( 1, count, CV_8UC1 );if( count > modelPoints ){ms1 = cvCreateMat( 1, modelPoints, m1->type );ms2 = cvCreateMat( 1, modelPoints, m2->type );}else{niters = 1;ms1 = cvCloneMat(m1);ms2 = cvCloneMat(m2);}for( iter = 0; iter < niters; iter++ ){int i, goodCount, nmodels;if( count > modelPoints ){bool found = getSubset( m1, m2, ms1, ms2, 300 );if( !found ){if( iter == 0 )return false;break;}}nmodels = runKernel( ms1, ms2, models );if( nmodels <= 0 )continue;for( i = 0; i < nmodels; i++ ){CvMat model_i;cvGetRows( models, &model_i, i*modelSize.height, (i+1)*modelSize.height );goodCount = findInliers( m1, m2, &model_i, err, tmask, reprojThreshold );if( goodCount > MAX(maxGoodCount, modelPoints-1) ){//每次找到更优的模型的时候都需要更新迭代次数std::swap(tmask, mask);cvCopy( &model_i, model );maxGoodCount = goodCount;niters = cvRANSACUpdateNumIters( confidence,(double)(count - goodCount)/count, modelPoints, niters );}}}if( maxGoodCount > 0 ){if( mask != mask0 )cvCopy( mask, mask0 );result = true;}return result;
}

RANSAC如何动态更新最大迭代次数相关推荐

  1. 基于适应度值和迭代次数的动态惯性权值策略改进的飞蛾火焰优化算法

    文章目录 一.理论基础 1.飞蛾火焰优化算法 2.改进的飞蛾火焰优化算法 (1)动态惯性权值 (2)AMFO算法 二.仿真实验与分析 三.参考文献 一.理论基础 1.飞蛾火焰优化算法 请参考这里. 2 ...

  2. 每天五分钟机器学习:随着算法迭代次数动态调整学习率

    本文重点 我们使用的学习率往往是不变的,本节课程我们将令学习率随着迭代次数的增加而减小,这会对算法的学习有很大的好处. 好处 当我们运行随机梯度下降时,算法会从某个点开始,然后曲折的逼近最小值,但是不 ...

  3. 用矩阵内积的办法构造迭代次数受控的神经网络1:0.6:0.1=4:3:2

    每个神经网络对应每个收敛标准δ都有一个特征的迭代次数n,因此可以用迭代次数曲线n(δ)来评价网络性能. 一个二分类网络,分类两个对象A和B,B中有K张图片,B的第i张图片被取样的概率为pi,B中第i张 ...

  4. 用矩阵点积的办法构造神经网络的迭代次数1:0.6:0.1=1:1:1

    每个神经网络对应每个收敛标准δ都有一个特征的迭代次数n,因此可以用迭代次数曲线n(δ)来评价网络性能. 一个二分类网络分类两个对象A和B,B中有K张图片,B的第i张图片被取样的概率为pi,B中第i张图 ...

  5. 用神经网络迭代次数曲线模拟原子光谱

    大量实验表明每个神经网络对应每个收敛标准δ都有一个特征的迭代次数n,因此可以用迭代次数曲线n(δ)来评价网络性能. 一个二分类网络分类两组对象A和B,B中有K张图片,B的第i张图片被取样的概率为pi, ...

  6. 用数学方法构造神经网路的迭代次数1-9

    神经网络对应每个收敛标准δ都有一个特征的迭代次数n,因此可以用迭代次数曲线n(δ)来评价网络性能. 一个二分类网络分类两组对象A和B,B中有K张图片,B的第i张图片被取样的概率为pi,B中第i张图片相 ...

  7. 用两个矩阵的点积计算神经网络的迭代次数 2-8

    每个神经网络对应每个收敛标准δ都有一个特征的迭代次数n,因此可以用迭代次数曲线n(δ)来评价网络性能. 在<神经网络的迭代次数是一个线性的变量吗?>中得到表达式 一个二分类网络分类两个对象 ...

  8. 神经网络迭代次数的数学构成

    每个神经网络对应每个收敛标准δ都有一个特征的迭代次数n,因此可以用迭代次数曲线n(δ)来评价网络性能. 在<神经网络的迭代次数是一个线性的变量吗?>中得到表达式 一个二分类网络分类两个对象 ...

  9. 神经网络迭代次数的线性累加现象

    神经网络对应每个收敛标准δ都有一个特征的迭代次数n,因此可以用迭代次数曲线n(δ)来评价网络性能. 在<神经网络的迭代次数是一个线性的变量吗?>中得到表达式 一个二分类网络分类两个对象A和 ...

最新文章

  1. 恩平服务器维修,四月 2021 | EDUP
  2. 在html中加动画效果,html5中css3新添加的动画效果
  3. django mysql 2006_Django (2006, 'MySQL server has gone away') 本地重现与解决
  4. ipynb是什么文件_数据科学家的神器:为什么大家都用Kaggle?
  5. Android之实现Room升级需要给一个表增加一个字段
  6. BZOJ 3436: 小K的农场( 差分约束 )
  7. UVA 514——Rails
  8. mysql and 和where_如何使用mysql查询where条件里的or和and
  9. 【数据分析】简介Excel数据表及设计要求
  10. 【大数据部落】R语言基于决策树的银行信贷风险预警模型
  11. java安装没有jdk文件_java文件在没有安装jdk的windows下运行。
  12. Cisco Packet Tracer 实验教程
  13. 【腾讯云技术沙龙预告】云端数据库的设计之美
  14. Log4j使用配置总结
  15. python opencv手势识别_OpenCV+Python3.5 简易手势识别的实现
  16. RAW和QCOW2 两种存储设备格式区别
  17. C# this.Invoke()的作用与用法、不阻塞UI界面线程的延时函数
  18. C语言高级用法---container_of()
  19. 压缩视频用什么软件比较好?
  20. QST青软实训学员学习总结-2020/5/24-STM32

热门文章

  1. Java+MySQL基于SSM的二手玩具交换网站
  2. 99、插值法,函数逼近,曲线拟和,数值积分,数值微分,解线性方程组的直接方法,解线性方程组的迭代法,非线性方程求根,常微分方程的数值解法...
  3. PCB拼板邮票孔制作规范!
  4. 如何解决java中的安全问题_如何解决java中“使用了未经检查或不安全的操作 请使用 -Xlint:unchecked 重新编译 ”的问题...
  5. 13种Java核心技术
  6. cf103202M. United in Stormwind
  7. 蒲月“登高”,临风眺望,旷视邀您共赴AI的下一个十年之约
  8. OA系统,全方位满足各行业办公需求
  9. 补码一位乘(布斯公式)
  10. Linux AHCI驱动