【AI系列】<2> 基于Dlib的人脸识别项目思路讲解

1. 环境部署

  • 参考之前的文章:

https://blog.csdn.net/jobbofhe/article/details/78815944
https://blog.csdn.net/jobbofhe/article/details/79386160

搭建环境这件事,我想说没有一蹴而就的事情,别人的方案再详细(更何况常常完成之后写的方案总是概要的),自己在执行的时候也可能有不同的情况,所以认真对待过程中出现的每一个问题,一步一步解决,不要怕出错,一旦出错,这个时候正式培养解决问题的能力的时候。

2. 代码流程

  • 主要接口描述
#1. 初始化检测器,
frontal_face_detector detector = get_frontal_face_detector();

#2. 加载已训练好的模型
deserialize("shape_predictor_5_face_landmarks.dat") >> sp;
deserialize("dlib_face_recognition_resnet_model_v1.dat") >> net;

#3. 加载图片
matrix<rgb_pixel> img;
#将图片数据格式转为像素矩阵
load_image(img, "name.jpg");

#4. 检测图片中人脸位置
#这里将得到图片所有中人脸的位置坐标
std::vector<rectangle> dets = detector(img);

#5 根据检测的人脸位置坐标,提取人脸特征值
std::vector<matrix<rgb_pixel>> faces;
for(unsigned long j = 0; j < dets.size(); j++)
{
    auto shape = sp(img, dets[j]);
    matrix<rgb_pixel> face_chip;
    extract_image_chip(img, get_face_chip_details(shape,150,0.25), face_chip);
    faces.push_back(move(face_chip));
} 

#6. 使用DNN网络接口,将每一张人脸转为128维的特征值向量
std::vector<matrix<float,0,1>> face_descriptors = net(faces);

#7. 比较不同图片128维向量之间的距离
length(face_descriptors[i]-face_descriptors[j])

#距离越小说明人脸特征越接近,也就是同一个人的概率更大

说明:

  1. 在实际应用中,以上流程是通用的,唯一不同就是当我们选取不同的模型的时候,需要响应的修改模型和网络结构;
  2. 检测的数据除了不同格式的通篇之外,还可以是YUV等其他格式的数据这个时候就需要响应的修改保存像素值的数据结构。

3. YUV转matrix

从摄像头获取视频流,取帧得到YUV数据,由于dlib的源码中是直接加载jpg图片,转成matrix,这样会花去很多时间,YUV数据比Jpg小,所以在这里将YUV数据出入,并转换成matrix数据格式。

/********************************************************************************
功能          : YUV数据转转换为matrix
输入参数    : YUV数据,图片高,宽,补位,格式
返回值         : matrix<rgb_pixel>, 图片YUV数据转换成matrix 格式返回
*********************************************************************************/

matrix<rgb_pixel> yuv_2_matrix( 
    unsigned char * yuvData,  int iHeight,  
    int iWidth, int iStride, int iFormat 
    )
{
    matrix<rgb_pixel> img;
    img.set_size(iHeight, iWidth);

    if(NULL == yuvData )
    {
        cout << "YUV data error, Parameter is NULL !" << endl;
        exit(1);
    }
    int yLen = iHeight*iWidth;
    //int uLen = iHeight*iWidth/2;
    //int vLen = uLen;

    unsigned char *yData = new unsigned char [yLen];
    //int *uData = new int[uLen];
    //int *vData = new int[vLen];

    for (int i = 0; i < iHeight * iWidth; i++)
    {
        yData[i] = yuvData[i];
    }

    int k = 0;
    for (int i = 0; i < iHeight; i++)
    {
        for (int j = 0; j < iWidth; j++, k++)
        {
            rgb_pixel p((unsigned char )yData[k], (unsigned char )yData[k],  
            (unsigned char )yData[k]);
            /*  p->red   = a;
                p->green = a;
                p->blue  = a;
            */
            img(i, j) = p;
        }
    }
    delete yData;

    return img;
}

4. Cmake编译说明

说明一下编译,是生成一个.so文件

cmake_minimum_required(VERSION 2.8.12) 
project(project_name)

add_compile_options(-std=c++11)
SET(CMAKE_CXX_FLAGS "-fPIC")
SET(CMAKE_C_FLAGS "-fPIC")

# dlib自身依赖,重要
add_subdirectory(../dlib dlib_build)
add_library(face_recog SHARED face_recog.cpp) 
target_link_libraries(face_recog dlib::dlib) 
  • 注意:
    在实际写代码过程中,在理解了整个流程之后,最重要的的事情就是了解,Dlib提供的数据结构。

参考资料

北京大学Dlib group
http://net.pku.edu.cn/dlib/

Windows 环境,Dlib使用
http://blog.csdn.net/longji/article/category/7160812/

人脸识别领域最重要的数据集合是lfw
http://vis-www.cs.umass.edu/lfw/

模型地址:
http://dlib.net/files/shape_predictor_5_face_landmarks.dat.bz2
http://dlib.net/files/dlib_face_recognition_resnet_model_v1.dat.bz2

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
项目介绍】 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到94.5分,放心下载使用! 该资源适合计算机相关专业(如人工智能、通信工程、自动化、软件工程等)的在校学生、老师或者企业员工下载,适合小白学习或者实际项目借鉴参考! 当然也可作为毕业设计、课程设计、课程作业、项目初期立项演示等。如果基础还行,可以在此代码基础之上做改动以实现更多功能。 人脸识别考勤系统 本项目是一个基于 Python 的人脸识别考勤系统,主要使用了 `dlib`、`opencv`、`tkinter`、`PIL`、`pymysql` 等库,并使用了 KNN 算法进行人脸识别。 环境安装 在运行本项目之前,请确保已经安装了以下环境和库: - Python - PyCharm - dlib(需要 Cmake、Visual Basic、C++ 依赖环境) - opencv 库 - tkinter 库 - pymysql - PIL - threading - time 功能介绍 本项目具有以下功能: - 打开系统按钮:打开摄像头捕获人脸。 - 注册按钮:将人脸、学号、姓名信息存储到数据库中。 - 查看缺勤名单:将没有识别签到的学生学号和姓名导出到打开的名单界面。 - 是否开始训练:点击“是”按钮进行人脸模型的训练。 - 帮助按钮:查看使用软件的注意事项。 注意事项 在使用本项目之前,请注意以下事项: 1. 请先打开系统。 2. 注册时请对准人脸,光线充足。 3. 训练时禁止进行其他操作。 文件说明 本项目包含以下文件: - `recognition.py`:主文件。 - `db.py`:数据库文件。 - `help_tip.py`:帮助窗口文件。 - `precamera.py`:预处理文件。 - `late_name.py`:缺勤名单文件。 - `trained_knn_model.clf`:KNN 算法模型文件。 - `knn_examples` 文件夹:包含了训练集和测试集,仅供学习交流探讨使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值