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, 为负样本的概率; 反之亦然.

代码:

  1. /*! @file
  2. ********************************************************************************
  3. <PRE>
  4. 模块名 : 分类器
  5. 文件名称 : SvmClassifier.cpp
  6. 相关文件 : SvmClassifier.h
  7. 文件实现功能 : SVM分类器类实现
  8. 作者 : C.L.Wang
  9. Email: morndragon@126.com
  10. 版本号 : 1.0
  11. --------------------------------------------------------------------------------
  12. 多线程安全性 : 是
  13. 异常时安全性 : 是
  14. --------------------------------------------------------------------------------
  15. 备注 : 无
  16. --------------------------------------------------------------------------------
  17. 改动记录 :
  18. 日 期 版本号 改动人 改动内容
  19. 2014/03/27 1.0 C.L.Wang Create
  20. </PRE>
  21. ********************************************************************************
  22.  
  23. * 版权全部(c) C.L.Wang, 保留全部权利
  24.  
  25. *******************************************************************************/
  26.  
  27. #include "stdafx.h"
  28.  
  29. #include "SvmClassifier.h"
  30.  
  31. #include <opencv.hpp>
  32.  
  33. using namespace std;
  34. using namespace cv;
  35. using namespace vd;
  36.  
  37. const std::string SvmClassifier::NORM_NAME = "normalization.xml"; //归一化模型
  38. const std::string SvmClassifier::SVM_MODEL_NAME = "hvd.model"; //Svm模型
  39. bool SvmClassifier::m_mutex = true; //相互排斥锁
  40.  
  41. /*! @function
  42. ********************************************************************************
  43. <PRE>
  44. 函数名 : SvmClassifier
  45. 功能 : 參数构造函数
  46. 參数 :
  47. const Mat& _videoFeature, 视频特征;
  48. const string& _modelPath, 模型路径;
  49. 返回值 : 无
  50. 抛出异常 : 无
  51. --------------------------------------------------------------------------------
  52. 复杂度 : 无
  53. 备注 : 无
  54. 典型使用方法 : SvmClassifier iSF(_videoFeature, _modelPath);
  55. --------------------------------------------------------------------------------
  56. 作者 : C.L.Wang
  57. </PRE>
  58. *******************************************************************************/
  59. SvmClassifier::SvmClassifier (
  60. const cv::Mat& _videoFeature, /*特征*/
  61. const std::string& _modelPath /*模型路径*/
  62. ) :
  63. Classifier(_videoFeature, _modelPath),
  64. m_model(nullptr),
  65. m_node(nullptr)
  66. {
  67. return;
  68. }
  69.  
  70. /*! @function
  71. ********************************************************************************
  72. <PRE>
  73. 函数名 : ~SvmClassifier
  74. 功能 : 析构函数
  75. 參数 : void
  76. 返回值 : 无
  77. 抛出异常 : 无
  78. --------------------------------------------------------------------------------
  79. 复杂度 : 无
  80. 备注 : 无
  81. 典型使用方法 : iSC.~SvmClassifier();
  82. --------------------------------------------------------------------------------
  83. 作者 : C.L.Wang
  84. </PRE>
  85. *******************************************************************************/
  86. SvmClassifier::~SvmClassifier (void)
  87. {
  88. if (m_model != nullptr) {
  89. svm_free_and_destroy_model(&m_model);
  90. }
  91.  
  92. if (m_node != nullptr) {
  93. delete[] m_node;
  94. m_node = nullptr;
  95. }
  96.  
  97. return;
  98. }
  99.  
  100. /*! @function
  101. ********************************************************************************
  102. <PRE>
  103. 函数名 : calculateResult
  104. 功能 : 计算分类结果
  105. 參数 : void
  106. 返回值 : const double, 分类结果
  107. 抛出异常 : 无
  108. --------------------------------------------------------------------------------
  109. 复杂度 : 无
  110. 备注 : 无
  111. 典型使用方法 : result = iSC.calculateResult();
  112. --------------------------------------------------------------------------------
  113. 作者 : C.L.Wang
  114. </PRE>
  115. *******************************************************************************/
  116. const double SvmClassifier::calculateResult (void)
  117. {
  118. double result(0.0);
  119.  
  120. while(1) {
  121. if (m_mutex == true)
  122. {
  123. m_mutex = false;
  124. _initModel();
  125.  
  126. result = _predictValue();
  127.  
  128. if (m_model != nullptr) {
  129. svm_free_and_destroy_model(&m_model);
  130. }
  131.  
  132. if (m_node != nullptr) {
  133. delete[] m_node;
  134. m_node = nullptr;
  135. }
  136. m_mutex = true;
  137. break;
  138. }
  139. }
  140.  
  141. return result;
  142. }
  143.  
  144. /*! @function
  145. ********************************************************************************
  146. <PRE>
  147. 函数名 : _predictValue
  148. 功能 : 预測值
  149. 參数 : void
  150. 返回值 : const double, 预測值;
  151. 抛出异常 : 无
  152. --------------------------------------------------------------------------------
  153. 复杂度 : 无
  154. 备注 : 无
  155. 典型使用方法 : result = _predictValue();
  156. --------------------------------------------------------------------------------
  157. 作者 : C.L.Wang
  158. </PRE>
  159. *******************************************************************************/
  160. const double SvmClassifier::_predictValue (void) const
  161. {
  162. double label (0.0);
  163. double prop (0.0);
  164. const int nr_class (2);
  165. double* prob_estimates = (double *) malloc(nr_class*sizeof(double));
  166.  
  167. label = svm_predict_probability(m_model, m_node, prob_estimates);
  168. prop = prob_estimates[0]; //返回预測概率值
  169.  
  170. delete[] prob_estimates;
  171.  
  172. return prop;
  173. }
  174.  
  175. /*! @function
  176. ********************************************************************************
  177. <PRE>
  178. 函数名 : _initModel
  179. 功能 : 初始化模型
  180. 參数 : void
  181. 返回值 : void
  182. 抛出异常 : 无
  183. --------------------------------------------------------------------------------
  184. 复杂度 : 无
  185. 备注 : 无
  186. 典型使用方法 : _initModel();
  187. --------------------------------------------------------------------------------
  188. 作者 : C.L.Wang
  189. </PRE>
  190. *******************************************************************************/
  191. void SvmClassifier::_initModel (void)
  192. {
  193. /*完整路径*/
  194.  
  195. std::string modelName (m_modelPath); //模型名称
  196. std::string normName (m_modelPath); //归一化名称
  197.  
  198. const std::string slash("/");
  199.  
  200. modelName.append(slash);
  201. modelName.append(SVM_MODEL_NAME);
  202.  
  203. normName.append(slash);
  204. normName.append(NORM_NAME);
  205.  
  206. std::ifstream ifs;
  207. ifs.open(modelName, ios::in);
  208. if (ifs.fail()) {
  209. __printLog(std::cerr, "Failed to open the model file!");
  210. }
  211. ifs.close();
  212.  
  213. ifs.open(normName, ios::in);
  214. if (ifs.fail()) {
  215. __printLog(std::cerr, "Failed to open the model file!");
  216. }
  217. ifs.close();
  218.  
  219. if (m_model != nullptr) {
  220. svm_free_and_destroy_model(&m_model);
  221. }
  222. m_model = svm_load_model(modelName.c_str());
  223.  
  224. __transSvmNode(normName);
  225.  
  226. return;
  227. }
  228.  
  229. /*! @function
  230. ********************************************************************************
  231. <PRE>
  232. 函数名 : __transSvmNode
  233. 功能 : 转换Svm结点
  234. 參数 : const string& normName, 归一化模型路径
  235. 返回值 : void
  236. 抛出异常 : 无
  237. --------------------------------------------------------------------------------
  238. 复杂度 : 无
  239. 备注 : 无
  240. 典型使用方法 : __transSvmNode(normName);
  241. --------------------------------------------------------------------------------
  242. 作者 : C.L.Wang
  243. </PRE>
  244. *******************************************************************************/
  245. void SvmClassifier::__transSvmNode (const std::string& _normName)
  246. {
  247. cv::FileStorage fs(_normName, FileStorage::READ);
  248. cv::Mat maxNorm;
  249. fs["normalization"] >> maxNorm;
  250. fs.release();
  251.  
  252. /*归一化视频特征*/
  253.  
  254. cv::Mat normFeature =
  255. cv::Mat::zeros(1, maxNorm.cols-2, CV_64FC1);
  256.  
  257. for (int j=2; j<m_videoFeature.cols; ++j) {
  258. for(int i=0; i<m_videoFeature.rows; ++i) {
  259. normFeature.at<double>(0, j-2) += m_videoFeature.at<double>(i, j);
  260. }
  261. }
  262.  
  263. for (int j=0; j<normFeature.cols; ++j)
  264. {
  265. normFeature.at<double>(0, j) /= m_videoFeature.rows;
  266. if (maxNorm.at<double>(0, j+2) > 0.0001)
  267. normFeature.at<double>(0, j) /= maxNorm.at<double>(0, j+2);
  268. }
  269. normFeature.at<double>(0,0) = 0.0;
  270.  
  271. if (m_node != nullptr) {
  272. delete[] m_node;
  273. m_node = nullptr;
  274. }
  275.  
  276. m_node = new svm_node[normFeature.cols];
  277. for (int j=1; j < normFeature.cols; ++j) {
  278. m_node[j-1].index = j;
  279. m_node[j-1].value = normFeature.at<double>(0, j);
  280. }
  281.  
  282. m_node[normFeature.cols-1].index = -1;
  283. m_node[normFeature.cols-1].value = 0;
  284.  
  285. return;
  286. }

