vnsc5858威尼斯城官网 > vnsc5858威尼斯城官网 > LibSVM之C# Wrapper

原标题:LibSVM之C# Wrapper

浏览次数:105 时间:2019-10-09

【百度完善】

LibSVM之C# Wrapper,

【百度宏观】

  LIBSVM是台大林智仁(Lin Chih-Jen)助教等开垦设计的八个简约、易于使用和飞跃有效的SVM情势识别与回归的软件包,他不但提供了编写翻译好的可在Windows连串系统的试行文书,还提供了源代码,方便革新、修改以致在其余操作系统上应用;该软件对SVM所涉及的参数调解相对相当少,提供了广大的默许参数,利用这一个默许参数能够减轻许多主题材料;并提供了相互核算(CrossValidation)的功用。该软件能够化解C-SVM、ν-SVM、ε-SVGL450和ν-SVKoleos等主题材料,包罗基于一对一算法的多类方式识别难点……

  假若你对libsvm还相当不足领会,提议先浏览下百度百科等对libsvm的牵线~

【C# Wrapper 动机】

  加入过三个品类,使用IDE是VS winform,工具包为EmguCV 2.4.10。我们通晓OpenCV第22中学的svm部分是依据libsvm-2.6编辑的,该版本的libsvm已经可以estimate预测可能率了(libsvm首页的change log中有详实表明),可是OpenCV却放弃了predictProbability。在具体的品种中,倘若得以拿走预测可能率新闻,那将对增长识别性有极大的帮扶。不过,opencv2遗弃了辨认可能率,富含opencv3,小编看源代码的svm部分也是基于libsvm-2.6改造的,也不曾引入predictProbability。

  因此,在EmguCV的ML知足不断的意况下,萌生了八个主见:

    一是修改OpenCV代码,然后再度CMake得到cvextern.dll;

    二是平素找其余的svm库。

  首先尝试CMake。像OpenCV那样的大项目,CMake起来确实不便于,更而且是从零发端学CMake。在岁月不允许的规格下,只得走第二条路。找到libsvmSharp后,小编如获宝物。然而,极快笔者又重新失望了,因为实时性供给知足不断(EmguCV自带SVM能够在5ms内到位辨认预测,而libsvmSharp要求500ms)。

  那是干什么?

  同样是C#对C++的wrapper,同样都以基于libsvm,一样是对C++所编译的dll的引用,效用竟相差百倍!本着一颗学习的心,笔者调控一探究竟……

【现有libsvm的C#/.Net版本】

  目前,LIBSVM拥有C、Java、Matlab、C#、Ruby、Python、宝马7系、Perl、Common LISP、Labview等数十种语言版本。最常使用的是C、Matlab、Java和命令行(c语言编写翻译的工具)的版本。

  首先大家看张libsvm官方网站首页上的截图:

vnsc5858威尼斯城官网 1

  上面,大家看看现在libsvm有怎么着C#版本:

  1、SVM.NET by Matthewa Johnson

  二零一零年,南洋理工大学的马特hewa Johnson大学生将SVM.NET更新到了V2.89,约等于未来的流行版本。万般无奈以往不FQ竟已经找不到SVM.NET的原生版了。这份神秘感使本身以为,这些C#本子的libsvm应该是材料最高的。

  后人有在V2.89的基础上做一些改变,提议了:SVM.NET with Parallel Optimization。相关描述为:When finding parameters, C and Gamma, in Grid-search algorithm using ParameterSelection.PGrid instead of the original ParameterSelection.Grid will increase the calculation speed.

  2、NSVM by Joannes

    3年岁月,却只有2下载量,何其惨淡……好啊,也许你也像本身同一主观臆断了。

3、KMLib(Kernel Machine Library with GPU SVM solver in .Net) by Krzysztof Sopyła

  Key Features

    • .Net implementation
    • Parallel kernel implementation
    • SVM CUDA acceleration – kernels and solver
    • CUDA SVM with sparse data formats: CSR, Ellpack-R, Sliced-Ellpack
    • For non commercial and academic use: Free MIT license when use please cite: Bibtex CUDA SVM CSR

  其他,还应该有有个别亟需重申的是,它是基于libsvm的java版本转换过来的。也正因如此,笔者备感用起来或许会有个别麻烦,故并未有接纳。

