मैं ओपनसीवी 2.4.2 सी ++ चला रहा हूं।लोगों की पहचान के लिए एसवीएम का उपयोग कैसे करें?
मैं ओपनसीवी का उपयोग करके लोगों की पहचान करने की कोशिश कर रहा हूं।
मैं VidTIMIT डेटासेट का उपयोग कर रहा हूं जिसमें विभिन्न अभिविन्यास में अलग-अलग लोग शामिल हैं।
मैं इन लोगों को वर्गीकृत करने के लिए सीवीएसवीएम का उपयोग कर रहा हूं।
मेरी समस्या यह है कि svm का आउटपुट हमेशा एक जैसा होता है।
एल्गोरिथ्म है कि मैं का पालन करें:
- चेहरा हार
- चेहरे के आकार (58 * 58)
- SVM प्रशिक्षण
- वर्गीकरण
का उपयोग कर पता लगाने अब, मैं सोच रहा हूं कि मैंने प्रशिक्षण में कुछ गलत किया है।
मैं इस विधि को 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";
}
आशा है कि आप मेरी मदद कर सकते हैं।
आपको बहुत बहुत – Gappa