前言:
==========================================================
分类器相对于深度学习来讲是一种古老传统的图片处理技术。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%被占用。
分类器相对于深度学习来讲不吃硬件,所以相对来讲算是轻量级的应用。
==========================================================
源码:
*这个示例程序演示了如何使用GMM对二维数据进行分类。使用二维数据是因为它可以很容易地可视化为区域和图像。 *这个例子使用了三个基本上重叠的类。 *它从每个类中生成样本,并用样本训练GMM。然后,利用GMM对完整的二维特征空间进行分类。 *它还计算每个类的概率,以及每个特征向量的k-sigma概率。 *后者可以用来以一定的概率拒绝不属于这三类中任何一类的所有特征向量。 dev_close_window () dev_open_window (0, 0, 600, 600, 'black', WindowHandle) dev_set_part (0, 0, 199, 199) set_display_font (WindowHandle, 16, 'mono', 'true', 'false') dev_update_off () * Generate three overlapping ellipses as the regions from which the training * samples are drawn. gen_ellipse (RegionClass1, 60, 60, rad(-45), 60, 40) gen_ellipse (RegionClass2, 70, 130, rad(-145), 70, 30) gen_ellipse (RegionClass3, 140, 100, rad(100), 55, 40) * Sample feature points from each region by segmenting a different noisy image * for each region and intersecting the segmented region with the class region. gen_image_const (Image, 'byte', 200, 200) add_noise_white (Image, ImageNoise1, 60) add_noise_white (Image, ImageNoise2, 60) add_noise_white (Image, ImageNoise3, 60) threshold (ImageNoise1, RegionNoise1, 40, 255) threshold (ImageNoise2, RegionNoise2, 40, 255) threshold (ImageNoise3, RegionNoise3, 40, 255) intersection (RegionClass1, RegionNoise1, SamplesClass1) intersection (RegionClass2, RegionNoise2, SamplesClass2) intersection (RegionClass3, RegionNoise3, SamplesClass3) * Display the samples of each class. dev_clear_window () dev_set_color ('red') dev_display (SamplesClass1) dev_set_color ('green') dev_display (SamplesClass2) dev_set_color ('blue') dev_display (SamplesClass3) Message := 'Training samples of the 3 classes' disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true') stop () * Read out the sample points and add them as training samples to the GMM. concat_obj (SamplesClass1, SamplesClass2, Samples) concat_obj (Samples, SamplesClass3, Samples) create_class_gmm (2, 3, 1, 'full', 'none', 2, 42, GMMHandle) for Class := 0 to 2 by 1 select_obj (Samples, SamplesClass, Class + 1) get_region_points (SamplesClass, Rows, Cols) for J := 0 to |Rows| - 1 by 1 add_sample_class_gmm (GMMHandle, real([Rows[J],Cols[J]]), Class, 1.5) endfor endfor get_sample_num_class_gmm (GMMHandle, NumSamples) * Train the GMM. train_class_gmm (GMMHandle, 100, 0.001, 'training', 1e-4, Centers, Iter) *现在确定二维特征空间中所有点的每个类出现的概率,并将它们累积到三个真实图像中。 *此外,将最有可能的类存储在类标签映像中。最后,将k-sigma概率存储在图像中,以拒绝不属于任何类的特征向量。 gen_image_const (ProbClass1, 'real', 200, 200) gen_image_const (ProbClass2, 'real', 200, 200) gen_image_const (ProbClass3, 'real', 200, 200) gen_image_const (ProbKSigma, 'real', 200, 200) gen_image_const (LabelClass, 'byte', 200, 200) for R := 0 to 199 by 1 for C := 0 to 199 by 1 Features := real([R,C]) classify_class_gmm (GMMHandle, Features, 3, Class, ClassProb, Density, KSigmaProb) Index := sort_index(Class) set_grayval (ProbClass1, R, C, ClassProb[Index[0]]) set_grayval (ProbClass2, R, C, ClassProb[Index[1]]) set_grayval (ProbClass3, R, C, ClassProb[Index[2]]) set_grayval (ProbKSigma, R, C, KSigmaProb) set_grayval (LabelClass, R, C, Class[0]) endfor endfor label_to_region (LabelClass, Classes) * 通过阈值筛选图像的k-sigma概率,以拒绝不属于这三类中任何一类的特征向量。 threshold (ProbKSigma, AcceptanceRegion, 0.01, 1.0) * 将类区域与接受区域相交。 intersection (Classes, AcceptanceRegion, Classes) compose3 (ProbClass1, ProbClass2, ProbClass3, Probs) * 显示每个类的概率 dev_display (ProbClass1) Message := 'Probability of class 1' disp_message (WindowHandle, Message, 'window', 12, 12, 'red', 'true') stop () dev_display (ProbClass2) Message := 'Probability of class 2' disp_message (WindowHandle, Message, 'window', 12, 12, 'red', 'true') stop () dev_display (ProbClass3) Message := 'Probability of class 3' disp_message (WindowHandle, Message, 'window', 12, 12, 'red', 'true') stop () * 以RGB图像的形式显示三个类别的概率 dev_display (Probs) dev_set_color ('white') dev_set_draw ('margin') dev_display (RegionClass1) dev_display (RegionClass2) dev_display (RegionClass3) dev_set_draw ('fill') Message := 'Probabilities of the 3 classes' disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true') stop () * 显示后验概率. dev_display (ProbKSigma) dev_set_color ('white') dev_set_draw ('margin') dev_display (RegionClass1) dev_display (RegionClass2) dev_display (RegionClass3) dev_set_draw ('fill') Message := 'k-sigma prob. of the 3 classes' disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true') stop () * 为特征空间中的每个点显示最有可能的类. dev_clear_window () dev_set_colored (3) dev_display (Classes) dev_set_color ('white') dev_set_draw ('margin') dev_display (RegionClass1) dev_display (RegionClass2) dev_display (RegionClass3) dev_set_draw ('fill') Message := 'Most probable classes' Message[1] := '(k-sigma probability >= 0.01)' disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')
准备三个类的训练数据
类别1的概率
类别2的概率
类别3的概率
以RGB图像的形式显示三个类别的概率
其中三个椭圆线框是三个类别的region范围。
显示3个类别的后验概率(the posterior probabilit, 缩写是prob)
后验概率的计算要以先验概率为基础。后验概率可以根据通过贝叶斯公式,用先验概率和似然函数计算出来
为特征空间中的每个点显示最有可能的类
(k-sigma probability >= 0.01) 中的0.01是怎么来的呢?
这是因为代码中过滤过概率。
* 通过阈值筛选图像的k-sigma概率,以拒绝不属于这三类中任何一类的特征向量。 threshold (ProbKSigma, AcceptanceRegion, 0.01, 1.0)
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!

