2

後で使用するために、トレーニング済みの期待値最大化モデルのパラメーターを XML ファイルから読み取ろうとしています。私が呼び出すモデルを保存するために

cv::FileStorage fs("model.xml",cv::FileStorage::WRITE);
classifier.write(fs);  //classifier is of type cv::EM

これにより、モデルのデータのように見えるものを含むファイルが作成されます。ファイルは次のようになります (最初の数行)。

StatModel.EM 1
<_ type_id="opencv-matrix"> 3 3 d
1.2159868951764311e+01 0. 0. 0. 1.9776824566023249e-01 0. 0. 0.  .2204460492503131e-16     
<_ type_id="opencv-matrix"> 3 3 d
3.2869203526862529e+00 0. 0. 0. 1.1631692248472096e+00 0. 0. 0. 2.2204460492503131e-16     
<_ type_id="opencv-matrix"> 3 3 d
2.9815870012055705e+00 0. 0. 0. 6.5049770685681069e+03 0. 0. 0. 6.8510191786605528e+03 
<_ type_id="opencv-matrix"> 3 3 d 
4.6608996548002040e+00 0. 0. 0. 3.7558131457318683e+02 0. 0. 0. 2.2204460492503131e-16 

XML ヘッダーがないことに注意してください。今私が使用しているデータを読み取るために

cv::FileStorage fs("model.xml",cv::FileStorage::READ);

cv::Algorithm::read() 関数は、filenode をパラメータとして呼び出す必要があります。どのノードを使用すればよいかわかりません。私が試したファイルにはノードが1つしかないと予想されるので

classifier.read(fs[0]);

ただし、アルゴリズムは後でトレーニングされません。元のパラメータを復元するにはどうすればよいですか?

4

3 に答える 3

4

私は単に使用します

        const FileStorage fs(filename, FileStorage::READ);
        EM model;
        if (fs.isOpened()) {
            const FileNode& fn = fs["StatModel.EM"];
            model.read(fn);
        } 

できます。

于 2012-11-26T11:32:04.427 に答える
3

代わりに、「書き込み」を使用する代わりに、次のことができます。

fs<<"my_model"<<classifier;

次に、読み取り用に FileStorage を開いた後、次のように読み取ります。

cv::EM EModel;
fs["my_model"] >> EModel;

編集: オーバーロードに含まれていないため、上記は cv::EM では機能しません。

このリンクは、カスタム クラスを XML/YAML ファイルに書き込んだり、XML/YAML ファイルから読み込んだりする方法の非常に良い例を提供します。それに応じて、クラスの「書き込み」および「読み取り」メソッドを作成するため、ノードを定義して名前を付けるのはあなたです。

これらのメソッドを自分で作成しておらず、それらが cv::Algorithm の一部である場合 (おそらくこれは新しいもので、使用している 2.2 では見つかりませんでした)、xml ファイルをチェックして作成されたノードの名前を取得し、 >> 演算子を使用するか、次のようにして取得します。

FileNode myFilenode = fs["node_name"];
classifier.read(myFilenode);

あなたが提供するものとリンクのxmlの例からStatModel.EM 1 <_ type_id="opencv-matrix">、このノードの名前は実際には「_」であると思います(おそらく、作成時に名前を指定しない場合、これがデフォルトです)

于 2012-09-06T19:23:16.333 に答える
1

代替構文は

    FileStorage fs(filename, FileStorage::READ);
    Mat mat;
    if (fs.isOpened()) {
        fs["mat_name"]>>mat;
    }
    fs.release();
于 2013-07-05T18:45:49.743 に答える