OpenCV 4.12.0
开源计算机视觉
加载中...
搜索中...
无匹配项
结构化森林训练

简介

在本教程中,我们将展示如何使用作者最初的 Matlab 实现来训练您自己的结构化森林。

训练流程

  1. 链接下载“Piotr 的工具箱”,并将其放入单独的目录中,例如 PToolbox
  2. 从链接 <http://www.eecs.berkeley.edu/Research/Projects/CS/vision/grouping/BSR/> 下载 BSDS500 数据集,并将其放入名为 BSR 的单独目录中
  3. 将这两个目录及其子目录添加到 Matlab 路径。
  4. 从链接 <http://research.microsoft.com/en-us/downloads/389109f6-b4e8-404c-84bf-239f7cbf4e3d/> 下载检测器代码,并将其放入根目录。现在您应该有
    .
    BSR
    PToolbox
    models
    private
    Contents.m
    edgesChns.m
    edgesDemo.m
    edgesDemoRgbd.m
    edgesDetect.m
    edgesEval.m
    edgesEvalDir.m
    edgesEvalImg.m
    edgesEvalPlot.m
    edgesSweeps.m
    edgesTrain.m
    license.txt
    readme.txt
  5. 将 models/forest/modelFinal.mat 重命名为 models/forest/modelFinal.mat.backup
  6. 打开 edgesChns.m 并注释掉第 26–41 行。在注释行后添加以下内容
    shrink=opts.shrink;
    chns = single(getFeatures( im2double(I) ));
  7. 现在是编译 promise getFeatures 的时候了。我使用以下代码
    #include <cv.h>
    #include <highgui.h>
    #include <mat.h>
    #include <mex.h>
    #include "MxArray.hpp" // https://github.com/kyamagu/mexopencv
    class NewRFFeatureGetter : public cv::RFFeatureGetter
    {
    public:
    NewRFFeatureGetter() : name("NewRFFeatureGetter"){}
    virtual void getFeatures(const cv::Mat &src, NChannelsMat &features,
    const int gnrmRad, const int gsmthRad,
    const int shrink, const int outNum, const int gradNum) const
    {
    // 此处为您的特征提取代码,默认代码为
    // 生成的特征 Mat 应为 n 通道,浮点矩阵
    }
    保护:
    cv::String name;
    };
    MEXFUNCTION_LINKAGE void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
    {
    if (nlhs != 1) mexErrMsgTxt("nlhs != 1");
    if (nrhs != 1) mexErrMsgTxt("nrhs != 1");
    cv::Mat src = MxArray(prhs[0]).toMat();
    std::string modelFile = MxArray(prhs[1]).toString();
    NewRFFeatureGetter *pDollar = createNewRFFeatureGetter();
    cv::Mat edges;
    pDollar->getFeatures(src, edges, 4, 0, 2, 13, 4);
    // 您可以在此处使用其他数字
    plhs[0] = MxArray(edges);
    }
    OpenCV 原始数据类型的模板“特征”类。
    定义 traits.hpp:113
    n 维密集数组类
    定义 mat.hpp:830
    void convertTo(OutputArray m, int rtype, double alpha=1, double beta=0) const
    使用可选缩放将数组转换为另一种数据类型。
    std::string String
    定义 cvstd.hpp:151
  8. 将编译的 mex 文件放入根目录并运行 edgesDemo。您需要等待几个小时,之后新模型将出现在 models/forest/ 中。
  9. 最后一步是将训练好的模型从 Matlab 二进制格式转换为 YAML,您可以通过我们的 ocv::StructuredEdgeDetection 使用它。为此,请运行 opencv_contrib/ximgproc/tutorials/scripts/modelConvert(model, "model.yml")

如何使用您的模型

只需使用带上面定义的类 NewRFFeatureGetter 的扩展构造函数

cv::StructuredEdgeDetection pDollar
= cv::createStructuredEdgeDetection( modelName, makePtr<NewRFFeatureGetter>() );