界面展示


这是主界面。打开摄像头,能进行人脸捕捉并显示在屏幕上,自动连接数据库,显示出对应人脸的信息,并进行上下班打卡。

相关开发工具

数据库:Microsoft SQL Server Management Studio 17
OpenCV:OpenCV-2.4.13
人脸检测库:Libfacedetection

它是由作者ShiqiYu发布在Github上的遵循MIT开源协议的公共库,是一个用于图像中人脸检测和人脸标识检测的二进制库。github地址:https://github.com/ShiqiYu/libfacedetection

人脸识别模型:SphereFace-20

关于SphereFace网络模型的理论基础,可参考下面链接
https://blog.csdn.net/qianqing13579/article/details/78288780

深度学习框架:Caffe

搭建Windows版本的Caffe 无论是CPU还是GPU环境的,都可参考下面链接
https://blog.csdn.net/kaychangeek/article/details/79885494

编译环境:VS2013

VS2013配置OpenCV https://blog.csdn.net/bryant_meng/article/details/79863921

关键代码、函数功能说明

1. 【关于编写CaffeVggface.dll 动态库】

caffe自带的classification比较复杂,希望在自己的项目中进行测试,减去不需要的代码。下面给出改写的代码。
改写Caffe自带的classification.cpp,编写CaffePredefine函数(即原本Classifierl的构造函数)

void CaffeClassification::CaffePredefine(std::string param_file, std::string pretrained_param_file, std::string labels_file,int classfymode)
{//param_file表示配置文件prototxt,pretrained_param_file表示训练好的模型文件
//labels_file标签文件,classfymode用0代表gqu训练,1代表CPU训练
#ifdef ZQ_CPU_ONLY  Caffe::set_mode(Caffe::CPU);//如果caffe是只在cpu上运行的,将运行模式设置为CPU
#else  Caffe::set_mode(Caffe::GPU);//一般我们都是用的GPU模式
#endif net.reset(new caffe::Net<float>(param_file, caffe::TEST));//加载配置文件,设定模式为TEST测试printf(pretrained_param_file.c_str());net->CopyTrainedLayersFrom(pretrained_param_file);//加载caffemodel,该函数在net.cpp中实现  memory_layer = (caffe::MemoryDataLayer<float> *)net->layers()[0].get();if (1 == classfymode){Blob<float>* input_layer = net->input_blobs()[0]; // 定义输入层变量input_geometry = Size(input_layer->width(), input_layer->height());//得到输入层图像大小}Blob<float>* output_layer = net->output_blobs()[0];if (labels_file.size() > 1){std::ifstream labelsfile(labels_file.c_str());string line;while (std::getline(labelsfile, line))labels.push_back(string(line));}
}

ExtractFeature函数,功能是获取网路模型中提取的特征值

int CaffeClassification::ExtractFeature(Mat img, vector<float> &rsvt, int rsnum,const std::string& blobname)
{ //img网络训练的输入图片,rsvt存储图片在网络中被提取出的特征值//rsnum要提取的特征值数目,blobname向网络中的哪个层获取特征值std::vector<Mat> test = { img };std::vector<int> testLabel = { 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;input_vec.clear();net->Forward(input_vec);//前向传导boost::shared_ptr<caffe::Blob<float>> fcblob = net->blob_by_name(blobname);  //InnerProduct 输出rsvt.clear();int featurenum = 0;//vector<float> tmpvc;while (featurenum < rsnum){rsvt.push_back(fcblob->data_at(0, featurenum++, 1, 1));}return 1;
}

CaffeVggFace.cpp为动态库,定义CaffeClassification对象,调用相关接口函数。
extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。被extern "C"修饰的变量和函数是按照C语言方式编译和连接的。引入extern "C"的目的是,实现C++与C及其它语言的混合编程。

CaffeClassification CaffeOBJ;extern "C" __declspec(dllexport) int InitDLL(char *prototxtname, char* caffemodelname,char* labelname,int classfymode)
{CaffeOBJ.CaffePredefine(prototxtname, caffemodelname, labelname,classfymode);return 1;
}extern "C" __declspec(dllexport) int FacedataToFeaturedata(unsigned char *pimgdata,int wid,int hi,double *pfeaturedata,int featurenum)
{Mat srcmat(hi, wid, CV_8UC3);memcpy(srcmat.data, pimgdata, wid*hi * 3);vector<float> rsvt;//rsvt.clear();CaffeOBJ.ExtractFeature(srcmat, rsvt, featurenum, "fc5");for (int i = 0; i < featurenum; ++i){pfeaturedata[i] = rsvt[i];}return 1;
}

2. 【人脸识别系统实现】

FaceDetect.cpp //人脸规范化处理。利用libfacedetect接口(facedetect_multiview_reinforce函数),从图片中检测人脸,对人脸区域的大小进行调整并保存。效果如下:

