例程:class_overlap_svm.hdev

说明:这个例程展示了如何用一个支持向量机来给一幅二维的图像进行分类。使用二维数据的原因是因为它可以很容易地联想成为区域和图像。本例程中使用了三个互相重叠的类(由二维平面三个不同颜色的像素点集组成)。三类不同颜色的像素点作为样本,将那些样本代入支持向量机进行训练。选取像素在二维平面的坐标作为特征向量,使支持向量机对这个二维特征区域进行分类。在结果中我们可以看到,支持向量机会将特性区域(也就是整个二维平面)中每一个的像素点分割为这三个类中的一类。因此,即使远离受训练的样本区域的像素点也将其归类到三个类别之一。

在本例程中最主要的就是展示不同的误差容忍参数Nu对分类的影响。参数Nu的可以理解成支持向量机对样本分类过程中存在重叠的部分分类时的判定错误样本的容忍比率。在分类时,样本质量并不一定理想,部分样本可能落入了本该属于其他类型的特征空间内,如图1中重叠部分的样本。针对这部分重叠区域,是无法对其进行很好的分类的,部分样本最终会作为错误的样本点被划分到其它区域中,如下图中三张分类效果图,无论分类好坏,重叠区域的部分样本都可能落入其它类型的空间。其中参数Nu就是对错误样本所占比例的容忍的上限,Nu取值太小或者太大对最终分类的效果都会造成影响,Nu的取值需要大于错误样本所占的比例。

下图1中展示了三个不同类型的训练样本点集在二维的特征空间的分布状况,从图中可以看到在图像中心位置部分,三类样本有重叠,Nu取值的关键就在于对这部分样本的处理。

图1.红、绿、蓝三个训练样本集

下面三张图展示了Nu取值0.01、0.18和0.25时的效果图。在训练过程中,三个样本集训练的参数都是相同的,因此区别就在于样本集的参数设置。图2中Nu选择太小,导致完全错误分类;图3中Nu值偏小,导致二维特征空间划分时少量的错误样本干扰了整个空间的分类;图4中参数选择刚刚好,二维特征空间分类效果也很完美。

在这里,很多人会问,如果误差容忍选取一个较小值,为何最终分类结果中特征空间划分效果反而差,样本落入其它空间的比例更多。这里仅说明一下我的个人理解,如有错误,希望大神指正:

从Halcon的代码中我们可以看到,支持向量机学习有两个过程——构造和训练。在构造过程中,Nu值作为对样本的优化负责选取三类样本中相对独立的成分,部分有争议的样本将根据参数Nu在此过程中被排除在外,不作为后面训练时的样本。因此,在参加训练之前,Nu作为对样本的优化参数,起到分离错误样本的作用。当然,如果Nu取值太大,也许在这个筛选过程中,提取到的样本并不能够有效表示该类样本空间,那么最终在分类时也会造成错误。

而在训练过程中,支持向量机将根据训练参数求最优平面划分特征空间。如果训练样本理想,那么求得的最优平面就能很好划分,如图4所示;而如果训练样本本身存在很大争议,那么在训练过程中,算法无法很简单地求得一个最优解,那么只能将原本低维的样本点映射到高维进行分类,如果本身样本存在很大问题,那么即使最终求得的解还是无法正确划分特征空间。如图1,由于本身样本的问题,导致求得的最终解在实际识别效果中表现糟糕。

图2.Nu参数取值0.01时的分类效果

图3.Nu参数取值0.18时的分类效果

图4.Nu参数取值0.25时的分类效果

