Halcon實戰之基於MLP多層神經網路的訓練學習
MLP多層感知器其實是一種人工神經網路結構,屬於非引數估計,可以用於解決分類和迴歸問題。
如果使用“BP演算法”也稱為BP神經網路,是一種前向結構的人工神經網路,對映一組輸入向量到一組輸出向量。MLP可以被看作是一個有向圖,由多個的節點層所組成,每一層都全連線到下一層。除了輸入節點,每個節點都是一個帶有非線性啟用函式的神經元(處理單元),可以解線性不可分問題。
早前已經學習了感知器學習演算法,主要通過對那些錯分類的樣本進行求和來表示對錯分樣本的懲罰,但明顯的它是一個線性的判別函式;而感知器神經元(閾值邏輯單元),對於單個的感知器神經元來說,儘管它能夠實現線性可分資料的分類問題(如與、或問題),但是卻無法解決非線性問題,如邏輯學裡的異或(XOR)問題甚至是高階,那麼這樣的問題該如何利用簡單學習機器來解決呢?
回想下前面在非線性分類器中提到的分段線性判別,它的目的是為了將非線性函式擬合成多段線性函式的組合,同樣,關於上述問題,我們也可以採用這一思想,對於任意複雜形狀的分類區域,總可以用多個神經元組成一定的層次結構來實現。
多層感知器(Multiayer perceptrons, MLP)可以實現非線性判別式,如果用於迴歸,可以逼近輸入的非線性函式。其實MLP可以用於“普適近似”,即可以證明: 具有連續輸入和輸出的任何函式都可以用MLP近似 ,已經證明,具有一個隱藏層(隱藏節點個數不限)的MLP可以學習輸入的任意非線性函式。
訓練MLP常用的是向後傳播(backpropagation),這主要是因為在我們收斂誤差函式的時候,使用連結規則計算梯度:
下面藉助Halcon,先以MLP訓練和識別開始(建立訓練檔案,訓練,識別)。
大致程式碼如下,
* Initialization ImageRootName := 'color/color_pieces_0' Regions := ['yellow','pink','blue','background'] Highlight := ['goldenrod','magenta','cyan'] *建立一個空的目標元組 gen_empty_obj (Classes) * Train and apply the MLP classifier * Specify color classes for I := 1 to 4 by 1 dev_display (Image) dev_display (Classes) disp_message (WindowHandle, ['Drag rectangle inside ' + Regions[I - 1] + ' color','Click right mouse button to confirm'], 'window', 24, 12, 'black', 'false') *畫roi區域 draw_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2) *獲取矩形區域——產生一個平行座標軸的矩形 gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2) *連線兩個目標元組的圖示 concat_obj (Classes, Rectangle, Classes) endfor * Train the specified color classes * 建立訓練分類器,為分類和迴歸建立一個多層感知器 create_class_mlp (3, 7, 4, 'softmax', 'normalization', 3, 42, MLPHandle) *新增訓練樣本 add_samples_image_class_mlp (Image, Classes, MLPHandle) *顯示資訊 disp_message (WindowHandle, 'Training...', 'window', 100, 12, 'black', 'false') *訓練一個基於多層神經網路的分類器 train_class_mlp (MLPHandle, 400, 0.5, 0.01, Error, ErrorLog) * * Use the trained MLP classifier to test if each image * contains four game pieces of each color for J := 0 to 3 by 1 read_image (Image, ImageRootName + J) if (Mode == 1) rgb1_to_gray (Image, GrayImage) compose3 (GrayImage, GrayImage, GrayImage, Image) endif * * Apply the trained classes 應用訓練分類器進行識別分類 classify_image_class_mlp (Image, ClassRegions, MLPHandle, 0.5) dev_display (Image) disp_message (WindowHandle, 'Looking for 4 game pieces of each color ...', 'window', 24, 12, 'black', 'false') dev_set_line_width (2) * * Count the number of game pieces for each color class for Figure := 1 to 3 by 1 copy_obj (ClassRegions, ObjectsSelected, Figure, 1) connection (ObjectsSelected, ConnectedRegions) select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 400, 99999) count_obj (SelectedRegions, Number) dev_set_color (Highlight[Figure - 1]) dev_display (SelectedRegions) OutString := Regions[Figure - 1] + ': ' + Number + ' ' dev_set_color ('green') disp_message (WindowHandle, OutString, 'window', 24 + 30 * Figure, 12, 'black', 'false') if (Number != 4) disp_message (WindowHandle, 'Not OK', 'window', 24 + 30 * Figure, 120, 'red', 'false') else disp_message (WindowHandle, 'OK', 'window', 24 + 30 * Figure, 120, 'green', 'false') endif endfor if (J < 3 or Mode == 0) disp_continue_message (WindowHandle, 'black', 'true') stop () endif endfor clear_class_mlp (MLPHandle)
上述案例摘自Halcon示例程式,用來解決顏色識別這一類問題的。從基本的思路可以看出,分類整體流程很簡單其實:
首先影象採集,分析樣本
提取樣本特徵
訓練樣本構成不同類
提取未知物體特徵
分類器分類未知物體
清除模型
而分類器的使用步驟也很簡單:
建立分類器
新增樣本
訓練樣本
分類器分類
執行圖示如下,