OpenCV中的「SVM分类器」:基本原理、函数解析和示例代码_python opencv svm 图像分类

w=(w1​;w2​;…;wd​)为法向量,决定超平面的方向,b为位移项,决定超平面与原点之间的距离。

对于线性可分的样本空间,需要找到具有最大间隔(maximum margin)的划分超平面,即找到能使下式最大化的参数

w

\boldsymbol{w}

w和b2

min

w

,

b

1

2

w

2

\min_{w,b}{\frac{1}{2}||\boldsymbol{w}||^2}

w,bmin​21​∣∣w∣∣2s.t.

y

i

(

w

T

x

i

b

)

1

,

i

=

1

,

2

,

.

.

.

,

m

y_i(\boldsymbol{w}^T\boldsymbol{x_i}+b)≥1,i=1,2,…,m

yi​(wTxi​+b)≥1,i=1,2,…,m

对于线性不可分的样本空间,可以将样本从原始空间映射到另一个高维特征空间,从而使样本在这个特征空间内线性可分。由于特征空间的维数可能很高,难以计算,所以通过引入核函数,可以将高维特征空间中的内积(dot product)转化为低维特征空间中的通过核函数计算的结果。

常用核函数2
在这里插入图片描述

为了减少过拟合,引入软间隔(soft margin)概念,允许支持向量机在一些样本上出错:

y

i

(

w

T

x

i

b

)

1

y_i(\boldsymbol{w}^T\boldsymbol{x_i}+b)≥1

yi​(wTxi​+b)≥1

用参数C来约束分类出错的样本,松弛变量

ξ

i

ξ_i

ξi​表示训练样本距离对应的正确决策边界的距离,对于分类正确的样本距离即为03,所以实际累加的是出错样本的距离。

在这里插入图片描述

优化问题调整为:

m

i

n

w

,

b

0

w

2

C

i

ξ

i

min_{\boldsymbol{w},b_0}{||\boldsymbol{w}||^2+C\sum_i{ξ_i}}

minw,b0​​∣∣w∣∣2+Ci∑​ξi​

s.t.

y

i

(

w

T

x

i

b

0

)

1

ξ

i

,

ξ

i

0

i

y_i(\boldsymbol{w}^T\boldsymbol{x_i}+b_0)≥1-ξ_i,且ξ_i≥0 ∀i

yi​(wTxi​+b0​)≥1−ξi​,且ξi​≥0∀i

3. 函数解析

SVM类在opencv中的继承关系如图所示4

在这里插入图片描述
SVM继承自StatModel和Algorithm类。

在opencv中使用SVM的一般流程如下:

