1. 程式人生 > >[轉]隨機取樣一致性(RANSAC)

[轉]隨機取樣一致性(RANSAC)

作者:桂。

時間:2017-04-25  21:05:07

連結:http://www.cnblogs.com/xingshansi/p/6763668.html 


前言

仍然是昨天的問題,別人問到最小二乘、霍夫變換、RANSAC在直線擬合上的區別。昨天梳理了霍夫變換,今天打算抽空梳理一下RANSAC演算法,主要包括:

  1)RANSAC理論介紹

  2)RANSAC應用簡介;

內容為自己的學習記錄,其中很多地方借鑑了別人,最後一起給出連結。

一、RANSAC理論介紹

普通最小二乘是保守派:在現有資料下,如何實現最優。是從一個整體誤差最小的角度去考慮,儘量誰也不得罪。

RANSAC是改革派:首先假設資料具有某種特性(目的),為了達到目的,適當割捨一些現有的資料。

給出最小二乘擬合(紅線)、RANSAC(綠線)對於一階直線、二階曲線的擬合對比:

可以看到RANSAC可以很好的擬合。RANSAC可以理解為一種取樣的方式,所以對於多項式擬合、混合高斯模型(GMM)等理論上都是適用的。

RANSAC的演算法大致可以表述為(來自wikipedia):

Given:
    data – a set of observed data points
    model – a model that can be fitted to data points
    n – the minimum number of data values required to fit the model
    k – the maximum number of iterations allowed in the algorithm
    t – a threshold value for determining when a data point fits a model
    d – the number of close data values required to assert that a model fits well to data

Return:
    bestfit – model parameters which best fit the data (or nul if no good model is found)

iterations = 0
bestfit = nul
besterr = something really large
while iterations < k {
    maybeinliers = n randomly selected values from data
    maybemodel = model parameters fitted to maybeinliers
    alsoinliers = empty set
    for every point in data not in maybeinliers {
        if point fits maybemodel with an error smaller than t
             add point to alsoinliers
    }
    if the number of elements in alsoinliers is > d {
        % this implies that we may have found a good model
        % now test how good it is
        bettermodel = model parameters fitted to all points in maybeinliers and alsoinliers
        thiserr = a measure of how well model fits these points
        if thiserr < besterr {
            bestfit = bettermodel
            besterr = thiserr
        }
    }
    increment iterations
}
return bestfit

RANSAC簡化版的思路就是:

第一步:假定模型(如直線方程),並隨機抽取Nums個(以2個為例)樣本點,對模型進行擬合:

第二步:由於不是嚴格線性,資料點都有一定波動,假設容差範圍為:sigma,找出距離擬合曲線容差範圍內的點,並統計點的個數:

第三步:重新隨機選取Nums個點,重複第一步~第二步的操作,直到結束迭代:

第四步:每一次擬合後,容差範圍內都有對應的資料點數,找出資料點個數最多的情況,就是最終的擬合結果

至此:完成了RANSAC的簡化版求解。

這個RANSAC的簡化版,只是給定迭代次數,迭代結束找出最優。如果樣本個數非常多的情況下,難不成一直迭代下去?其實RANSAC忽略了幾個問題:

  • 每一次隨機樣本數Nums的選取:如二次曲線最少需要3個點確定,一般來說,Nums少一些易得出較優結果;
  • 抽樣迭代次數Iter的選取:即重複多少次抽取,就認為是符合要求從而停止運算?太多計算量大,太少效能可能不夠理想;
  • 容差Sigma的選取:sigma取大取小,對最終結果影響較大;

這些引數細節資訊參考:維基百科

RANSAC的作用有點類似:將資料一切兩段,一部分是自己人,一部分是敵人,自己人留下商量事,敵人趕出去。RANSAC開的是家庭會議,不像最小二乘總是開全體會議。

附上最開始一階直線、二階曲線擬合的code(只是為了說明最基本的思路,用的是RANSAC的簡化版):

