前言:
==========================================================
分类器相对于深度学习来讲是一种古老传统的图片处理技术。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://47.98.154.65/?id=1630 这篇文章是使用gmm做新奇检测。
而本篇则是使用svm做新奇检测。
本例子使用2D数据做为特征演示,这样更容易进行可视化显示。
首先,创建一个不规则形状的类。

然后测试gamma=0.05的效果
gamma是算子create_class_svm的内核参数KernelParam
0.05是宽松的拟合值
画面上的椭圆显示称为类的region, 其实是超平面。
如果你不明白啥是超平面,请看:

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


少有人走的路



