版权声明:本文博主原创文章,博客,未经同意不得转载。

模式识别 - libsvm该函数的调用方法 详细说明的更多相关文章

  1. jquery ajax success 函数 异步调用方法中不能给全局变量赋值的原因及解决办法

    jquery ajax success 函数 异步调用方法中不能给全局变量赋值的原因及解决办法   在调用一个jquery的ajax方法时我们有时会需要该方法返回一个值或者给某个全局变量赋值,可是我们 ...

  2. js中使用function定义类、实例化,函数的调用方法

    function Test002(name, age){ name, age, this.printInfo = function(){ //定义的公有方法 console.log(name, age ...

  3. phpcms 的实用相关接口,函数,调用方法

    常用函数 , 打开include/global.func.php,下面存放一些公共函数view plaincopy to clipboardprint? strip_tags() 调用内容过滤html ...

  4. Phpcms v9系统类库与函数库调用方法

    在分享了n多phpcms的教程后,cmsyou继续分享关于phpcms v9系统类库与函数库的调用方法. 系统类库位于系统的 /libs/functions目录下面,函数库文件名为*.func.php ...

  5. sort函数简单调用方法

    向量调用sort函数排序,一般有三个参数,即为sort(v.begin(),v.end(),cmp),第三个传入的是比较函数的地址(函数名),决定你比较的性质,运用灵活 #include<ios ...

  6. Pytorch中torch.autograd ---backward函数的使用方法详细解析,具体例子分析

    backward函数 官方定义: torch.autograd.backward(tensors, grad_tensors=None, retain_graph=None, create_graph ...

  7. KingbaseES OUT 类型参数过程与函数的调用方法

    对于含有 out 类型参数的过程或者函数,只能通过块方式调用,这是因为,ksql 还不支持类似 Oracle 那样通过 var 定义变量. 一.带OUT的procedure 调用 创建过程: crea ...

  8. php学习笔记:自定义函数的调用

    PHP内置了超过1000个函数,因此函数使得PHP成为一门非常强大的语言.大多数时候我们使用系统的内置函数就可以满足需求,但是自定义函数通过将一组代码封装起来,使代码进行复用,程序结构与逻辑更加清晰. ...

  9. 关于js中函数的调用问题

    js中函数的调用方法 1.直接调用 函数名(参数): 2.通过指向函数的变量去调用 例如: var myval = 函数名: 此刻 myval是指向函数的一个指针: myval(实际参数):此刻调用的 ...

随机推荐

  1. Oracle SQL Lesson (1) - 使用SQL Select语句获取数据

    第一节课: 启动数据库并且使用特定用户连接:su - oracle; 启动sqlplus并且使用sys连接:conn / as sysdba; 启动数据库:startup; 解锁用户:alter us ...

  2. Javascript 优化

    Javascript 优化 作者:@gzdaijie本文为作者原创,转载请注明出处:http://www.cnblogs.com/gzdaijie/p/5324489.html 目录 1.全局变量污染 ...

  3. iOS执行时与method swizzling

    C语言是静态语言,它的工作方式是通过函数调用,这样在编译时我们就已经确定程序怎样执行的.而Objective-C是动态语言,它并不是通过调用类的方法来执行功能,而是给对象发送消息,对象在接收到消息之后 ...

  4. ASP.NET 应用程序生命周期

    1.请求到达IIS服务器,IIS根据文件后缀找到对应的ISAPI(Internet Server API)扩展来处理,这个配置可在网站属性里的“根目录”选项卡中的“配置”里看到.可以看到,ashx.a ...

  5. HDU4144:Bacon's Cipher

    Problem Description Bacon's cipher or the Baconian cipher is a method of steganography (a method of ...

  6. java序列化是什么和反序列化和hadoop序列化

    1.什么是序列化和系列化DE- 神马是序列化它,序列化是内存中的对象状态信息,兑换字节序列以便于存储(持久化)和网络传输.(网络传输和硬盘持久化,你没有一定的手段来进行辨别这些字节序列是什么东西,有什 ...

  7. Android学习路径(十)如何将Action Bar堆放在布局

    默认情况下,action bar出如今activity窗体的顶部,稍微降低了activity布局的总空间.假设你想隐藏或者显示action bar,在这堂用户体验的课程中,你能够通过调用hide()  ...

  8. quick 2.23 它们的定义c++代码lua与总结的一些细节

    它们的定义c++代码lua与总结的一些细节 参考:点击打开链接 1.自己定义 XXX.cpp .XXX.h 2.D:\quick\quick-cocos2d-x-2.2.3-rc\lib\cocos2 ...

  9. 利用Pattern和Mather来禁止特殊字符的输入

    String regEx="[`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~!@#¥%……&*()——+|{}[]‘::”“’.,.?]&q ...

  10. sails 相关文章

    Node 框架之sails   http://cnodejs.org/topic/555c3c82e684c4c8088a0ca1