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示例程序,用來解決顏色識別這一類問題的。從基本的思路可以看出,分類整體流程很簡單其實:
首先圖像採集,分析樣本
提取樣本特徵
訓練樣本構成不同類
提取未知物體特徵
分類器分類未知物體
清除模型
而分類器的使用步驟也很簡單:
創建分類器
添加樣本
訓練樣本
分類器分類
運行圖示如下,
閱讀更多 愛生活愛趣談 的文章