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

Posted

技术标签:

【中文标题】从字符串加载 OpenCV 的 ML (SVM)【英文标题】:Load OpenCV's ML (SVM) from string 【发布时间】:2014-09-16 09:47:45 【问题描述】:

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

在我的例子中,高效意味着它将在多个桌面和移动平台(即 androidios)上运行,并且总是在本机线程的深处。由于软件结构和平台访问策略的原因,我无法访问使用 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】:

只要你坚持使用 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());

以上是关于从字符串加载 OpenCV 的 ML (SVM)的主要内容,如果未能解决你的问题,请参考以下文章

在 OpenCV 上使用 SVM 训练图像

使用opencv SVM训练火灾检测[关闭]

OpenCVopencv3.0中的SVM训练 mnist 手写字体识别

OpenCV机器学习库函数--SVM

为 svm::predict 准备 cv::mat

如何为 openCV SVM 格式化数据