0%

線段檢測的難題

  • 會有雜訊干擾
  • 如何找到一條局部斷裂的線
  • 由 noise 干擾導致檢測方向偏移

回顧投票法

  • 蠻力投票法,時間複雜度$ O(N^2) $
  • 投票法可以讓所有模型通用
    • 循環所有參數,取得投票結果
    • 選出高票參數結果
  • 雜訊所產生的線段也會被納入投票的參數中,但通常結果會與我們想要的預期不符

RANSAC

RANdom SAmple Consensus,隨機抽樣一致
將資料分成 inliers(正常數據), outliers(異常數據)
RANSAC 目標:濾除異常數據,使用正常的數據進行檢測

直覺來看,在線段檢測中,若選擇的 edge 是 outliers 進行擬合時,其他點應該不會在所擬合的線段上

隨機選取兩點得到直線後,藍色點為靠近線段的 inliers,紫色點為遠離線段的 outliers

RANSAC 流程

循環 k 次迭代:

  1. 在一組資料集中(ex:edge 點座標)隨機選擇要執行模型評估的最小數據集(ex:直線偵測下是兩個點)
  2. 代入選擇的數據集來計算數據模型
  3. 尋找此模型內的 inliers 數量
  4. 比較當前模型結果與目前最佳模型結果數量,紀錄最大 inliers 數量與對應模型結果
  5. 重新估算迭代次數 k

如何設定參數 k

參數符號定義:

  • 假設$n$是建立模型所需的點數量(已知,ex:直線擬合需要兩點)
  • $w$ 是 inliers 的數量/數據集的總數量(未知)
  • $w^n$是所有$n$個點均為是 inliers 的機率
  • $1-w^n$是所有$n$個點有一個是 outliers 的機率
  • 迭代$k$次都沒辦法找到所有點是 inliers 的機率$(1-w^n)^k$
  • 迭代$k$次所有點是 inliers 的機率$1-(1-w^n)^k$

選擇較高的迭代次數$k$來讓找到 inliers 的機率提高

假設演算法跑完$k$次成功機率為$p$

$1-p = (1-w^n)^k$

$p = 1-(1-w^n)^k$

$當n不變時、k越大、p越大,其中p自行定義$

更新迭代次數$k$公式:

$k=\frac{log(1-p)}{log(1-w^n)}$

改善 RANSAC 效率方法:

  • 先對資料集進行最小二乘法得到不錯的模型(全局最佳化),再進行 RANSAC(本地最佳化)

RANSAC 優缺點:

  • 優點
    • 通用方法適合各種擬合問題
    • 好實現
  • 缺點
    • 對於資料集中 outliers 數量變多時,時間成本會大幅提升,真實問題通常都有較大佔比的 outliers(可能的解決方法:隨機選擇資料集中的子集合)
    • 非確定性算法:每次跑完結果可能不一樣,但會在一定機率下跑出合理的結果

參考

RANSAC 算法详解(附 Python 拟合直线模型代码)
随机抽样一致(Random Sample Consensus, RANSAC)

edge 的重要性

  • 大部分的形狀等資訊可以從邊緣分析出來
  • 用 edge 來提取資訊、辨識物件
  • 回復幾何形狀與消失點(vanishing point)

edge 產生原因

  • 表面法向不連續性(Surface normal discontinuity):區塊內看到多個不同角度的表面
  • 深度不連續性 (Depth discontinuity):由物體前後距離不一所產生邊緣
  • 表面顏色不連續性 (Surface color discontinuity):物體改變顏色,例如材質顏色改變
  • 亮度不連續性 (Illumination discontinuity):陰影,光線亮度變化

邊緣檢測在一階微分應用

edge detection Using First/Second Derivative

透過一階微分找出亮度變化大的地方

First Derivative

1D function:

2D function:

轉換成 2D mask/filter

  • gradient vector:對 x,y 方向進行偏微分,也就是用上述兩個 Gx, Gy 的 mask 個別對影像進行 convolution
  • gradient magnitude:透過 x,y 方向梯度的加總得到最終梯度強度
  • gradient direction:gradient vector 中 gradient 變化量最大的角度

noise 對 edge detection 的影響

  • noise 對邊緣檢測的影響不大
  • 若有較大的影響可以考慮先對影像進行平滑運算
    • Median filter
    • Gaussian filter
    • Bilateral filter

Tradeoff:影像模糊度越強,noise 越少,但 edge 也會被模糊掉

edge detector

好的 edge detector 應避免這些事情發生

  • Poor robustness to noise:對 noise 抵抗能力低
  • Poor localization:與真實 edge 位置仍有小幅度差距
  • Too many responses:檢出太多不必要 edge

Sobel edge detector

Sobel Operator

