天天看點

Halcon學習筆記之支援向量機(二)

在halcon中模式比對最成熟最常用的方式該署支援向量機了,在本例程中展示了使用支援向量機對鹵素燈的品質檢測方法。通過這個案例,相信大家可以對支援向量機的使用有一個更加清晰的了解。在相當多的檢測和識别的應用中,都可以使用相同的方法來解決分類問題。

圖1. 鹵素燈圖像

1. 準備好兩組鹵素燈圖像樣本,好壞的各若幹張圖像;

2. 對樣本圖像進行分割,擷取鹵素燈關鍵部位區域;

3. 選擇合适的對圖像的描述,作為識别的特征;

1. 構造支援向量機:初始化支援向量機分類器所需的特征數量、核函數、類型數等參數;

2. 将樣本添加到分類器中;

3. 進行訓練,使分類器收斂;

1. 提取待測目标區域;

2. 提取分類所需的特征:與準備階段3中進行的操作相同;

3. 代入分類器進行分類。

上述在實際的操作過程中,準備階段樣本描述和構造分類器同時進行,即:将樣本圖像的特征提取和樣本添加到分類器中這兩步放在一個循環中完成。整個流程如下圖所示:

圖2. 支援向量機分類識别流程

圖中左邊部分是準備階段所做的工作。如圖所示,在使用svm進行分類之前,首先需要構造分類器;構造完分類器之後,樣本通過svm樣本描述循環體,被逐個進行特征提取後加入到待訓練的svm分類器中;所有訓練樣本按照各自的類型添加結束後就進行訓練,使svm收斂。

訓練之後的svm就可以用于分類了,下面就進入識别階段。如圖右側所示,将待檢測的樣品圖像經過相同的特征提取過程後代入svm分類器即可得到分類結果。由于svm本質上是對提取的特征向量的特征空間進行劃分來差別特征的類别,是以在識别階段使用的特征需要和準備階段的完全相同。這樣svm在對待測樣本中提取的特征向量進行劃分時才知道它具體落入哪一個類型所在的空間,也就知道該樣本的類型了。

對于使用,我們隻要知道svm是一個分類器,可以根據先驗知識将特征向量進行分類。如果想深入了解svm是如何分類的,裡面涉及到的原理可以通過下面的連結來檢視:

幾乎所有使用svm進行分類的流程大架構都遵循上圖,在不同的應用中使用svm的差別就在于圖像描述的差別,如:中,樣本是每一個像素點,而特征向量是像素點的坐标。在本案例中,樣本是兩組圖像,而特征是分割後區域的若幹個形态特征。

首先黏貼出源代碼,這是halcon當中例程中完整的代碼:

以上這是halcon中案例的源代碼,代碼稍微有點長,但是其中很大篇幅代碼與算法關系不大,下面進行詳細介紹。

首先我們可以看到截圖所示部分的代碼,所占篇幅較大。這部分代碼的目的僅僅是初始化環境,并對樣本圖像的目錄進行檢查,這裡不再對内容進行過多介紹。值得注意的是,其中對try-catch的使用在其它例程中不多見,但是實際應用中還是很有必要的,大家在寫代碼的時候不妨可以參考一下。

下面截圖所示代碼為準備階段所做的事情:構造分類器、循環添加樣本、訓練分類器。

第一行定義了分類器所要分辨的類型:good, bad, none;

第二行定義了在輸出時候不同結果顯示的顔色;

第三和第四行是構造的分類器參數;

第五行,如注釋所示,是構造svm分類器;

對于前兩行定義的元組,實質是一個枚舉類型。因為在halcon中,類型輸出實際是一個整數,即諸如:0,1,2……的整數。是以如果輸出是0,則對應的類型是good;輸出1對應是bad;輸出2對應的類型是none。而在顯示的時候,同樣的,可以使用colors元組中相應位置的資料作為顯示參數,用于顯示不同顔色的字元或者區域。

通過create_class_svm構造svm分類器之後需要添加樣本進行訓練,下面就進入外部過程add_sample_to_svm。如下圖所示,通過滑鼠右鍵,可以檢視外部過程詳細定義,該外部過程定義如下:

這是一個循環,每次循環完成的任務為:

1. 讀取下一幀樣本圖像(image);

2. 使用固定門檻值分割後提取待測區域(region);

3. 計算特征向量(features);

4. 将特征向量按照類型加入svm中;

圖3. 分割後的區域

calculate_features同樣也是一個外部過程,該外部過程定義如下:

從定義中,我們可以知道特征向量的選取,包括:面積(area)、密實度(compactness)、四個不變矩特征(psi1,psi2,psi3,psi4)和凸度(convexity)。這些特征都屬于區域的形态特征,最後将這些特征合并成一個實數型的特征向量features,作為本過程的最終運算結果:

圖4. 特征示例

添加樣本後就開始訓練svm分類器,這一步halcon僅通過一個tran_class_svm就能夠完成,訓練過程實質就是使用構造svm時定義的核函數(此處為rbf)在高維特征空間尋找最優的分界面,将特征空間劃分成不同類型(此處為good、bad、none三類)。訓練過程是svm的核心,也是需要進行大量運算的過程,是以在這一個算子上,可能會耗費比較長的時間。

具體如何劃分,原理感興趣的朋友可以下載下傳上面的連結中的pdf檔案進行研究。

到了識别階段,就是對待測樣本進行分類了,分類結果本案例中共有三類:good、bad、none。整個識别過程被封裝在外部過程classify_regions_with_svm中:

從程式中可以看到,識别過程經曆了與樣本添加過程中相同的分割和特征提取。将提取到的特征向量代入svm分類器就就能得出分類結果(class)了。代入分類器的算子為classify_class_svm。從這裡我們也可以看到,對svm分類器實質是在對提取到的特征向量進行分類。

圖5. 識别結果圖

整體來說,svm分類到這裡基本上已經結束,其它部分顯示的代碼就不在進行介紹了,相信大家也看得懂。這裡我沒有對參數的配置進行介紹,隻介紹了整個流程。對于參數的解釋,使用halcon的朋友通過查詢手冊要來得更加友善,也更加準确。