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

