5

サポート ベクター マシンを使用するアルゴリズムを Python (scikit-learn を使用) から C++ (OpenCV の機械学習ライブラリを使用) に移植しています。

Python でトレーニング済みの SVM にアクセスでき、SVM モデル パラメーターを XML ファイルから OpenCV にインポートできます。scikit-learn も OpenCV も LibSVM をベースに SVM 実装を行っているため、トレーニング済みの scikit SVM のパラメータを OpenCV で利用できるはずだと思います。

以下の例は、OpenCV で SVM を初期化するために使用できる XML ファイルを示しています。

<?xml version="1.0"?>
<opencv_storage>
<my_svm type_id="opencv-ml-svm">
  <svm_type>C_SVC</svm_type>
  <kernel><type>RBF</type>
    <gamma>0.058823529411764705</gamma></kernel>
  <C>100</C>
  <term_criteria><epsilon>0.0</epsilon>
    <iterations>1000</iterations></term_criteria>
  <var_all>17</var_all>
  <var_count>17</var_count>
  <class_count>2</class_count>
  <class_labels type_id="opencv-matrix">
    <rows>1</rows>
    <cols>2</cols>
    <dt>i</dt>
    <data>
      0 1</data></class_labels>
  <sv_total>20</sv_total>
  <support_vectors>
    <_>
      2.562423055146794554e-02 1.195797425735170838e-01
      8.541410183822648050e-02 9.395551202204914520e-02
      1.622867934926303379e-01 3.074907666176152077e-01
      4.099876888234874062e-01 4.697775601102455179e-01
      3.074907666176152077e-01 3.416564073529061440e-01
      5.124846110293592716e-01 5.039432008455355660e-01
      5.466502517646497639e-01 1.494746782168964394e+00
      4.168208169705446942e+00 7.214937388193202183e-01
      7.400275229357797802e-01</_>
    <!-- omit 19 vectors to keep it short -->
  </support_vectors>
  <decision_functions>
    <_>
      <sv_count>20</sv_count>
      <rho>-5.137523249549433402e+00</rho>
      <alpha>
        2.668992955678978518e+01 7.079767098112181145e+01
        3.554240018130368384e+01 4.787014908624512088e+01
        1.308470223155845069e+01 5.499185410034550614e+01
        4.160483074010306126e+01 2.885504210853826379e+01
        7.816431542954153144e+01 6.882061506693679576e+01
        1.069534676985309574e+01 -1.000000000000000000e+02
        -5.088050252552544350e+01 -1.101740897543916375e+01
        -7.519686789702373630e+01 -3.893481464245511603e+01
        -9.497774056452135483e+01 -4.688632332663718927e+00
        -1.972745089701982835e+01 -8.169343841768861125e+01</alpha>
      <index>
        0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
        </index></_></decision_functions></my_svm>
</opencv_storage>

この XML ファイルに、トレーニング済みの scikit-learn SVM からの値を入力したいと思います。しかし、scikit-learn と OpenCV のパラメーターがどのように対応しているかはわかりません。これが私がこれまでに持っているものです(clfPythonの分類子オブジェクトです):

  • <kernel><gamma>に対応clf.gamma
  • <C>に対応clf.C
  • <term_criteria><epsilon>に対応clf.tol
  • <support_vectors>に対応clf.support_vectors_

これは今のところ正しいですか?さて、ここに私がよくわからない項目があります:

  • どう<term_criteria><iterations>ですか?
  • <decision_functions><_><rho>に対応していますかclf.intercept_?
  • <decision_functions><_><alpha>に対応していますかclf.dual_coef_? dual_coef_ここでは、scikit-learn のドキュメントに「積 y i α iを保持する」と記載されているため、よくわかりません。OpenCV はy i α iではなく α iのみを想定しているようです。
4

1 に答える 1

7

もう必要epsilonありiterationsません。これらはトレーニングの最適化問題で使用されます。お気に入りの番号に設定するか、無視することができます。

の間でインデックス作成が異なる場合があるため、サポート ベクターの移植には若干の調整が必要になる場合があります。たとえば、例の XML にはスパース形式はありません。

その他のパラメーターについては、次のとおりです。

  • rhoに対応するintercept_必要がありますが、符号を変更する必要がある場合があります。
  • scikitは、標準のモデル (alpha_i*y_i)にdual_coef_対応しています。sv_coef

移植時に指定した値についてが文句を言う場合は、 絶対alpha値(たとえば、すべて正) を使用してください。これらは、SVM モデルの真のアルファ値です。dual_coef_

于 2013-05-30T14:18:02.520 に答える