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. MATLAB安装libsvm工具箱的方法

    支持向量机(support vector machine,SVM)是机器学习中一种流行的学习算法,在分类与回归分析中发挥着重要作用.基于SVM算法开发的工具箱有很多种,下面我们要安装的是十分受欢迎的l ...

  2. 第44篇-为native方法设置解释执行入口

    对于Java中的native方法来说,实际上调用的是C/C++实现的本地函数,由于可能会在Java解释执行过程中调用native方法,或在本地函数的实现过程中调用Java方法,所以当两者相互调用时,必 ...

  3. 第48篇-native方法调用解释执行的Java方法

    举一个native方法调用解释执行的Java方法的实例,如下: public class TestJNI { static { System.load("/media/mazhi/sourc ...

  4. Js apply 方法 具体解释

    Js apply方法具体解释 我在一開始看到javascript的函数apply和call时,很的模糊,看也看不懂,近期在网上看到一些文章对apply方法和call的一些演示样例,总算是看的有点眉目了 ...

  5. Format类及其子类功能和使用方法具体解释

    Format类及其子类功能和使用方法具体解释 1.   Format类结构: ·        java.lang.Object ·        java.text.Format ·         ...

  6. hbase-0.94安装方法具体解释

    先决条件:     1)java环境,须要安装java1.6以上版本号     2)hadoop环境.因为HBase架构是基于其它文件存储系统的,因此在分布式模式下安装Hadoop是必须的,可是,假设 ...

  7. ZooKeeper安装方法具体解释

    ZooKeeper安装方式分为两种,一种为单机模式.一个为集群模式,集群模式须要事先正确配置hadoop集群,安装方法參考hadoop-1.2.1安装方法具体解释 单机模式安装: 1.上传并解压zoo ...

  8. 函数调用方法之__cdecl与_stdcall

    在debug VS c工程文件时,碰到cannot convert from 'int (__cdecl *)(char *)' to 'xxx'这个问题,发现问题在于typedef函数指针类型时,将 ...

  9. JS高级. 06 缓存、分析解决递归斐波那契数列、jQuery缓存、沙箱、函数的四种调用方式、call和apply修改函数调用方法

    缓存 cache 作用就是将一些常用的数据存储起来 提升性能 cdn //-----------------分析解决递归斐波那契数列<script> //定义一个缓存数组,存储已经计算出来 ...

随机推荐

  1. HDU 4606 Occupy Cities (计算几何+最短路+二分+最小路径覆盖)

    Occupy Cities Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  2. 扩展gridview轻松实现冻结行和列

    在实际的项目中,由于项目的需要,数据量比较大,同时显示栏位也比较多,要做gridview里显示完整,并做到用户体验比较好,这就需要冻结表头和关键列.由于用到的地方比较多,我们可以护展一个gridvie ...

  3. 现在就可以使用的5个 ES6 特性

    小编推荐:掘金是一个高质量的技术社区,从 ECMAScript 6 到 Vue.js,性能优化到开源类库,让你不错过前端开发的每一个技术干货.各大应用市场搜索「掘金」即可下载APP,技术干货尽在掌握. ...

  4. getopt使用

    参考: http://www.gnu.org/software/libc/manual/html_node/Example-of-Getopt.html http://en.wikipedia.org ...

  5. Bootstrap响应式折叠导航

    浏览器宽度缩小到一定值时,导航显示为 <nav class="navbar navbar-inverse navbar-fixed-top" role="navig ...

  6. 构建高性能web站点-1

    以下为阅读<构建高性能web站点>郭欣 著 这本书的适合读者: 1.编写web程序.关心站点性能,并且希望自己做的更加出色的开发人员 2.关心性能和可用性的web架构师 3.希望构建高性能 ...

  7. REOBJECT structure

    REOBJECT structure   包含丰富编辑控件中的OLE或图像对象的信息. Syntax 语法 typedef struct _reobject { DWORD cbStruct; LON ...

  8. Mac机装Win7后 启动只见鼠标怎么办

    我有一台Mac机,用Bootcamp的方式装了Win7,昨天一按开机键发现只有鼠标没有别的. 当时按热启动无效,把笔记本盖子合上一会再开也无效,按关机键关掉再开也无效(这时是短按). 当时想是不是Ma ...

  9. 网络编程——The C10K Problem(C10K = connection 10 kilo 问题)。k 表示 kilo,即 1000

    The C10K problem翻译 (C10K = connection 10 kilo 问题).k 表示 kilo,即 1000 比如:kilometer(千米), kilogram(千克). 如 ...

  10. Django——如何在Django模板中注入全局变量?——part1

    问题:TEMPLATE_CONTEXT_PROCESSORS代表着什么? 问题描述:无法在项目的settings.py文件中找到TEMPLATE_CONTEXT_PROCESSORS. ——————— ...