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示例程序,用来解决颜色识别这一类问题的。从基本的思路可以看出,分类整体流程很简单其实:
首先图像采集,分析样本
提取样本特征
训练样本构成不同类
提取未知物体特征
分类器分类未知物体
清除模型
而分类器的使用步骤也很简单:
创建分类器
添加样本
训练样本
分类器分类
运行图示如下,