前言:
==========================================================
分类器相对于深度学习来讲是一种古老传统的图片处理技术。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计算出来的回归曲线。
evalidate_class_mlp 算子:计算多层感知器对特征向量的评估
算子签名:
evaluate_class_mlp( : : MLPHandle, Features : 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
版权声明:本文为博主原创文章,转载请附上博文链接!

