RANSAC迭代估计

article/2025/9/8 14:01:30

RANSAC迭代估计

  • 1. 定义
  • 2. 功能
  • 3. 流程
  • 4. 迭代次数推导
  • 5. 实现直线拟合


1. 定义

根据一组包含异常数据的样本数据集,计算出数据的数学模型参数,得到有效样本数据的算法

从一组含有“外点”(outliers)的数据中正确估计数学模型参数的迭代算法
“外点”一般指的的数据中的噪声,比如说匹配中的误匹配和估计曲线中的离群点


2. 功能

利用RANSAC剔除错误匹配,配对提取关键的特征,即可用于图片拼接和物体识别定位

在模型确定以及最大迭代次数允许的情况下,RANSAC总是能找到最优解
对于包含80%误差的数据集,RANSAC的效果远优于直接的最小二乘法


3. 流程

RANSAC是通过反复选择数据集去估计出模型,一直迭代到估计出认为比较好的模型

具体的实现步骤可以分为以下几步:

  1. 选择出可以估计出模型的最小数据集
  2. 使用这个最小数据集来计算出数据模型
  3. 将所有数据带入这个模型,计算出“内点”的数目
  4. 比较当前模型和之前推出的最好的模型的“内点“的数量,记录最大“内点”数的模型参数和“内点”数
  5. 重复以上步骤,直到达到最大迭代次数或者内点数目大于一定数量,即当前模型已经足够好了,迭代结束

利用 知乎 计算机视觉基本原理——RANSAC 中的一张图可视化一下流程:
在这里插入图片描述


4. 迭代次数推导

这里有一点就是迭代的次数应该选择多大?
这个值其实是可以估算出来的

假设“内点”在数据中的占比为 t

[公式]

那么每次计算模型使用N个点的情况下,选取的点至少有一个外点的情况就是
在这里插入图片描述
即在迭代 k 次的情况下, 1 - t^n 就是 k 次迭代计算模型都至少采样到一个“外点”去计算模型的概率
那么能采样到正确的N个点去计算出正确模型的概率就是:
在这里插入图片描述

通过上式,可以求得

[公式]


5. 实现直线拟合

import numpy as np
import matplotlib.pyplot as plt
import random
import math# 设置数据量
pionts_sum = 100# 设置数据准确概率和希望的得到正确模型的概率
P_set, P_expect = 0.6, 0.6# 分配正常和噪声数据
pionts_line_sum = int(pionts_sum * P_set)
pionts_noise_sum = pionts_sum - pionts_line_sum# 产生 x=[0, 10]间隔相等的直线数据
A, B = 7, 10
X_min, X_max = 0, 10
X = np.linspace(X_min, X_max, pionts_line_sum)
Y = A * X + B# 直线随机差值和可接受的差值
line_sigma = 0.1
allow_sigma = 1# 添加直线随机噪声
random_x, random_y = [], []
for i in range(pionts_line_sum):random_x.append(X[i] + random.uniform(-line_sigma, line_sigma))random_y.append(Y[i] + random.uniform(-line_sigma, line_sigma))# 添加随机噪声
for i in range(pionts_noise_sum):random_x.append(random.uniform(X_min, X_max))random_y.append(random.uniform(int(min(Y)), int(max(Y))))# 散点图的横纵轴
RANDOM_X = np.array(random_x)
RANDOM_Y = np.array(random_y)# 初始迭代最大次数
iters = 100# 最好模型的参数估计和内点数目
Best_A, Best_B = 0, 0
point_inner_sum = 0# 开始迭代
count = 0
while count < iters:count += 1# 随机在数据中红选出两个点去求解模型sample_index = random.sample(range(pionts_sum), 2)x_1, y_1 = RANDOM_X[sample_index[0]], RANDOM_Y[sample_index[0]]x_2, y_2 = RANDOM_X[sample_index[1]], RANDOM_Y[sample_index[1]]# 求解出a,ba = (y_2 - y_1) / (x_2 - x_1)b = y_1 - a * x_1# 计算内点数目point_inner_count = 0for index in range(pionts_sum):y_estimate = a * RANDOM_X[index] + bif abs(y_estimate - RANDOM_Y[index]) < allow_sigma:point_inner_count += 1# 计算当前内点比值P_now = point_inner_count / pionts_sum# 判断当前的模型是否比之前估算的模型好if point_inner_count > point_inner_sum:# 用当前的内点比值当成内点的概率iters = count + math.log(1 - P_set) / math.log(1 - pow(P_now, 2))point_inner_sum = point_inner_countBest_A, Best_B = a, b# 判断是否当前模型已经符合期望if P_now > P_expect:breakprint("迭代完成,共迭代{}次,当前内点比值:{}".format(count, P_now))# 最佳估计
Y = Best_A * RANDOM_X + Best_B# 新建标题RANSAC区域图
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.set_title("RANSAC")# 设置轴名称
ax.set_xlabel("x")
ax.set_ylabel("y")# 画散点图
ax.scatter(RANDOM_X, RANDOM_Y)# 画估计直线图
ax.plot(RANDOM_X, Y, linewidth=5, color='g')text = "Best_A = {:.2f} Best_B = {:.2f}".format(Best_A, Best_B)
plt.text(int(X_max / 2), int(max(Y)), text, fontdict={'size': 10, 'color': 'r'})
plt.show()

