基于Python实现人脸识别和焦点人物检测功能

写在前面的话

基于dlib库的模型,实现人脸识别和焦点人物的检测。最后呈现的效果为焦点人物的识别框颜色与其他人物框不一样。

准备工作

需要安装好python环境,安装好dlib、opencv-python库等,具体可以看报错信息(可以使用PyCharm来运行和编辑py文件),然后把需要的库补全,文章最后会有完整代码,但是需要与shape_predictor_68_face_landmarks.dat模型文件同处一个路径下,然后启用。(百度可以下载到)

设计过程

  • 因为是在自己电脑完成的必做题设计,所以前期还经历了相应的Python安装与环境配置,相应的资源库安装,例如dlib、opencv-python等等。
  • 然后运行综合了(68个人脸特征点检测模型完成静止图像的人脸检测与标注)和(完成实时摄制视频的人脸检测与定位)的参考文件opencv_webcam_face_detection.py,发现可以实现实时视频的人脸检测。
  • 对参考文件的代码进行分析,理解每一句代码的意思。对比查找设计需要的功能模块,实现1280x720视频输出,实现类win10相机的焦点人物识别。
  • 上网查找并学习相应资料,参考win10相机的算法,创建自己的基于距离与面积的焦点人物算法,根据自己的需要对源代码进行添加及修改。
  • 最后对代码进行测试,且不断修改成最适合的版本。

Python程序

流程图

焦点人物算法

内在逻辑:模仿win10相机,当有多于1个人时,优先选择最居中的为焦点人物,但若在其他地方的人脸面积大于4倍中心的人脸面积,则选择其他地方的作为焦点人物。

实际代码

import dlib
import cv2
import math

# 摄像头参数设置
cam = cv2.VideoCapture(0)  # 参数0,调用计算机的摄像头
cam.set(3, 1280)  # 参数3,设定宽度分辨为1280
cam.set(4, 720)  # 参数4,设定高度分辨为720

# 设定人脸框的边框颜色及宽度,便于分辨焦点人物
color_focus = (255, 0, 255)  # 设定焦点人脸框的颜色,紫红色
color_other = (255, 255, 255)  # 设定其余人脸框的颜色,白色
lineWidth_focus = 2  # 设定焦点人脸框的宽度
lineWidth_other = 1  # 设定其他人脸框的宽度

# 设定计算的一些参数
w = cam.get(3) / 2  # 设定屏幕中心的横坐标X
h = cam.get(4) / 2  # 设定屏幕中心的纵坐标Y
d_center = 10000  # 预设人脸框到屏幕中心的距离
index_center = 0  # 预设距离优先时的人脸框序号
index_area = 0  # 预设面积优先时的人脸框序号
area_center = -1  # 预设距离中心最近人脸框的面积
area = -1  # # 预设人脸框面积最大时的面积

detector = dlib.get_frontal_face_detector()  # 加载这个库自带的人脸检测器
predictor_path = "shape_predictor_68_face_landmarks.dat"  # 设置人脸预测模型的路径位置
predictor = dlib.shape_predictor(predictor_path)  # 人脸预测实例化
while True:  # 当获取到视频输入时
    ret_val, img = cam.read()  # 读取视频每一帧,颜色格式为BGR格式,
    rgb_image = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  # 颜色BGR格式转为RGB格式
    faces = detector(rgb_image)  # 返回RGB格式人脸捕捉框

    # 逻辑算法:当有多于1个人时,优先选择最居中的为焦点人物,但若其他地方的人脸面积大于4倍中心的人脸面积,则选择该为焦点人物。
    # 这个for循环先求出距离屏幕中心最近时的人脸框的序号和距离优先面积
    for i, det in enumerate(faces):  # 遍历所有人脸框,i是人脸框序号,det是每个人脸框
        d = math.sqrt((w-(det.left()+(det.right()-det.left())/2))**2+(h-(det.top()+(det.bottom()-det.top())/2))**2)
        # 计算该人脸框到屏幕中心的距离
        if d < d_center:  # 对比刚计算出的距离与设定的最近距离,达成选择更小
            index_center = i  # 更新距离最近时的人脸框序号
            d_center = d  # 更新最近距离
            area_center = abs((det.right() - det.left()) * (det.bottom() - det.top()))  # 算出该人脸框的面积(距离更近优先)

    # 这个for循环求出面积最大的人脸框的序号和面积优先面积
    for i, det in enumerate(faces):  # 遍历所有人脸框,i是人脸框序号,det是每个人脸框
        if abs((det.right() - det.left()) * (det.bottom() - det.top())) > area:  # 对比该人脸面积与设定的最大面积,实现选择更大
            index_area = i  # 更新面积更大时的人脸框序号
            area = abs((det.right() - det.left()) * (det.bottom() - det.top()))  # 算出该人脸框的面积(面积更大优先)

    if area > 5*area_center:  # 判断依据,若面积优先面积大于距离优先面积的5倍,就实现面积优先选择焦点人物,否则就距离优先。
        index_center = index_area   # 面积优先时,使用面积最大的人脸框序号
    for i, det in enumerate(faces):  # 遍历所有人脸框
        if i == index_center:  # 确定焦点人脸框的序号
            print(d_center, i)  # 输出焦点人物的距离中心位置,方便调试
            cv2.rectangle(img, (det.left(), det.top()), (det.right(), det.bottom()), color_focus, lineWidth_focus)
            # 绘出焦点人脸框
            shape = predictor(img, det)  # 从预测模型处,得到68个人物特征点
            for p in shape.parts():  # 遍历68个人物特征点
                cv2.circle(img, (p.x, p.y), 2, (124, 252, 0), -1)  # 设定焦点人物的68个点的形状颜色,茶绿色、实心
        else:
            cv2.rectangle(img, (det.left(), det.top()), (det.right(), det.bottom()), color_other, lineWidth_other)
            # 绘出其他人脸框
            shape = predictor(img, det)  # 从预测模型处,得到68个人物特征点
            for p in shape.parts():  # 遍历68个人物特征点
                cv2.circle(img, (p.x, p.y), 2, (255, 255, 255), -1)  # 设定其他人物的68个点的形状颜色,白色、实心
    cv2.imshow('my webcam', img)  # 输出绘好框后的帧动画
    if cv2.waitKey(1) == 27:  # 设置一个滞留时间,等待用户触发事件,若用户按下 ESC(ASCII码为27),则执行 if 体
        break  # (if主体)退出

