人脸跟踪、识别、脸部标识

知识点:

  1. 人脸跟踪
  2. 人脸特征
  3. 要识别的人脸特征距离

看效果图,鼻子部分已经被标识出来了:

主要用到了dlib

import dlib

predictor_path = ‘models\\shape_predictor_68_face_landmarks.dat‘
face_rec_model_path = ‘models\\dlib_face_recognition_resnet_model_v1.dat‘
detector = dlib.get_frontal_face_detector()                       #人脸跟踪
predictor = dlib.shape_predictor(predictor_path)                  #人脸68个特征点检测器
facerec = dlib.face_recognition_model_v1(face_rec_model_path)     #映射人脸为128维特征值

由于目标里还希望把鼻子区域标识出来(方便后续自己贴图上去),因此:

from imutils import face_utils

(noseStart, noseEnd) = face_utils.FACIAL_LANDMARKS_IDXS["nose"] 

#省略一部分代码,主要是省略了opencv调用摄像头逻辑代码

        success, img = cap.read()                                  #读取摄像头视频信息
        frame = imutils.resize(img, width=300)                     #resize,尺寸越小处理越快
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)             #变灰度图
        rects = detector(gray, 0)                                  #人脸区域跟踪
        rect = rects[0]                                            #假设只有1个区域存在人脸
        shape = predictor(gray, rect)                              #识别68个特征点
        shape = face_utils.shape_to_np(shape)                      #转换为numpy格式
        nose = shape[noseStart:noseEnd]                            #只拿鼻子区域的点
        noseHull = cv2.convexHull(nose)                            #把这些点转换为凸包
        cv2.drawContours(frame, [noseHull], -1, (0, 255, 0), 1)    #画出这些凸包外形
        cv2.putText(frame, "nose", (nose[0][0], nose[0][1]), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)         #文本标注

  

face_utils.FACIAL_LANDMARKS_IDXS,这个是对68个点的描述,有很多(有兴趣大家自己试试):
#For dlib’s 68-point facial landmark detector:
FACIAL_LANDMARKS_68_IDXS = OrderedDict([
	("mouth", (48, 68)),
	("inner_mouth", (60, 68)),
	("right_eyebrow", (17, 22)),
	("left_eyebrow", (22, 27)),
	("right_eye", (36, 42)),
	("left_eye", (42, 48)),
	("nose", (27, 36)),
	("jaw", (0, 17))
])

  

接下来就是识别人脸到底是谁了

def get_feature(path):
    img = imread(path)
    frame = img
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    dets = detector(gray, 0)
    shape = predictor(gray, dets[0])
    face_vector = facerec.compute_face_descriptor(img, shape)
    return face_vector

faces = [
           (get_feature(‘faces\\dbh.jpg‘), ‘McKay‘)
        ]

  目前就1张,所以只load了1个到faces array里

实际匹配代码如下:

def distance(a, b):
    a, b = np.array(a), np.array(b)
    sub = np.sum((a - b) ** 2)
    add = (np.sum(a ** 2) + np.sum(b ** 2)) / 2.
    r = sub / add
    return r
def process_face_id(faces, frame, rect, shape):
    found_face_id = ‘Unknown‘
    if len(faces) > 0:
        face_descriptor = facerec.compute_face_descriptor(frame, shape)
        min_face_id = found_face_id
        min_face_distance = 1
        for face_feature, face_id in faces:
            cur_distance = distance(face_feature, face_descriptor)
            if cur_distance < min_face_distance:
                min_face_distance = cur_distance
                min_face_id = face_id

        if min_face_distance < threshold:
            found_face_id = min_face_id
    cv2.rectangle(frame, (rect.left(), rect.top() + 10), (rect.right(), rect.bottom()), (0, 255, 0), 2)
    cv2.putText(frame, found_face_id, (rect.left(), rect.top()), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2, cv2.LINE_AA)
    if found_face_id != ‘Unknown‘:
        events.append((‘user_found‘, found_face_id, time.time()))

  

需要pip install的有:

import dlib
import cv2
import numpy as np
import imutils
from imutils import face_utils
from imageio import imread

pip install cmake
pip install dlib
pip install opencv-python
pip install numpy
pip install imutils
pip install imageio

  

完整代码

import dlib
import cv2
import numpy as np
import imutils
from imutils import face_utils
from imageio import imread
import time

