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多层神经网络的训练学习


分享到:


相關文章: