Face_Recognition 人脸识别函数详解

2023-11-13

加载人脸图片文件

load_image_file(file, mode='RGB'):  

通过 PIL.image.open 加载图片文件

mode 有两种模式 ‘RGB’ 3通道 和 ‘L' 单通道

返回 numpy.array

查找人脸位置 人脸分割

face_locations(img, number_of_times_to_upsample=1, model="hog"): 

:Param

img 是一个 numpy.array 指定要查找人脸位置的图像矩阵

number_of_times_to_upsample 指定要查找的次数

model 指定查找的模式 'hog' 不精确但是在CPU上运算速度快 'CNN' 是一种深度学习的精确查找,但是速度慢。需要GPU/CUDA加速

返回 人脸位置 list  (top, right, bottom, left)

对人脸进行编码

face_encodings(face_image, known_face_locations=None, num_jitters=1, model="small"): 

:Param 

face_image 指定数据类型为numpy.array编码的人脸矩阵 数据类型

known_face_locations 指定人脸位置 如果值为None 则默认按照 'Hog'模式 调用 _raw_face_locations 查找人脸位置

num_jitters 重新采样编码次数 默认为1 

model 预测人脸关键点个数 large 为68个点 small 为 5个关键点

返回 128维特征向量 list

人脸对比

compare_faces(known_face_encodings, face_encoding_to_check, tolerance=0.6):

:Param 

known_face_encodings  已经编码的人脸 list

face_encoding_to_check 要检测的单个人脸

tolerance 默认人脸对比距离长度  对比方式    np.linalg.norm(face_encodings - face_to_compare, axis=1)

返回 对比结果 list

 

附加自己编写的测试类

import face_recognition
import cv2
import numpy as np
import time