predictor_path = ‘models\\shape_predictor_68_face_landmarks.dat‘
face_rec_model_path = ‘models\\dlib_face_recognition_resnet_model_v1.dat‘

predictor = dlib.shape_predictor(predictor_path)
detector = dlib.get_frontal_face_detector()
facerec = dlib.face_recognition_model_v1(face_rec_model_path)

(noseStart, noseEnd) = face_utils.FACIAL_LANDMARKS_IDXS["nose"]

threshold = 0.12

def get_feature(path):
    img = imread(path)
    frame = img
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    dets = detector(gray, 0)
    # print(‘检测到了 %d 个人脸‘ % len(dets))
    # 这里假设每张图只有一个人脸
    shape = predictor(gray, dets[0])
    face_vector = facerec.compute_face_descriptor(img, shape)
    return face_vector

def distance(a, b):
    a, b = np.array(a), np.array(b)
    sub = np.sum((a - b) ** 2)
    add = (np.sum(a ** 2) + np.sum(b ** 2)) / 2.
    r = sub / add
    return r

faces = None
cap = None
success = None
events = []

def init():
    global faces
    global cap
    global success
    faces = [
                (get_feature(‘faces\\dbh.jpg‘), ‘McKay‘)
            ]

    cap = cv2.VideoCapture(0)
    success, img = cap.read()

def start():
    global faces
    global cap
    global success
    while success:
        success, img = cap.read()
        frame = imutils.resize(img, width=300)
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        rects = detector(gray, 0)
        for rect in rects:
            shape = predictor(gray, rect)

            process_face_id(faces, frame, rect, shape)

            shape = face_utils.shape_to_np(shape)
            nose = shape[noseStart:noseEnd]
            noseHull = cv2.convexHull(nose)
            cv2.drawContours(frame, [noseHull], -1, (0, 255, 0), 1)
            cv2.putText(frame, "nose", (nose[0][0], nose[0][1]), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)

        cv2.imshow("Frame", frame)
        key = cv2.waitKey(1) & 0xFF

    cv2.destroyAllWindows()

def process_face_id(faces, frame, rect, shape):
    found_face_id = ‘Unknown‘
    if len(faces) > 0:
        face_descriptor = facerec.compute_face_descriptor(frame, shape)
        min_face_id = found_face_id
        min_face_distance = 1
        for face_feature, face_id in faces:
            cur_distance = distance(face_feature, face_descriptor)
            if cur_distance < min_face_distance:
                min_face_distance = cur_distance
                min_face_id = face_id

        if min_face_distance < threshold:
            found_face_id = min_face_id
    cv2.rectangle(frame, (rect.left(), rect.top() + 10), (rect.right(), rect.bottom()), (0, 255, 0), 2)
    cv2.putText(frame, found_face_id, (rect.left(), rect.top()), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2, cv2.LINE_AA)
    if found_face_id != ‘Unknown‘:
        events.append((‘user_found‘, found_face_id, time.time()))

  

原文地址:https://www.cnblogs.com/aarond/p/dlib.html

时间: 2024-10-23 15:14:20

人脸跟踪、识别、脸部标识的相关文章

《Master Opencv...读书笔记》非刚性人脸跟踪 III

上篇文章中,我们获得了人脸的各种表情模式,也就是一堆标注点的形变参数.这次我们需要训练一中人脸特征(团块模型),它能够对人脸的不同部位(即"标注点")分别进行描述,作为后面人脸跟踪.表情识别的区分依据.本次博文的主要内容: a.      介绍下人脸特征检测器大概有哪些类别 b.      详细介绍随机梯度法,并介绍在人脸团块特征提取时的应用 c.      为了提高训练/跟踪的健壮性,利用上一讲对输入的图像进行大小.角度的约束 人脸特征检测器综述 人脸特征检测与普通的物体检测非常相似

人脸表情识别相关研究

1. 国内外研究人脸表情识别的公司与产品介绍 现在,国内外都有人脸识别的相关产品,尤其在美国,已经能够通过机器人识别人脸表情,还能推断人的年龄等.而在国内,以杭州热知科技为代表的主要是生产人脸识别和表情识别的嵌入式设备. 国外: 1.美国汉森机器人公司 爱因斯坦机器人Einstein 图1 美国汉森机器人公司的爱因斯坦机器人 Einstein是美国汉森机器人公司的机器人专家大卫·汉森设计的一款类人机器人.它不仅能识别喜怒哀乐.恐惧.迷茫等数以百计的面部表情,推断人的年龄和性别,还能做出相应表情回

