C++中条件随机字段(CRFs)的开源实现有好几种,比如CRF++、FlexCRF等。但是从手册上,我只能理解如何将它们用于文本标注等一维问题,不清楚如何将它们应用于二维视觉问题,假设我已经计算了每个节点的关联势和每个边缘的交互势。
是否有人将这些软件包用于解决视觉问题,例如分割?或者它们根本不能以这种方式使用?
总而言之,是否有任何针对视力问题的 CRF 开源包?
非常感谢!
C++中条件随机字段(CRFs)的开源实现有好几种,比如CRF++、FlexCRF等。但是从手册上,我只能理解如何将它们用于文本标注等一维问题,不清楚如何将它们应用于二维视觉问题,假设我已经计算了每个节点的关联势和每个边缘的交互势。
是否有人将这些软件包用于解决视觉问题,例如分割?或者它们根本不能以这种方式使用?
总而言之,是否有任何针对视力问题的 CRF 开源包?
非常感谢!
最新版本的 dlib 支持在任意图结构(包括二维网格)上学习成对马尔可夫随机场模型。它以最大边距意义(即使用结构 SVM)而不是最大似然意义(即 CRF)来估计参数,但如果您只想预测图形标记,那么任何一种方法都一样好。
有一个示例程序显示了如何在一个简单的示例图上使用这些东西。该示例将特征向量放在每个节点上,结构化 SVM 使用它们来学习如何正确标记图中的节点。请注意,您可以通过修改文件顶部的 typedef 来更改特征向量的维度。此外,如果您已经有一个完整的模型并且只想找到最可能的标签,那么您可以直接调用底层基于 min-cut 的推理例程。
一般来说,我会说解决这些问题的最佳方法是定义您要使用的图形模型,然后选择一种适用于它的参数学习方法。所以在这种情况下,我想你对某种成对的马尔可夫随机场模型感兴趣。特别是,可以使用最小切/最大流算法找到最可能分配的模型。然后在这种情况下,结果证明结构 SVM 是查找模型参数的一种自然方法,因为结构 SVM 只需要找到最大概率分配的能力。通过最大似然找到参数(即,将其视为 CRF)将需要您另外有一些方法来计算图形变量的总和,但这对于这些类型的模型来说非常困难。对于这种模型,我所知道的所有 CRF 方法都是近似值,而 dlib 中的 SVM 方法使用精确求解器。我的意思是,该算法的参数之一是一个 epsilon 值,它表示“运行直到找到在 epsilon 精度范围内的最佳参数”,并且该算法每次都可以有效地执行此操作。
在今年的计算机视觉和模式识别大会上有一个关于这个主题的很好的教程。演讲者还写了一本关于计算机视觉中的结构化预测和学习的好书。