*下面部分为对Hdevelop环境的设置,这里不着重介绍
dev_close_window()
dev_open_window(0,0,600,600,’black’,WindowHandle)
dev_set_part(0,0,199,199)
get_system(‘operating_sysytem’,OS)
if(OS{0:2} = ‘Win’)
set_font(WindowHandle,’-Courier New-18-*-*-*-*-1-’) //设置输出文本的字体
else
set_font(WindowHandle,’-adobe-courier-bold-r-normal—25-*-*-*-*-*-*-*’)
endif
dev_updata_pc(‘off’)
dev_updata_window(‘off’)
dev_updata_var(‘off’) *以下代码用于构造三个样本集:构造三个样本区域;构造白噪声图像;分割白噪声图像;分别与样本区域进行与运算得到样本集
gen_ellipse(RegionClass1,60,60,rad(-45),60,40)
gen_ellipse(RegionClass2,70,70,130,rad(-145),70,30)
gen_ellipse(RegionClass3,140,100,rad(100),55,40) //产生一个椭圆。
//参数说明:产生的椭圆(RegionClassx)
//椭圆中心坐标(140,100)
//椭圆长轴的方向(rad(100))
//椭圆的长轴(55)
//椭圆的短轴(40)
gen_image_const(Image,’byte’,200,200) //一幅固定大小固定灰度的图像
//参数说明:生成的图片(Image)
//图片格式(’byte’)
//图片大小(200,200)
add_noise_white(Image,ImageNoise1,60)
add_noise_white(Image,ImageNoise2,60)
add_noise_white(Image,ImageNoise3,60) //加入白噪声,幅度为60
threshold(ImageNoise1,RegionNoise1,40,255)
threshold(ImageNoise2,RegionNoise2,40,255)
threshold(ImageNoise3,RegionNoise3,40,255) //利用全局阈值分割图像
intersection(RegionClass1,RegionNoise1,SampleClass1)
intersection(RegionClass1,RegionNoise2,SampleClass2)
intersection(RegionClass1,RegionNoise3,SampleClass3)//计算两个区域的交叉(区域的与运算)
//参数说明:两个区域(RegionClassx,RegionNoisex)
//交叉的区域(SampleClassx)
*用三种颜色显示三个不同类型的样本集
dev_clear_window()
dev_set_color(‘red’)
dev_display(SampleClass1)
dev_set_color(‘green’)
dev_display(SampleClass2)
dev_set_color(‘blue’)
dev_display(SampleClass3)
dev_set_color(‘white’)
set_tposition(WindowHandle,5,5) //设置文本的光标位置
write_string(WindowHandle,’Training samples of the 3 classes ’)//在屏幕的已设定的光标位置输出字符串
stop()
classify_2d_feature_space(SampleClass1,SampleClass2,SampleClass3,RegionClass1,RegionClass2,RegionClass3,WindowHandle,’rbf’,0.05,0.01)//利用支持向量机进行分类,这是一个外部过程,具体不进行详细介绍
set_tposition(WindowHandle,188,5) //光标位置(188,5)
write_string(WindowHandle,’Nu = 0.01 : Wrong classification’)
stop()
classify_2d_feature_space(SampleClass1,SampleClass2,SampleClass3,RegionClass1,RegionClass2,RegionClass3,WindowHandle,’rbf’,0.05,0.18)//同样是利用SVM进行分类,只是Nu参数改为0.18
set_tposition(WindowHandle,188,5)
write_string(WindowHandle,’Nu = 0.18 : Overfitting’)
stop()
classify_2d_feature_space(SampleClass1,SampleClass2,SampleClass3,RegionClass1,RegionClass2,RegionClass3,WindowHandle,’rbf’,0.05,0.25)//同样是利用SVM进行分类,只是Nu参数改为0.25
set_tposition(WindowHandle,188,5)
write_string(WindowHandle,’Nu = 0.25 : ’Good generalization’)

