模式识别 - libsvm该函数的调用方法 详细说明
libsvm该函数的调用方法 详细说明
本文地址: http://blog.csdn.net/caroline_wendy/article/details/26261173
须要载入(load)SVM的模型, 然后将结点转换为SVM的格式, 即索引(index)+数据(value)的形式;
释放SVM的model有专用的函数: svm_free_and_destroy_model, 否则easy内存泄露;
能够预測数据的概率, 则须要模型是概率模型, 返回的是一个类别数组(2分类, 则为2个值的数组), 即各个标签的概率值;
注意: 标签即概率值较大的部分, 所以在训练时, 应注意正负样本的顺序,
正样本在前, 下标0, 为正样本的概率, 下标1, 为负样本的概率; 反之亦然.
代码:
- /*! @file
- ********************************************************************************
- <PRE>
- 模块名 : 分类器
- 文件名称 : SvmClassifier.cpp
- 相关文件 : SvmClassifier.h
- 文件实现功能 : SVM分类器类实现
- 作者 : C.L.Wang
- Email: morndragon@126.com
- 版本号 : 1.0
- --------------------------------------------------------------------------------
- 多线程安全性 : 是
- 异常时安全性 : 是
- --------------------------------------------------------------------------------
- 备注 : 无
- --------------------------------------------------------------------------------
- 改动记录 :
- 日 期 版本号 改动人 改动内容
- 2014/03/27 1.0 C.L.Wang Create
- </PRE>
- ********************************************************************************
- * 版权全部(c) C.L.Wang, 保留全部权利
- *******************************************************************************/
- #include "stdafx.h"
- #include "SvmClassifier.h"
- #include <opencv.hpp>
- using namespace std;
- using namespace cv;
- using namespace vd;
- const std::string SvmClassifier::NORM_NAME = "normalization.xml"; //归一化模型
- const std::string SvmClassifier::SVM_MODEL_NAME = "hvd.model"; //Svm模型
- bool SvmClassifier::m_mutex = true; //相互排斥锁
- /*! @function
- ********************************************************************************
- <PRE>
- 函数名 : SvmClassifier
- 功能 : 參数构造函数
- 參数 :
- const Mat& _videoFeature, 视频特征;
- const string& _modelPath, 模型路径;
- 返回值 : 无
- 抛出异常 : 无
- --------------------------------------------------------------------------------
- 复杂度 : 无
- 备注 : 无
- 典型使用方法 : SvmClassifier iSF(_videoFeature, _modelPath);
- --------------------------------------------------------------------------------
- 作者 : C.L.Wang
- </PRE>
- *******************************************************************************/
- SvmClassifier::SvmClassifier (
- const cv::Mat& _videoFeature, /*特征*/
- const std::string& _modelPath /*模型路径*/
- ) :
- Classifier(_videoFeature, _modelPath),
- m_model(nullptr),
- m_node(nullptr)
- {
- return;
- }
- /*! @function
- ********************************************************************************
- <PRE>
- 函数名 : ~SvmClassifier
- 功能 : 析构函数
- 參数 : void
- 返回值 : 无
- 抛出异常 : 无
- --------------------------------------------------------------------------------
- 复杂度 : 无
- 备注 : 无
- 典型使用方法 : iSC.~SvmClassifier();
- --------------------------------------------------------------------------------
- 作者 : C.L.Wang
- </PRE>
- *******************************************************************************/
- SvmClassifier::~SvmClassifier (void)
- {
- if (m_model != nullptr) {
- svm_free_and_destroy_model(&m_model);
- }
- if (m_node != nullptr) {
- delete[] m_node;
- m_node = nullptr;
- }
- return;
- }
- /*! @function
- ********************************************************************************
- <PRE>
- 函数名 : calculateResult
- 功能 : 计算分类结果
- 參数 : void
- 返回值 : const double, 分类结果
- 抛出异常 : 无
- --------------------------------------------------------------------------------
- 复杂度 : 无
- 备注 : 无
- 典型使用方法 : result = iSC.calculateResult();
- --------------------------------------------------------------------------------
- 作者 : C.L.Wang
- </PRE>
- *******************************************************************************/
- const double SvmClassifier::calculateResult (void)
- {
- double result(0.0);
- while(1) {
- if (m_mutex == true)
- {
- m_mutex = false;
- _initModel();
- result = _predictValue();
- if (m_model != nullptr) {
- svm_free_and_destroy_model(&m_model);
- }
- if (m_node != nullptr) {
- delete[] m_node;
- m_node = nullptr;
- }
- m_mutex = true;
- break;
- }
- }
- return result;
- }
- /*! @function
- ********************************************************************************
- <PRE>
- 函数名 : _predictValue
- 功能 : 预測值
- 參数 : void
- 返回值 : const double, 预測值;
- 抛出异常 : 无
- --------------------------------------------------------------------------------
- 复杂度 : 无
- 备注 : 无
- 典型使用方法 : result = _predictValue();
- --------------------------------------------------------------------------------
- 作者 : C.L.Wang
- </PRE>
- *******************************************************************************/
- const double SvmClassifier::_predictValue (void) const
- {
- double label (0.0);
- double prop (0.0);
- const int nr_class (2);
- double* prob_estimates = (double *) malloc(nr_class*sizeof(double));
- label = svm_predict_probability(m_model, m_node, prob_estimates);
- prop = prob_estimates[0]; //返回预測概率值
- delete[] prob_estimates;
- return prop;
- }
- /*! @function
- ********************************************************************************
- <PRE>
- 函数名 : _initModel
- 功能 : 初始化模型
- 參数 : void
- 返回值 : void
- 抛出异常 : 无
- --------------------------------------------------------------------------------
- 复杂度 : 无
- 备注 : 无
- 典型使用方法 : _initModel();
- --------------------------------------------------------------------------------
- 作者 : C.L.Wang
- </PRE>
- *******************************************************************************/
- void SvmClassifier::_initModel (void)
- {
- /*完整路径*/
- std::string modelName (m_modelPath); //模型名称
- std::string normName (m_modelPath); //归一化名称
- const std::string slash("/");
- modelName.append(slash);
- modelName.append(SVM_MODEL_NAME);
- normName.append(slash);
- normName.append(NORM_NAME);
- std::ifstream ifs;
- ifs.open(modelName, ios::in);
- if (ifs.fail()) {
- __printLog(std::cerr, "Failed to open the model file!");
- }
- ifs.close();
- ifs.open(normName, ios::in);
- if (ifs.fail()) {
- __printLog(std::cerr, "Failed to open the model file!");
- }
- ifs.close();
- if (m_model != nullptr) {
- svm_free_and_destroy_model(&m_model);
- }
- m_model = svm_load_model(modelName.c_str());
- __transSvmNode(normName);
- return;
- }
- /*! @function
- ********************************************************************************
- <PRE>
- 函数名 : __transSvmNode
- 功能 : 转换Svm结点
- 參数 : const string& normName, 归一化模型路径
- 返回值 : void
- 抛出异常 : 无
- --------------------------------------------------------------------------------
- 复杂度 : 无
- 备注 : 无
- 典型使用方法 : __transSvmNode(normName);
- --------------------------------------------------------------------------------
- 作者 : C.L.Wang
- </PRE>
- *******************************************************************************/
- void SvmClassifier::__transSvmNode (const std::string& _normName)
- {
- cv::FileStorage fs(_normName, FileStorage::READ);
- cv::Mat maxNorm;
- fs["normalization"] >> maxNorm;
- fs.release();
- /*归一化视频特征*/
- cv::Mat normFeature =
- cv::Mat::zeros(1, maxNorm.cols-2, CV_64FC1);
- for (int j=2; j<m_videoFeature.cols; ++j) {
- for(int i=0; i<m_videoFeature.rows; ++i) {
- normFeature.at<double>(0, j-2) += m_videoFeature.at<double>(i, j);
- }
- }
- for (int j=0; j<normFeature.cols; ++j)
- {
- normFeature.at<double>(0, j) /= m_videoFeature.rows;
- if (maxNorm.at<double>(0, j+2) > 0.0001)
- normFeature.at<double>(0, j) /= maxNorm.at<double>(0, j+2);
- }
- normFeature.at<double>(0,0) = 0.0;
- if (m_node != nullptr) {
- delete[] m_node;
- m_node = nullptr;
- }
- m_node = new svm_node[normFeature.cols];
- for (int j=1; j < normFeature.cols; ++j) {
- m_node[j-1].index = j;
- m_node[j-1].value = normFeature.at<double>(0, j);
- }
- m_node[normFeature.cols-1].index = -1;
- m_node[normFeature.cols-1].value = 0;
- return;
- }
版权声明:本文博主原创文章,博客,未经同意不得转载。
模式识别 - libsvm该函数的调用方法 详细说明的更多相关文章
- jquery ajax success 函数 异步调用方法中不能给全局变量赋值的原因及解决办法
jquery ajax success 函数 异步调用方法中不能给全局变量赋值的原因及解决办法 在调用一个jquery的ajax方法时我们有时会需要该方法返回一个值或者给某个全局变量赋值,可是我们 ...
- js中使用function定义类、实例化,函数的调用方法
function Test002(name, age){ name, age, this.printInfo = function(){ //定义的公有方法 console.log(name, age ...
- phpcms 的实用相关接口,函数,调用方法
常用函数 , 打开include/global.func.php,下面存放一些公共函数view plaincopy to clipboardprint? strip_tags() 调用内容过滤html ...
- Phpcms v9系统类库与函数库调用方法
在分享了n多phpcms的教程后,cmsyou继续分享关于phpcms v9系统类库与函数库的调用方法. 系统类库位于系统的 /libs/functions目录下面,函数库文件名为*.func.php ...
- sort函数简单调用方法
向量调用sort函数排序,一般有三个参数,即为sort(v.begin(),v.end(),cmp),第三个传入的是比较函数的地址(函数名),决定你比较的性质,运用灵活 #include<ios ...
- Pytorch中torch.autograd ---backward函数的使用方法详细解析,具体例子分析
backward函数 官方定义: torch.autograd.backward(tensors, grad_tensors=None, retain_graph=None, create_graph ...
- KingbaseES OUT 类型参数过程与函数的调用方法
对于含有 out 类型参数的过程或者函数,只能通过块方式调用,这是因为,ksql 还不支持类似 Oracle 那样通过 var 定义变量. 一.带OUT的procedure 调用 创建过程: crea ...
- php学习笔记:自定义函数的调用
PHP内置了超过1000个函数,因此函数使得PHP成为一门非常强大的语言.大多数时候我们使用系统的内置函数就可以满足需求,但是自定义函数通过将一组代码封装起来,使代码进行复用,程序结构与逻辑更加清晰. ...
- 关于js中函数的调用问题
js中函数的调用方法 1.直接调用 函数名(参数): 2.通过指向函数的变量去调用 例如: var myval = 函数名: 此刻 myval是指向函数的一个指针: myval(实际参数):此刻调用的 ...
随机推荐
- Oracle SQL Lesson (1) - 使用SQL Select语句获取数据
第一节课: 启动数据库并且使用特定用户连接:su - oracle; 启动sqlplus并且使用sys连接:conn / as sysdba; 启动数据库:startup; 解锁用户:alter us ...
- Javascript 优化
Javascript 优化 作者:@gzdaijie本文为作者原创,转载请注明出处:http://www.cnblogs.com/gzdaijie/p/5324489.html 目录 1.全局变量污染 ...
- iOS执行时与method swizzling
C语言是静态语言,它的工作方式是通过函数调用,这样在编译时我们就已经确定程序怎样执行的.而Objective-C是动态语言,它并不是通过调用类的方法来执行功能,而是给对象发送消息,对象在接收到消息之后 ...
- ASP.NET 应用程序生命周期
1.请求到达IIS服务器,IIS根据文件后缀找到对应的ISAPI(Internet Server API)扩展来处理,这个配置可在网站属性里的“根目录”选项卡中的“配置”里看到.可以看到,ashx.a ...
- HDU4144:Bacon's Cipher
Problem Description Bacon's cipher or the Baconian cipher is a method of steganography (a method of ...
- java序列化是什么和反序列化和hadoop序列化
1.什么是序列化和系列化DE- 神马是序列化它,序列化是内存中的对象状态信息,兑换字节序列以便于存储(持久化)和网络传输.(网络传输和硬盘持久化,你没有一定的手段来进行辨别这些字节序列是什么东西,有什 ...
- Android学习路径(十)如何将Action Bar堆放在布局
默认情况下,action bar出如今activity窗体的顶部,稍微降低了activity布局的总空间.假设你想隐藏或者显示action bar,在这堂用户体验的课程中,你能够通过调用hide() ...
- quick 2.23 它们的定义c++代码lua与总结的一些细节
它们的定义c++代码lua与总结的一些细节 参考:点击打开链接 1.自己定义 XXX.cpp .XXX.h 2.D:\quick\quick-cocos2d-x-2.2.3-rc\lib\cocos2 ...
- 利用Pattern和Mather来禁止特殊字符的输入
String regEx="[`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~!@#¥%……&*()——+|{}[]‘::”“’.,.?]&q ...
- sails 相关文章
Node 框架之sails http://cnodejs.org/topic/555c3c82e684c4c8088a0ca1