周末抽空将以前很久写过的人脸识别测试demo重新复现了下,主要的模块部分还算ok,主要是人脸数据的问题,数据量越多,识别相对越精准
人脸识别预测的步骤大致包括以下几步:
一、准备人脸相关数据照片
二、通过人脸检测分类器进行人脸的切割裁剪形成自己的人脸数据库
三、通过特征脸模块进行人脸的预训练与识别
大致的流程是这样,不过期间是有很多小细节的地方需要在做的时候多注意
- 这里先放最后的预测结果吧,预测可以通过打开摄像头的方式进行实时预测,而我这里是自己做了一个视频,以视频流的方式读入作为实时预测,
强调一下,视频流也可以直接用程序demo的,通过图像的切割分割,这里需要自己提前算好切割的尺寸与距离
放图先看效果
可以看到效果还可以,都能预测正确,预测精度主要取决于你的数据库人脸数据的大小 - 而我这里基本每一类都只是放了10张人脸照而已
这里基本上是采用监督的学习方式,主要是通过学习特征脸的特征数据,形成一个人脸数据库,然后通过实时的人脸检测提取人脸特征进行数据库的label预测标签的对比
- 这里我是通过在网上下载10类的明星照片作为初始的人脸数据照片
- 每一个文件夹代表一个类别,文件夹里面放相应的人脸照数据
- 然后通过人脸检测模块提取人脸部分进行数据的整合,得到以下的人脸数据
- 这里把人脸检测与识别的主要核心模块代码放出来
// train it
Ptr<BasicFaceRecognizer> model = EigenFaceRecognizer::create();
model->train(images, labels);
// recognition face
int predictedLabel = model->predict(testSample);
printf("actual label : %d, predict label : %d\n", testLabel, predictedLabel);
CascadeClassifier faceDetector;
faceDetector.load(haar_face_datapath);
//VideoCapture capture(0);
VideoCapture capture("C:/Users/cheng/Desktop/myface/myface.avi");
if (!capture.isOpened()) {
printf("could not open camera...\n");
return -1;
}
Mat frame;
namedWindow("face-recognition", WINDOW_AUTOSIZE);
vector<Rect> faces;
Mat dst;
while (capture.read(frame)) {
flip(frame, frame, 1);
faceDetector.detectMultiScale(frame, faces, 1.1, 3, CASCADE_SCALE_IMAGE, Size(50, 50), Size(380, 400));
//faceDetector.detectMultiScale(frame, faces, 1.1, 3, CASCADE_SCALE_IMAGE, Size(30, 30));
for (int i = 0; i < faces.size(); i++) {
Mat roi = frame(faces[i]);
cvtColor(roi, dst, COLOR_BGR2GRAY);
resize(dst, dst, testSample.size()); //数据类型与样本数据保持一致大小
int label = model->predict(dst);
cout << "predict_labels=" << label << endl;
rectangle(frame, faces[i], Scalar(255, 0, 0), 2, 8, 0);
//putText(frame, format("i'm %s", (label == predictedLabel ? "mumuxi" : "Unknow")), faces[i].tl(), FONT_HERSHEY_PLAIN, 1.0, Scalar(0, 0, 255), 2, 8);
putText(frame, format("i'm %s", string(Face_ID[label - 1])), faces[i].tl(), FONT_HERSHEY_PLAIN, 1.0, Scalar(0, 0, 255), 2, 8);
}
imshow("face-recognition", frame);
char c = waitKey(10);
if (c == 27) {
break;
}
}
然后代码里面有个csv文件,csv文件格式需要指明下,如下
前面一部分是人脸库的路径,后面是相应的标签值
怎么生成csv文件呢?
这里也把代码放出来,是用Python写的,很简单,遍历下文件夹就行
import os
path = "C:/Users/cheng/Desktop/myface/face_feature/"
for j in range(1, 11, 1):
dir_path = path + str(j)
dir_list = os.listdir(dir_path)
for i in dir_list:
print(dir_path + "/" + i + ";" + str(j))
具体的如果有童鞋像玩一下,需要完整的demo或者具体的流程步骤的话可以私聊博主哦!
或者关注公号<木木夕的算法笔记> 回复关键字’‘face’'可以找到文章 来找我玩吧,mua~
公众号会时不时更新有趣的图像算法哦!!!