【问题标题】:Load Trained SVM – Emgu CV负载训练的 SVM – Emgu CV
【发布时间】:2016-03-01 20:10:53
【问题描述】:

我对 SVM 和对象识别有点陌生,目前正在尝试使用 Emgu CV 3.0 训练 SVM,将其保存到文件中,然后加载它(用于 HOGDescriptor.SetSVMDetector)。

但是,除其他问题外,我在保存 SVM 后找不到加载 SVM 的方法。

到目前为止,我的代码基本上做了以下事情:

SVM myFirstSVM = new SVM();

// do some stuff, set some parameters...

myFirstSVM.Train(someParameters);

myFirstSVM.Save("filePath");

从这里开始,问题在于保存后重新加载 SVM。我检查了几个帮助主题和页面,我能找到的唯一相关内容与 OpenCV 有关,它使用了以下方法:

SVM mySecondSVM;

mySecondSVM.load("filePath");

但是,我在 Emgu 3.0 中找不到方法“.load()”,尽管它似乎存在于以前的版本中。 Emgu 3.0 中是否有与此 OpenCV 方法等效的方法?我会假设有,而且我确信它相当简单,但我一辈子都找不到它。

【问题讨论】:

    标签: opencv emgucv


    【解决方案1】:

    对于 EmguCV 3.0.0,似乎不支持 Save/Load 功能(Load 不存在),您可以改用 Write/Read

    保存 SVM 模型的函数:

    public static void SaveSVMToFile(SVM model, String path) {
        if (File.Exists(path)) File.Delete(path);
        FileStorage fs = new FileStorage(path, FileStorage.Mode.Write);
        model.Write(fs);
        fs.ReleaseAndGetString();
    }
    

    加载 SVM 模型的函数提供了正确的路径:

    public static SVM LoadSVMFromFile(String path) {
        SVM svm = new SVM();
        FileStorage fs = new FileStorage(path, FileStorage.Mode.Read);
        svm.Read(fs.GetRoot());
        fs.ReleaseAndGetString();
        return svm;
    }
    

    【讨论】:

      【解决方案2】:

      我已经使用指定的函数保存并读取了 SVM 模型。但我正在使用 3.1.0 版本,希望它也适用于您:

      我已将模型保存在 XML 文件中,因为据我所知,读取功能适用于 xml 文件:

      Emgu.CV.ML.SVM model = new Emgu.CV.ML.SVM();
      model.SetKernel(Emgu.CV.ML.SVM.SvmKernelType.Linear);
      model.Type = Emgu.CV.ML.SVM.SvmType.CSvc;
      model.C = 1;
      model.TermCriteria = new MCvTermCriteria(100, 0.00001);
      bool trained = model.TrainAuto(my_trainData, 5);
      model.Save("SVM_Model.xml");
      

      我阅读模型如下:

      Emgu.CV.ML.SVM model_loaded = new Emgu.CV.ML.SVM();
      FileStorage fsr = new FileStorage("SVM_Model.xml", FileStorage.Mode.Read);
      model_loaded.Read(fsr.GetFirstTopLevelNode());
      

      它可以正常工作。 我希望它对你有用。

      【讨论】:

        【解决方案3】:

        对于 EmguCV 1.5.0:

        Load Method (fileName)

        继承自StatModel

        从文件中加载统计模型

        文件名(字符串)

        从中加载模型的文件

        对于 EmguCV 3.0+:

        Load()不可用,源码中可以看到:https://sourceforge.net/p/emgucv/code/ci/master/tree/Emgu.CV.ML/StatModel.cs

        【讨论】:

        • 我做到了。 Emgu 中没有针对 SVM 对象的扩展方法“.Load("file path")”。
        • @JohiasburgFrowell 你确定吗?此信息来自其文档:emgu.com/wiki/files/1.5.0.0/Help/html/…
        • 我使用的是 3.0 版,您引用的文档严重过时。 3.0 文档可以在 emgu.com/wiki/files/3.0.0/document/html/… 找到
        • @JohiasburgFrowell 这很有趣...在源代码上,Load() 方法被注释...也许是一个错误?
        猜你喜欢
        • 2016-08-29
        • 2012-11-16
        • 2015-05-04
        • 2015-07-25
        • 2012-11-03
        • 2015-04-18
        • 2015-01-22
        • 2012-06-27
        相关资源
        最近更新 更多