1. 程式人生 > >Halcon實戰之基於MLP多層神經網路的訓練學習

Halcon實戰之基於MLP多層神經網路的訓練學習

MLP多層感知器其實是一種人工神經網路結構,屬於非引數估計,可以用於解決分類和迴歸問題。

如果使用“BP演算法”也稱為BP神經網路,是一種前向結構的人工神經網路,對映一組輸入向量到一組輸出向量。MLP可以被看作是一個有向圖,由多個的節點層所組成,每一層都全連線到下一層。除了輸入節點,每個節點都是一個帶有非線性啟用函式的神經元(處理單元),可以解線性不可分問題。

早前已經學習了感知器學習演算法,主要通過對那些錯分類的樣本進行求和來表示對錯分樣本的懲罰,但明顯的它是一個線性的判別函式;而感知器神經元(閾值邏輯單元),對於單個的感知器神經元來說,儘管它能夠實現線性可分資料的分類問題(如與、或問題),但是卻無法解決非線性問題,如邏輯學裡的異或(XOR)問題甚至是高階,那麼這樣的問題該如何利用簡單學習機器來解決呢?

Halcon之基於MLP多層神經網路的訓練學習

回想下前面在非線性分類器中提到的分段線性判別,它的目的是為了將非線性函式擬合成多段線性函式的組合,同樣,關於上述問題,我們也可以採用這一思想,對於任意複雜形狀的分類區域,總可以用多個神經元組成一定的層次結構來實現。

Halcon之基於MLP多層神經網路的訓練學習

多層感知器(Multiayer perceptrons, MLP)可以實現非線性判別式,如果用於迴歸,可以逼近輸入的非線性函式。其實MLP可以用於“普適近似”,即可以證明: 具有連續輸入和輸出的任何函式都可以用MLP近似 ,已經證明,具有一個隱藏層(隱藏節點個數不限)的MLP可以學習輸入的任意非線性函式。

訓練MLP常用的是向後傳播(backpropagation),這主要是因為在我們收斂誤差函式的時候,使用連結規則計算梯度:

Halcon之基於MLP多層神經網路的訓練學習

下面藉助Halcon,先以MLP訓練和識別開始(建立訓練檔案,訓練,識別)。

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示例程式,用來解決顏色識別這一類問題的。從基本的思路可以看出,分類整體流程很簡單其實:

  1. 首先影象採集,分析樣本

  2. 提取樣本特徵

  3. 訓練樣本構成不同類

  4. 提取未知物體特徵

  5. 分類器分類未知物體

  6. 清除模型

  7. Halcon之基於MLP多層神經網路的訓練學習

而分類器的使用步驟也很簡單:

  1. 建立分類器

  2. 新增樣本

  3. 訓練樣本

  4. 分類器分類

Halcon之基於MLP多層神經網路的訓練學習

執行圖示如下,

Halcon之基於MLP多層神經網路的訓練學習