1. 程式人生 > >人臉識別之性別實現

人臉識別之性別實現

說明一下,我的實現是將一張影象輸入到程式中,程式給出這張圖片的屬性值,包括:性別、是否帶帽子、是否戴眼鏡、是否帶口罩以及遮擋物的顏色。

說說思想吧,當然遮臉跳過了蒐集和訓練的這一步,這實現這一步包括了蒐集和訓練。我採用PCA(主成分分析演算法)來實現訓練和預測,用HSV顏色空間H值分量來進行顏色匹配。

這裡略去PCA演算法的原理講解,也略去HSV顏色空間匹配方法的介紹,如果有疑問的就在下面評論指出,當然不足之處也請指出,共同學習,共同進退:

由於整個程式程式碼有700多行,下面給出部分程式碼

蒐集和學習程式碼部分:

//性別的識別
int sex_Rec(string fn_csv, string tn_csv)
{
int returnSex;
vector<Mat> allImages, train_images;
vector<int> allLabels, train_labels;


vector<Mat> testImages, test_images;
vector<int> testLabels, test_labels;




//-------------------------訓練集---------------------//
try {
read_csv(fn_csv, allImages, allLabels);
}
catch (cv::Exception& e) {
cerr << "Error opening file " << fn_csv << ". Reason: " << e.msg << endl;
exit(1);
}


for (int i = 0; i < allImages.size(); i++)
equalizeHist(allImages[i], allImages[i]);


int photoTrainNumber = allImages.size();
for (int i = 0; i < photoTrainNumber; i++)
{
train_images.push_back(allImages[i]);
train_labels.push_back(allLabels[i]);
}


//------------------------訓練結束---------------------//


//-------------------------測試---------------------------//
try {
read_csv(tn_csv, testImages, testLabels);
}
catch (cv::Exception& e) {
cerr << "Error opening file " << fn_csv << ". Reason: " << e.msg << endl;
exit(1);
}


for (int i = 0; i < testImages.size(); i++)
equalizeHist(testImages[i], testImages[i]);


int photoTestNum = testImages.size();
for (int i = 0; i < photoTestNum; i++)
{
test_images.push_back(testImages[i]);
test_labels.push_back(testLabels[i]);
}
//------------------------測試結束----------------------//


Ptr<FaceRecognizer> model = createEigenFaceRecognizer();//定義pca模型  
model->train(train_images, train_labels);//訓練pca模型,這裡的model包含了所有特徵值和特徵向量


int predictedLabel;
int testPhotoNum = test_images.size();
for (int i = 0; i < testPhotoNum; i++)
{
predictedLabel = model->predict(test_images[i]);
if (test_labels[i] == predictedLabel)
{
if (0 == predictedLabel)
{
returnSex = 0;
//cout << "性別: 女" << endl;
}
else
{
returnSex = 1;
//cout << "性別: 男" << endl;
}
}
else
{
returnSex = -1;
//cout << "ERROR : 未能預測出性別!" << endl;
}
}
return returnSex;
}

這裡我設定了返回值來方便我自己的整個程式對性別識別部分的呼叫。由於太長了,就接下篇博文吧!!