#mermaid-svg-rzGo5PBLAQjMOTen .label{font-family:‘trebuchet ms’, verdana, arial;font-family:var(–mermaid-font-family);fill:#333;color:#333}#mermaid-svg-rzGo5PBLAQjMOTen .label text{fill:#333}#mermaid-svg-rzGo5PBLAQjMOTen .node rect,#mermaid-svg-rzGo5PBLAQjMOTen .node circle,#mermaid-svg-rzGo5PBLAQjMOTen .node ellipse,#mermaid-svg-rzGo5PBLAQjMOTen .node polygon,#mermaid-svg-rzGo5PBLAQjMOTen .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-rzGo5PBLAQjMOTen .node .label{text-align:center;fill:#333}#mermaid-svg-rzGo5PBLAQjMOTen .node.clickable{cursor:pointer}#mermaid-svg-rzGo5PBLAQjMOTen .arrowheadPath{fill:#333}#mermaid-svg-rzGo5PBLAQjMOTen .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-rzGo5PBLAQjMOTen .flowchart-link{stroke:#333;fill:none}#mermaid-svg-rzGo5PBLAQjMOTen .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-rzGo5PBLAQjMOTen .edgeLabel rect{opacity:0.9}#mermaid-svg-rzGo5PBLAQjMOTen .edgeLabel span{color:#333}#mermaid-svg-rzGo5PBLAQjMOTen .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-rzGo5PBLAQjMOTen .cluster text{fill:#333}#mermaid-svg-rzGo5PBLAQjMOTen div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:‘trebuchet ms’, verdana, arial;font-family:var(–mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-rzGo5PBLAQjMOTen .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-rzGo5PBLAQjMOTen text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-rzGo5PBLAQjMOTen .actor-line{stroke:grey}#mermaid-svg-rzGo5PBLAQjMOTen .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-rzGo5PBLAQjMOTen .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-rzGo5PBLAQjMOTen #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-rzGo5PBLAQjMOTen .sequenceNumber{fill:#fff}#mermaid-svg-rzGo5PBLAQjMOTen #sequencenumber{fill:#333}#mermaid-svg-rzGo5PBLAQjMOTen #crosshead path{fill:#333;stroke:#333}#mermaid-svg-rzGo5PBLAQjMOTen .messageText{fill:#333;stroke:#333}#mermaid-svg-rzGo5PBLAQjMOTen .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-rzGo5PBLAQjMOTen .labelText,#mermaid-svg-rzGo5PBLAQjMOTen .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-rzGo5PBLAQjMOTen .loopText,#mermaid-svg-rzGo5PBLAQjMOTen .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-rzGo5PBLAQjMOTen .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-rzGo5PBLAQjMOTen .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-rzGo5PBLAQjMOTen .noteText,#mermaid-svg-rzGo5PBLAQjMOTen .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-rzGo5PBLAQjMOTen .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-rzGo5PBLAQjMOTen .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-rzGo5PBLAQjMOTen .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-rzGo5PBLAQjMOTen .mermaid-main-font{font-family:“trebuchet ms”, verdana, arial;font-family:var(–mermaid-font-family)}#mermaid-svg-rzGo5PBLAQjMOTen .section{stroke:none;opacity:0.2}#mermaid-svg-rzGo5PBLAQjMOTen .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-rzGo5PBLAQjMOTen .section2{fill:#fff400}#mermaid-svg-rzGo5PBLAQjMOTen .section1,#mermaid-svg-rzGo5PBLAQjMOTen .section3{fill:#fff;opacity:0.2}#mermaid-svg-rzGo5PBLAQjMOTen .sectionTitle0{fill:#333}#mermaid-svg-rzGo5PBLAQjMOTen .sectionTitle1{fill:#333}#mermaid-svg-rzGo5PBLAQjMOTen .sectionTitle2{fill:#333}#mermaid-svg-rzGo5PBLAQjMOTen .sectionTitle3{fill:#333}#mermaid-svg-rzGo5PBLAQjMOTen .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:‘trebuchet ms’, verdana, arial;font-family:var(–mermaid-font-family)}#mermaid-svg-rzGo5PBLAQjMOTen .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-rzGo5PBLAQjMOTen .grid .tick text{font-family:‘trebuchet ms’, verdana, arial;font-family:var(–mermaid-font-family)}#mermaid-svg-rzGo5PBLAQjMOTen .grid path{stroke-width:0}#mermaid-svg-rzGo5PBLAQjMOTen .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-rzGo5PBLAQjMOTen .task{stroke-width:2}#mermaid-svg-rzGo5PBLAQjMOTen .taskText{text-anchor:middle;font-family:‘trebuchet ms’, verdana, arial;font-family:var(–mermaid-font-family)}#mermaid-svg-rzGo5PBLAQjMOTen .taskText:not([font-size]){font-size:11px}#mermaid-svg-rzGo5PBLAQjMOTen .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:‘trebuchet ms’, verdana, arial;font-family:var(–mermaid-font-family)}#mermaid-svg-rzGo5PBLAQjMOTen .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-rzGo5PBLAQjMOTen .task.clickable{cursor:pointer}#mermaid-svg-rzGo5PBLAQjMOTen .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-rzGo5PBLAQjMOTen .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-rzGo5PBLAQjMOTen .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-rzGo5PBLAQjMOTen .taskText0,#mermaid-svg-rzGo5PBLAQjMOTen .taskText1,#mermaid-svg-rzGo5PBLAQjMOTen .taskText2,#mermaid-svg-rzGo5PBLAQjMOTen .taskText3{fill:#fff}#mermaid-svg-rzGo5PBLAQjMOTen .task0,#mermaid-svg-rzGo5PBLAQjMOTen .task1,#mermaid-svg-rzGo5PBLAQjMOTen .task2,#mermaid-svg-rzGo5PBLAQjMOTen .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-rzGo5PBLAQjMOTen .taskTextOutside0,#mermaid-svg-rzGo5PBLAQjMOTen .taskTextOutside2{fill:#000}#mermaid-svg-rzGo5PBLAQjMOTen .taskTextOutside1,#mermaid-svg-rzGo5PBLAQjMOTen .taskTextOutside3{fill:#000}#mermaid-svg-rzGo5PBLAQjMOTen .active0,#mermaid-svg-rzGo5PBLAQjMOTen .active1,#mermaid-svg-rzGo5PBLAQjMOTen .active2,#mermaid-svg-rzGo5PBLAQjMOTen .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-rzGo5PBLAQjMOTen .activeText0,#mermaid-svg-rzGo5PBLAQjMOTen .activeText1,#mermaid-svg-rzGo5PBLAQjMOTen .activeText2,#mermaid-svg-rzGo5PBLAQjMOTen .activeText3{fill:#000 !important}#mermaid-svg-rzGo5PBLAQjMOTen .done0,#mermaid-svg-rzGo5PBLAQjMOTen .done1,#mermaid-svg-rzGo5PBLAQjMOTen .done2,#mermaid-svg-rzGo5PBLAQjMOTen .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-rzGo5PBLAQjMOTen .doneText0,#mermaid-svg-rzGo5PBLAQjMOTen .doneText1,#mermaid-svg-rzGo5PBLAQjMOTen .doneText2,#mermaid-svg-rzGo5PBLAQjMOTen .doneText3{fill:#000 !important}#mermaid-svg-rzGo5PBLAQjMOTen .crit0,#mermaid-svg-rzGo5PBLAQjMOTen .crit1,#mermaid-svg-rzGo5PBLAQjMOTen .crit2,#mermaid-svg-rzGo5PBLAQjMOTen .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-rzGo5PBLAQjMOTen .activeCrit0,#mermaid-svg-rzGo5PBLAQjMOTen .activeCrit1,#mermaid-svg-rzGo5PBLAQjMOTen .activeCrit2,#mermaid-svg-rzGo5PBLAQjMOTen .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-rzGo5PBLAQjMOTen .doneCrit0,#mermaid-svg-rzGo5PBLAQjMOTen .doneCrit1,#mermaid-svg-rzGo5PBLAQjMOTen .doneCrit2,#mermaid-svg-rzGo5PBLAQjMOTen .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-rzGo5PBLAQjMOTen .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-rzGo5PBLAQjMOTen .milestoneText{font-style:italic}#mermaid-svg-rzGo5PBLAQjMOTen .doneCritText0,#mermaid-svg-rzGo5PBLAQjMOTen .doneCritText1,#mermaid-svg-rzGo5PBLAQjMOTen .doneCritText2,#mermaid-svg-rzGo5PBLAQjMOTen .doneCritText3{fill:#000 !important}#mermaid-svg-rzGo5PBLAQjMOTen .activeCritText0,#mermaid-svg-rzGo5PBLAQjMOTen .activeCritText1,#mermaid-svg-rzGo5PBLAQjMOTen .activeCritText2,#mermaid-svg-rzGo5PBLAQjMOTen .activeCritText3{fill:#000 !important}#mermaid-svg-rzGo5PBLAQjMOTen .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:‘trebuchet ms’, verdana, arial;font-family:var(–mermaid-font-family)}#mermaid-svg-rzGo5PBLAQjMOTen g.classGroup text{fill:#9370db;stroke:none;font-family:‘trebuchet ms’, verdana, arial;font-family:var(–mermaid-font-family);font-size:10px}#mermaid-svg-rzGo5PBLAQjMOTen g.classGroup text .title{font-weight:bolder}#mermaid-svg-rzGo5PBLAQjMOTen g.clickable{cursor:pointer}#mermaid-svg-rzGo5PBLAQjMOTen g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-rzGo5PBLAQjMOTen g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-rzGo5PBLAQjMOTen .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-rzGo5PBLAQjMOTen .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-rzGo5PBLAQjMOTen .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-rzGo5PBLAQjMOTen .dashed-line{stroke-dasharray:3}#mermaid-svg-rzGo5PBLAQjMOTen #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-rzGo5PBLAQjMOTen #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-rzGo5PBLAQjMOTen #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-rzGo5PBLAQjMOTen #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-rzGo5PBLAQjMOTen #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-rzGo5PBLAQjMOTen #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-rzGo5PBLAQjMOTen #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-rzGo5PBLAQjMOTen #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-rzGo5PBLAQjMOTen .commit-id,#mermaid-svg-rzGo5PBLAQjMOTen .commit-msg,#mermaid-svg-rzGo5PBLAQjMOTen .branch-label{fill:lightgrey;color:lightgrey;font-family:‘trebuchet ms’, verdana, arial;font-family:var(–mermaid-font-family)}#mermaid-svg-rzGo5PBLAQjMOTen .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:‘trebuchet ms’, verdana, arial;font-family:var(–mermaid-font-family)}#mermaid-svg-rzGo5PBLAQjMOTen .slice{font-family:‘trebuchet ms’, verdana, arial;font-family:var(–mermaid-font-family)}#mermaid-svg-rzGo5PBLAQjMOTen g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:‘trebuchet ms’, verdana, arial;font-family:var(–mermaid-font-family)}#mermaid-svg-rzGo5PBLAQjMOTen g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-rzGo5PBLAQjMOTen g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-rzGo5PBLAQjMOTen g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-rzGo5PBLAQjMOTen g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-rzGo5PBLAQjMOTen g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-rzGo5PBLAQjMOTen .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-rzGo5PBLAQjMOTen .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-rzGo5PBLAQjMOTen .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-rzGo5PBLAQjMOTen .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-rzGo5PBLAQjMOTen .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-rzGo5PBLAQjMOTen .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-rzGo5PBLAQjMOTen .edgeLabel text{fill:#333}#mermaid-svg-rzGo5PBLAQjMOTen .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:‘trebuchet ms’, verdana, arial;font-family:var(–mermaid-font-family)}#mermaid-svg-rzGo5PBLAQjMOTen .node circle.state-start{fill:black;stroke:black}#mermaid-svg-rzGo5PBLAQjMOTen .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-rzGo5PBLAQjMOTen #statediagram-barbEnd{fill:#9370db}#mermaid-svg-rzGo5PBLAQjMOTen .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-rzGo5PBLAQjMOTen .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-rzGo5PBLAQjMOTen .statediagram-state .divider{stroke:#9370db}#mermaid-svg-rzGo5PBLAQjMOTen .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-rzGo5PBLAQjMOTen .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-rzGo5PBLAQjMOTen .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-rzGo5PBLAQjMOTen .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-rzGo5PBLAQjMOTen .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-rzGo5PBLAQjMOTen .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-rzGo5PBLAQjMOTen .note-edge{stroke-dasharray:5}#mermaid-svg-rzGo5PBLAQjMOTen .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{–mermaid-font-family: ‘“trebuchet ms”, verdana, arial’;–mermaid-font-family: “Comic Sans MS”, “Comic Sans”, cursive}#mermaid-svg-rzGo5PBLAQjMOTen .error-icon{fill:#522}#mermaid-svg-rzGo5PBLAQjMOTen .error-text{fill:#522;stroke:#522}#mermaid-svg-rzGo5PBLAQjMOTen .edge-thickness-normal{stroke-width:2px}#mermaid-svg-rzGo5PBLAQjMOTen .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-rzGo5PBLAQjMOTen .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-rzGo5PBLAQjMOTen .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-rzGo5PBLAQjMOTen .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-rzGo5PBLAQjMOTen .marker{fill:#333}#mermaid-svg-rzGo5PBLAQjMOTen .marker.cross{stroke:#333}

