Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Greenplum
Opencv
提交
321070cc
O
Opencv
项目概览
Greenplum
/
Opencv
11 个月 前同步成功
通知
7
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
O
Opencv
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
321070cc
编写于
3月 21, 2013
作者:
V
Vadim Pisarevsky
提交者:
OpenCV Buildbot
3月 21, 2013
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #669 from vpisarev:fast_lin_svm
上级
ecdc7da6
24c614f6
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
92 addition
and
12 deletion
+92
-12
modules/ml/include/opencv2/ml/ml.hpp
modules/ml/include/opencv2/ml/ml.hpp
+2
-0
modules/ml/src/svm.cpp
modules/ml/src/svm.cpp
+55
-0
samples/cpp/letter_recog.cpp
samples/cpp/letter_recog.cpp
+35
-12
未找到文件。
modules/ml/include/opencv2/ml/ml.hpp
浏览文件 @
321070cc
...
...
@@ -534,6 +534,8 @@ protected:
virtual
void
write_params
(
CvFileStorage
*
fs
)
const
;
virtual
void
read_params
(
CvFileStorage
*
fs
,
CvFileNode
*
node
);
void
optimize_linear_svm
();
CvSVMParams
params
;
CvMat
*
class_labels
;
int
var_all
;
...
...
modules/ml/src/svm.cpp
浏览文件 @
321070cc
...
...
@@ -1517,6 +1517,7 @@ bool CvSVM::do_train( int svm_type, int sample_count, int var_count, const float
}
}
optimize_linear_svm
();
ok
=
true
;
__END__
;
...
...
@@ -1524,6 +1525,59 @@ bool CvSVM::do_train( int svm_type, int sample_count, int var_count, const float
return
ok
;
}
void
CvSVM
::
optimize_linear_svm
()
{
// we optimize only linear SVM: compress all the support vectors into one.
if
(
params
.
kernel_type
!=
LINEAR
)
return
;
int
class_count
=
class_labels
?
class_labels
->
cols
:
params
.
svm_type
==
CvSVM
::
ONE_CLASS
?
1
:
0
;
int
i
,
df_count
=
class_count
>
1
?
class_count
*
(
class_count
-
1
)
/
2
:
1
;
CvSVMDecisionFunc
*
df
=
decision_func
;
for
(
i
=
0
;
i
<
df_count
;
i
++
)
{
int
sv_count
=
df
[
i
].
sv_count
;
if
(
sv_count
!=
1
)
break
;
}
// if every decision functions uses a single support vector;
// it's already compressed. skip it then.
if
(
i
==
df_count
)
return
;
int
var_count
=
get_var_count
();
int
sample_size
=
(
int
)(
var_count
*
sizeof
(
sv
[
0
][
0
]));
float
**
new_sv
=
(
float
**
)
cvMemStorageAlloc
(
storage
,
df_count
*
sizeof
(
new_sv
[
0
]));
for
(
i
=
0
;
i
<
df_count
;
i
++
)
{
new_sv
[
i
]
=
(
float
*
)
cvMemStorageAlloc
(
storage
,
sample_size
);
float
*
dst
=
new_sv
[
i
];
memset
(
dst
,
0
,
sample_size
);
int
j
,
k
,
sv_count
=
df
[
i
].
sv_count
;
for
(
j
=
0
;
j
<
sv_count
;
j
++
)
{
const
float
*
src
=
class_count
>
1
?
sv
[
df
[
i
].
sv_index
[
j
]]
:
sv
[
j
];
double
a
=
df
[
i
].
alpha
[
j
];
for
(
k
=
0
;
k
<
var_count
;
k
++
)
dst
[
k
]
=
(
float
)(
dst
[
k
]
+
src
[
k
]
*
a
);
}
df
[
i
].
sv_count
=
1
;
df
[
i
].
alpha
[
0
]
=
1.
;
if
(
class_count
>
1
)
df
[
i
].
sv_index
[
0
]
=
i
;
}
sv
=
new_sv
;
sv_total
=
df_count
;
}
bool
CvSVM
::
train
(
const
CvMat
*
_train_data
,
const
CvMat
*
_responses
,
const
CvMat
*
_var_idx
,
const
CvMat
*
_sample_idx
,
CvSVMParams
_params
)
{
...
...
@@ -2516,6 +2570,7 @@ void CvSVM::read( CvFileStorage* fs, CvFileNode* svm_node )
CV_NEXT_SEQ_ELEM
(
df_node
->
data
.
seq
->
elem_size
,
reader
);
}
optimize_linear_svm
();
create_kernel
();
__END__
;
...
...
samples/cpp/letter_recog.cpp
浏览文件 @
321070cc
...
...
@@ -131,7 +131,7 @@ int build_rtrees_classifier( char* data_filename,
printf
(
"Could not read the classifier %s
\n
"
,
filename_to_load
);
return
-
1
;
}
printf
(
"The classifier %s is loaded.
\n
"
,
data_filename
);
printf
(
"The classifier %s is loaded.
\n
"
,
filename_to_load
);
}
else
{
...
...
@@ -262,7 +262,7 @@ int build_boost_classifier( char* data_filename,
printf
(
"Could not read the classifier %s
\n
"
,
filename_to_load
);
return
-
1
;
}
printf
(
"The classifier %s is loaded.
\n
"
,
data_filename
);
printf
(
"The classifier %s is loaded.
\n
"
,
filename_to_load
);
}
else
{
...
...
@@ -403,7 +403,7 @@ int build_mlp_classifier( char* data_filename,
printf
(
"Could not read the classifier %s
\n
"
,
filename_to_load
);
return
-
1
;
}
printf
(
"The classifier %s is loaded.
\n
"
,
data_filename
);
printf
(
"The classifier %s is loaded.
\n
"
,
filename_to_load
);
}
else
{
...
...
@@ -639,10 +639,11 @@ int build_nbayes_classifier( char* data_filename )
}
static
int
build_svm_classifier
(
char
*
data_filename
)
int
build_svm_classifier
(
char
*
data_filename
,
const
char
*
filename_to_save
,
const
char
*
filename_to_load
)
{
CvMat
*
data
=
0
;
CvMat
*
responses
=
0
;
CvMat
*
train_resp
=
0
;
CvMat
train_data
;
int
nsamples_all
=
0
,
ntrain_samples
=
0
;
int
var_count
;
...
...
@@ -666,13 +667,29 @@ int build_svm_classifier( char* data_filename )
ntrain_samples
=
(
int
)(
nsamples_all
*
0.1
);
var_count
=
data
->
cols
;
// train classifier
printf
(
"Training the classifier (may take a few minutes)...
\n
"
);
cvGetRows
(
data
,
&
train_data
,
0
,
ntrain_samples
);
CvMat
*
train_resp
=
cvCreateMat
(
ntrain_samples
,
1
,
CV_32FC1
);
for
(
int
i
=
0
;
i
<
ntrain_samples
;
i
++
)
train_resp
->
data
.
fl
[
i
]
=
responses
->
data
.
fl
[
i
];
svm
.
train
(
&
train_data
,
train_resp
,
0
,
0
,
param
);
// Create or load Random Trees classifier
if
(
filename_to_load
)
{
// load classifier from the specified file
svm
.
load
(
filename_to_load
);
ntrain_samples
=
0
;
if
(
svm
.
get_var_count
()
==
0
)
{
printf
(
"Could not read the classifier %s
\n
"
,
filename_to_load
);
return
-
1
;
}
printf
(
"The classifier %s is loaded.
\n
"
,
filename_to_load
);
}
else
{
// train classifier
printf
(
"Training the classifier (may take a few minutes)...
\n
"
);
cvGetRows
(
data
,
&
train_data
,
0
,
ntrain_samples
);
train_resp
=
cvCreateMat
(
ntrain_samples
,
1
,
CV_32FC1
);
for
(
int
i
=
0
;
i
<
ntrain_samples
;
i
++
)
train_resp
->
data
.
fl
[
i
]
=
responses
->
data
.
fl
[
i
];
svm
.
train
(
&
train_data
,
train_resp
,
0
,
0
,
param
);
}
// classification
std
::
vector
<
float
>
_sample
(
var_count
*
(
nsamples_all
-
ntrain_samples
));
...
...
@@ -691,7 +708,10 @@ int build_svm_classifier( char* data_filename )
CvMat
*
result
=
cvCreateMat
(
1
,
nsamples_all
-
ntrain_samples
,
CV_32FC1
);
printf
(
"Classification (may take a few minutes)...
\n
"
);
double
t
=
(
double
)
cvGetTickCount
();
svm
.
predict
(
&
sample
,
result
);
t
=
(
double
)
cvGetTickCount
()
-
t
;
printf
(
"Prediction type: %gms
\n
"
,
t
/
(
cvGetTickFrequency
()
*
1000.
));
int
true_resp
=
0
;
for
(
int
i
=
0
;
i
<
nsamples_all
-
ntrain_samples
;
i
++
)
...
...
@@ -702,6 +722,9 @@ int build_svm_classifier( char* data_filename )
printf
(
"true_resp = %f%%
\n
"
,
(
float
)
true_resp
/
(
nsamples_all
-
ntrain_samples
)
*
100
);
if
(
filename_to_save
)
svm
.
save
(
filename_to_save
);
cvReleaseMat
(
&
train_resp
);
cvReleaseMat
(
&
result
);
cvReleaseMat
(
&
data
);
...
...
@@ -772,7 +795,7 @@ int main( int argc, char *argv[] )
method
==
4
?
build_nbayes_classifier
(
data_filename
)
:
method
==
5
?
build_svm_classifier
(
data_filename
)
:
build_svm_classifier
(
data_filename
,
filename_to_save
,
filename_to_load
)
:
-
1
)
<
0
)
{
help
();
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录