天天看点

人脸识别之性别实现

说明一下,我的实现是将一张图像输入到程序中,程序给出这张图片的属性值,包括:性别、是否带帽子、是否戴眼镜、是否带口罩以及遮挡物的颜色。

说说思想吧,当然遮脸跳过了搜集和训练的这一步,这实现这一步包括了搜集和训练。我采用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;

}

这里我设置了返回值来方便我自己的整个程序对性别识别部分的调用。由于太长了,就接下篇博文吧!!

继续阅读