勇哥的视觉实验:SVM分类器(五) 支持向量机的应用例子,新奇检测

前言:

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

分类器相对于深度学习来讲是一种古老传统的图片处理技术。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%被占用。
分类器相对于深度学习来讲不吃硬件,所以相对来讲算是轻量级的应用。

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

如果你不知道啥是“新奇检测”,请参见勇哥的另一篇文章:

http://www.skcircle.com/?id=1630  这篇文章是使用gmm做新奇检测。


而本篇则是使用svm做新奇检测。

本例子使用2D数据做为特征演示,这样更容易进行可视化显示。


首先,创建一个不规则形状的类。

image.png


然后测试gamma=0.05的效果

gamma是算子create_class_svm的内核参数KernelParam

0.05是宽松的拟合值

画面上的椭圆显示称为类的region, 其实是超平面。

如果你不明白啥是超平面,请看:

http://www.skcircle.com/?id=1644

image.png


gamma=0.4是紧密的拟合值。

看到这里,勇哥似乎想不到halcon还有其它的功能可以拟合出2d数据的边界的。

如果有,请读者指出,非常感谢!

image.png


为了演示“新奇检测”,制造了一些带新奇点的2d数据。

image.png


nu=0.01的情况下,分类结果会包括异常值。

image.png


如果把nu放大为0.2,可以看到结果可以不包含异常值。

这样的代价是少数样本会分类为新样本。(即超平面外的那些点)

image.png


勇哥注:这个例子真得是非常精彩!!童鞋们不要错过哦。


* 这个示例程序显示了SVM分类器在“新颖性检测”模式下的行为。
*程序的第一部分展示了如何使用内核参数gamma来控制类与训练样本的匹配程度。
*程序的第二部分表明,支持向量机通过为Nu选择一个合适的值,
*可以在一定程度上容忍训练样本中的异常值,但代价是将少数训练样本分类为新样本。
*因此,可以看出,通常最好确保新颖性检测的训练样本不包含异常值。
*在本例中,二维数据用于特征,因为它们可以很容易地可视化为区域。

dev_close_window ()
dev_open_window (0, 0, 600, 600, 'black', WindowHandle)
dev_set_part (0, 0, 199, 199)
dev_update_off ()
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
set_system ('clip_region', 'false')
gen_region_points (Region, rand(1000) * 200, rand(1000) * 200)
set_system ('clip_region', 'true')
gen_ellipse (Ellipse1, 100, 70, rad(-60), 90, 40)
gen_ellipse (Ellipse2, 120, 150, rad(40), 50, 30)
union2 (Ellipse1, Ellipse2, Ellipses)
intersection (Ellipses, Region, Region)
dev_clear_window ()
dev_set_draw ('fill')
dev_set_color ('green')
dev_display (Region)
dev_set_color ('white')
set_tposition (WindowHandle, 2, 5)
write_string (WindowHandle, 'Training samples')
set_tposition (WindowHandle, 12, 5)
*Irregularly shaped class 不规则形状类
write_string (WindowHandle, 'Irregularly shaped class')
stop ()
classify_2d_feature_space (Region, WindowHandle, 0.05, 0.01, 1.0)
set_tposition (WindowHandle, 190, 2)
dev_set_color ('white')
*'Gamma = 0.05: 宽松的' 
write_string (WindowHandle, 'Gamma = 0.05: Loose fit')
stop ()
classify_2d_feature_space (Region, WindowHandle, 0.4, 0.01, 1.0)
set_tposition (WindowHandle, 190, 2)
dev_set_color ('white')
write_string (WindowHandle, 'Gamma = 0.4: Tight fit')
stop ()
set_system ('clip_region', 'false')
gen_region_points (Region, rand(1000) * 200, rand(1000) * 200)
set_system ('clip_region', 'true')
gen_ellipse (Ellipse1, 100, 70, rad(-60), 90, 40)
gen_ellipse (Ellipse2, 80, 150, rad(20), 10, 10)
union2 (Ellipse1, Ellipse2, Ellipses)
intersection (Ellipses, Region, Region)
dev_clear_window ()
dev_set_draw ('fill')
dev_set_color ('green')
dev_display (Region)
dev_set_color ('white')
set_tposition (WindowHandle, 2, 5)
write_string (WindowHandle, 'Training samples')
set_tposition (WindowHandle, 12, 5)
write_string (WindowHandle, 'Class with outliers (errors)')
stop ()
classify_2d_feature_space (Region, WindowHandle, 0.2, 0.01, 1.0)
set_tposition (WindowHandle, 190, 2)
dev_set_color ('white')
write_string (WindowHandle, 'Nu = 0.01: Outliers in result')
stop ()
classify_2d_feature_space (Region, WindowHandle, 0.2, 0.2, 1.0)
set_tposition (WindowHandle, 190, 2)
dev_set_color ('white')
write_string (WindowHandle, 'Nu = 0.2: Outliers not in result')
stop ()
classify_2d_feature_space (Region, WindowHandle, 0.2, 0.2, 0.9)
set_tposition (WindowHandle, 190, 2)
dev_set_color ('white')
write_string (WindowHandle, 'Nu = 0.2: Rejection threshold = 0.9')


classify_2d_feature_space的源码:


image.png

get_region_points (Region, Rows, Cols)
create_class_svm (2, 'rbf', KernelParam, Nu, 1, 'novelty-detection', 'normalization', 0, SVMHandle)
* Add the samples to the SVM.
for J := 0 to |Rows| - 1 by 1
    add_sample_class_svm (SVMHandle, [real(Rows[J]),real(Cols[J])], 0)
endfor
* Train the SVM.
train_class_svm (SVMHandle, 0.001, 'default')
* Classify each point of the 2D feature space and accumulate the classification
* result in a class label image.
gen_image_const (Image, 'byte', 200, 200)
if (RejectionThreshold == 1.0)
    for R := 0 to 199 by 1
        for C := 0 to 199 by 1
            classify_class_svm (SVMHandle, [real(R),real(C)], 1, Class)
            set_grayval (Image, R, C, Class)
        endfor
    endfor
else
    for R := 0 to 199 by 1
        for C := 0 to 199 by 1
            evaluate_class_svm (SVMHandle, [real(R),real(C)], Result)
            Class := Result >= RejectionThreshold
            set_grayval (Image, R, C, Class)
        endfor
    endfor
endif
label_to_region (Image, Classes)
select_obj (Classes, Class1, 1)
select_obj (Classes, Class2, 2)
dev_clear_window ()
dev_set_draw ('margin')
dev_set_color ('green')
dev_display (Class2)
dev_set_color ('red')
dev_display (Class1)
dev_set_draw ('fill')
dev_set_color ('green')
dev_display (Region)
set_tposition (WindowHandle, 2, 2)
write_string (WindowHandle, 'Class 2 and class region')
dev_set_color ('red')
set_tposition (WindowHandle, 180, 2)
write_string (WindowHandle, 'Class 1 and class region')
return ()


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

作者: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