:root { --mermaid-font-family: “trebuchet ms”, verdana, arial;}
#mermaid-svg-rzGo5PBLAQjMOTen {
color: rgba(0, 0, 0, 0.75);
font: ;
}

训练

推理

开始

创建SVM模型

加载SVM模型

配置参数

加载训练数据

模型训练

保存模型

输入数据进行预测

创建模型

C++:

static Ptr<SVM> cv::ml::SVM::create()

Python:

cv.ml.SVM_create() -> retval

设置模型类型

C++:

enum  Types {
  C_SVC =100,//C-支持向量分类。n级分类(n≥ 2) 允许使用异常值的惩罚乘数 C 不完全地分离类。
  NU_SVC =101,//ν-支持向量分类。n级分类,可能有不完美的分离。参数ν用于代替C,参数ν在0-1范围内,值越大,决策边界越平滑。
  ONE_CLASS =102,//分布估计,所有的训练数据都来自同一个类,SVM 构建了一个边界,将类与特征空间的其余部分分开。
  EPS_SVR =103,//ε-支持向量回归。来自训练集的特征向量和拟合超平面之间的距离必须小于p。对于异常值,使用惩罚乘数 C。
  NU_SVR =104 // ν-支持向量回归。 ν用于代替 p。
}
virtual void cv::ml::SVM::setType(int val)