class Wqs_Face_Recognition:

    know_Encodings = []
    know_names = []
    tolerance = 0.4
    model = 'CNN'
    num_of_times_to_upSample = 1
    isDebug = False

    def __init__(self, tolerance=0.6, num_of_times_to_upSample = 1, model='CNN', imageType = cv2.IMREAD_COLOR, isDebug = False):
        self.tolerance = tolerance
        self.model = model
        self.num_of_times_to_upSample = num_of_times_to_upSample
        self.imageType = imageType
        self.isDebug = isDebug

    # 设置 识别精度 数据越小 精度越高
    def SetTolerance(self, tolerance):
        self.tolerance = tolerance

    # 获取 识别精度
    def GetTolerance(self):
        return self.tolerance

    def Set_Num_of_times_to_upSample(self, num_of_times_to_upSample):
        self.num_of_times_to_upSample = num_of_times_to_upSample

    def Get_Num_of_times_to_upSample(self, num_of_times_to_upSample):
        return self.num_of_times_to_upSample

    def SetModel(self, model):
        self.model = model

    def GetModel(self, model):
        return self.model

    #图像分割并命名
    def FaceSegmentation(self, faceFile:str = None, faceMat:np = None, faceName:str = None):
        if faceFile != None:
            faceMat = cv2.imread(faceFile)
        try:
            shp = faceMat.shape
            if self.isDebug:
                print('Recognition faceMat shape', faceMat.shape)
        except AttributeError:
            print('FaceSegmentation faceMat is None')
            return False
        locations = face_recognition.face_locations(faceMat, self.num_of_times_to_upSample, model=self.model)
        #cv2.imshow('l', liudehua_encoding)
        i = 0
        for location in locations:
            top, right, bottom, left = location
            if faceName == None and faceFile != None:
                index = faceFile.find('.')
                faceName = faceFile[:index]

            outName = faceName + '_name_' + str(i) + '.jpg'
            #filename = 'name%d.jpg' % i
            i = i+1
            faceFile = faceMat[top:bottom, left:right]

            cv2.imwrite(outName, faceFile)

    #识别特征编码并加载
    def Know_Encoding(self, faceFile:str = None, faceMat:np = None, faceName:str = None, index = -1):
        if faceFile != None:
            faceMat = cv2.imread(faceFile)
        try:
            shp = faceMat.shape
            if self.isDebug:
                print('Recognition faceMat shape', faceMat.shape)
        except AttributeError:
            print('Know_Encoding faceMat is None')
            return False
        if faceName == None and faceFile != None:
            loc = faceFile.find('.')
            faceName = faceFile[:loc]
        if faceName == None:
            faceName = 'NoName'
        tm = time.time()
        face_encoding = face_recognition.face_encodings(faceMat, model='small')[0]

        tm = time.time()- tm
        print('spend time ', tm)
        if index == -1:
            self.know_Encodings.append(face_encoding)
            self.know_names.append(faceName)
        else:
            self.know_Encodings.insert(index, face_encoding)
            self.know_names.insert(index, faceName)

    #加载已知人脸特征编码
    def LoadKnow_Encoding(self, face_encoding:np, name:np, index = -1):
        if index == -1:
            self.know_Encodings.append(face_encoding)
            self.know_names.append(name)
        else:
            self.know_Encodings.insert(index, face_encoding)
            self.know_names.insert(index, name)

    #全体查找人脸识别
    def AllRecognition(self, faceFile:str = None, faceMat:np = None):
        if faceFile != None:
            faceMat = cv2.imread(faceFile)
        try:
            shp = faceMat.shape
            if self.isDebug:
                print('Recognition faceMat shape', faceMat.shape)
        except AttributeError:
            print('AllRecognition faceMat is None')
            return False
        face_locations = face_recognition.face_locations(faceMat, self.num_of_times_to_upSample, model=self.model)
        faceEncodings = face_recognition.face_encodings(faceMat, face_locations)

        nameArray = []
        indexArray = []
        locationArray = []

        locationIndex = -1

        for face_location, face_encode in zip(face_locations , faceEncodings):
            index = 0
            locationIndex = locationIndex + 1

            (top, right, bottom, left) = face_location
            face = faceMat[top:bottom, left:right]
            cv2.imwrite('testFace.jpg', face)

            matches = face_recognition.compare_faces(self.know_Encodings, face_encode, self.tolerance)
            #index = matches.find('True')

            for match in matches:
                if match == True:
                    nameArray.append(self.know_names[index])
                    indexArray.append(index)
                    locationArray.append(face_locations[locationIndex])
                    #break
                index += 1
            if self.isDebug:
                for x in range(len(indexArray)):
                    print('Name', nameArray[x])
                    print('index', indexArray[x])
                    print('face_locations', locationArray[x])
                else:
                    print('Unknow people')
        return nameArray, indexArray, locationArray

    #精准人脸识别
    def Recognition(self,  know_Encoding:np, know_name:np, faceFile:str = None, faceMat:np = None):
        if faceFile != None:
            faceMat = cv2.imread(faceFile)
        try:
            shp = faceMat.shape
            if self.isDebug:
                print('Recognition faceMat shape', faceMat.shape)
        except AttributeError:
            print('Recognition faceMat is None')
            return False
        face_locations = face_recognition.face_locations(faceMat)
        faceEncodings = face_recognition.face_encodings(faceMat, face_locations)

        for face_location, face_encode in zip(face_locations, faceEncodings):

            (top, right, bottom, left) = face_location
            face = faceMat[top:bottom, left:right]
            if self.isDebug:
                cv2.imwrite('testFace.jpg', face)

            matches = face_recognition.compare_faces([know_Encoding], face_encode, self.tolerance)
            #index = matches.find('True')
            index = 0
            for match in matches:
                if match == True:
                    break
                index += 1

            if index < len(matches):
                if self.isDebug:
                    print('Know =', know_name)
                return True, know_name
            else:
                if self.isDebug:
                    print('Unknow people')
                return False, None

def drawRect(file:str, locations:np):
    img = cv2.imread(file)
    print('drawRect locations', locations)
    for loc in locations:
        cv2.rectangle(img,(loc[3], loc[0]), (loc[1], loc[2]), color= (255, 0, 0))
    cv2.imshow(file,img)
    cv2.waitKey(0)

def main():
    wqsRecognition = Wqs_Face_Recognition(0.4)

    wqsRecognition.FaceSegmentation('sunli1.jpg')
    wqsRecognition.FaceSegmentation('yangmi.jpg')


    wqsRecognition.Know_Encoding('sunli1_name_0.jpg', faceName='sunli1')
    mat = cv2.imread('yangmi_name_0.jpg')
    wqsRecognition.Know_Encoding(faceMat=mat, faceName= 'yangmi')

    mat = cv2.imread('ymTest.jpg')
    nameArray, indexArray, locations = wqsRecognition.AllRecognition(faceMat=mat)

    drawRect('ymTest.jpg', locations)

    wqsRecognition.tolerance = 0.6
    wqsRecognition.Recognition(wqsRecognition.know_Encodings[1], wqsRecognition.know_names[1], 'ymTest.jpg')

