私はopencv 2.4.2 C++を実行しています。SVM for People Recognitionの使い方は?
私はopencvを使って人々の認識をしようとしています。
私は、さまざまな方向の異なる人を含むVidTIMITデータセットを使用しています。
私はCvSVMを使ってこれらの人々を分類しています。
私の問題は、svmの出力は常に同じであるということです。
私は従うアルゴリズムは次のとおりです。顔のハールを使用して
- 顔検出
- リサイズ(58 * 58)
- SVMトレーニング
- 分類
今、私は訓練に何か間違っていたのだろうかと思っています。
私は5(num_name)person、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";
}
はあなたが私を助けることができると思います。
を取得するには、このリンクを見て、CA – Gappa