在这里插入图片描述


完整代码:
CSDN
Github


谢谢


http://chatgpt.dhexx.cn/article/yTNi9vtj.shtml

相关文章

RANSAC

转自&#xff1a;http://www.cnblogs.com/xrwang/archive/2011/03/09/ransac-1.html 作者&#xff1a;王先荣 本文翻译自维基百科&#xff0c;英文原文地址是&#xff1a;http://en.wikipedia.org/wiki/ransac&#xff0c;如果您英语不错&#xff0c;建议您直接查看原文。 …

机器视觉:ransac算法详解

目录 一、说明&#xff1a; 二、算法步骤 三、算法代码 四、其它补充 一、说明&#xff1a; RANSAC是一种常用的参数估计方法&#xff0c;全称为Random Sample Consensus&#xff08;随机抽样一致性&#xff09;。它通过随机选择数据中的一部分&#xff0c;然后根据这些数据…

RANSAC算法介绍与总结

RANSAC算法 简介RANSAC地面分割 简介 粒子分割主要使用RANSAC算法. RANSAC全称Random Sample Consensus, 即随机样本一致性, 是一种检测数据中异常值的方法. RANSAC通过多次迭代, 返回最佳的模型. 每次迭代随机选取数据的一个子集, 并生成一个模型拟合这个子样本, 例如一条直线…

RANSAC算法原理

RANSAC是“RANdom SAmple Consensus&#xff08;随机抽样一致&#xff09;”的缩写。它可以从一组包含“局外点”的观测数据集中&#xff0c;通过迭代方式估计数学模型的参数。它是一种不确定的算法&#xff0c;有一定的概率得出一个合理的结果。为了提高得出合理结果的概率必须…

RANSAC算法理解

RANSAC是“RANdom SAmple Consensus&#xff08;随机抽样一致&#xff09;”的缩写。它可以从一组包含“局外点”的观测数据集中&#xff0c;通过迭代方式估计数学模型的参数。它是一种不确定的算法——它有一定的概率得出一个合理的结果&#xff1b;为了提高概率必须提高迭代次…

RANSAC算法(附RANSAC直线拟合C++与Python版本)

文章目录 RANSAC算法简介RANSAC算法基本思想和流程迭代次数推导RANSAC与最小二乘区别RANSAC直线拟合代码&#xff08;C及Python版本&#xff09;C版本代码Python版本代码如下&#xff1a; RANSAC优缺点参考 RANSAC算法简介 RANSAC(RANdom SAmple Consensus,随机采样一致)算法是…

php 枚举类代替hard code代码

新建OrderEnum枚举类 在控制器调用

ERP text object hard code

Created by Wang, Jerry, last modified on Sep 28, 2016 要获取更多Jerry的原创文章&#xff0c;请关注公众号"汪子熙":