cv2.destroyAllWindows()  # 销毁所有输出图像窗

运行情况

为了容易分辨焦点人物与其他人物,首先将焦点人物框的宽度设为2,颜色设为紫红色,68个识别点设为茶绿色;其他人物框的宽度设为1,颜色设为白色,68个识别点设为白色。
然后进行多次测试,通过整理测试结果,发现算法没有错误,焦点人物按照距离和面积两个因素来决定。成功运行图如下:
不展示图了,但是主人物为紫红框,其他人物为白色圈。与预期一致。

到此这篇关于基于Python的人脸识别和焦点人物检测的文章就介绍到这了,更多相关Python人脸识别和焦点人物检测内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 简单的Python人脸识别系统

    案例一 导入图片 思路: 1.导入库 2.加载图片 3.创建窗口 4.显示图片 5.暂停窗口 6.关闭窗口 # 1.导入库 import cv2 # 2.加载图片 img = cv2.imread('a.png') # 3.创建窗口 cv2.namedWindow('window 1 haha') # 4.显示图片 cv2.imshow('window 1',img) # 5.暂停窗口 cv2.waitKey(0) # 6.关闭窗口 cv2.destroyAllWindows() 案例二 在图片

  • 如何通过python实现人脸识别验证

    这篇文章主要介绍了如何通过python实现人脸识别验证,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 直接上代码,此案例是根据https://github.com/caibojian/face_login修改的,识别率不怎么好,有时挡了半个脸还是成功的 # -*- coding: utf-8 -*- # __author__="maple" """ ┏┓ ┏┓ ┏┛┻━━━┛┻┓ ┃ ☃ ┃ ┃ ┳┛ ┗

  • python实现图像,视频人脸识别(opencv版)

    图片人脸识别 import cv2 filepath = "img/xingye-1.png" img = cv2.imread(filepath) # 读取图片 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转换灰色 # OpenCV人脸识别分类器 classifier = cv2.CascadeClassifier( "C:\Python36\Lib\site-packages\opencv-master\data\haar

  • python调用百度API实现人脸识别

    1.代码 from aip import AipFace import cv2 import time import base64 from PIL import Image from io import BytesIO import pyttsx3 # """ 你的 APPID AK SK """ APP_ID = '1965####' API_KEY = 'YXL65ekIloykyjrT4kzc####' SECRET_KEY = 'lFi

  • 基于Python实现人脸识别和焦点人物检测功能

    写在前面的话 基于dlib库的模型,实现人脸识别和焦点人物的检测.最后呈现的效果为焦点人物的识别框颜色与其他人物框不一样. 准备工作 需要安装好python环境,安装好dlib.opencv-python库等,具体可以看报错信息(可以使用PyCharm来运行和编辑py文件),然后把需要的库补全,文章最后会有完整代码,但是需要与shape_predictor_68_face_landmarks.dat模型文件同处一个路径下,然后启用.(百度可以下载到) 设计过程 因为是在自己电脑完成的必做题设计,

  • 基于Python搭建人脸识别考勤系统

    目录 介绍 人脸识别的实际应用 构建人脸识别系统的步骤 安装库 导入库 加载图像 查找人脸位置并绘制边界框 为人脸识别训练图像 构建人脸识别系统 人脸识别系统面临的挑战 结论 介绍 在本文中,你将学习如何使用 Python 构建人脸识别系统.人脸识别比人脸检测更进一步.在人脸检测中,我们只检测人脸在图像中的位置,但在人脸识别中,我们制作了一个可以识别人的系统. "人脸识别是验证或识别图片或视频中的人的挑战.大型科技巨头仍在努力打造更快.更准确的人脸识别模型." 人脸识别的实际应用 人脸

  • face++与python实现人脸识别签到(考勤)功能

    项目实现利用face++开发一个课堂签到的软件,实现面向摄像头即可完成记录学号.姓名和时间的签到工作. 项目架构 项目使用场景 代码: 流程代码,主文件 #!usr/bin/ # -*- coding: utf-8 -*- import requests from json import JSONDecoder import csv import cv2 import time import tkinter as tk search_url = "https://api-cn.faceplusp

  • Python基于Dlib的人脸识别系统的实现

    之前已经介绍过人脸识别的基础概念,以及基于opencv的实现方式,今天,我们使用dlib来提取128维的人脸嵌入,并使用k临近值方法来实现人脸识别. 人脸识别系统的实现流程与之前是一样的,只是这里我们借助了dlib和face_recognition这两个库来实现.face_recognition是对dlib库的包装,使对dlib的使用更方便.所以首先要安装这2个库. pip3 install dlib pip3 install face_recognition 然后,还要安装imutils库 p

  • python基于opencv实现人脸识别

    将opencv中haarcascade_frontalface_default.xml文件下载到本地,我们调用它辅助进行人脸识别. 识别图像中的人脸 #coding:utf-8 import cv2 as cv # 读取原始图像 img = cv.imread('face.png') # 调用熟悉的人脸分类器 识别特征类型 # 人脸 - haarcascade_frontalface_default.xml # 人眼 - haarcascade_eye.xml # 微笑 - haarcascad

  • 基于Python实现人脸自动戴口罩系统

    1.项目背景 2019年新型冠状病毒感染的肺炎疫情发生以来,牵动人心,举国哀痛,口罩.酒精.消毒液奇货可居. 抢不到口罩,怎么办?作为技术人今天分享如何使用Python实现自动戴口罩系统,来安慰自己,系统效果如下所示: 本系统的实现原理是借助 Dlib模块的Landmark人脸68个关键点检测库轻松识别出人脸五官数据,根据这些数据,确定嘴唇部分的位置数据(48点~67点位置),根据检测到嘴部的尺寸和方向,借助PLL模块调整口罩的尺寸和方向,实现将口罩放在图像的适当位置. 2.页面设计 基于tki

  • python opencv人脸识别考勤系统的完整源码

    如需安装运行环境或远程调试,可加QQ905733049, 或QQ2945218359由专业技术人员远程协助! 运行结果如下: 代码如下: import wx import wx.grid from time import localtime,strftime import os import io import zlib import dlib # 人脸识别的库dlib import numpy as np # 数据处理的库numpy import cv2 # 图像处理的库OpenCv impo

  • Python实现人脸识别

    使用到的库: dlib+Opencv python版本: 3.8 编译环境: Jupyter Notebook (Anaconda3) 0.Dlib人脸特征检测原理 提取特征点:首选抓取多张图片,从中获取特征数据集和平均特征值然后写入 csv 文件 - 计算特征数据集的欧式距离作对比:首先使用Opencv库将摄像头中的人脸框出来,再将摄像头中采取到的人脸特征值与数据集中的每个人的特征均值作对比,选取最接近(欧氏距离最小)的值,将其标注为欧氏距离最小的数据集的人名 一.构建人脸特征数据集 安装Dl

  • 基于Python的人脸检测与分类过程详解

    目录 人脸识别 算法简介 人脸检测 简述 数据集介绍 算法介绍 测试网络 结果预览 人脸识别 算法简介 我们的算法可以分成两个部分,识别人脸位置和确定人脸分类.这两个部分可以看成:1.检测出人脸之间相似性.2.检测出人脸之间不同性.由于这两项工作截然相反,所以我们使用了两个网络来分别完成这两项工作. 人脸检测 简述 我们的人脸检测网络采用了和Faster RCNN类似的策略,但我们在ROI Polling上进行了创新,兼顾了小目标检测和大目标检测,为此,我们还使用了改进后的RESNET101_V

  • python实现人脸识别代码

    从实时视频流中识别出人脸区域,从原理上看,其依然属于机器学习的领域之一,本质上与谷歌利用深度学习识别出猫没有什么区别.程序通过大量的人脸图片数据进行训练,利用数学算法建立建立可靠的人脸特征模型,如此即可识别出人脸.幸运的是,这些工作OpenCV已经帮我们做了,我们只需调用对应的API函数即可,先给出代码: #-*- coding: utf-8 -*- import cv2 import sys from PIL import Image def CatchUsbVideo(window_name

随机推荐