从字符串加载 OpenCV 的 ML (SVM)

Load OpenCV's ML (SVM) from string

本文关键字:SVM ML 字符串 加载 OpenCV      更新时间:2023-10-16

我目前正在开发一种基于机器学习的纹理分类算法,主要是支持向量机(SVM)。我能够在我的测试数据上获得一些非常好的结果,现在我想在生产环境中使用SVM。

在我的情况下,高效意味着它将在多个桌面和移动平台(即Android、iOS)上运行,并且总是在本地线程的深处运行。由于软件结构和平台的访问策略的原因,我无法从使用SVM的位置访问文件系统。然而,我的框架支持在允许访问文件系统的环境中读取文件,并将文件内容作为std::string传输到我的应用程序的SVM部分。

如何配置SVM的标准程序是使用文件名和OpenCV直接从文件中读取:

cv::SVM _svm;
_svm.load("/home/<usrname>/DEV/TrainSoftware/trained.cfg", "<trainSetName>");

我想要这个(基本上是从其他地方读取文件,并将文件的内容作为字符串传递给SVM):

cv::SVM _svm;
std::string trainedCfgContentStr="<get the content here>";
_svm.loadFromString(trainedCfgContentStr, "<trainSetName>") // This method is desired

我在OpenCV的文档或源代码中找不到任何可能的东西,但这不是第一个没有文档或广为人知的OpenCV功能。当然,我可以破解OpenCV源代码,并交叉编译到我的每个目标平台,但我会尽量避免这种情况,因为这是一项艰巨的工作,而且我很确信我不是第一个遇到这个问题的人。

所有想法(也是非传统的)和/或暗示都将受到高度赞赏!

只要你坚持使用c++api,FileStorage就可以从内存中读取:

string data_string; //containing xml/yml data
FileStorage fs( data_string, FileStorage::READ | FileStorage::MEMORY);
svm.read(fs.getFirstTopLevelNode()); // or the node with your trainset

(不幸的是,没有暴露于java)