人脸检测与人脸识别概述
1、概念
人脸识别和人脸检测是计算机视觉领域中两个相关但不同的任务。
人脸检测(Face Detection)是指在图像或视频中检测出人脸所在的位置和边界框。该任务的目标是确定图像中是否存在人脸,并标识出其大致位置。人脸检测通常是作为一个预处理步骤,用于在更高级别的任务(如人脸识别、表情识别等)中定位人脸。
人脸识别(Face Recognition)是指识别和验证人脸的身份。该任务的目标是将输入的人脸图像与预先存储的人脸模板进行比较,并判断是否匹配。人脸识别可以用于识别一个人是否在数据库中,或者将输入的人脸与数据库中的多个人脸进行比对,从而确定最相似的身份。
人脸识别数据库是一种存储人脸图像和相关信息的系统或集合。这些数据库通常用于人脸识别技术,该技术使用算法来识别和验证人脸图像中的身份。人脸识别数据库通常包含以下组成部分:
人脸图像:数据库中存储了大量的人脸图像,这些图像可以是照片、视频截图或其他来源的图像。每张人脸图像都与一个唯一的身份相关联。身份信息:每个人脸图像都与一个身份信息相关联,例如姓名、身份证号码、员工编号等。这些信息用于标识和验证人脸图像的身份。特征向量:人脸识别算法通常会将人脸图像转换为数值表示,称为特征向量或人脸特征。这些特征向量是人脸识别算法用于比对和匹配的关键数据。元数据:数据库中可能包含其他与人脸图像相关的信息,例如拍摄时间、地点、摄像头信息等。总结起来,人脸检测是找出图像中的人脸位置,而人脸识别是在已检测到的人脸中识别出具体的身份。人脸检测是一个二分类问题(有人脸或无人脸),而人脸识别则是一个多分类或一对一匹配问题(识别具体的人脸身份)。
2、常用人脸检测算法
从大方向来说,人脸检测可以分为三种方向:
基于特征的人脸检测技术:通过采用颜色、轮廓、纹理、结构或者直方图特征等进行人脸检测基于模板匹配人脸检测技术:从数据库当中提取人脸模板,接着采取一定模板匹配策略,使抓取人脸图像与从模板库提取图片相匹配,由相关性的高低和所匹配的模板大小确定人脸大小以及位置信息基于统计的人脸检测技术:通过对于“人脸”和“非人脸”的图像大量搜集构成的人脸正、负样本库,采用统计方法强化训练该系统,从而实现对人脸和非人脸的模式进行检测和分类常用人脸检测算法:
Viola-Jones算法:一种经典的人脸检测算法,使用Haar特征和级联分类器进行检测MTCNN:多任务卷积神经网络,可同时进行人脸检测、关键点定位和人脸对齐RetinaFace:一种基于深度学习的快速人脸检测算法,具有较高的准确性和检测速度CenterNet:一种基于中心点检测的算法,可以用于人脸检测和其他目标检测任务
3、常用人脸识别算法
DeepFace:由Facebook开发的深度学习模型,用于人脸识别任务FaceNet:由Google开发的基于深度学习的人脸识别系统,采用了三元组损失函数来学习具有相似性的人脸表示VGGFace:基于VGGNet模型的人脸识别算法,采用了深度卷积神经网络进行特征提取和匹配VGGFace2:包含了约9,131个身份的3.31百万个人脸图像,是一个用于人脸识别的大规模数据集。VGGFace2合集是VGGFace数据集的继任者,更具挑战性和多样性ArcFace:一种用于人脸识别的度量学习算法,通过将同一身份的人脸样本相互拉近,不同身份的人脸样本相互推开
4、常用人脸检测与识别数据集
人脸检测数据集:
AFLW(Annotated Facial Landmarks in the Wild):一个包含21,080张图像和24,386个人脸实例的数据集,用于人脸关键点检测和人脸对齐任务WIDER Face:一个大规模的人脸检测数据集,包含32,203张图像和393,703个人脸实例。该数据集涵盖了多种场景和姿势,具有挑战性FDDB(Face Detection Data Set and Benchmark):包含2,845张图像和5,171个人脸实例的数据集,用于评估人脸检测算法的性能FDDB-Folds:FDDB数据集的一个变体,提供了10个预定义的数据集划分,每个划分都用于训练和测试不同的人脸检测算法AFW(Annotated Faces in the Wild):一个用于人脸检测和人脸关键点检测的数据集,包含205张自然图像。每张图像都标注了人脸的边界框和关键点AFW-Subset:AFW数据集的一个子集,包含了205个图像和473个人脸实例。用于在较小的规模上进行人脸检测算法的测试BioID:一个包含1,521张图像和1,521个人脸实例的数据集,用于人脸检测和人脸识别任务。每个图像都提供了人脸边界框的标注人脸识别数据集:
LFW(Labeled Faces in the Wild):一个常用的用于人脸识别的数据集,包含13,000多张名人的人脸图像CelebA:包含超过20万个名人图像的数据集,用于人脸属性识别和人脸识别任务CASIA-WebFace:由中国科学院自动化研究所创建的人脸识别数据集,包含10,575个身份的494,414张人脸图像MegaFace:包含来自互联网的百万级人脸图像,用于评估大规模人脸识别系统的性能MS-Celeb-1M:由微软研究亚洲实验室发布的一个大规模人脸识别数据集。它包含了来自互联网的约100万个名人身份的人脸图像MegaFace Challenge:一个用于评估大规模人脸识别系统性能的挑战赛,提供了大量的人脸图像数据。MegaFace合集包含了来自互联网的数百万个人脸图像,用于进行更真实的评估UMDFaces:由美国马里兰大学发布的一个包含来自互联网的超过3,700个身份的3.7百万个人脸图像的数据集。它包含了不同年龄、种族和姿势的人脸图像CASIA-WebFace:中国科学院自动化研究所发布的人脸识别数据集,包含了来自互联网的10,575个身份的494,414张人脸图像
更多人脸数据集参考:常用公开人脸数据集汇总,持续更新中~~_人脸表情数据集-CSDN博客
5、face_recognition 人脸识别
face_recognition号称是世界上最简单的开源人脸识别库,可以通过Python或命令行识别和操作人脸。face_recognition提供了十分完整的技术文档和应用实例,人脸识别初学者建议研究该库上手。
face_recognition的官方代码仓库为:face_recognitionGitHub - ageitgey/face_recognition: The world's simplest facial recognition api for Python and the command line
face_recognition也有自己的官方中文文档,该文档详情见:face_recognition中文使用说明face_recognition/README_Simplified_Chinese.md at master · ageitgey/face_recognition · GitHub
实际使用建议看看官方文档的函数接口说明face_recognition函数接口。
face_recognition中的人脸识别模型来自开源的机器学习库Dlib,Dlib的官方代码仓库见:dlib。大部分模型用Labeled Faces in the Wild人脸数据集进行测试,有高达99.38%的准确率。但对小孩和亚洲人脸的识别准确率尚待提升。Labeled Faces in the Wild是美国麻省大学安姆斯特分校(University of Massachusetts Amherst)制作的人脸数据集,该数据集包含了从网络收集的13,000多张面部图像。该数据集算是一个非常小型的人脸数据集。
总体而言这个项目的人脸识别模型是基于成年人的,在孩子身上效果可能会一般。
其它相关学习资料:
Python-Study-Notes/Deep learning/face detection at main · luohenyueji/Python-Study-Notes · GitHub
编写人脸识别代码
步骤一:安装相关库
pip install boost -i https://mirrors.aliyun.com/pypi/simple/
pip install cmake -i https://mirrors.aliyun.com/pypi/simple/
pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple
离线下载dlib-19.17.99-cp37-cp37m-win_amd64.whl,将包放到E:\soft文件夹中,cmd打开切换到soft文件夹中,执行如下语句
dlib-19.17.99-cp37-cp37m-win_amd64.whl离线下载地址:
链接: https://pan.baidu.com/s/1Ahf98vCWmQyxs8bvTexm3Q?pwd=mges 提取码: mges
pip install dlib-19.17.99-cp37-cp37m-win_amd64.whl
下载人脸识别库
pip install face_recognition -i https://mirrors.aliyun.com/pypi/simple/
步骤二:创建人脸库文件夹
创建sourceai/model/face/custom/train文件夹,将人像图片存放到当前文件夹中
步骤三:创建图片工具类代码
创建sourceai/model/face/custom/base64util.py,代码如下
import base64
def base2picture(strbase64, target_path):
try:
avatar_bytes = base64.b64decode(strbase64)
with open(target_path, 'wb+') as fp:
fp.write(avatar_bytes)
return 1
except Exception as e:
print(e)
return 0
def pic2base64(path):
try:
f = open(path, 'rb') # 二进制方式打开图文件
data = base64.b64encode(f.read()) # 读取文件内容,转换为base64编码
f.close()
return data.decode('ascii')
except Exception as e:
print(e)
return 0
步骤四:创建人脸识别代码
创建sourceai/model/face/custom/facesearch.py,代码如下
import face_recognition as fr
import cv2
import numpy as np
import os
def init(path):
known_names = []
known_name_encodings = []
images = os.listdir(path)
for _ in images:
try:
image = fr.load_image_file(path + _)
image_path = path + _
encoding = fr.face_encodings(image)[0]
known_name_encodings.append(encoding)
known_names.append(os.path.splitext(os.path.basename(image_path))[0].capitalize())
except:
pass
print(known_names)
return known_names,known_name_encodings
def start(trains,test_image):
known_names ,known_name_encodings = init(trains)
image = cv2.imread(test_image)
face_locations = fr.face_locations(image)
face_encodings = fr.face_encodings(image, face_locations)
name = ""
for (top, right, bottom, left), face_encoding in zip(face_locations, face_encodings):
matches = fr.compare_faces(known_name_encodings, face_encoding)
face_distances = fr.face_distance(known_name_encodings, face_encoding)
best_match = np.argmin(face_distances)
if matches[best_match]:
name = known_names[best_match]
return name
return name
if __name__ == '__main__':
path = "./train/"
test_image = "wcj.png"
result = start(path,test_image)
print(result)
步骤五:放置搜索图片
train文件夹中选取一张图片或者找一张和train文件夹下某张图片类似的文件放置到custom文件夹下
注意:测试图片命名不能出现中文
步骤六:人脸搜索测试
测试facesearch.py代码,进行识别,查看运行结果