勇哥的视觉实验:GMM分类器(四) 二维数据分类

前言:

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

分类器相对于深度学习来讲是一种古老传统的图片处理技术。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')


准备三个类的训练数据

image.png

类别1的概率

image.png

类别2的概率

image.png

类别3的概率

image.png


以RGB图像的形式显示三个类别的概率

其中三个椭圆线框是三个类别的region范围。

image.png

显示3个类别的后验概率(the posterior probabilit, 缩写是prob)

后验概率的计算要以先验概率为基础。后验概率可以根据通过贝叶斯公式,用先验概率和似然函数计算出来

image.png

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

(k-sigma probability >= 0.01) 中的0.01是怎么来的呢?

这是因为代码中过滤过概率。

* 通过阈值筛选图像的k-sigma概率,以拒绝不属于这三类中任何一类的特征向量。
threshold (ProbKSigma, AcceptanceRegion, 0.01, 1.0)

image.png



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

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


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

发表评论:

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

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