伪代码:

CNNFaceFeatureExtract.cpp //调用前面写好的动态库CaffeVggface.dll,传入配置文件prototxt、训练好的模型,进行特征提取。

extern "C" __declspec(dllexport) int InitDLL(char *prototxtname, char* caffemodelname, char* labelname, int classfymode);
extern "C" __declspec(dllexport) int FacedataToFeaturedata(unsigned char *pimgdata, int wid, int hi, double *pfeaturedata, int featurenum);CNNFaceFeatureExtract::CNNFaceFeatureExtract()
{InitDLL("sphereface_deploy.prototxt", "sphereface.caffemodel", "", 0);
}CNNFaceFeatureExtract::~CNNFaceFeatureExtract()
{    }
int CNNFaceFeatureExtract::FaceFeatureExtract(unsigned char *pimgdata, int wid, int hi, double *pfeaturedata, int featurenum)
{FacedataToFeaturedata(pimgdata, wid, hi, pfeaturedata, featurenum);return 1;
}

ADOConn.cpp //实现SQLServer数据库的基本操作(使用了ADODB类库,可实现对任意数据库的存取和访问)
REGISTER.cpp //员工信息注册(包括人脸注册)一共有5个数据内容(id、name、department、image、feature)
void CREGISTER::Register(CString m_filename, int id, CString name, CString depart) //连接SQL数据库,读取照片(通过摄像头拍摄),将图片转化为二进制存储在数据库中,如:

_StreamPtr  pStm;
pStm.CreateInstance("ADODB.Stream");
variant_t   varOptional(DISP_E_PARAMNOTFOUND, VT_ERROR);
pStm->PutType(adTypeBinary);
pStm->Open(varOptional, adModeUnknown, adOpenStreamUnspecified, _bstr_t(), _bstr_t());
//获取图像并转化为二进制
CString strr;
strr.Format("%s", m_filename);
pStm->LoadFromFile(_bstr_t(strr));//读入文件
variant_t  varBLOB = pStm->Read(adReadAll);pRst->GetFields()->GetItem("image")->AppendChunk(varBLOB);   // 图片写入

类似的,将检测出的人脸传入训练好的模型中,提取特征值,转化为二进制存入数据库(因为特征值有512个,统一转化为一个二进制存储,更方便)
FaceContrast2Dlg.cpp //实现界面上所有响应函数

  • OnBnClickedButton4() //摄像获取图像,从摄像头读入图片,保存在本地
  • Check(CString file) //(重点) 传入之前保存图片的路径,调用FaceDetectObj.FaceDetectNormal进行人脸检测并规范化,再调用FeatureExtractObj.FaceFeatureExtract,提取网络模型中的人脸特征值(根据模型设计,输出了512个特征点),连接数据库,查找对应id的人脸特征值,通过余弦距离计算,比对人脸相似度,若>=阈值,则人脸匹配成功,可进行有员工权限的一切系统操作。
  • OnBnClickedButton3() //上班打卡,逻辑:先判断数据库中是否已经有今天的打卡记录,若没有,则获取当地时间,比对系统设置的上班时间,判断是否迟到,迟到了多久,并记录到数据库中。
  • OnBnClickedButton5()//下班打卡
  • OnBnClickedButton6() //查看个人基本信息
  • OnBnClickedButton7()//查看个人近期打卡日志
  • 数据库中建了四张表(“people”“login_table”“off_table”“administer”)

INFO.cpp //查看个人基本信息的功能实现,关键代码:从数据库中把二进制的人脸图片转化为bmp位图,例如:

————————————————————————————————————————————
补充Caffe模型训练的几点内容:

  • 首先准备训练的图像数据。下载 CASIA-WebFace人脸训练集,里面包括了10575个人的494414张照片,按照7:3的比例把人脸图像分成训练数据和测试数据,并对该人脸图像进行人脸检测和人脸归一化、标准化处理。效果如下
  • 所有图像数据预处理完成后,生成训练和测试文件中所有图像对应的文本清单。利用Caffe的create_imagenet程序直接生成可训练的文件格式lmdb。在输入层data层修改source参数即训练文件的路径,调整Solver文件,修改其中stepvalue值,开始重新训练SphereFace网络模型。
  • 准备一组测试验证数据即LFW人脸数据库。

传送门:
CASIA-WebFace数据集下载 密码:abkq
LFW数据下载 密码:g2oj

