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


谢谢

RANSAC迭代估计相关推荐

  1. 【论文阅读】Modeling the world from internet photo collections

    Modeling the world from internet photo collections论文阅读 1.摘要 2.介绍 3.先前技术(历史介绍) 4.重建过程 4.1 关键点的检测和匹配 4 ...

  2. RANSAC估计——以直线拟合为例

    RANSAC(RANdom SAmple Consensus),即随机采样一致性.该方法最早是由Fischler和Bolles提出的一种鲁棒估计方法,最早用于计算机视觉中位姿估计问题,现在已广泛应用于 ...

  3. 相机模型与标定(十一)--LMEDS,M估计,RANSAC估计对比

    原文: http://blog.csdn.net/lanbing510/article/details/50053865 图像配准对于运动平台(无人机,移动机器人)上的视觉处理有着极其重要的作用.配准 ...

  4. 2-Entity RANSAC:在变化的环境中进行稳健的视觉定位

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 摘要 视觉定位由于其低成本和稳定的传感器而受到广泛关注, 这在许多 ...

  5. 物体抓取位姿估計算法綜述_大盘点|6D姿态估计算法汇总(上)

    1.DenseFusion: 6D Object Pose Estimation by Iterative Dense Fusion (CVPR2019) 原文链接:https://arxiv.org ...

  6. 解决物体位姿估计中遮挡、对称、无纹理物体的方法

    点击我爱计算机视觉标星,更快获取CVML新技术 本文转载自知乎物体6D位姿估计专栏,已获作者授权转载,请勿二次转载. https://zhuanlan.zhihu.com/p/89830618 本文解 ...

  7. (三)计算机视觉 --SIFT特征匹配、地理标记图像匹配及RANSAC图像拼接

    目录 一.sift特征检测概述 1.1特征点 1.2sift特征检测 二.sift特征提取与匹配 2.1特征提取并展示 2.2对两张图片进行特征匹配计算 2.3给定一张图片,输出与其匹配最多的三张图片 ...

  8. 6D姿态估计算法汇总

    文章目录 标题 6D姿态估计的算法 1.GDR-Net: Geometry-Guided Direct Regression Network for Monocular 6D Object Pose ...

  9. 传统的6d位姿估计fangfa1_6D姿态估计算法汇总(上)

    首发于:公众号[3D视觉工坊] 欢迎加入国内最大的3D视觉交流社区,1700+的领域从业者正在共同进步~ 1.DenseFusion: 6D Object Pose Estimation by Ite ...

最新文章

  1. 清华 词向量库_word2vec 构建中文词向量
  2. Linux6.x修改出eth0网卡的解决方法
  3. 机器人x展架制作_门型展架80*180易拉宝x展架海报架广告架立牌展示架地推海报2元优惠券券后价20元...
  4. 《水泥公司信息管理系统》Access学习心得
  5. 不用代码,10分钟打造属于自己的第一款小程序
  6. 使用matlab版卷及神经网络 MatconvNe和预训练的imageNet进行图像检Image retrieval using MatconvNet and pre-trained imageNet
  7. 路径规划算法之Bellman-Ford算法
  8. 计算机科学在航空航天仿真模拟,2016年南京航空航天大学计算机科学与技术学院541计算机综合基础之数据结构复试笔试仿真模拟题...
  9. nginx全局内存缓存
  10. 【Hibernate】getHibernateTemplate.find()和session.createQuery()方法总结
  11. NuGet的简单使用
  12. 数据结构之树和二叉树的应用:二叉排序树(BST)
  13. oracle rac redo log,RAC共享online redo log和archived log的官方说明
  14. 正确清理binlog日志
  15. vs2005常用快捷键_包括代码自动缩进
  16. PLSQL 连接Oracle11g (64位)
  17. Python学习之路-基础知识1
  18. Final Cut Pro 10.6 for Mac(fcpx视频剪辑)
  19. Drool7s kmodule的作用--系列02课
  20. 中文分词库jieba介绍

热门文章

  1. nc和telnet配合使用
  2. WINDOWSXP全面优化下
  3. asp.net程序的问题原来是IE造成的,改用firefox就没问题了!
  4. JDK源码学习之一lang包
  5. pcb设计等长线误差_“背锅”盲区,光时域反射仪延长线实际使用测评
  6. Payroll Calculation的Process Rule
  7. elasticsarch6.5.4安装插件 searchguard和elasticsearh-head插件安全性问题
  8. 我的markdown学习笔记
  9. Ripple_vJZ
  10. python 迭代器相关知识