if __name__ == '__main__':
    main()

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Face_Recognition 人脸识别函数详解 的相关文章

  • OpenCV人脸检测及识别(深度学习)

    简介 最近做了一个人脸检测以及识别的程序 很多的文章都有比较详细的叙述 可以自行查找 但是个人觉得大部分文章都太细致了以至于初学者无法快速领会主干 不是否认质量 是侧重点问题 所以结合我遇到了一些问题 现在做个总结 本文主要叙述实现的思路
  • 人脸识别:coco loss-Rethinking Feature Discrimination and Polymerization for Large-scale Recognition

    nips的一篇做分类和识别的工作 其中在人脸识别任务上也做了实验 Rethinking Feature Discrimination and Polymerization for Large scale Recognition Yu Liu
  • 基于LBPH算法进行人脸识别的毕设项目(一)

    摘要 在完成本科毕业设计时期 选题使关于人脸识别的一个题目 主要内容是通过海康威视的网络摄像头让视频数据在上传到笔记本电脑端进行实时的人脸检测与识别 识别出人脸则显示信息 应用场景为针对斑马线行人闯红灯的行为 通过对下位机实时视频数据的处理
  • 模式识别学习初感悟

    学习模式识别已经快一个月了 从开始的混沌迷茫到现在的小有感觉 不能说自己进步了很多 只能说自己没有虚度这一个月的时光 下面相对自己这一个月的学习做一个总结 希望各位老师同学能多提宝贵意见 毕竟学术要在交流中才能发展 考研的生活结束后 顺利进
  • 企业引入人脸识别考勤 想要代打卡?没门!

    近年来 伴随着生物识别技术的进步 越来越多的生物识别技术应用进入市场 冲击各大行业 传统的考勤模式同样面临着来自新兴技术的挑战 以人脸识别技术为首 掀起一场考勤领域的变革 刷脸 考勤 想要代签不容易 传统的 最为人所熟知的考勤模式莫过于磁卡
  • 使用Python,OpenCV,本地二进制模式(LBP)进行人脸识别

    使用Python OpenCV与本地二进制模式 LBP 进行人脸识别 1 效果图 2 原理及步骤 2 1 原理 2 2 步骤 3 源码 参考 在深度学习和暹罗网络之前 面部识别算法依赖于特征提取和机器学习 这篇博客将介绍如何使用本地二进制模
  • insightface pytorch 答疑指南

    之前写过一篇人脸识别从原理到实践 详细介绍了人脸识别相关的算法 模型和Loss等 里面也提到insightface成为当前工业事实上的基准 但是它各种牛逼 唯一不足的点就是开始时选了mxnet框架开发 奈何现在基本没什么人用了 所以在22年
  • 基于百度PaddleHub实现人像美颜V1.0

    AI美颜核心技术之一就是人脸关键点检测 PaddleHub已经开源了人脸关键点检测模型 face landmark localization 人脸关键点检测是人脸识别和分析领域中的关键一步 它是诸如自动人脸识别 表情分析 三维人脸重建及三维
  • 疯壳AI语音及人脸识别教程2-4串口

    目录 1 1寄存器 1 1 2实验现象 17 视频地址 https fengke club GeekMart su f9cTSxNsp jsp 串口 官方QQ群 457586268 串行接口分为异步串行接口和同步串行接口两种 异步串行接口统
  • 基于PaddleGAN项目人脸表情动作迁移学习(二)单人表情迁移

    学习目标 学习基于PaddleGAN实现的动作迁移模型 First order motion model First order motion model原理 First order motion model的任务是image animat
  • 计算机视觉之人脸识别(Yale数据集)--HOG和ResNet两种方法实现

    1 问题描述 在给定Yale数据集上完成以下工作 在给定的人脸库中 通过算法完成人脸识别 算法需要做到能判断出测试的人脸是否属于给定的数据集 如果属于 需要判断出测试的人脸属于数据集中的哪一位 否则 需要声明测试的人脸不属于数据集 这是一个
  • 人脸识别引擎

    最近人工智能异常火爆 各路诸侯蠢蠢欲动 特别是金融业 安防业都在追求人工智能的落地 人工智能新秀云从 商汤 旷世 老牌王者海康 华为都在建设自己的人工智能平台 人工智能领域人脸识别目前来看是最先落地的技术 本文将介绍人脸识别产品中人脸识别引
  • OpenCV 训练分类器生成XML文件【完整过程】

    在网上找了好多相关信息 有几篇写的很好的 http blog csdn net tyt2222008 article details 5838389 http blog csdn net carson2005 article details
  • TensorFlow框架做实时人脸识别小项目(二)

    在第一部分中 分析了整个小项目的体系 重点讨论了用于人脸检测对齐的mtcnn网络的实现原理 并利用笔记本电脑自带的摄像头进行了测试 今天在这里要讨论的重点是人脸识别中的核心部分 facenet网络 facenet是Google开源的人脸识别
  • 深度学习——图像增强 小组代码

    TJU暑期的深度学习训练营 这是人脸识别运用图像增强后的一段代码 import os shutil unzip tjudataset zip base dir tjudataset read data train dir os path j
  • esp32cam门禁系统简易教程

    esp32cam门禁系统简易教程 人脸识别 1 环境安装 最好有梯子 arduino IDE 1 官网下载地址 选择相应版本下载Windows ZIP file 无脑安装 2 配置IDE 打开IDE 文件 gt 首选项 gt 附加开发板管理
  • SeetaFace编译成功(有windows及Android源码)

    声明 由于本人水平有限 所提供的代码 dll so等必然存在很多问题 仅用于学习 不适合工业级使用 请谨慎使用 如果造成损失 责任自负 对齐 这张照片第3个人的特征点检测有点问题 研发人员很快修正了 赞一个 下面是人脸比对 准确率还是可以接
  • 疯壳AI语音及人脸识别3-4AI人脸系统架构

    详情地址 https fengke club GeekMart views offline ai 购买链接 https fengke club GeekMart su fKw7Nb7oC jsp 视频地址 https fengke club
  • 基于深度学习的人脸识别算法

    基于深度学习的人脸识别算法 简介 Contrastive Loss Triplet Loss Center Loss A Softmax Loss 参考文献 简介 我们经常能从电影中看到各种神奇的人脸识别技术 例如图1 人脸识别技术是基于面
  • 机器学习系列(8):人脸识别基本原理及Python实现

    众所周知 人脸识别和人脸验证已经得到大量应用 那么它们之间有什么异同呢 又是如何实现的呢 这里是机器学习系列第八篇 带你揭开它们神秘的面纱 若图片挂了 可移步 https mp weixin qq com s biz MzU4NTY1NDM