Do not hardcode /data/; use Context.getFilesDir().getPath() instead 解决方法

在Android项目中如果使用字符串路径会提示 Do not hardcode "/data/"; use Context.getFilesDir().getPath() instead&#xff0c;如图所示 原因是因为硬编码不是对任何设备都适合&#xff0c;在一些设备上可能会给出错误消息或无法正常工作。可以做如下替换。 Stri…

Drool7s 什么叫KIE和生命周期-系列03课

KIE是缩写&#xff0c;knowledge is everything。可以理解成一个上层接口&#xff0c;本质是由很多个实现类去实现功能的。 另外关于drool7s的生命周期&#xff0c;请看下图 本文只是让你了解drools7的一些概念&#xff0c;也是开始实践的基础。如果不了解这些知识的话&#xf…

drool 7.x 属性 : agenda-group

Agenda Group 是用来在Agenda 的基础之上,对现在的规则进行再次分组,具体的分组方法可以采用为规则添加agenda-group 属性来实现。 agenda-group 属性的值也是一个字符串,通过这个字符串,可以将规则分为若干个Agenda Group,默认情况下,引擎在调用这些设置了agenda-group …

drools视频教程(drool实战实例+数据库+视频讲解)

特别说明&#xff1a;此教程适用任何版本的drools&#xff0c;因为编程思想是不变的 drools的资料网上也有不少&#xff0c;但是大都是讲基础的&#xff0c;几乎没有讲在项目中到底怎么用的&#xff0c;小哥当时学的时候也是&#xff0c;网上看了很多文档&#xff0c;但是还是不…

Drool实战系列(二)之eclipse安装drools插件

这里演示是drools7.5.0&#xff0c;大家可以根据自己需要安装不同的drools版本 drools安装地址: http://download.jboss.org/drools/release/ 一、 二、点击进入7.6.0.Final,并选择droolsjbpm-tools-distribution-XXX.zip(XXX为版本号)进行下载 三、将下载完的插件解压到本地 启…

drool 7.x 属性 : lock-on-active

lock-on-active true&#xff1a;通过这个标签&#xff0c;可以控制当前的规则只会被执行一次&#xff0c;因为一个规则的重复执行不一定是本身触发的&#xff0c;也可能是其他规则触发的&#xff0c;所以这个是no-loop的加强版。当然该标签正规的用法会有其他的标签的配合&…

Drool7s kmodule的作用--系列02课

本文是介绍drool7s kmodule。 一、为什么komdule.xml文件一定要放在resources下的META-INF文件夹中 ---》直接看源码吧&#xff0c;请看下图&#xff0c;应该都知道为什么要放在固定文件夹下。 二、下面是一些知识点&#xff0c;需要大家记住的 kmodule中可以包含一个或多个…

Java Drool规则引擎

2019独角兽企业重金招聘Python工程师标准>>> Drools是一个基于java的规则引擎&#xff0c;开源的&#xff0c;可以将复杂多变的规则从硬编码中解放出来&#xff0c;以规则脚本的形式存放在文件中&#xff0c;使得规则的变更不需要修正代码重启机器就可以立即在线上环…

Drool学习记录(二) Kie Session、Truth maintenance

参考Drools官方文档(3.1 KIE Session和3.2 Inference and truth maintenance in the Drools engine)&#xff0c;学习关于Kie Session和Truth maintenace的内容。这两节内容虽然很基础&#xff0c;但是感觉官方文档说的还是不够明了&#xff0c;尤其是Stateless Session和State…

drool 7.x 属性 : no-loop

drool 7.x 属性 : no-loop 测试类参考:https://blog.csdn.net/qq_21383435/article/details/82872537 实体类:com.secbro.drools.model.Product 规则:/Users/lcc/IdeaProjects/AllTest/drools_test7/src/main/resources/rules.blog/noLoopSession.drl package rules.blogim…

Drool实战系列(一)之入门程序

Drools官网地址为:https://www.drools.org/ maven环境 入门程序例子如下: 项目结构截图: 一、导入pom文件 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"http://…