勇哥的视觉实验: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的拒绝类对二维数据进行分类。使用二维数据是因为它可以很容易地可视化为区域和图像。

在训练MLP之前,调用操作符set_rejection_params_class_mlp来打开后台类样本的生成。

训练完成后,MLP用于评估以确定完整2D特征空间中每个类别的概率

这是用来创建三个概率图像。

此外,对特征空间中的每个点进行分类,以确定每个点的最可能类别。

可以看出,位于训练样本凸包外的点将被分配到拒绝类。


image.png

类1的概率

image.png

类2的概率

image.png

类3的概率

image.png

三个类的概率生成RGB图像。

image.png

为特征空间中的每个点显示最可能的类

image.png


set_rejection_params_class_mlp (MLPHandle, 'sampling_strategy', 'hyperbox_around_all_classes')
 set_rejection_params_class_mlp (MLPHandle, 'rejection_class_index', 3)

image.png

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)

image.png


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)


image.png


* 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
版权声明:本文为博主原创文章,转载请附上博文链接!


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

发表评论:

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

会员中心
搜索
«    2024年3月    »
123
45678910
11121314151617
18192021222324
25262728293031
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 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