随机推荐

  • 【第十三届蓝桥杯】省赛C/C++ B组 题目+题解

    目录 A 九进制转十进制 B 顺子日期 C 刷题统计 D 修剪灌木 E X 进制减法 F 统计子矩阵 G 积木画 H 扫雷 I 李白打酒加强版 J 砍竹子 A 九进制转十进制 本题总分 5 分 问题描述 九进制正整数 2022 转换成十进制
  • 使用Python接口自动化测试post请求和get请求,获取请求返回值

    目录 引言 请求接口为Post时 传参方法 方法一 通过json dunps body 转化成json格式的字符串 然后传递给data 方法二 在传参时直接格式化成json格式传参 获取接口请求响应数据 request 接口请求时 不对数据
  • github提交失败:error: failed to push some refs to https://github.com/***/git.git

    1 问题 在github远程创建仓库后 利用gitbash进行提交本地文件的时候出现如下错误 报错 error failed to push some refs to https github com git git 2 原因 远程仓库与本
  • AD里面PCB怎样设置原点

    在PCB图中 点击EDIT 选择ORIGIN 点击set 设置原点 如果是元器件封装时 点击EDIT 选择set reference 有三个选项 下面细讲 1 选择pin1 会将原点自动设置在pin1的中心 2 选择 center 会将原点
  • jquery如何获取表单全部数据

    Jquery 如何获取表单的全部数据 用于ajax提交 var formData var t Form serializeArray each t function formData this name this value console
  • [Node] Node.js 包管理工具详解npm yarn cnpm npx pnpm

    Node js专栏 Node js 初级知识 个人简介 一个不甘平庸的平凡人 个人主页 CoderHing的个人主页 格言 路漫漫其修远兮 吾将上下而求索 你的一键三连是我更新的最大动力 目录 1 npm包管理工具 包管理工具npm 常见的
  • 淘宝装修HTML代码大全

    http blog sina com cn s blog 506f1f940100hv9d html 淘宝网店装修HTML代码大全 包括淘宝装修代码 插入图片代码 公告滚动代码 不不一定要懂网站知识 不一定要懂HTML语言 看完这个就可以装
  • 五线谱音名和组别对照表_利用吉他指板快速识记五线谱

    如果你开始读五线谱 最重要的建议就是读五线谱时 忘记六线谱 忘记 忘记 忘记 因为五线谱和六线谱完全是两个不同的概念 虽然六线谱只比五线谱多出一条横线 关键是二者记谱的机理风马牛不相及 五线谱是采用音高记谱 而六线谱是音位记谱 虽然音高和音
  • Linux kernel 关机的底层操作

    Linux关机相关命令如 halt shutdown poweroff和reboot 其实它们底层都是调用名为reboot的system call 其具体实现是在内核目录的kernel sys c中的 SYSCALL DEFINE4 reb
  • 用python怎么输出个人信息,python怎么输出个人信息

    大家好 给大家分享一下python输入自己的姓名 输出hello 某某某同学 很多人还不知道这一点 下面详细解释一下 现在让我们来看看 1 python要求用户输入姓名并输出 name input 请输入姓名 print 你好 name 代
  • 内核hwmon驱动框架详解以及海思芯片温度驱动分析

    1 hwmon驱动框架介绍 hwmon即hardware monitoring framework 硬件监视框架 可以把温度传感器 风扇 电源管理等设备的驱动都利用hwmon框架去实现 在设备的归类上比较容易理解 2 hwmon驱动框架分析
  • 解决ubuntu22.04不能使用todesk问题(显示没有x11桌面)

    这个版本默认使用的是Wayland 所以可能有点问题 x11的适配比较好 也懒得对比了 毕竟todesk好用多了 sudo nano etc gdm custom conf 将WaylandEnable false前面的注释去掉 ctrl
  • Tuning Muxers

    Tuning Muxers WebLogic Server uses software modules called muxers to read incoming requests on the server and incoming r
  • C++ 通讯录管理系统

    include showMenu h using namespace std void showMenu cout lt lt lt lt endl cout lt lt 1 添加联系人 lt lt endl cout lt lt 2 显示
  • Deep Learning Tutorials(一):开头语

    万事开头难 当你开始看这些时候 有可能你已经开始了研究生生活 不在像本科时候过着那种得过且过 考试不挂科的日子 你整天盲目 漫无目的的过日子实际上是在浪费自己的生命 所以坚持每天进步吧 回到正事 你可能开始从事深度学习研究或者有关机器学习方
  • 在PyCharm中查看调用函数的说明文档

    说明文档对函数进行说明解释 帮助更好理解函数的功能 在PyCharm编写代码时 可以通过鼠标悬停 查看调用函数的说明文档 可以查看python内置函数的说明文档 我们也可以给自己创建的函数添加说明文档 辅助理解函数的作用 如下
  • 为什么计算机是32位64位,64位是x86还是x64_为什么64位是X64,32位是X86?

    其它网友回答 windows系统64位的是x64 说明这个系统是可以向下兼容32位程序的64位系统 32位的不是x32而是x86说明该系统是可以向上兼容非32位程序的32位系统 其它网友回答 同意楼上说法 其它网友回答 1 x86的由来 8
  • 时序预测

    时序预测 MATLAB实现时间序列回归之Bootstrapped测试 目录 时序预测 MATLAB实现时间序列回归之Bootstrapped测试 基本介绍 程序设计 学习小结 参考资料 基本介绍 对传统规格测试中尺寸失真的另一种反应是自举
  • idea连接MYSQL报错汇总

    idea连接MYSQL报错汇总 The last packet sent successfully to the server was 0 milliseconds ago The driver has not received any p
  • Face_Recognition 人脸识别函数详解

    加载人脸图片文件 load image file file mode RGB 通过 PIL image open 加载图片文件 mode 有两种模式 RGB 3通道 和 L 单通道 返回 numpy array 查找人脸位置 人脸分割 fa