勇哥的视觉实验:MLP分类器(五) 回归(函数近似)

前言:

==========================================================

分类器相对于深度学习来讲是一种古老传统的图片处理技术。halcon中常见的有四类分类器:

  • MLP(多层神经网络neural Nets)

  • SVM(支持向量机)

  • K-NN(K-最邻近)

  • GMM(高斯混合类型)

分类器的应用领域主要是下面这些:

  • image segmentation         图像分割  

  • object recognition             对象识别 

  • quality control                 质量控制

  • novelty detection             缺陷检测 

  • optical character recognition(OCR)      光学字符识别

勇哥第一次见到分类器的视觉项目是锂电池的极片缺陷检测,效果还不错。

这两年深度学习火起来后,发现深度学习完成上面所说的领域的应用更容易,效果也更好。

但深度学习对硬件要求太高,你把IPC加装个一百多W的显卡很多时候是不现实的。

如果你用cpu来跑,会发现速度乎快乎慢,cpu全部内核会100%被占用。

分类器相对于深度学习来讲不吃硬件,所以相对来讲算是轻量级的应用。

==========================================================

这个例子展示了MLP如何用于回归(函数近似)。

首先,产生21个噪声正弦波样本。

然后,利用噪声数据训练具有线性输出激活的MLP。

最后,绘制了训练后的MLP输出和真实无噪声正弦波。


下图是程序的运行结果。

其中蓝色线是真实正弦函数的曲线,绿色线是MLP计算出来的回归曲线。

image.png


evalidate_class_mlp 算子:计算多层感知器对特征向量的评估

算子签名:

evaluate_class_mlp( : : MLPHandleFeatures : Result)


evaluate_class_mlp计算结果评估所述特征向量的Features,用MLPHandle(多层感知器MLP的句柄)。

用于评估的公式由create_class_mlp描述。调用evaluate_class_mlp之前的MLP必须经过train_class_mlp训练 。


如果将MLP用于回归(函数逼近),即,如果(OutputFunction = 'linear'),则Result是函数在坐标Features处的值。

对于 OutputFunction = 'logistic'和 'softmax',可以将Result中的值解释为概率。

因此,对于OutputFunction = 'logistic',结果元素代表各自独立属性存在的概率。

通常,阈值0.5用于确定属性是否存在。取决于应用,也可以使用其他阈值。

对于OutputFunction = 'softmax',通常将Result最大值的位置 解释为特征向量的类别,并将相应的值解释为该类别的概率。

在这种情况下,应使用classify_class_mlp而不是 evaluate_class_mlp,因为classify_class_mlp 直接返回类别和相应的概率。


dev_update_pc ('off')
dev_update_window ('off')
dev_update_var ('off')
dev_close_window ()
dev_open_window (0, 0, 500, 500, 'black', WindowHandle)
dev_set_part (0, 0, 499, 499)
* Initialize the random number generator.  create_class_mlp will overwrite
* the seed.  Therefore, we will only get identical results if we call rand once
* before calling create_class_mlp.
* 初始化随机数生成器。创建create_class_mlp将覆盖随机种子。
* 因此,只有在调用create_class_mlp之前调用rand一次,我们才能得到相同的结果。
D := rand(1)
* 创建MLP.
create_class_mlp (1, 3, 1, 'linear', 'none', 1, 9, MLPHandle)

* 产生正弦波的噪声样本.
D := []
T := []
Noise := 0.2
NData := 21
for J := 0 to NData - 1 by 1
    D := [D,real(J) / (NData - 1)]
    T := [T,sin(rad(360) * D[J]) + Noise * (rand(1) - 0.5)]
endfor

* 绘制样本.
dev_clear_window ()
dev_set_color ('red')
disp_cross (WindowHandle, 250 - T * 200, D * 500, 20, 0)
* 训练MLP.
for J := 0 to NData - 1 by 1
    add_sample_class_mlp (MLPHandle, D[J], T[J])
endfor
train_class_mlp (MLPHandle, 200, 0.00001, 0.00001, Error, ErrorLog)
* 生成MLP输出和真实正弦波的曲线图。Y将包含MLP的输出,而G将包含地面真值(即真正弦波)。
NPlot := 101
X := []
Y := []
G := []
for J := 0 to NPlot - 1 by 1
        *x轴刻度
    X := [X,real(J) / (NPlot - 1)]
    evaluate_class_mlp (MLPHandle, X[J], R)
    Y := [Y,R]
    G := [G,sin(rad(360) * X[J])]
endfor
dev_set_color ('blue')
for J := 0 to NPlot - 2 by 1
    disp_line (WindowHandle, 250 - G[J] * 200, X[J] * 500, 250 - G[J + 1] * 200, X[J + 1] * 500)
endfor
dev_set_color ('green')
for J := 0 to NPlot - 2 by 1
    disp_line (WindowHandle, 250 - Y[J] * 200, X[J] * 500, 250 - Y[J + 1] * 200, X[J + 1] * 500)
endfor



--------------------- 

作者:hackpig
来源:
www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!


本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2025年4月    »
123456
78910111213
14151617181920
21222324252627
282930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864