高斯平滑 + 一階微分 組成

gradient magnitude & gradient direction

缺點

  • 準確率差,誤判率高
  • 對 noise 敏感

Line Detection

直線是一個很常見的特徵,例如在建築物、道路、零件電路板等都看得到
從 edge 資訊更進一步找出直線

Naïve method

對影像中的 edge 點任取兩個點,檢查在此點形成的線上是否有其他 edge 點
當點數量大於一定值時,視為真正的直線
缺點:

  • 時間複雜度為$ O(N^2) $ ,N 為 edge 數量

Hough transform

與蠻力法相似,用投票的方式來找出合適的線段
但不同的地方在於使用 hough space 將直線透過另一種公式做轉換

Hough space

直線方程式
$ y=ax+b $(1)
但這個方程式(1)不能表示垂直的線段

$ r = xcos \theta + ysin \theta $ (2)

因此由公式(2)可以簡單的改變$ \theta $ 值組合出多種不同角度的直線

單個 edge 點(x,y)在$ [r,\theta] $ hough space 下所呈現多條直線的結果為

可以看到單個點在$ [r,\theta] $空間下畫出一條彎曲線

加上不同 edge 座標點,可以在 hough space 下畫出多條彎曲線
並且有疊加交點,而此交點正好是兩點所形成的直線$ [r, \theta] $

可篩選交點數較多的點為真實直線,也可以篩選指定直線角度範圍

優點:

  • 概念簡單,好實現
  • 相同概念也可以用在檢測圓形

缺點:

  • 只得到直線角度資訊,沒有直線長度資訊

補充

消失點 vanishing point

消失點是三維空間中所有平行線相交的交點。
消失點的應用在檢測道路上有很大的幫助,在二維影像中車道最終會在消失點相交,但真實空間的車道是平行的。
透過 edge 尋找消失點,進行道路檢測。

VPGNet: Vanishing Point Guided Network for Lane and Road Marking Detection and Recognition ICCV2017-用 DeepLearning 進行消失點檢測影片

參考

Line Detection by Hough transformation

概述

What is filtering:Forming a new image whose pixel values are transformed
from original pixel values

影像處理中的濾波:把原來影像像素值透過某種轉換組合成新的影像

目標

  • 從影像中取出有用的訊息或轉換影像屬性
    • 擷取特徵:edge, corners, blobs detection…
    • 其他應用:超解析度成像 super-resolution, 影像修復 in-painting, 去噪 de-noising

convolution & correlation

convolution 公式:

correlation 公式:

compare with convolution & correlation

convolution 的符號是$ f*g $,correlation的符號是$ f**g $
convolution 先對 filter mask 做轉置再做 correlation

參考

影像修復 matlab example

數位影像的類別

  • Binary : 二值化影像,影像像素值非 0 即 1,在影像顯示中 0 表示黑色、1 代表白色
  • Grayscale : 灰階影像,影像像素值在[0~255]之間,像素值越大越接近白色
  • Color : 彩色影像,常見的是 RGB 和 CMYK,RGB 彩色影像是由紅、綠、藍三個色彩通道組合而成。CMYK 則是由青色(Cyan)、洋紅色(Magenta)、黃色(Yellow)、黑色(blacK)四個通道組成。

影像解析度

  • dpi:Dots Per Inch,每英寸點數,dpi 的數值越高,所輸出的解析度就越高,常用在印表機上的設定

影像轉換

變換矩陣 transformation matrix

  • 對原 x,y 座標進行縮放

  • 角度轉換

矩陣可以做多重轉換:

$ p’=R_2R_1Sp $

其中 p 是座標點,$R_1 R_2 是角度轉換矩陣,S是縮放矩陣,p’是轉換後的座標點$

多重轉換的細節:

  • 矩陣變換是由右到左做變換
  • 上列式子與 $ p’=R_2(R_1(Sp)) $ 相等
  • 也與$ p’=(R_2R_1S)p $ ,先做矩陣變換運算,再與座標變換

齊次坐標 Homogeneous coordinates

  • 變換矩陣可以做縮放、旋轉,但卻不能加上常量進行平移
  • 解決方法:每個向量末端加上”1”

新的轉換矩陣可以旋轉、縮放,還可以平移了,讚

齊次坐標上的影像縮放

為何在加上每個向量末端加上”1”就可以進行縮放?
原因是在:我們也許想透過除法的方式達到縮放的效果,但實際上矩陣運算並不能直接做除法運算,因此將他轉換為齊次座標,再進行除法運算

用圖片來解釋比較清楚:
有個座標點為$ [x, y] = [15, 21] $,今天想將它縮小3倍,
我們透過齊次座標的方式把$[x, y]$改寫成$[x, y, w] = [15, 21, 3]$
其中的$W$把它想像成是我們的投影機距離

