4

OpenCV::HOGDescriptor で使用するために独自の検出器をトレーニングしようとしていますが、新しくトレーニングした SVM で既存の HOGDescriptor を機能させるのに問題があります。

正と負のトレーニング画像の HOG 特徴を計算し、それらにラベルを付け、CvSVM を使用して SVM をトレーニングしました。私が使用したパラメータは次のとおりです。

    CvSVMParams params;
    params.svm_type =CvSVM::EPS_SVR;
    params.kernel_type = CvSVM::LINEAR;
    params.C = 0.01;
    params.p = 0.5;

次に、多くのベクトルではなく 1 つのベクトルのみを取得するように、サポート ベクターの主形式を計算し、HOGDescriptor.setSVMDetector(vector); を使用して計算されたサポート ベクターを設定します。

これがプライマルフォーム

CvSVM.predict() を使用すると、SVM でオブジェクトを正しく分類できますが、HOGDescriptor.detect() または detectMultiScale() は常に多くの肯定的な一致を返し、正確な予測を提供しません。

CvSVM.predict() は元のサポート ベクターを分類に使用するため、主形式の計算方法に問題がある可能性があります。

私を正しい方向に向けることができる独自の検出器を訓練した人はいますか?

4

3 に答える 3

5

CvSVM の子クラスを作成して、線形 svm がトレーニングされた後に原始形式を抽出しました。陽性サンプルは 1 とラベル付けされ、陰性サンプルは -1 とラベル付けされます。HogDescriptor から正しい結果を得るために、alpha の前にマイナス記号を付け、rho の記号を変更せずに残しておく必要があるのは奇妙です。

LinearSVM.h

#ifndef LINEAR_SVM_H_
#define LINEAR_SVM_H_
#include <opencv2/core/core.hpp>
#include <opencv2/ml/ml.hpp>

class LinearSVM: public CvSVM {
public:
  void getSupportVector(std::vector<float>& support_vector) const;
};  

#endif /* LINEAR_SVM_H_ */

LinearSVM.cc

#include "linear_svm.h"    
void LinearSVM::getSupportVector(std::vector<float>& support_vector) const {

    int sv_count = get_support_vector_count();
    const CvSVMDecisionFunc* df = decision_func;
    const double* alphas = df[0].alpha;
    double rho = df[0].rho;
    int var_count = get_var_count();
    support_vector.resize(var_count, 0);
    for (unsigned int r = 0; r < (unsigned)sv_count; r++) {
      float myalpha = alphas[r];
      const float* v = get_support_vector(r);
      for (int j = 0; j < var_count; j++,v++) {
        support_vector[j] += (-myalpha) * (*v);
      }
    }
    support_vector.push_back(rho);
}
于 2013-06-14T23:11:24.263 に答える