HALCON例程:novelty_detection.hdev

**这个示例程序展示了支持向量机分类器在“新颖性检测”模式下的行为。
程序的第一部分展示了如何使用内核参数gamma来控制类与训练样本的匹配程度。
程序的第二部分表明,SVM通过为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)//合并
*求交叉区域(由两个椭圆合并得的区域Ellipses 与像素区域Region的交叉部分)
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, 'Irregularly shaped class')
stop ()

*改变gamma值,控制类与训练样本的匹配程度。

classify_2d_feature_space (Region, WindowHandle, 0.05, 0.01, 1.0)
set_tposition (WindowHandle, 190, 2)
dev_set_color ('white')
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 ()

 

*流程同上,改变Nu值,观察训练样本中异常值的影响

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 ()

功能:改变gamma和Nu值,不同值对结果的影响

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值