OpenCV 4.13.0
Open Source Computer Vision
読み込み中...
検索中...
見つかりません
🤖 AIによる機械翻訳(非公式) — これは OpenCV 4.13.0 公式リファレンス(英語)を AI (Claude) で自動翻訳したものです。訳に誤りを含む場合があります。正確な情報は 公式英語版(原文) を参照してください。
Structured forestの学習

はじめに

このチュートリアルでは、著者によるオリジナルのMatlab実装を使って、独自のstructured forestを学習させる方法を示す。

学習パイプライン

  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
    {
    // here your feature extraction code, the default one is:
    // resulting features Mat should be n-channels, floating point matrix
    }
    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);
    // you can use other numbers here
    plhs[0] = MxArray(edges);
    }
    Template "trait" class for OpenCV primitive data types.
    Definition traits.hpp:113
    n-dimensional dense array class
    Definition mat.hpp:840
    void convertTo(OutputArray m, int rtype, double alpha=1, double beta=0) const
    Converts an array to another data type with optional scaling.
    std::string String
    Definition cvstd.hpp:151
  8. コンパイルしたmexファイルをルートディレクトリに配置し、edgesDemoを実行する。その後、新しいモデルが models/forest/ 内に現れるまで数時間待つ必要がある。
  9. 最後のステップは、学習済みモデルをMatlabのバイナリ形式から、ocv::StructuredEdgeDetectionで使用できるYAMLに変換することである。この目的のために opencv_contrib/ximgproc/tutorials/scripts/modelConvert(model, "model.yml") を実行する

モデルの使い方

上で定義したクラスNewRFFeatureGetterを指定して、拡張版コンストラクタを使うだけでよい

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