前言:
==========================================================
分类器相对于深度学习来讲是一种古老传统的图片处理技术。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的拒绝类对二维数据进行分类。使用二维数据是因为它可以很容易地可视化为区域和图像。
在训练MLP之前,调用操作符set_rejection_params_class_mlp来打开后台类样本的生成。
训练完成后,MLP用于评估以确定完整2D特征空间中每个类别的概率。
这是用来创建三个概率图像。
此外,对特征空间中的每个点进行分类,以确定每个点的最可能类别。
可以看出,位于训练样本凸包外的点将被分配到拒绝类。
类1的概率
类2的概率
类3的概率
三个类的概率生成RGB图像。
为特征空间中的每个点显示最可能的类
set_rejection_params_class_mlp (MLPHandle, 'sampling_strategy', 'hyperbox_around_all_classes') set_rejection_params_class_mlp (MLPHandle, 'rejection_class_index', 3)
set_rejection_params_class_mlp (MLPHandle, 'sampling_strategy', 'hyperbox_around_all_classes') set_rejection_params_class_mlp (MLPHandle, 'rejection_class_index', 3) set_rejection_params_class_mlp (MLPHandle, 'hyperbox_tolerance', 0.1)
set_rejection_params_class_mlp (MLPHandle, 'sampling_strategy', 'hyperbox_around_all_classes') set_rejection_params_class_mlp (MLPHandle, 'rejection_class_index', 3) set_rejection_params_class_mlp (MLPHandle, 'hyperbox_tolerance', 0.1) set_rejection_params_class_mlp (MLPHandle, 'rejection_sample_factor', 1.0)
* This example program shows how to use a rejection class for * a MLP for classifying two-dimensional data. 2D data is used because * it can easily be visualized as regions and images. * Before training the MLP the operator set_rejection_params_class_mlp is * called to switch on the generation of a background class samples. * After training, the MLP is used for evaluation to determine the * probabilities of each class in the complete 2D feature space. This is used to * create three probability images. Furthermore, each point in the feature space * is classified to determine the most probable class for each point. * It can be seen that points that lie outside the convex hull of the training * samples will be assigned to the rejection class. 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_pc ('off') dev_update_window ('off') dev_update_var ('off') * 生成三个椭圆作为提取训练样本的区域. gen_ellipse (RegionClass1, 60, 60, rad(-45), 40, 20) gen_ellipse (RegionClass2, 70, 130, rad(-145), 40, 20) gen_ellipse (RegionClass3, 140, 100, rad(100), 35, 20) * 通过对每个区域分割不同的噪声图像并将分割后的区域与类区域相交,从每个区域采样特征点 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) * 显示每个类的示例. 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 () * 读出样本点并将其作为训练样本添加到MLP中. concat_obj (SamplesClass1, SamplesClass2, Samples) concat_obj (Samples, SamplesClass3, Samples) * 在创建mlp分类器时,必须为拒绝类添加一个附加类。因此,NumOutput设置为4而不是3。 create_class_mlp (2, 5, 4, 'softmax', 'normalization', 1, 42, MLPHandle) 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_mlp (MLPHandle, real([Rows[J],Cols[J]]), Class) endfor endfor get_sample_num_class_mlp (MLPHandle, NumSamples) * 将拒绝类采样策略设置为“hyperbox_around_all_classes”。 * 在这里尝试拒绝类的不同参数的意义,(注释部分可以手动开启进行测试不同参数值) set_rejection_params_class_mlp (MLPHandle, 'sampling_strategy', 'hyperbox_around_all_classes') * set_rejection_params_class_mlp (MLPHandle, 'rejection_class_index', 3) * set_rejection_params_class_mlp (MLPHandle, 'hyperbox_tolerance', 0.1) * set_rejection_params_class_mlp (MLPHandle, 'rejection_sample_factor', 1.0) * 训练MLP. train_class_mlp (MLPHandle, 300, 0.01, 0.01, Error, ErrorLog) stop () * 现在确定2D特征空间中所有点的每个类出现的概率,并将它们累积到三幅real图像中。 * 此外,将最可能的类存储在类标签图像中。 gen_image_const (ProbClass1, 'real', 200, 200) gen_image_const (ProbClass2, 'real', 200, 200) gen_image_const (ProbClass3, '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]) evaluate_class_mlp (MLPHandle, Features, Prob) classify_class_mlp (MLPHandle, Features, 1, Class, Confidence) set_grayval (ProbClass1, R, C, Prob[0]) set_grayval (ProbClass2, R, C, Prob[1]) set_grayval (ProbClass3, R, C, Prob[2]) set_grayval (LabelClass, R, C, Class) endfor endfor label_to_region (LabelClass, 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') *3类的概率 Message := 'Probabilities of the 3 classes' disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true') stop () * 为特征空间中的每个点显示最可能的类. dev_set_colored (6) 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' disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!

