编译dlib

从官方网站下载

准备好人脸数据

准备好人脸数据,放入各自的文件夹,然后给文件夹起好名字,这里就是人的名字拼音首字。准备好test数据

test数据也是图片,一次对比一张,其外,还要有dlib的face模型,包含两个文件,一个是dlib_face_recognition_resnet_model_v1.dat和shape_predictor_68_face_landmarks.dat,两个文件,在运行过程中必须加载

//查找文件夹下面的所有文件夹

//人名的文件夹
void face_reco::listfiles(std::string dir,std::string namefolder)
{intptr_t handle;_finddata_t findData;string dirfilter =dir + "/" +  namefolder + "/" + "*.*";handle = _findfirst(dirfilter.c_str(), &findData);    // 查找目录中的第一个文件if (handle == -1){cout << "Failed to find first file!\n";return;}face_desc desc;desc.name = namefolder;//子文件夹的名称为人名do{if (!(findData.attrib & _A_SUBDIR))desc.files.push_back(findData.name);} while (_findnext(handle, &findData) == 0);    // 查找目录中的下一个文件//cout << "Done!\n";_findclose(handle);    // 关闭搜索句柄face_desc_vec.push_back(desc);}void face_reco::listfolder(std::string dir, std::vector<string> & names)
{intptr_t handle;_finddata_t findData;string dirfilter = dir + "/" + "*.*";handle = _findfirst(dirfilter.c_str(), &findData);    // 查找目录中的第一个文件if (handle == -1){cout << "Failed to find first file!\n";return;}do{if (findData.attrib & _A_SUBDIR)//&& strcmp(findData.name, ".") != 0//&& strcmp(findData.name, "..") != 0//)    // 是否是子目录并且不为"."或".."{if (findData.name[0] != '.')names.push_back(findData.name);//cout << findData.name << "\t<dir>\n";}else //否则是文件{//子文件//face_desc_vec.files.push_back(findData.name);}//cout << findData.name << "\t" << findData.size << endl;} while (_findnext(handle, &findData) == 0);    // 查找目录中的下一个文件//cout << "Done!\n";_findclose(handle);    // 关闭搜索句柄}int face_reco::load_db_faces_prepare(string folder)
{// We will also use a face landmarking model to align faces to a standard pose:  (see face_landmark_detection_ex.cpp for an introduction)deserialize("./shape_predictor_68_face_landmarks.dat") >> sp;// And finally we load the DNN responsible for face recognition.deserialize("./dlib_face_recognition_resnet_model_v1.dat") >> net;std::vector<string> vecs;listfolder(folder.c_str(), vecs);auto iter = vecs.begin();while(iter != vecs.end()){//文件夹名称就是人名string name = *iter;cout << name << endl;//string mfolder = folder + "/" + name;listfiles(folder,name);iter++;}//把所有的文件都放到数据结构中,开始读取并且获取值load_faces(folder);return 0;
}void face_reco::load_faces(string folder)
{frontal_face_detector detector = get_frontal_face_detector();auto iter = face_desc_vec.begin();while (iter != face_desc_vec.end()){face_desc &desc = *iter;matrix<rgb_pixel> img;string path = folder + "/" + desc.name +"/"+ desc.files[0];cout <<"path is " << path << endl;//char path[260];//sprintf_s(path, "%s/%s/%s", folder.c_str(),desc.name.c_str(),desc.files[0].c_str());load_image(img, path);//image_window win(img);for (auto face : detector(img)){auto shape = sp(img, face);matrix<rgb_pixel> face_chip;extract_image_chip(img, get_face_chip_details(shape, 150, 0.25), face_chip);//Record the all this face's information//FACE_DESC sigle_face;desc.face_chip = face_chip;//sigle_face.name = fileinfo.name;std::vector<matrix<rgb_pixel>> face_chip_vec;std::vector<matrix<float, 0, 1>> face_all;face_chip_vec.push_back(move(face_chip));//Asks the DNN to convert each face image in faces into a 128D vectorface_all = net(face_chip_vec);//Get the feature of this personstd::vector<matrix<float, 0, 1>>::iterator iter_begin = face_all.begin(),iter_end = face_all.end();if (face_all.size() > 1) break;desc.face_feature = *iter_begin;//all the person description into vector//face_desc_vec.push_back(sigle_face);}iter++;}}

以上过程就是程序拿到取走文件夹中所有文件进行学习,实际上dlib本身是使用的dnn方式来训练网络数据的。

调用过程

#include "face_recognition_dlib.h"
#include "Sort_method.h"
#include <vector>
#include <string>
using namespace std;
#include <io.h>typedef struct face_pics
{string name;std::vector<string> pics;
}face_pics;int load_folder_jpg()
{return 0;
}face_reco face_recognize;int compareone(face_desc &desc)
{return 0;}int main(int argc, char** argv)
{//std::vector<string> folder;//listFiles("H:/git/dlib/qb_recognize/qbrecog/bin/face/*.*",folder, true);//FACE_RECOGNITION dlib;if (argc == 1){cout << "Give some image files as arguments to this program." << endl;return 0;}cout << "processing image " << argv[1] << endl;std::string ff = "face";face_recognize.load_db_faces_prepare(ff);matrix<rgb_pixel> face_cap;//save the capture in the project directoryload_image(face_cap, argv[1]);image_window win(face_cap);//Display the raw image on the screen//image_window win1(face_cap);frontal_face_detector detector = get_frontal_face_detector();std::vector<matrix<rgb_pixel>> vect_faces;for (auto face : detector(face_cap)){auto shape = face_recognize.sp(face_cap, face);matrix<rgb_pixel> face_chip;extract_image_chip(face_cap, get_face_chip_details(shape, 150, 0.25), face_chip);vect_faces.push_back(move(face_chip));//win1.add_overlay(face);}if (vect_faces.size() != 1){cout << "Capture face error! face number " << vect_faces.size() << endl;return -1;}//Use DNN and get the capture face's feature with 128D vectorstd::vector<matrix<float, 0, 1>> face_cap_desc = face_recognize.net(vect_faces);//Browse the face feature from the database, and find the match onestd::pair<double, std::string> candidate_face;std::vector<double> len_vec;std::vector<std::pair<double, std::string>> candi_face_vec;candi_face_vec.reserve(256);cout << "face find " << face_recognize.face_desc_vec.size() << endl;for (size_t i = 0; i < face_recognize.face_desc_vec.size(); ++i){auto len = length(face_cap_desc[0] - face_recognize.face_desc_vec[i].face_feature);cout << "len is " << len << endl;if (len < 0.4){len_vec.push_back(len);candidate_face.first = len;candidate_face.second = face_recognize.face_desc_vec[i].name.c_str();candi_face_vec.push_back(candidate_face);//#ifdef _FACE_RECOGNIZE_DEBUG
//          char buffer[256] = { 0 };
//          sprintf_s(buffer, "Candidate face %s Euclid length %f",
//              face_recognize.face_desc_vec[i].name.c_str(),
//              len);
//          MessageBox(CString(buffer), NULL, MB_YESNO);
//#endif}else{cout << "This face from database is not match the face, continue!" << endl;}}//Find the most similar faceif (len_vec.size() != 0){shellSort(len_vec);int i(0);for (i = 0; i != len_vec.size(); i++){if (len_vec[0] == candi_face_vec[i].first)break;}char buffer[256] = { 0 };sprintf_s(buffer, "The face is %s -- Euclid length %f",candi_face_vec[i].second.c_str(), candi_face_vec[i].first);cout << buffer << endl;/*if (MessageBox(CString(buffer), NULL, MB_YESNO) == IDNO){face_record();}*/}else{cout << "not found" << endl;/*if (MessageBox(CString("Not the similar face been found"), NULL, MB_YESNO) == IDYES){face_record();}*/}//char a;getchar();return 0;
}

以上就是整个训练和使用过程,比较简单,读者可以继续深入研究,比如人脸图片曝光过强去除,人脸对齐等等,都是需要调整的,上面代码并不包含这些。

使用dlib 进行人脸识别相关推荐

  1. python人脸识别毕业设计-Python基于Dlib的人脸识别系统的实现

    之前已经介绍过人脸识别的基础概念,以及基于opencv的实现方式,今天,我们使用dlib来提取128维的人脸嵌入,并使用k临近值方法来实现人脸识别. 人脸识别系统的实现流程与之前是一样的,只是这里我们 ...

  2. 都说dlib是人脸识别的神器,那到底能不能识破妖怪的伪装?

    作者:盛光晓 原文链接:https://blog.csdn.net/esa72ya/article/details/89189987 众所周知,dlib是人脸识别的利器,被广泛应用于行为检测.安防工程 ...

  3. python怎么另起一行阅读答案_使用Python+Dlib构建人脸识别系统(在Nvidia Jetson Nano 2GB开发板上)...

    Nvidia Jetson Nano 2GB开发板是一款新的单板机 售价59美元 运行带有GPU加速的人工智能软件.在2020年 你可以从一台售价59美元的单板计算机中获得令人惊叹的性能 让我们用它来 ...

  4. dlib实现人脸识别方法

    文章目录 概述 方法实现 实现步骤 示例代码 重载方法 概述 此示例演示如何使用dlib作为人脸识别工具,dlib提供一个方法可将人脸图片数据映射到128维度的空间向量,如果两张图片来源于同一个人,那 ...

  5. 使用Python+Dlib构建人脸识别系统(在Nvidia Jetson Nano 2GB开发板上)

    Nvidia Jetson Nano 2GB开发板是一款新的单板机,售价59美元,运行带有GPU加速的人工智能软件. 在2020年,你可以从一台售价59美元的单板计算机中获得令人惊叹的性能,让我们用它 ...

  6. dlib库包的介绍与使用,opencv+dlib检测人脸框、opencv+dlib进行人脸68关键点检测,opencv+dlib实现人脸识别,dlib进行人脸特征聚类、dlib视频目标跟踪

    文章目录: 1 dlib库介绍 2 dlib人脸检测:绘制出人脸检测框 2.1 dlib人脸检测源码 2.2 opencv + dlib 人脸检测 2.3 dlib人脸检测总结 3 dlib人脸关键点 ...

  7. python dlib opencv人脸识别准确度_基于dlib和opencv库的人脸识别

    基于dlib和opencv库的人脸识别 需下载68个特征点的人脸检测模型: http://dlib.net/files/ 文件名为shape_predictor_68_face_landmarks.d ...

  8. 写个神经网络,让她认得我`(๑•ᴗ•๑)(Tensorflow,opencv,dlib,cnn,人脸识别)

    训练一个神经网络 能让她认得我 阅读原文 这段时间正在学习tensorflow的卷积神经网络部分,为了对卷积神经网络能够有一个更深的了解,自己动手实现一个例程是比较好的方式,所以就选了一个这样比较有点 ...

  9. Java + Dlib实现人脸识别

    一. 效果展示 示例1 示例2 人脸识别演示 在学习人脸识别的过程中,刚开始我是从opencv开始学习的,后来发现还有一种使用dlib来检测的方法,并且,在图像处理中,有些美颜功能,例如数字化妆功能, ...

  10. 基于C#结合dlib实现人脸识别及眼部识别【附源码】

    文章目录 前言 一.库的引用 二.代码调用 工程构建 建立panel控件 定义人脸识别类 开启摄像头.调用算法 总结 前言 本文基于C#及dlib及emgu结合使用实现摄像头人脸定位及眼部定位,读者可 ...

最新文章

  1. 【笔记】opencv图像轮廓 获得平均灰度值在原图上画轮廓 观察灰度图的分解
  2. Hadoop安装记录
  3. [LuoguP1064][Noip2006]金明的预算方案
  4. 在MapPath的Path参数中不允许字符'..',解决方法。
  5. android The public type classname must be defined in its own file 报错
  6. java7创建线程_Java 并发编程学习(七):正确地创建线程池
  7. 二、信号分解 —> 变分模态分解(VMD)学习笔记
  8. 威纶通触摸屏制作自定义弹出窗口的具体方法(3种)
  9. Java 读取shp文件,生成shp文件,通过shp文件自动建库
  10. VOCALOID Job Plugin API 任务插件开发参考手册中文翻译 V1.0
  11. python爬取谷歌学术_对于python抓取google搜索结果的一些了解
  12. 311 - Technology 102 - Consumer Cyclical 中选市值最大的12只股票,一个月调仓一次
  13. 结束 oracle 锁 ps -ef|grepp.spid,oracle 解锁表剔除去session 和kill
  14. A cost-effective recommender system for taxi drivers
  15. 一夜撸700万,羊毛党不光薅羊毛,还吃羊肉吸羊血。
  16. 给HTML页面设置背景音乐
  17. 软考程序员有必要考吗?
  18. Java处理小数点精度
  19. 【leetcode】537. Complex Number Multiplication(Python C++)
  20. 别人的随笔(非常有用)

热门文章

  1. 边拍照边显示弹幕 小米公开拍摄相关专利
  2. 年入10亿,“山寨”耳机芯片凶猛
  3. “媲美百万豪车”!首款华为鸿蒙汽车正式发布:定名问界M5 25万起售
  4. 三星Galaxy S22 Ultra真机首曝:颜值与实力并存堪称完美
  5. 美柚或赴境外IPO 阿里京东等为其客户
  6. realme真我GT大师版来了:继续由深泽直人操刀
  7. 江苏通报“中通宠物盲盒”事件:已立案调查
  8. 抖音发布女性数据报告:平均每天31.8万女性发布自拍视频又删除
  9. 是谁掌控了丁真的故事走向?
  10. 山寨AirPods2020年出货量已达6亿副,是正版7倍,网友:怪不得满大街都是