4、libsvmSharp by ccerhan

  选取它的说辞很简单,有早晚的下载量(从众情感又开始惹祸了!)下载方便,用VS的Nuget package,通过命令“PM> Install-Package LibSVMsharp”即下载到本地。

5、libsvm-net by Nicolas Panel

  下载起来一样充足有益于: NuGet package : PM> Install-Package libsvm.net,比起libsvmSharp有更加高的人气。

【分析libsvmSharp】

  为啥libsvm夏普.dll如此低效?

  在反编写翻译后的源代码中(稍后将介绍怎样反编译C#编写翻译出来的dll文件),我们得以见见libsvmSharp所用的数据结构有:

    1、struct:svm_node、svm_model、svm_problem、svm_parameter;

    2、calss:SVMNode、SVMModel、SVMProblem、SVMParameter。

骨子里,结构体能做的事务,类完全也能做,就像是结构体未有存在的要求。

  並且,能够看见各个的达成中,有那些“结构体=>类”、“指针=>结构体”、“类=>指针”等那样的类型调换。大家掌握,C#要引用C++所编写翻译的dll,用得最多的就是IntPtr那个数据结构。而libsvmSharp低效的来头,也正在于对指针的处理政策选择不当,它只在急需传指针的时候,硬生生地用马尔斯hal类重新在内部存款和储蓄器中开采当前数据结构大小的区域,并回到指针,美其名曰convert到指针。这种措施,无论是在时光上依旧空中上,都有太多没须要的疏落。

  这里大家用libsvm中的svm_predict作为例子来说学。

  在libsvm.dll(该dll由C++编写翻译得到)中,函数为:

 double svm_predict(const svm_model *model, const svm_node *x)

  在libsvmSharp.dll(该dll由C#编写翻译获得)中,我们这么注解它:

 [DllImport("libsvm.dll", CallingConvention = CallingConvention.Cdecl)]
 public static extern double svm_predict(IntPtr model, IntPtr x);

  DllImport时,越来越多关于C++数据结构到C#数据结构的消息请读者查阅资料获得。由上可以知道,IntPtr是个很首要的数据结构,由它申明的变量实际上是贰个指针值(即内部存款和储蓄器地址值)。第一个参数IntPtr model,须求传入model所在内部存款和储蓄器区域的地址,第一个参数IntPtr x,供给传入特征节点数组所在内存区域的地方。上边,大家看看libsvmSharp是怎么利用那几个函数的:

 1         public static double Predict(SVMModel model, SVMNode[] x)
 2         {
 3             if (model == null)
 4             {
 5                 throw new ArgumentNullException("model");
 6             }
 7             if (x == null)
 8             {
 9                 throw new ArgumentNullException("x");
10             }
11             IntPtr intPtr = SVMModel.Allocate(model);
12             double result = SVM.Predict(intPtr, x);
13             SVMModel.Free(intPtr);
14             return result;
15         }
16 
17         public static double Predict(IntPtr ptr_model, SVMNode[] x)
18         {
19             if (ptr_model == IntPtr.Zero)
20             {
21                 throw new ArgumentNullException("ptr_model");
22             }
23             if (x == null)
24             {
25                 throw new ArgumentNullException("x");
26             }
27             List<SVMNode> list = (from a in x
28             select a.Clone()).ToList<SVMNode>();
29             list.Add(new SVMNode(-1, 0.0));
30             IntPtr intPtr = SVMNode.Allocate(list.ToArray());
31             double result = libsvm.svm_predict(ptr_model, intPtr);
32             SVMNode.Free(intPtr);
33             return result;
34         }

  留意的您有未有开采什么样难题?看不懂?究竟本身是以点带面。可是,请看第11行,每一遍调用都要双重给model分配内部存款和储蓄器哦!再如,第27、28、29、30行,在熟习C++的人看来,that's what?参数字传送进来的可不是数组名吗,干嘛如此千方百计?内部存款和储蓄器不会被玩坏吗?

  一切都是因为C#有指针,但不是可怜大家所耳闻则诵的指针。C#尚无像Java一样完全丢弃指针,但为了代码安全思量而减弱指针。C#是面向对象的语言,里面别的一种数据结构都尚未指针这一品质,除非您自身在定义数据结构时,将指针作为成员变量。大家所耳熟能详的EmguCV正是这么完毕对OpenCV的wrapper的。

【开始libsvm的C# Wrapper之旅】

  很好,大家能够进来正题了。作者将以wrapper libsvm为例,分步骤讲明整个经过。读者能够一隅三反,希望本文能够援救你加深你对跨语言编制程序的掌握。

  1.wrapper第一步(准备)

  获取你要wrapper的dll(由C++编写翻译获得),最棒有源代码,当然有参照他事他说加以考察手册也得以,不过假如除去dll的名字,对该dll一窍不通,这恐怕就不或者了。

  安装C#的dll反编译工具,这里推荐ILSpy。为啥要设置?比起自身森林绿中搜索,如若有能够参谋借鉴的能源,淡然置之是多么缺憾的一件事呀。EmguCV真的称得上wrapper中的经典。

  1. wrapper第二步(DllImport)

  首先,VS新建C#工程,项目连串选项类库,那样结尾生成技术方案后,便能够在bin/Debug目录下获得实用的dll文件了。笔者将品种命名称叫libsvmSharpCyc。

  其次,增多须要wrapper的C++ dll文件。右键单击施工方案财富管理器中的libsvmSharpCyc,然后增多现成项,把libsvm.dll增多进项目。

  接着,新建类,用于DllImport。作者建的是LsInvoke.cs,能够像下图所示这样,把想要使用的函数方法给Import进来:

  该进度中,DllImport要怎么着利用,感兴趣的读者可自行学习,这里必要潜心的是C++函数中的数据结构到C#中的数据结构是有光彩夺目关系的,下边附上一张dll援用常用转化表:

            C++            C#
        =====================================
        WORD              ushort
        DWORD             uint
        UCHAR             int/byte   大部分情况都可以使用int代替,而如果需要严格对齐的话则应该用bytebyte 
        UCHAR*            string/IntPtr
        unsigned char*    [MarshalAs(UnmanagedType.LPArray)]byte[]/?(Intptr)
        char*             string
        LPCTSTR           string
        LPTSTR            [MarshalAs(UnmanagedType.LPTStr)] string
        long              int
        ulong             uint
        Handle            IntPtr
        HWND              IntPtr
        void*             IntPtr
        int               int
        int*              ref int
        *int              IntPtr
        unsigned int      uint
        COLORREF          uint

3、wrapper第三步(数据结构)

  这一步是举世无双重大的一步,在C#中新建数据结构,必供给与C++中的数据结构相平等,不然遇到不能够预想的难题。

  前文已经简单地介绍过libsvm的数据结构了。这里再度一下:

 1 struct svm_node
 2 {
 3     int index;
 4     double value;
 5 };
 6 
 7 struct svm_problem
 8 {
 9     int l;
10     double *y;
11     struct svm_node **x;
12 };
13 
14 enum { C_SVC, NU_SVC, ONE_CLASS, EPSILON_SVR, NU_SVR };    /* svm_type */
15 enum { LINEAR, POLY, RBF, SIGMOID, PRECOMPUTED }; /* kernel_type */
16 
17 struct svm_parameter
18 {
19     int svm_type;
20     int kernel_type;
21     int degree;    /* for poly */
22     double gamma;    /* for poly/rbf/sigmoid */
23     double coef0;    /* for poly/sigmoid */
24 
25     /* these are for training only */
26     double cache_size; /* in MB */
27     double eps;    /* stopping criteria */
28     double C;    /* for C_SVC, EPSILON_SVR and NU_SVR */
29     int nr_weight;        /* for C_SVC */
30     int *weight_label;    /* for C_SVC */
31     double* weight;        /* for C_SVC */
32     double nu;    /* for NU_SVC, ONE_CLASS, and NU_SVR */
33     double p;    /* for EPSILON_SVR */
34     int shrinking;    /* use the shrinking heuristics */
35     int probability; /* do probability estimates */
36 };
37 
38 //
39 // svm_model
40 // 
41 struct svm_model
42 {
43     struct svm_parameter param;    /* parameter */
44     int nr_class;        /* number of classes, = 2 in regression/one class svm */
45     int l;            /* total #SV */
46     struct svm_node **SV;        /* SVs (SV[l]) */
47     double **sv_coef;    /* coefficients for SVs in decision functions (sv_coef[k-1][l]) */
48     double *rho;        /* constants in decision functions (rho[k*(k-1)/2]) */
49     double *probA;        /* pariwise probability information */
50     double *probB;
51     int *sv_indices;        /* sv_indices[0,...,nSV-1] are values in [1,...,num_traning_data] to indicate SVs in the training set */
52 
53     /* for classification only */
54 
55     int *label;        /* label of each class (label[k]) */
56     int *nSV;        /* number of SVs for each class (nSV[k]) */
57                 /* nSV[0] + nSV[1] + ... + nSV[k-1] = l */
58     /* XXX */
59     int free_sv;        /* 1 if svm_model is created by svm_load_model*/
60                 /* 0 if svm_model is created by svm_train */
61 };

  对应地,我们在C#中确立数据结构:

    public struct svm_node
    {
        /// <summary>
        /// 索引
        /// </summary>
        public int index;

        /// <summary>
        /// 值
        /// </summary>
        public double value;

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="i"></param>
        /// <param name="v"></param>
        public svm_node(int i,double v)
        {
            this.index = i;
            this.value = v;
        }
        public bool Equals(svm_node x)
        {
            return this.index.Equals(x.index) && this.value.Equals(x.value);
        }
    }
    public struct svm_problem
    {
        /// <summary>
        /// 支持向量个数
        /// </summary>
        public int l;

        /// <summary>
        /// 标签值
        /// </summary>
        public IntPtr y;

        /// <summary>
        /// 节点情况
        /// </summary>
        public IntPtr x;
    }
    ……

  也会有读者会问,结构体你加构造函数和其余函数干嘛?那实质上是为着以后好简化代码。不然,每一回对象创立于赋值分开操作有一点点麻烦。

  实行到明日,我们只是达成了数据结构搭建的一小部分,上边是从EmguCV中学习到的美丽部分!将要下篇作介绍~

Wrapper, 【百度百科】 LIBSVM是台大林智仁(Lin Chih-Jen)教师等开采设计的一个粗略、易于使用和飞跃有效的SVM方式识别与回归的...

  LIBSVM是浙江高校林智仁(Lin Chih-Jen)教授等开辟设计的三个简便、易于使用和快捷有效的SVM情势识别与回归的软件包,他不只提供了编写翻译好的可在Windows种类系统的实施文书,还提供了源代码,方便革新、修改以致在别的操作系统上接纳;该软件对SVM所涉嫌的参数调度相对相当少,提供了重重的暗许参数,利用那个暗许参数能够消除广大主题材料;并提供了互相核算(CrossValidation)的作用。该软件能够消除C-SVM、ν-SVM、ε-SV陆风X8和ν-SVKuga等难点,包蕴基于一对一算法的多类方式识别难点……

  假使您对libsvm还缺乏精晓,建议先浏览下百度百科等对libsvm的介绍~

【C# Wrapper 动机】

  参加过一个连串,使用IDE是VS winform,工具包为EmguCV 2.4.10。大家知晓OpenCV第22中学的svm部分是基于libsvm-2.6编写制定的,该版本的libsvm已经可以estimate预测可能率了(libsvm首页的change log中有详尽表达),可是OpenCV却吐弃了predictProbability。在切实可行的品类中,借使能够收获预测可能率音讯,那将对巩固识别性有十分大的辅助。但是,opencv2遗弃了识别概率,满含opencv3,笔者看源代码的svm部分也是基于libsvm-2.6改造的,也尚未引入predictProbability。

  因此,在EmguCV的ML知足不断的意况下,萌生了多个主见:

    一是修改OpenCV代码,然后再一次CMake得到cvextern.dll;

    二是一贯找其余的svm库。

  首先尝试CMake。像OpenCV那样的大体系,CMake起来实在不轻巧,更并且是从零从头学CMake。在时刻不一样意的基准下,只得走第二条路。找到libsvmSharp后,笔者如获珍宝。可是,不慢笔者又再度失望了,因为实时性供给满足不断(EmguCV自带SVM能够在5ms内做到辨认预测,而libsvmSharp供给500ms)。

  这是为什么?

  同样是C#对C++的wrapper,一样都以基于libsvm,一样是对C++所编写翻译的dll的引用,效用竟相差百倍!本着一颗学习的心,作者主宰一探究竟……

【现有libsvm的C#/.Net版本】

  目前,LIBSVM拥有C、Java、Matlab、C#、Ruby、Python、翼虎、Perl、Common LISP、Labview等数十种语言版本。最常使用的是C、Matlab、Java和命令行(c语言编写翻译的工具)的版本。

  首先大家看张libsvm官方网站首页上的截图:

vnsc5858威尼斯城官网 2

  下边,大家看看未来libsvm有啥C#版本:

  1、SVM.NET by Matthewa Johnson

  二零一零年,加州理工高校的马特hewa Johnson大学生将SVM.NET更新到了V2.89,相当于后日的风靡版本。无语今后不FQ竟已经找不到SVM.NET的原生版了。那份神秘感使自个儿觉着,这几个C#本子的libsvm应该是质量最高的。

  后人有在V2.89的基础上做一些改变,提议了:SVM.NET with Parallel Optimization。相关描述为:When finding parameters, C and Gamma, in Grid-search algorithm using ParameterSelection.PGrid instead of the original ParameterSelection.Grid will increase the calculation speed.

  2、NSVM by Joannes

vnsc5858威尼斯城官网 3

    3年时光,却独有2下载量,何其惨淡……好呢,可能你也像自家一样主观臆断了。

3、KMLib(Kernel Machine Library with GPU SVM solver in .Net) by Krzysztof Sopyła

  Key Features

    • .Net implementation
    • Parallel kernel implementation
    • SVM CUDA acceleration – kernels and solver
    • CUDA SVM with sparse data formats: CSR, Ellpack-R, Sliced-Ellpack
    • For non commercial and academic use: Free MIT license when use please cite: Bibtex CUDA SVM CSR

  另外,还大概有少数亟待重申的是,它是基于libsvm的java版本转换过来的。也正因如此,作者备感用起来恐怕会略微麻烦,故未有选拔。

4、libsvmSharp by ccerhan

  选择它的说辞一点也不细略,有必然的下载量(从众心思又初叶生事了!)下载方便,用VS的Nuget package,通过命令“PM> Install-Package LibSVMsharp”即下载到本地。

5、libsvm-net by Nicolas Panel

vnsc5858威尼斯城官网 ,  下载起来同样不行利于: NuGet package : PM> Install-Package libsvm.net,比起libsvmSharp有越来越高的人气。

【分析libsvmSharp】

  为何libsvmSharp.dll如此低效?

  在反编写翻译后的源代码中(稍后将介绍怎么样反编写翻译C#编译出来的dll文件),我们得以观察libsvmSharp所用的数据结构有:

本文由vnsc5858威尼斯城官网发布于vnsc5858威尼斯城官网,转载请注明出处:LibSVM之C# Wrapper

关键词:

上一篇:Laravel的三种安装方法总结

下一篇:没有了