0

私は Match Faces の初心者です。 HOG 記述子で SVM を使用する方法を学ぼうとしています。SVM を使用して単純な顔認識エンジンを作成しましたが、アクティブにすると、コードは常に 1 を返します

float *getHOG(const cv::Mat &image, int* count)//Compute HOG
{
    cv::HOGDescriptor hog;
    std::vector<float> res;
    cv::Mat img2;
    cv::resize(image, img2, cv::Size(64, 128));
    hog.compute(img2, res, cv::Size(8, 8), cv::Size(0, 0));
    *count = res.size();
    float* result = new float[*count];
    for(int i = 0; i < res.size(); i++)
    {
        result[i] = res[i];
    }
    return result;
}

const int dataSetLength = 10;
float **getTraininigData(int* setlen, int* veclen)//Load some samples of data
{
    char *names[dataSetLength] = {
        "../faces/s1/1.pgm",
        "../faces/s1/2.pgm",
        "../faces/s1/3.pgm",
        "../faces/s1/4.pgm",
        "../faces/s1/5.pgm",
        "../faces/cars/1.jpg",
        "../faces/cars/2.jpg",
        "../faces/cars/3.jpg",
        "../faces/cars/4.jpg",
        "../faces/cars/5.jpg",
    };

    float **res = new float* [dataSetLength];
    for(int i = 0; i < dataSetLength; i++)
    {
        std::cout<<names[i]<<"\n";
        cv::Mat img = cv::imread(names[i], 0);
        res[i] = getHOG(img, veclen);
    }
    *setlen = dataSetLength;
    return res;
}

void test()//Training and activate SVM
{
    int setlen, veclen;
    float **trainingData = getTraininigData(&setlen, &veclen);
    float *labels = new float[dataSetLength];
    for(int i = 0; i < dataSetLength; i++)
    {
        labels[i] = (i < dataSetLength/2)? 0.0 : 1.0;
    }
    cv::Mat labelsMat(setlen, 1, CV_32FC1, labels);
    cv::Mat trainingDataMat(setlen, veclen, CV_32FC1, trainingData);

    cv::SVMParams params;
    params.svm_type    = cv::SVM::C_SVC;
    params.kernel_type = cv::SVM::LINEAR;
    params.term_crit   = cv::TermCriteria(CV_TERMCRIT_ITER, 100, 1e-6);
    std::cout<<labelsMat<<"\n";

    cv::SVM SVM;
    SVM.train(trainingDataMat, labelsMat, cv::Mat(), cv::Mat(), params);
    cv::Mat img = cv::imread("../faces/s1/2.pgm", 0);//sample from train data, but ansewer is 1 for every sample
    auto desc = getHOG(img, &veclen);
    cv::Mat sampleMat(1, veclen, CV_32FC1, desc);
    float response = SVM.predict(sampleMat);
    std::cout<<"resp "<< response<<"\n";
}

私のコードの何が問題なのですか?

PS 書き間違い失礼しました。私の母国語ではない英語

4

1 に答える 1

3
  1. トレーニング データがあまりありません。Dalal と Triggs が HOG に関する元の論文 ( http://lear.inrialpes.fr/people/triggs/pubs/Dalal-cvpr05.pdf ) で何千もの例を使用して SVM をトレーニングしたことに注意してください。ポジティブ。
  2. C パラメータを設定していません (クロス検証で適切な値を見つける必要があります)。さらにデータが必要です。
  3. 顔と車の HOG 記述子は、線形カーネルでは分離できない可能性があります。RBF を試してください。しかし、D&L は論文で線形 SVM を使用しているため、これが問題になる可能性は低いです。
  4. これを読んでください: http://www.csie.ntu.edu.tw/~cjlin/papers/guide/guide.pdf
  5. まだこれを行っていない場合は、より単純なケースで SVM を動作させるようにしてください (たとえば、HOG の代わりにイメージ パッチを使用するだけです)。
于 2013-05-20T14:22:43.400 に答える