基于SphereFace深度学习的人脸考勤系统(Caffe+windows+OpenCV)相关推荐

  1. python dlib caffe人脸相似度_基于深度学习的人脸识别系统(Caffe+OpenCV+Dlib)【一】如何配置caffe属性表...

    前言 基于深度学习的人脸识别系统,一共用到了5个开源库:OpenCV(计算机视觉库).Caffe(深度学习库).Dlib(机器学习库).libfacedetection(人脸检测库).cudnn(gp ...

  2. 基于深度学习的人脸识别系统(Caffe+OpenCV+Dlib)【三】VGG网络进行特征提取

    前言 基于深度学习的人脸识别系统,一共用到了5个开源库:OpenCV(计算机视觉库).Caffe(深度学习库).Dlib(机器学习库).libfacedetection(人脸检测库).cudnn(gp ...

  3. 基于深度学习的人脸识别系统系列(Caffe+OpenCV+Dlib)——【六】设计人脸识别的识别类...

    前言 基于深度学习的人脸识别系统,一共用到了5个开源库:OpenCV(计算机视觉库).Caffe(深度学习库).Dlib(机器学习库).libfacedetection(人脸检测库).cudnn(gp ...

  4. 基于Python的(拍照签到+网课在线检测)深度学习的人脸识别系统

    摘 要 近年来,网络技术日新月异,我们已经进入了大数据的时代并成为其中第一员,由此带来数据量的飞跃式的增长,而如何利用这些数据产生实际的生产价值则成为了大数据时代的一个重要问题.而人脸识别技术是一份对 ...

  5. 基于AI深度学习的缺陷检测系统

    1. 基于AI深度学习的工业缺陷检测现状 在工业生产中,由于生产和运输环境中的不可控因素,很容易产生划痕.压伤.擦挂等缺陷.而其中的缺陷大部分都极其微小,甚至是肉眼难以识别,这些缺陷所造成的坏品率极大 ...

  6. 基于Python深度学习的人脸识别考勤(戴口罩、多人)

    该"基于深度识别的人脸识别线下课堂考勤"系统有"人脸识别考勤","考勤信息统计"等主要功能组成,其中戴口罩识别及多人识别均可成功实现.涉及& ...

  7. 基于深度学习的人脸识别系统:卷积神经网络实现(VIPLFaceNet、VGGNet、Xception、ResNet50、ResNet18)、AM-Softmax损失

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) ResNet结构并分析其在计算机视觉方面取得成功的原因 Res ...

  8. 基于Matlab深度学习目标检测算法系统GUI,单目标、多目标检测

            深度学习是一种功能强大的机器学习方法,可用于训练稳健的目标检测器.目标检测有多种方法,包括 Faster R-CNN 和 you only look once (YOLO) v2!本文 ...

  9. 毕业设计 深度学习 机器视觉 人脸识别系统 - opencv python

    文章目录 0 前言 1 机器学习-人脸识别过程 人脸检测 人脸对其 人脸特征向量化 人脸识别 2 深度学习-人脸识别过程 人脸检测 人脸识别 Metric Larning 3 最后 0 前言

最新文章

  1. It is currently in use by another Gradle instance
  2. 【LeetCode】154. Find Minimum in Rotated Sorted Array II (3 solutions)
  3. SEO小程:医院网站优化之如何分析竞争对手的网站
  4. fedora17用yum下载包而不安装包
  5. P1892-团伙【图论,并查集】
  6. double和float的误区!
  7. 丹佛机场行李系统Postmortem
  8. 面试稳了!网易资深工程师详解运维面经!
  9. mysql BDB支持表锁吗_mysql 表锁问题
  10. 做工作流时候 Mybatis 在 insert 之后想获取自增的主键 id,但却总是返回1
  11. 我也发个图 娱乐一下
  12. Qt语言家使用中遇到的问题及解决方案
  13. 计算机网络第三章课后答案第七版(谢希仁著)
  14. 用计算机修改图片或照片,【如何更改图片像素】电脑上如何改照片像素
  15. 一行 Python 能实现什么丧心病狂的功能?
  16. QT打包软件在另一电脑运行后出现Cannot load library XXX.dll之解决方案-MSVC编译器
  17. Stimulsoft 报表工具单元格内换行
  18. ERES BRES的区别
  19. 路由器vueRouter
  20. CodeForces1214C

热门文章

  1. 我们日常应用的古代智慧—反其道而行之
  2. win10安全中心(win10安全中心怎么关闭)
  3. 钉钉直播回放下载解决方案
  4. 迈拓恢复出厂设置图解_电脑系统怎么重置呢?教你恢复出厂设置
  5. PHP代码审计DVWA[CSP Bypass]
  6. vue路由嵌套无法渲染 页面空白
  7. 沙巴克服务器占用,传奇怎么设置传奇服务端沙巴克自动攻城
  8. Jupyter Notebook 如何安装 + 使用?【审核5次重磅发布】
  9. 分数乘法计算机题,《分数乘法》测试题
  10. 世界需要简化第五篇:阅读本文需要有基础,仅一文教你快速应用FOC的SVPWM实现三相异步电机调速?快速学会使用著名的电机SVPWM调速控制算法——史上最简单易懂,算法经高度抽象简化,所有下标经仔细核对