前言:
==========================================================
分类器相对于深度学习来讲是一种古老传统的图片处理技术。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数据做为特征演示,这样更容易进行可视化显示。
首先,创建一个不规则形状的类。
然后测试gamma=0.05的效果
gamma是算子create_class_svm的内核参数KernelParam
0.05是宽松的拟合值
画面上的椭圆显示称为类的region, 其实是超平面。
如果你不明白啥是超平面,请看:
http://www.skcircle.com/?id=1644
gamma=0.4是紧密的拟合值。
看到这里,勇哥似乎想不到halcon还有其它的功能可以拟合出2d数据的边界的。
如果有,请读者指出,非常感谢!
为了演示“新奇检测”,制造了一些带新奇点的2d数据。
nu=0.01的情况下,分类结果会包括异常值。
如果把nu放大为0.2,可以看到结果可以不包含异常值。
这样的代价是少数样本会分类为新样本。(即超平面外的那些点)
勇哥注:这个例子真得是非常精彩!!童鞋们不要错过哦。
* 这个示例程序显示了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的源码:
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
版权声明:本文为博主原创文章,转载请附上博文链接!

