OpenCV  4.10.0
开源计算机视觉
正在加载...
正在搜索...
没有匹配
结构森林训练

绪论

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

训练管道

  1. 链接 下载“Piotr's Toolbox”并将它放入单独的目录中,例如 PToolbox
  2. 从链接

    下载 BSDS500 数据集,并将其放入名为 BSR 的单独目录中
  3. 将目录及其子目录添加到 Matlab 路径中。
  4. 从链接

    下载检测器代码,并将其放入根目录。现在您应该有
    .
    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. 现在是时候编译承诺的 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
    {
    // 在此添加您的特征提取代码,默认代码是
    // 结果特征垫应该是 n 通道浮点矩阵
    }
    protected:
    cv::String name;
    };
    MEXFUNCTION_LINKAGE void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
    {
    if (nlhs != 1) mexErrMsgTxt("nlhs != 1");
    如果 (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:812
    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,您可以将该 YAML 与我们的 ocv::StructuredEdgeDetection 一起使用。为此,请运行 opencv_contrib/ximgproc/tutorials/scripts/modelConvert(model, "model.yml")

如何使用您的模型

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

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