《Master Opencv...读书笔记》非刚性人脸跟踪 IV (终)

一.我们目前为止拥有什么 为了有一个连续完整的认识,在介绍最后一节前,先梳理下至今我们训练了哪些数据特征,并且训练它们的目的是什么. 1.      ft_data:利用手工标注工具,获取最原始的样本训练数据,包括以下内容: 图像名称集合imnames:表明在哪幅图像上标注特征点: 二维坐标集合points:手工标准点,后续更高级别特征均围绕这些特征点展开: 对称坐标索引集合symmetry:标注样本图像的镜像图像上的特征点,扩大样本库: 连接索引集合connections:描述手工标注的人脸特

C++开发人脸性别识别教程(12)——添加性别识别功能

经过之前几篇博客的讲解,我们已经成功搭建了MFC应用框架,并实现了基本的图像显示和人脸检测程序,在这篇博文中我们要向其中添加性别识别代码. 关于性别识别,之前已经专门拿出两篇博客的篇幅来进行讲解,这里不再赘述,具体参见:C++开发人脸性别识别教程(5)——通过FaceRecognizer类实现性别识别和C++开发人脸性别识别教程(6)——通过SVM实现性别识别. 一.分类器训练 在进行人脸性别识别之前需要训练性别识别的分类器,而分类器的训练过程是相对耗时的(大约五分钟),因此这里我们采用离线训练

人脸表情识别文献阅读

本周主要继续研读了两篇外文人脸表情识别的文章,都是IEEE上的文章,都比较长,一共40几页,所以就读了两篇.以及利用opencv中Philipp Wagner写的人脸识别的源代码.以及利用flandmark检测人脸上的关键点点.主要还是利用opencv中HaarClassifierCascade分类器完成的.还有就是利用opencv自带的分类器做了人脸识别的小实验. 第一篇文章是2007年IEEE TRANS ON IMAGE PROCESSING的文章.<Facial Expression R

人脸性别识别文献阅读笔记(1)

之前研究过一段时间的人脸性别识别,将之前查阅的论文总结总结,与大家分享一下,也方便日后汇总. 1.基于LBP,亮度.形状直方图的多尺度特征融合的性别识别(Gender Classification Based on Fusion of Different Spatial Scale Features Selected by Mutual Information From Histogram of LBP, Intensity, and Shape)(英文,期刊,2013年,IEEE检索) 在性别

C++开发人脸性别识别教程(16)——视频人脸性别识别

在之前的博文中我们已经能够顺利驱动摄像头来采集源图像,在这篇博文中将正式为其加入性别识别的代码,实现摄像头视频的人脸性别识别. 一.人脸检测 在得到摄像头采集的源图像之后,首先要做的就是对其进行人脸检测,将人脸区域分割出来.这步相对来说比较简单,只需在定时器时间触发函数中加入人脸检测的代码即可,这里给出OnTimer()函数的整体代码: void CGenderRecognitionMFCDlg::OnTimer(UINT_PTR nIDEvent) { /***********人脸检测并识别*

C++开发人脸性别识别教程(13)——针对单张图片的性别识别

在之前的博文中我们的性别识别程序已经初步成型,能够识别某个文件夹下的图片文件.不过这里有一个问题,假设这个文件夹下有着大量的图片,而我们希望识别这些图片中的某一张,此时需要我们不停的单击“下一张”按钮才会轮询到对应的图片,这是相当麻烦的,因此在这篇博客中我们向程序中添加一个功能——单张图片的性别识别. 一.基本思想 最基本的办法就是在主界面再添加一个按钮控件,命名为“图片文件”(之前的按钮为“图片文件夹”),不过这样会使得界面上的按钮控件过于繁多,给人一种“作者只会用button控件”的感觉.这

简述人脸特异性识别&amp;&amp;一个基于LBP和SVM的人脸识别小例子

原谅我用图片,MAC在Safari里给文章进行图文排版太麻烦啦~ 本文适合初入计算机视觉和模式识别方向的同学们观看~ 文章写得匆忙,加上博主所知甚少,有不妥和勘误请指出并多多包涵. 本文Demo的代码由HZK编写,特征点由月神和YK选择和训练. 转载请注明 copyleft by sciencefans, 2014 为了方便大家学习,附上高维LBP的核心代码 1 ################################################### 2 # 3 # 4 # NO