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

3
我目前正在开发一种基于机器学习的纹理分类算法,主要使用支持向量机(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源代码并交叉编译到我的每个目标平台,但我会尽量避免这样做,因为这是一项巨大的工作,而且我相信我不是第一个遇到这个问题的人。欢迎提出所有想法(包括非传统的)和/或提示!
1个回答

2
只要坚持使用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)


太棒了,这对我很有效。只是需要注意的是,至少在我的旧OpenCV 2.4.6中,您必须使用重载的*运算符才能使svm.read正常工作:FileStorage fs (data_string, FileStorage::READ | FileStorage::MEMORY); _svm.read(*fs,*fs.getFirstTopLevelNode()); - Thomas Bergmueller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接