OpenCV 4.11.0
开源计算机视觉库
加载中…
搜索中…
未找到匹配项
结构化森林训练

简介

本教程将演示如何使用作者最初的Matlab实现来训练你自己的结构化森林。

训练流程

  1. 链接下载“Piotr's Toolbox”,并将其放入单独的目录中,例如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. 现在是编译承诺的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通道的浮点矩阵
    }
    protected:
    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:829
    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>() );