一階直線擬合:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 clc ; clear  all ; close  all ;   set (0, 'defaultfigurecolor' , 'w' ); %Generate data param = [3 2]; npa =  length (param); x = -20:20; y = param*[x;  ones (1, length (x))]+3* randn (1, length (x)); data = [x  randi (20,1,30);...      randi (20,1,30)]; %figure figure subplot  221 plot (data(1,:),data(2,:), 'k*' ); hold  on; %Ordinary least square mean p =  polyfit (data(1,:),data(2,:),npa-1); flms =  polyval (p,x); plot (x,flms, 'r' , 'linewidth' ,2); hold  on; title ( '最小二乘擬合' ); %Ransac Iter = 100; sigma = 1; Nums = 2; %number select res =  zeros (Iter,npa+1); for  i  = 1:Iter idx =  randperm ( size (data,2),Nums); if  diff (idx) ==0      continue ; end sample = data(:,idx); pest =  polyfit (sample(1,:),sample(2,:),npa-1); %parameter estimate res( i ,1:npa) = pest; res( i ,npa+1) =  numel ( find ( abs ( polyval (pest,data(1,:))-data(2,:))<sigma)); end [~,pos] =  max (res(:,npa+1)); pest = res(pos,1:npa); fransac =  polyval (pest,x); %figure subplot  222 plot (data(1,:),data(2,:), 'k*' ); hold  on; plot (x,flms, 'r' , 'linewidth' ,2); hold  on; plot (x,fransac,

相關推薦

[]隨機取樣一致性RANSAC

作者:桂。 時間:2017-04-25  21:05:07 連結:http://www.cnblogs.com/xingshansi/p/6763668.html  前言 仍然是昨天的問題,別人問到最小二乘、霍夫變換、RANSAC在直線擬合上的區別。昨天梳理

隨機抽樣一致性RANSAC演算法詳解

隨機抽樣一致性(RANSAC)演算法能夠有效的剔除特徵匹配中的錯誤匹配點。 實際上,RANSAC能夠有效擬合存在噪聲模型下的擬合函式。實際上,RANSAC演算法的核心在於將點劃分為“內點”和“外點”。在一組包含“外點”的資料集中,採用不斷迭代的方法,尋找最優引數模型,不符合最優模型的點,被定義為“外點”。這就

3D點雲地圖地面去除1:基於隨機一致性取樣RANSAC,未做RANSAC後續處理

       點雲地圖中包括了大量的地面點,不僅讓整個地圖顯得很雜亂,而且對後續障礙物點雲的分類、識別和跟蹤帶來麻煩,所以需要首先去除。首先我有兩個思路: 在雷達的原始資料上把地面濾除,這樣在後續的建圖就不會有地面資訊。 在建圖結束後檢測地

隨機抽樣一致性演算法RANSAC

本文翻譯自維基百科,英文原文地址是:http://en.wikipedia.org/wiki/ransac,如果您英語不錯,建議您直接檢視原文。     RANSAC是“RANdom SAmple Consensus(隨機抽樣一致)”的縮寫。它可以從一組包含“局外點”的觀

隨機模擬的基本思想和常用取樣方法sampling

通常,我們會遇到很多問題無法用分析的方法來求得精確解,例如由於式子特別,真的解不出來; 一般遇到這種情況,人們經常會採用一些方法去得到近似解(越逼近精確解越好,當然如果一個近似演算法與精確解的接近程度能夠通過一個式子來衡量或者有上下界,那麼這種近似演算法比較好,因為人們可以

調試 Dockerfile - 每天5分鐘玩 Docker 容器技術15

top add font tom middle 程序 ria family 是個 包括 Dockerfile 在內的任何腳本和程序都會出錯。有錯並不可怕,但必須有辦法排查,所以本節討論如何 debug Dockerfile。 先回顧一下通過 Dockerfile 構建鏡像

Dockerfile 常用指令 - 每天5分鐘玩 Docker 容器技術16

依次 官方文檔 構建 bottom str -s 暴露 工作 12px 是時候系統學習 Dockerfile 了。下面列出了 Dockerfile 中最常用的指令,完整列表和說明可參看官方文檔。 FROM指定 base 鏡像。 MAINTAINER設置鏡像的作

RUN vs CMD vs ENTRYPOINT - 每天5分鐘玩 Docker 容器技術17

docker 教程 容器 RUN、CMD 和 ENTRYPOINT 這三個 Dockerfile 指令看上去很類似很容易混淆。本節將通過實踐詳細討論它們的區別。簡單的說RUN 執行命令並創建新的鏡像層RUN 經常用於安裝軟件包。CMD 設置容器啟動後默認執行的命令及其參數但 CMD 能夠被 doc

使用公共 Registry - 每天5分鐘玩 Docker 容器技術19

docker 教程 容器 保存和分發鏡像的最直接方法就是使用 Docker Hub。Docker Hub 是 Docker 公司維護的公共 Registry。用戶可以將自己的鏡像保存到 Docker Hub 免費的 repository 中。如果不希望別人訪問自己的鏡像,也可以購買私有 repos

Docker 鏡像小結 - 每天5分鐘玩 Docker 容器技術21

列表 例如 normal one sys tro docker comm color 本節我們對 Docker 鏡像做個小結。 這一部分我們首先討論了鏡像的分層結構,然後學習了如何構建鏡像,最後實踐使用 Docker Hub 和本地 registry。 下面是鏡像的常用操作

如何運行容器?- 每天5分鐘玩 Docker 容器技術22

docker 教程 容器 上一章我們學習了如何構建 Docker 鏡像,並通過鏡像運行容器。本章將深入討論容器:學習容器的各種操作,容器各種狀態之間如何轉換,以及實現容器的底層技術。運行容器docker run 是啟動容器的方法。在討論 Dockerfile 時我們已經學習到,可用三種方式指定容器

兩種進入容器的方法 - 每天5分鐘玩 Docker 容器技術23

工作 技術 啟動進程 gin attach ant while col -c 我們經常需要進到容器裏去做一些工作,比如查看日誌、調試、啟動其他進程等。有兩種方法進入容器:attach 和 exec。 docker attach 通過 docker attach 可以 a

運行容器的最佳實踐 - 每天5分鐘玩 Docker 容器技術24

oat add vertical poi can size 執行命令 後臺 運行 按用途容器大致可分為兩類:服務類容器和工具類的容器。 1. 服務類容器以 daemon 的形式運行,對外提供服務。比如 web server,數據庫等。通過 -d 以後臺方式啟動這類容器是非常

容器常用操作 - 每天5分鐘玩 Docker 容器技術25

技術 order position 自動 code lec 資源 add 服務 前面討論了如何運行容器,本節學習容器的其他常用操作。 stop/start/restart 容器 通過 docker stop 可以停止運行的容器。 容器在 docker host 中實際上是

限制容器對內存的使用 - 每天5分鐘玩 Docker 容器技術27

upload 機制 性能 http tle war pac 啟動 物理內存 一個 docker host 上會運行若幹容器,每個容器都需要 CPU、內存和 IO 資源。對於 KVM,VMware 等虛擬化技術,用戶可以控制分配多少 CPU、內存資源給每個虛擬機。對於容器,D

限制容器對CPU的使用 - 每天5分鐘玩 Docker 容器技術28

docker 教程 容器 上節學習了如何限制容器對內存的使用,本節我們來看CPU。默認設置下,所有容器可以平等地使用 host CPU 資源並且沒有限制。Docker 可以通過 -c 或 --cpu-shares 設置容器使用 CPU 的權重。如果不指定,默認值為 1024。與內存限額不同,通過

限制容器的 Block IO - 每天5分鐘玩 Docker 容器技術29

docker 教程 容器 前面學習了如何限制容器對內存和CPU的使用,本節我們來看 Block IO。Block IO 是另一種可以限制容器使用的資源。Block IO 指的是磁盤的讀寫,docker 可通過設置權重、限制 bps 和 iops 的方式控制容器讀寫磁盤的帶寬,下面分別討論。註:目前

實現容器的底層技術 - 每天5分鐘玩 Docker 容器技術30

docker 教程 容器 為了更好地理解容器的特性,本節我們將討論容器的底層實現技術。cgroup 和 namespace 是最重要的兩種技術。cgroup 實現資源限額, namespace 實現資源隔離。cgroupcgroup 全稱 Control Group。Linux 操作系統通過 cg

none 和 host 網絡的適用場景 - 每天5分鐘玩 Docker 容器技術31

docker 教程 容器 本章開始討論 Docker 網絡。我們會首先學習 Docker 提供的幾種原生網絡,以及如何創建自定義網絡。然後探討容器之間如何通信,以及容器與外界如何交互。Docker 網絡從覆蓋範圍可分為單個 host 上的容器網絡和跨多個 host 的網絡,本章重點討論前一種。對於

學容器必須懂 bridge 網絡 - 每天5分鐘玩 Docker 容器技術32

docker 教程 容器 上一節我們討論了 none 和 host 類型的容器網絡,本節學習應用最廣泛也是默認的 bridge 網絡。Docker 安裝時會創建一個 命名為 docker0 的 linux bridge。如果不指定--network,創建的容器默認都會掛到 docker0 上。當前