Python:

cv.ml_SVM.setType(val) ->None

设置参数C

根据"2.基本原理"中对参数C的介绍,我们应该如何设置参数C?

  • C值较大时:误分类错误较少,但余量较小。这种情况下,侧重于寻找具有很少的误分类错误的超平面。
  • C值较小时:具有更大余量和更多分类错误。在这种情况下,更侧重于寻找具有大余量的超平面。

C++:

//设置参数C
virtual void cv::ml::SVM::setC(double val)

python:

cv.ml_SVM.setC(val) -> None

设置核函数

C++:

enum KernelTypes {
  CUSTOM =-1,//由SVM::getKernelType返回,默认是RBF
  LINEAR =0,//线性内核,速度最快
  POLY =1,//多项式核
  RBF =2,//径向基函数(RBF),大多数情况下是个不错的选择
  SIGMOID =3,//sigmoid核
  CHI2 =4,//Chi2核,类似于RBF核
  INTER =5//直方图交叉核,速度较快
}
virtual void cv::ml::SVM::setKernel(int kernelType)    

python:

cv.ml_SVM.setKernel(kernelType) -> None

设置迭代算法的终止标准

C++:

virtual void cv::ml::SVM::setTermCriteria(const cv::TermCriteria &val)    

// cv::TermCriteria
cv::TermCriteria::TermCriteria (int type,int maxCount,double epsilon)