Halcon学习笔记之支持向量机(一)的更多相关文章

  1. Halcon学习笔记之支持向量机(二)

    例程:classify_halogen_bulbs.hdev 在Halcon中模式匹配最成熟最常用的方式该署支持向量机了,在本例程中展示了使用支持向量机对卤素灯的质量检测方法.通过这个案例,相信大家可 ...

  2. OpenCV 学习笔记 07 支持向量机SVM(flag)

    1 SVM 基本概念 本章节主要从文字层面来概括性理解 SVM. 支持向量机(support vector machine,简SVM)是二类分类模型. 在机器学习中,它在分类与回归分析中分析数据的监督 ...

  3. halcon学习笔记——机器视觉工程应用的开发思路【转】

    转自:http://www.cnblogs.com/hanzhaoxin/archive/2013/02/15/2912879.html 机器视觉工程应用主要可划分为硬件和软件两大部分. 硬件:工程应 ...

  4. Halcon学习笔记——条形码的定位与识别

    一维码的原理与结构 条码基本原理是利用条纹和间隔或宽窄条纹(间隔)构成二进制的”0“和”1“,反映的是某种信息. 一维条码数据结构,分四个区域.组成分别为静区.起始/终止符.校验符.数据符. 一维条码 ...

  5. Halcon学习笔记——机器视觉应用工程开发思路及相机标定

    机器视觉应用工程开发思路 机器视觉应用工程主要可划分为两大部分,硬件部分和软件部分. 1.硬件部分,硬件的选型至关重要,决定了后续工作是否可以正常开展,其中关键硬件部分包括:光源,相机以及镜头. 2. ...

  6. Halcon学习笔记1

    转:https://www.cnblogs.com/hanzhaoxin/archive/2013/02/15/2912879.html 机器视觉工程应用主要可划分为硬件和软件两大部分. 硬件:工程应 ...

  7. halcon学习笔记——(11)Image,region,xld初步

    一 读取的3种方式: 读取单张的图片: read_image( image,'filename') //image 是输出对象,后面是输入文件的路径和名称 读取多图: 1,申明一个数组,分别保存路径 ...

  8. Halcon学习笔记之缺陷检测(二)

    例程:detect_indent_fft.hdev 说明:这个程序展示了如何利用快速傅里叶变换(FFT)对塑料制品的表面进行目标(缺陷)的检测,大致分为三步: 首先,我们用高斯滤波器构造一个合适的滤波 ...

  9. Halcon学习笔记之缺陷检测(一)

    例程:surface_scratch.hdev 说明:这个程序利用局部阈值和形态学处理提取表面划痕 代码中绿色部分为个人理解和注释,其余为例程中原有代码 *surface_scratch.hdev:e ...

随机推荐

  1. react typescript 子组件给父组件传值

    //父组件 import * as React from 'react'import { Input } from 'antd'const Search = Input.Searchimport &q ...

  2. webpack打包出错,通过babel将es6转es5的出错。

    错误信息如下: 解决方法: 1,先安装babel-preset-es2015到项目中, cnpm install babel-preset-es2015 --save-dev2,在项目根目录中新建一个 ...

  3. 7-20 Windows消息队列 (25 分)(模拟水题)

    题意: 思路: 用优先队列直接模拟就OK了,另外优先队列存pair的时候比较的是first的值,实测!! 上代码: #include <iostream> #include <que ...

  4. LeetCode 712. Minimum ASCII Delete Sum for Two Strings

    Given two strings s1, s2, find the lowest ASCII sum of deleted characters to make two strings equal. ...

  5. vue 中全局filter过滤器的配置及使用

    在项目中使用到的经常用到过滤器,比如时间,数据截取等过滤器,如果在每个.vue中都可以复制同一个过滤器,这可以达到目的,但是遇到方法有bug时就需要诸葛修改进入不同的页面修改,这样既费时又费力,优先可 ...

  6. SqlServer转换为Mysql(mss2sql)

    SqlServer转换为Mysql(mss2sql)工具 http://pan.baidu.com/s/1c2d8R8O 参考链接: http://www.cnblogs.com/angestudy/ ...

  7. [cogs731] [网络流24题#6] 最长递增子序列 [网络流,最大流]

    [转hzwer]第一问是LIS,动态规划求解,第二问和第三问用网络最大流解决.首先动态规划求出F[i],表示以第i位为开头的最长上升序列的长度,求出最长上升序列长度K.1.把序列每位i拆成两个点< ...

  8. Javascript中数据与字符串互转(转)

    数组与字符串的相互转化 <script type="text/javascript"> var obj="new1abcdefg".replace( ...

  9. 开源GIS软件 1

    1. 在线地图浏览器 GMap.NET GMap.NET 是一个强大.免费.跨平台.开源的.NET控件,它在Windows Forms 和WPF环境中能够通过Google, Yahoo!, Bing, ...

  10. MySQL:解决MySQL无法启动的问题

    MySQL无法启动的原因有多种,这里是我遇到的一种情况和解决方法. 起因: 最近项目需要使用MySQL,于是想在MAC上安装一个本地的数据库,但是其实忘了已经安装过一个版本了,结果发现新的服务器怎么也 ...