文章目录

  • 前言
  • 一、SVM
  • 1.1 SVM 使用类型
  • 1.2 核函数
  • (1) 线性核(LINEAR )
  • (2) 多项式核
  • (3) RBF 高斯核函数
  • (4) SIGMOID核函数
  • (5) POLY核函数
  • 1.3 参数
  • 1.3.1 与核函数相关的参数如下
  • 1.3.2 与SVM类型选择相关的参数设置
  • 1.3.3 训练参数相关
  • 二、SVM分类问题步骤
  • 1.数据准备
  • 2.SVM模型搭建
  • 总结



前言

本文主要以使用svm做图像分类为主要任务进行讲解,如何从图像数据准备到模型构建到训练,模型保存,预测的流程。同样也会涉及svm中不同核函数对应的参数设置方法。

使用SVM完成图像分类、数据分类等分类任务
优点:
1.模型小,推理速度快
2.所需数据集少,训练速度快
3.简单易上手
其中影响SVM模型效果的关键性因素在于核函数以及不同核函数对应的参数。


一、SVM

SVM(Support Vector Machine)是一种常用的分类算法,主要用于二分类问题。其核心思想是在高维特征空间中寻找一个最优的超平面,使得能够将不同类别的样本分开,同时最大化分类间隔,从而提高分类准确率。SVM还可以通过引入核函数来处理非线性问题,在将数据映射到高维空间后,采用SVM算法进行分类。SVM由于其简单、有效的分类思想和丰富的理论支持,在机器学习领域得到了广泛的应用。

1.1 SVM 使用类型

SVM主要有C_SVC/ EPS_SVR/ NU_SVR/ONE_CLASS这几种类型

C_SVC : C类支撑向量分类机。 n类分组 (n≥2),容许用异常值处罚因子C进行不完全分类。
NU_SVC :v类支撑向量分类机。n类似然不完全分类的分类器。参数为庖代C(其值在区间【0,1】中,nu越大,决定计划鸿沟越腻滑)。
ONE_CLASS : 单分类器,所有的练习数据提取自同一个类里,然后SVM建树了一个分界线以分别该类在特点空间中所占区域和其它类在特点空间中所占区域。
EPS_SVR : 类支撑向量回归机。练习集中的特点向量和拟合出来的超平面的间隔须要小于p。异常值处罚因子C被采取。
NU_SVR : v类支撑向量回归机。 v庖代了 p。

1.2 核函数

SVM中常用的核函数包括线性核(LINEAR )、多项式核、高斯核(RBF)和 sigmoid 核。

(1) 线性核(LINEAR )

opencv python gamma变换 opencv python svm_支持向量机

(2) 多项式核

opencv python gamma变换 opencv python svm_python_02

(3) RBF 高斯核函数

opencv python gamma变换 opencv python svm_支持向量机_03

(4) SIGMOID核函数

opencv python gamma变换 opencv python svm_核函数_04
在实际应用中,需要根据具体问题选择合适的核函数,并对参数进行调整以达到最优的分类效果,接下来就是参数部分。

(5) POLY核函数

opencv python gamma变换 opencv python svm_python_05
在实际应用中,需要根据具体问题选择合适的核函数,并对参数进行调整以达到最优的分类效果,接下来就是参数部分。

1.3 参数

在选定核函数后,可以对模型相关的参数进行设定。

1.3.1 与核函数相关的参数如下

degree:内核函数(POLY)的参数degree。

gamma(γ):内核函数(POLY/ RBF/ SIGMOID)的参数。

coef0:内核函数(POLY/ SIGMOID)的参数coef0。
以上参数与核函数表达式中相对应,也就是在选定核函数后,可以选择设置对应的参数。

1.3.2 与SVM类型选择相关的参数设置

Cvalue:SVM类型(C_SVC/ EPS_SVR/ NU_SVR)的参数C

nu:SVM类型(NU_SVC/ ONE_CLASS/ NU_SVR)的参数 。

p:SVM类型(EPS_SVR)的参数。

1.3.3 训练参数相关

class_weights:C_SVC中的可选权重,赋给指定的类,乘以C今后变成 。所以这些权重影响不合类此外错误分类处罚项。权重越大,某一类此外误分类数据的处罚项就越大。

TermCriteria:SVM的迭代练习过程的中断前提,解决项目组受束缚二次最优题目。您可以指定的公差和/或最大迭代次数

二、SVM分类问题步骤

(1)获得练习样本及制作其类别标签(train_images,train_labels)
(2)设置模型、训练参数(Param)
(3)对SVM进行训练(train)
(4)对新的输入样本进行猜测(predict),并输出结果类型(对应标签)

1.数据准备

SVM训练投入的数据train_images->shape:[N, L],N为数据总数,L为单个数据长度。train_labels->shape:[N,1]
对于自己准备的数据,无论是图像还是向量,都需要整理成长度都为L的数据。
RGB图像数据的处理: 读图像时经行统一resize到相同长宽,如果不进行BGR2GRAY,也就是不使用灰度图作为图像特征进行训练的话,想用RGB三色图作为输入数据进行训练就得进行reshape,将三维图像reshape成一维向量,如果要进行灰度化就先将RGB2GRAY后再进行reshape成一维向量。
以下代码展示如何处理准备数据
我这里的数据集架构如下:
image_root
|-0-images
|-1-images

#加载数据
train_images = []
train_labels = []
for dir in os.listdir(image_root):
    img_path = os.path.join(image_root, dir)
    for name in os.listdir(img_path):
        img = cv2.imread(os.path.join(img_path, name))
        img = cv2.resize(img, (30,30))  #shape:[30,30,3]
        train_images.append(img.reshape(1,-1)) #shape:[1,2700]
        train_labels.append(int(dir))
#list -> array
train_images = np.array([i[0] for i in train_images], "int") #shape:[N*2700]                                             
train_labels = np.array([i for i in train_labels], "int")    
#数据处理
train_images=train_images.astype('float32')/255 #转换成float32,并且归一化
train_labels=train_labels.astype(np.int32) #转换成int32类型

经过该部分处理,数据结构就符合svm输入规则了。

2.SVM模型搭建

#创建svm模型
svm = cv2.ml.SVM_create()
#设置类型为SVM_C_SVC代表分类
svm.setType(cv2.ml.SVM_C_SVC)
#设置核函数
svm.setKernel(cv2.ml.SVM_POLY)
#设置参数
#核函数相关参数
svm.setCoef0(0.0)
svm.setGamma(3)
svm.setDegree(3)
#模型型别参数
svm.setNu(0.5)
svm.setP(0.1)  # for EPSILON_SVR, epsilon in loss function?
svm.setC(0.01)  # From paper, soft classifier
#设置迭代终止条件
criteria = (cv2.TERM_CRITERIA_MAX_ITER + cv2.TERM_CRITERIA_EPS, num, 1e-3)
 #这里设置终止条件是迭代次数达到num,或者loss损失小于设置的1e-3
svm.setTermCriteria(criteria)
 #训练
svm.train(train,cv2.ml.ROW_SAMPLE,labels)
#保存模型
svm.save('svm.xml')
#预测
a, y_preds = svm.predict(test) #y_preds 即为预测结果

模型加载函数:svm = cv2.ml.SVM_load(“svm.xml”)