// Type 
enum  cv::TermCriteria::Type {
  COUNT =1,
  MAX_ITER =COUNT,//最大迭代次数
  EPS =2 //迭代算法停止时所需的精度或参数变化
文末有福利领取哦~
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

👉**一、Python所有方向的学习路线**

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。![img](https://img-blog.csdnimg.cn/c67c0f87cf9343879a1278dfb067f802.png)

👉**二、Python必备开发工具**

![img](https://img-blog.csdnimg.cn/757ca3f717df4825b7d90a11cad93bc7.png)  
👉**三、Python视频合集**

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。  
![img](https://img-blog.csdnimg.cn/31066dd7f1d245159f21623d9efafa68.png)

👉 **四、实战案例**

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。**(文末领读者福利)**  
![img](https://img-blog.csdnimg.cn/e78afb3dcb8e4da3bae5b6ffb9c07ec7.png)

👉**五、Python练习题**

检查学习结果。  
![img](https://img-blog.csdnimg.cn/280da06969e54cf180f4904270636b8e.png)

👉**六、面试资料**

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。  
![img](https://img-blog.csdnimg.cn/a9d7c35e6919437a988883d84dcc5e58.png)

![img](https://img-blog.csdnimg.cn/5db8141418d544d3a8e9da4805b1a3f9.png)

👉因篇幅有限,仅展示部分资料,这份完整版的Python全套学习资料已经上传




**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化学习资料的朋友,可以戳这里无偿获取](https://bbs.csdn.net/topics/618317507)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
  • 7
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
这是opencv svm图像分类的整个工程代码,在VS2010下打开即可。整个工程文件以及我的所有训练的图片存放在这里,需要的可以下载,自己在找训练图片写代码花了很多时间,下载完后自行解压,训练图片和测试图片可以从这免费下载http://download.csdn.net/detail/always2015/8944959,project data文件夹直接放在D盘就行,里面存放训练的图片和待测试图片,以及训练过程生成的间文件,现在这个下载object_classfication_end则是工程文件,我用的是vs2010打开即可,下面工程里有几个要注意的地方: 1、在这个模块使用到了c++的boost库,但是在这里有一个版本的限制。这个模块的代码只能在boost版本1.46以上使用,这个版本以下的就不能用了,直接运行就会出错,这是最需要注意的。因为在1.46版本以上对比CsSVM这个类一些成员函数做了一些私有化的修改,所以在使用该类初始化对象时候需要注意。 2、我的模块所使用到的函数和产生的间结果都是在一个categorizer类声明的,由于不同的执行阶段间结果有很多个,例如:训练图片聚类后所得到单词表矩阵,svm分类的训练的结果等,间结果的产生是相当耗时的,所以在刚开始就考虑到第一次运行时候把他以文件XML的格式保存下来,下次使用到的时候在读取。将一个矩阵存入文本的时候可以直接用输出流的方式将一个矩阵存入,但是读取时候如果用输入流直接一个矩阵变量的形式读取,那就肯定报错,因为输入流不支持直接对矩阵的操作,所以这时候只能对矩阵的元素一个一个进行读取了。 3、在测试的时候,如果输入的图片太小,或者全为黑色,当经过特征提取和单词构造完成使用svm进行分类时候会出现错误。经过调试代码,发现上述图片在生成该图片的单词的时候所得到的单词矩阵会是一个空矩阵,即该矩阵的行列数都为0,所以在使用svm分类时候就出错。所以在使用每个输入图片的单词矩阵的时候先做一个判断,如果该矩阵行列数都为0,那么该图片直接跳过。
### 回答1: 在MATLAB,我们可以使用支持向量机(Support Vector Machine,SVM分类进行多分类任务。首先,我们需要导入训练数据和标签。训练数据是包含特征的矩阵,每一行代表一个样本,每一列代表一个特征。标签是一个向量,与训练数据的行一一对应,用于表示每个样本的分类。 接下来,我们可以使用fitcecoc函数来构建一个基于SVM的多分类模型。fitcecoc函数使用"一对一"的策略来处理多分类问题。它将原始问题转化为多个二分类问题,对每个类别之间进行分类。然后,它将每个二分类的结果进行组合,得到最终的多分类结果。 在fitcecoc函数,我们还可以指定不同的SVM内核函数,如线性核、多项式核和高斯核等。每个内核函数都具有不同的性质和适用范围。我们可以根据实际情况选择合适的内核函数。 训练完成后,我们可以使用predict函数对新的样本进行预测。predict函数将返回每个样本属于各个类别的概率值。我们可以选择概率最大的类别作为最终的分类结果。 此外,对于多分类问题,我们还可以使用交叉验证来评估模型的性能。通过将数据划分为训练集和验证集,我们可以使用fitcecoc函数进行交叉验证,并使用loss函数计算分类错误率。 总而言之,MATLAB提供了丰富的工具和函数来构建和评估多分类SVM分类。我们可以根据具体任务和数据特点选择合适的参数和方法,来实现准确、高效的多分类任务。 ### 回答2: 在MATLABSVM(支持向量机)分类可以用于多类别分类问题。为了使用SVM进行多类别分类,有两种常用的方法:一对一(One-vs-One)和一对其余(One-vs-All)。 一对一方法将每个类别之间进行两两组合,并构建一个二分类来区分它们。对于一个有N个类别的问题,需要构建N*(N-1)/2个二分类。在进行预测时,将输入样本传递给所有二分类,每个分类输出一个概率或得分,然后选取得分最高的类别作为最终预测结果。 一对其余方法将每个类别与其他所有类别进行组合,并构建一个二分类。对于一个有N个类别的问题,需要构建N个二分类。在进行预测时,将输入样本传递给所有二分类,每个分类输出一个概率或得分,然后选取得分最高的类别作为最终预测结果。 MATLAB,可以使用fitcecoc函数来实现多类别SVM分类。该函数采用一对一方法,并自动执行模型训练和预测的过程。其,输入参数包括训练集、类别标签、SVM模型类型(例如线性SVM或高斯核函数SVM)和其他可选参数。 通过fitcecoc函数训练得到的分类可以用于对新样本进行分类预测。可以使用predict函数来进行预测,并返回预测结果的类别标签。 总之,MATLABSVM分类支持多类别分类问题,可以使用一对一或一对其余的方法来构建多分类。可以使用fitcecoc函数进行模型训练和predict函数进行预测。 ### 回答3: 在MATLAB,可以使用svmtrain函数来构建支持向量机(SVM分类,实现多分类任务。svmtrain函数基于一对一(one-vs-one)的策略,将多分类问题转化为多个二分类问题。 具体而言,svmtrain函数可以接受多个训练样本集和对应的标签,每个样本集和标签对应一个二分类问题。对于K类别的多分类问题,可以使用K倒数(K-1)/2个训练样本集和标签来构建svmtrain函数svmtrain函数将训练多个二分类SVM模型,其每个模型由一个训练样本集和标签对应。 训练完成后,可以使用svmclassify函数对新的数据进行分类svmclassify函数会将新数据输入到每个二分类SVM模型,然后通过投票或其他统计方法将最终分类结果确定为K类别的某一个。 需要注意的是,MATLABsvmtrain和svmclassify函数仅适用于两类和多类别的线性可分问题。如果数据集不是线性可分的,可以使用SVM的核函数(如高斯核函数)来处理非线性问题。 总之,在MATLAB,可以使用svmtrain函数构建基于一对一策略的SVM分类,实现多分类任务。在训练完成后,可以使用svmclassify函数对新的数据进行分类
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值