前言
基于深度学习的人脸识别系统,一共用到了5个开源库:OpenCV(计算机视觉库)、Caffe(深度学习库)、Dlib(机器学习库)、libfacedetection(人脸检测库)、cudnn(gpu加速库)。
用到了一个开源的深度学习模型:VGG model。
最终的效果是很赞的,识别一张人脸的速度是0.039秒,而且最重要的是:精度高啊!!!
CPU:intel i5-4590
GPU:GTX 980
系统:Win 10
OpenCV版本:3.1(这个无所谓)
Caffe版本:Microsoft caffe (微软编译的Caffe,安装方便,在这里安利一波)
Dlib版本:19.0(也无所谓
CUDA版本:7.5
cudnn版本:4
libfacedetection:6月份之后的(这个有所谓,6月后出了64位版本的)
这个系列纯C++构成,有问题的各位朋同学可以直接在博客下留言,我们互相交流学习。
====================================================================
本篇是该系列的第五篇博客,介绍设计一个人脸识别的注册类与识别类用于具体的识别任务。
思路
回顾一下这个系列的前四篇博文,把人脸识别的整个任务剖析为了一个个的小任务。我们现在希望用我们定义的这些接口能够非常方便的进行人脸识别的任务,而且可以实现很短的时间内就匹配一个人脸。我们现在希望,可以将其用于一个具体的分类任务中。
我们可以自己来定义这个任务:假设我有20个人要进行人脸识别,我们希望通过我们设计的代码来实现这个任务。如何方便而又快捷的进行实现呢?
这里考虑设计两个类:Register与Recognition。当有人需要注册时,其信息会添加入Register类中的某个成员空间,这里我们用到的信息可以稍微简单一点:
姓名、注册图片、人脸空间。
其中姓名、注册图片是必须要的,而这个人脸空间的意思就是:我们可以实现很多不同场景下的人脸识别。比如在考勤方面,学校想要人脸识别时,受限于人脸数目众多,不可能把所有的人都放在一个数据库里。这个时候我们可以某个信息来区分他们,比如说:课程。 课程这个信息就可以算作一个人脸空间。当我们进行具体的识别时,只会在相应的人脸空间内进行匹配,而不会在其他的人脸空间内匹配。
由于在上一篇博客我们介绍了如何使用CUBLAS来进行人脸向量的运算,那么我们需要对代码进行一些修改,将其换为二维数组。
修改
ExtractFeature.h:
#include <opencv.hpp>
using namespace cv;
using namespace std;
float* ExtractFeature_(Mat FaceROI);//添加一个提取特征的函数
vector<float> ExtractFeature(Mat FaceROI);
void Caffe_Predefine();
在这里面添加相应的函数ExtractFeature.cpp:
float* ExtractFeature_(Mat FaceROI)
{
caffe::Caffe::set_mode(caffe::Caffe::GPU);
std::vector<Mat> test;
std::vector<int> testLabel;
test.push_back(FaceROI);
testLabel.push_back(0);
memory_layer->AddMatVector(test, testLabel);// memory_layer and net , must be define be a global variable.
test.clear();
testLabel.clear();
std::vector<caffe::Blob<float>*> input_vec;
net->Forward(input_vec);
boost::shared_ptr<caffe::Blob<float>> fc8 = net->blob_by_name("fc8");
int test_num = 0;
float FaceVector[