OpenCV 4.12.0
開源計算機視覺
載入中...
搜尋中...
無匹配項
用於非線性可分資料的支援向量機

上一教程: 支援向量機簡介
下一教程: 主成分分析(PCA)簡介

原始作者Fernando Iglesias García
相容性OpenCV >= 3.0

目標

在本教程中,您將學習如何

  • 定義當訓練資料無法線性分離時SVM的最佳化問題。
  • 如何配置引數以使SVM適應這類問題。

動機

為什麼擴充套件SVM最佳化問題以處理非線性可分離的訓練資料很有趣?計算機視覺中大多數使用SVM的應用都需要比簡單線性分類器更強大的工具。這是因為在這些任務中,訓練資料很少能使用超平面進行分離

以其中一項任務為例,例如人臉檢測。在這種情況下,訓練資料由一組人臉影像和另一組非人臉影像(世界上除人臉以外的所有其他事物)組成。這些訓練資料過於複雜,無法找到每個樣本的表示(特徵向量),從而使整個人臉集與整個非人臉集線性可分。

最佳化問題的擴充套件

請記住,使用SVM我們獲得一個分離超平面。因此,由於訓練資料現在是非線性可分離的,我們必須承認找到的超平面將錯誤分類一些樣本。這種錯誤分類是最佳化中的一個新變數,必須予以考慮。新模型必須同時包含尋找能提供最大邊距的超平面這一舊要求,以及透過不允許過多分類錯誤來正確泛化訓練資料這一新要求。

我們從這裡開始闡述尋找最大化邊距的超平面的最佳化問題(這在之前的教程中有所解釋(支援向量機簡介))

\[\min_{\beta, \beta_{0}} L(\beta) = \frac{1}{2}||\beta||^{2} \text{ 滿足條件 } y_{i}(\beta^{T} x_{i} + \beta_{0}) \geq 1 \text{ 對於所有 } i\]

有多種方法可以修改此模型,使其考慮誤分類錯誤。例如,可以考慮最小化相同的量加上一個常數乘以訓練資料中的誤分類錯誤數量,即

\[\min ||\beta||^{2} + C \text{(誤分類誤差)}\]

然而,這不是一個很好的解決方案,因為,除其他原因外,我們沒有區分與正確決策區域距離較小或不小的錯誤分類樣本。因此,一個更好的解決方案將考慮錯誤分類樣本與其正確決策區域的距離,即

\[\min ||\beta||^{2} + C \text{(錯分樣本到其正確區域的距離)}\]

對於訓練資料的每個樣本,都定義了一個新引數 \(\xi_{i}\)。這些引數中的每一個都包含其對應訓練樣本到其正確決策區域的距離。下圖顯示了來自兩個類的非線性可分訓練資料、一個分離超平面以及被錯誤分類樣本到其正確區域的距離。

注意
圖中僅顯示了被錯誤分類樣本的距離。其餘樣本的距離為零,因為它們已經位於其正確的決策區域中。

圖中出現的紅色和藍色線條是到每個決策區域的邊距。非常重要的是要認識到,每個 \(\xi_{i}\) 都從一個錯誤分類的訓練樣本延伸到其相應區域的邊距。

最後,最佳化問題的新公式是

\[\min_{\beta, \beta_{0}} L(\beta) = ||\beta||^{2} + C \sum_{i} {\xi_{i}} \text{ 滿足條件 } y_{i}(\beta^{T} x_{i} + \beta_{0}) \geq 1 - \xi_{i} \text{ 且 } \xi_{i} \geq 0 \text{ 對於所有 } i\]

引數 C 應該如何選擇?顯然,這個問題的答案取決於訓練資料的分佈方式。雖然沒有通用的答案,但以下規則很有用:

  • 較大的 C 值會給出更少的誤分類錯誤更小的邊距的解決方案。請注意,在這種情況下,誤分類錯誤代價高昂。由於最佳化的目標是最小化引數,因此只允許少量誤分類錯誤。
  • 較小的 C 值會給出更大的邊距更多的分類錯誤的解決方案。在這種情況下,最小化不會過多地考慮求和項,因此它更側重於尋找具有大邊距的超平面。

原始碼

你也可以在OpenCV原始碼庫的samples/cpp/tutorial_code/ml/non_linear_svms資料夾中找到原始碼,或者從這裡下載

解釋

  • 設定訓練資料

本練習的訓練資料由一組屬於兩個不同類別的帶標籤二維點組成。為了使練習更具吸引力,訓練資料是使用均勻機率密度函式(PDF)隨機生成的。

我們已將訓練資料的生成分為兩個主要部分。

在第一部分中,我們為兩個類別生成線性可分的資料。

在第二部分中,我們為兩個類別建立非線性可分的資料,即重疊資料。

  • 設定SVM引數
注意
在上一教程支援向量機簡介中,解釋了我們在訓練SVM之前在此處配置的cv::ml::SVM類的屬性。

我們在此處的配置與作為參考的上一教程(支援向量機簡介)中的配置僅有兩個不同之處。

  • C。我們在此處選擇了一個較小的引數值,以便在最佳化中不過多懲罰誤分類錯誤。這樣做的目的是為了獲得一個接近直觀預期結果的解決方案。但是,我們建議透過調整此引數來更深入地瞭解問題。

    注意
    在這種情況下,重疊區域中只有很少的點。透過將FRAC_LINEAR_SEP設定為較小的值,可以增加點的密度,從而深入探討引數C的影響。
  • 演算法的終止準則。為了正確解決非線性可分離訓練資料問題,必須大幅增加最大迭代次數。特別是,我們將此值增加了五個數量級。
  • 訓練SVM

我們呼叫cv::ml::SVM::train方法來構建SVM模型。請注意,訓練過程可能需要相當長的時間。執行程式時請耐心等待。

  • 顯示決策區域

cv::ml::SVM::predict方法用於使用訓練好的SVM對輸入樣本進行分類。在此示例中,我們使用此方法根據SVM的預測為空間著色。換句話說,遍歷影像,將其畫素解釋為笛卡爾平面上的點。每個點根據SVM預測的類別著色;如果是標籤為1的類別,則為深綠色;如果是標籤為2的類別,則為深藍色。

  • 顯示訓練資料

cv::circle方法用於顯示組成訓練資料的樣本。標籤為1的類別的樣本顯示為淺綠色,標籤為2的類別的樣本顯示為淺藍色。

  • 支援向量

我們在此處使用一些方法來獲取有關支援向量的資訊。cv::ml::SVM::getSupportVectors方法獲取所有支援向量。我們在這裡使用此方法來查詢作為支援向量的訓練示例並對其進行突出顯示。

結果

  • 程式碼開啟一張影像並顯示兩個類別的訓練示例。一個類別的點用淺綠色表示,另一個類別用淺藍色表示。
  • SVM經過訓練並用於分類影像的所有畫素。這導致影像被劃分為藍色區域和綠色區域。兩個區域之間的邊界是分離超平面。由於訓練資料是非線性可分的,可以看到兩個類別中的一些示例被錯誤分類;一些綠點落在藍色區域,一些藍點落在綠色區域。
  • 最後,使用訓練示例周圍的灰色環顯示支援向量。

你可以在此處觀看其執行時例項。