將整個矩陣除與 3,$[ \frac{15}{3}, \frac{21}{3}, \frac{3}{3}] = [5, 7, 1]$
就是在上面的圖片中將投影機向前推進到$W=1$的位置

因此座標位置也跟著等比例縮小了

2D 座標平移、縮放、旋轉

參考

CS131 Computer Vision: Foundations and Applications

写给大家看的“透视除法” —— 齐次坐标和投影

課程介紹

CS131 是史丹佛大學所開設的電腦視覺課程
主要預備技能與知識有

  • Python 應用
  • 線性代數
  • 微積分
  • 機率與統計

有了以上的基礎知識,在接下來的課程會比較得心應手

而除了 CS131 在史丹佛有電腦視覺課程外,另外還有進階課程 CS231a、到 DNN 領域的 CS231n
讓想更進一步學習的人有更多選擇

Introduction to Computer Vision

人之所以看得到影像,是由於光線照到物體,經由眼睛接收到影像,再傳送到大腦做對應的舉動
ex:騎車看到紅燈會停車、看到貓咪會想用手去摸…
而電腦視覺所做的事也是如此,用一個攝影機接收影像資訊,傳送到電腦,經過計算後進行相應的舉動

電腦視覺與人眼的動作流程差異:
打光到物體成像 -> 接受影像(人眼\sensor) -> 理解(大腦\電腦) 並做出動作

而人眼的視覺感知是非常強的,對物體分析、幾何認知能力在電腦視覺上都很難去做
但偶爾也有出錯(被騙)的時候,人眼視覺錯覺:
棋盤陰影錯覺

電腦視覺的挑戰:將數位影像像素值轉換成有用的訊息
人眼看到的與電腦視覺看到的東西是截然不同的
如何建構一個方法(演算法)可以像人眼一樣識別幾何、分析物體、由影像取出我們想知道的資訊。

電腦視覺應用

Canny edge檢測流程

  1. 使用高斯濾波器
  2. 使用Sobel濾波器取出x,y方向梯度
  3. 對梯度進行非極大值抑制
  4. 使用滯後閾值

高斯濾波

平滑影像,濾除雜訊

滯後閾值

設定高閾值與低閾值

低於低閾值的不是edge,如線段(D)
高於高閾值的是強edge,如線段(A)、(B)
介於高低閾值之間的edge,需檢查他的線段是否有與強edge連接
若有連接到,如線段(C),就視為edge,沒連接到的就非edge(E)

website:CS231n: Convolutional Neural Networks for Visual Recognition

影像分類是電腦視覺的核心任務,但其中有許多障礙要克服

遇到的問題

Semantic Gap 語義鴻溝

  • Semantic Gap指的是在不同系統中形成的結構造成差異
  • 人眼傳送到大腦所看到的物體形成的過程!=攝影機傳送到電腦看到物體形成的過程
  • 人眼看到的是物體是光線照射到物體,經過反射後部份光線射入我們的眼睛。人腦所想的通常是高階特徵ex:飛機、汽車、室內空間
  • 在電腦中看到的數位影像是個三維tensor(R, G, B channel)。電腦主要觀察低階特徵ex:顏色分布、紋理(texture)

Viewpoint variation 視野角度變化

  • 攝影機視野改變造成觀測結果產生變化

Background Clutter 非均值的背景

  • 背景可能非常雜亂

Illumination 亮度的變化

  • 不同的燈源,打光方式造成同一個物體不同成像結果

Occlusion 被遮蔽的物體

  • 物體被遮擋一部分,但還是可以透過特徵來辨認出來

Deformation 物體形狀的變化

Intraclass variation 同類型的不同變化

沒辦法透過硬編碼的方式在這些問題下輕易的分類出貓咪

機器學習: 數據驅動方法

寫一個影像分類演算法與排序演算法非常不同,假設今天是要辨識一隻貓咪,我們必須考慮到貓咪的各種形狀、顏色等變化。
因此,與其透過硬編碼方式定義出複雜的經驗法則,不如透過給予很多數據來建立一個學習演算法。
流程:

  1. 收集數據集(影像與對應的類別標記)
  2. 機器學習演算法訓練分類器
  3. 使用分類器預測新讀進來的影像

Nearest Neighbor Classifier

Nearest Neighbor

  • 比較兩影像之間的距離
    L1距離公式:$d_1(I_1, I_2) = \sum_{p} |I^P_1 - I^P_2|$

$其中I_1, I_2 是影像,P是I_1, I_2像素點的索引$

這個距離公式就是逐點計算兩影像像素值差異的總和,加絕對值是為了避免正負號誤差加總後造成抵銷

實作KNN測試cifar10 in github

參考