6

opencv 2.4.2 C++ を実行しています。

私はopencvを使って人物認識をしようとしています。

さまざまな方向のさまざまな人々を含む VidTIMIT データセットを使用しています。

私は CvSVM を使ってこれらの人々を分類しています。

私の問題は、svm の出力が常に同じであることです。

私が従うアルゴリズムは次のとおりです。

  1. Haar を使用した顔検出
  2. 顔のリサイズ (58*58)
  3. SVM トレーニング
  4. 分類

今、私はトレーニングで何か間違ったことをしたのだろうかと思っています。

5(num_name) 人、それぞれ 10(num_images) の異なる画像を考慮して、この方法を試しています。

void runFaceDetectionRecognition(vector<Mat_<uchar> > &images){
vector<vector<Rect> > faces;
for (unsigned i=0; i<images.size(); ++i) {

    /// detection face
    vector<Rect> f;
    faceDetection(images[i], f);

    if (!f.empty()) {
        faces.push_back(f);

        /// I keep only the face
        Mat_<uchar> roi = ( images[i](f[0]) );

        /// resize
        resize(roi, roi, Size(58, 58));

        roi.copyTo(images[i]);            
    }
}

/// Set up parameters
CvSVMParams params;
params.svm_type    = CvSVM::C_SVC;
params.kernel_type = CvSVM::LINEAR;
params.term_crit   = cvTermCriteria(CV_TERMCRIT_ITER, 100, 1e-6);


/// Set up training data
float labels[num_name][num_images];
float label = 0;

/// different label for different person
for (unsigned i=0; i<num_name; ++i) {
    for (unsigned j=0; j<num_images; ++j)
        labels[i][j] = label;

    label++;
}

/// labeling matrix
Mat labelsMat(num_name*num_images, 1, CV_32FC1, labels);

/// unrolling images
float data[images.size()][58*58];
for (unsigned l=0; l<images.size(); ++l)

    for (unsigned i=0; i<58; ++i)
        for (unsigned j=0; j<58; ++j)
            data[l][j+58*i] = images[l].at<float>(i,j);


/// training matrix
Mat train((int) images.size(),58*58, CV_32FC1, data);
CvSVM svm(train, labelsMat, Mat(), Mat(), params);

/// Validation
valSVM(svm, train.rowRange(0, 1));
}

検証コード:

void valSVM(CvSVM &svm, Mat train){

/// prediction
float response = svm.predict(train);

cout << "Response ===> " << response << " ";

/// output
if (response == 0)  cout << "lea";
else if (response == 1)  cout << "maria";
else if (response == 2)  cout << "ramona";
else if (response == 3)  cout << "teresa";
else if (response == 4)  cout << "yan";
}

あなたが私を助けてくれることを願っています。

4

3 に答える 3

2

完全な 58*58 顔で SVM をトレーニングしているようです。SVM を機能させるには、OpenCV に既に含まれている PCA (主成分分析) などの方法を使用して次元を減らす (主成分を取得する) 必要があります。

次元を 58*58 配列から *n 配列 (n は主な機能) に減らすと、SVM のトレーニングでは主な機能のみが使用され、ソリューションが改善されます。

OpenCV を使用した顔認識のドキュメントは多数あります。ここから開始できます。

于 2013-03-13T14:09:54.913 に答える
0

オブジェクトを分類したプロジェクトも構築しています。SVM と Bag of Features(BOf)/BOW を組み合わせて使用​​しています。この方法では、まず辞書/コードブックを作成してから、SVM をトレーニングします。結果はかなり良いです。

このリンクを見てアイデアを得ることができます http://www.morethantechnical.com/2011/08/25/a-simple-object-classifier-with-bag-of-words-using-opencv-2- 3-w-コード/

于 2014-02-07T19:54:28.717 に答える