百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

人脸识别系统真的不难?今天手把手教你用Python写

off999 2024-12-03 00:08 17 浏览 0 评论

前言

文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

作者: 沂水寒城

PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取

http://note.youdao.com/noteshare?id=3054cce4add8a909e784ad934f956cef

首先你需要安装一个模块

pip install face_recognition

face_recognition是一个强大、简单、易上手的人脸识别开源项目,并且配备了完整的开发文档和应用案例,特别是兼容树莓派系统。

1、定位图像中的人脸

def demoFunc():
 '''
 在一张包含人脸的图片中圈出来人脸
 '''
 image = face_recognition.load_image_file("test.jpg")
 face_locations = face_recognition.face_locations(image)
 for one in face_locations: 
 y0, x1, y1, x0=one
 cv2.rectangle(image, pt1=(x0, y0), pt2=(x1, y1), color=(0, 0, 255), thickness=3)
 cv2.imshow('aaa', image)
 if cv2.waitKey(0) & 0xFF == ord('q'):
 cv2.destroyAllWindows()

从网上随便找了一张图片,如下所示:

定位结果如下所示:

感觉还是很强大的,当然了,在我实践的过程中也发现了部分图像识别检测人脸失败的问题,这个毕竟不是一个百分之百的问题,face_recognition更像是一个基础框架,帮助我们更加高效地去构建自己的人脸识别的相关应用。

2、切割图像中的每个人脸保存本地

def demoFunc():
 '''
 图片中人脸截图保存
 '''
 img = cv2.imread("test.jpg")
 image = face_recognition.load_image_file("test.jpg")
 face_locations = face_recognition.face_locations(image) #(top, right, bottom, left)
 for i in range(len(face_locations)):
 y0, x1, y1, x0 = face_locations[i]
 cropped = img.crop((x0,y0,x1,y1)) # (left, upper, right, lower) 左上角 右下角
 cropped.save(str(i)+"_.jpg")
 cropped.show()

使用的原始图像同上,结果如下所示:

五张人脸都检测成功,并且保存成功,这里主要是要注意一些face_locations这个函数的返回结果,返回的子列表中每个子列表包含4个元素,分别是单张人脸图像的左上顶点和右下顶点坐标,主要需要注意的是这四个参数的顺序,我给出来的结果中(x0,y0)表示左上顶点的坐标,(x1,y1)表示右下顶点的坐标。

3、将图像中的每个人脸编码成一个128维的向量

def demoFunc():
 '''
 将图片中的每张人脸编码成一个128维长度的向量
 '''
 image = face_recognition.load_image_file("cl.jpg")
 face_locations = face_recognition.face_locations(image) #(top, right, bottom, left) 
 face_encodings = face_recognition.face_encodings(image, face_locations) #将单个人脸数据转化为一个128维的向量
 for one in face_encodings:
 print('one: ',one)

进行到这里就不得不去讲一下face_recognition的一些应用原理,下面是我的一些总结,如有不当欢迎指教。

face_recognition模块人脸识别应用实现的原理:

(1) 给定想要识别的人脸的图片并对其进行编码(每个人只需要一张),并将这些不同的人脸编码构建成一个列表。编码其实就是将人脸图片映射成一个128维的特征向量。

(2) 计算图像向量之间的相似度根据阈值或者是容错度来决定是否是同一个人

(3) 输出识别结果标签。

毫不夸张地说,face_recognition整个的核心就在于这一块的向量化处理中,输入的每一张人脸图像都会被转化为一个128维的特征向量进行存储,128维特征向量的生成也是一个算法在里面的感兴趣的话可以去查一下深入了解一下,我这里就不展开了,之后的人脸识别就转化为了两个人脸图像之间向量相似度的问题了。

这里使用一张成龙大哥的图像来进行测试,原始图像如下所示:

向量化结果如下:

如果自己想要构建自己的个性化应用的话一般会选择在这里进行改造,首先就是需要保存这里的特征向量。

4、输入两张人脸图像,判断是否是同一个人

def demoFunc(one_pic='c1.jpg',two_pic='c2.jpg'):
 '''
 给定两张图片,判断是否是同一个人
 '''
 chenglong = face_recognition.load_image_file(one_pic)
 unknown_image = face_recognition.load_image_file(two_pic)
 biden_encoding = face_recognition.face_encodings(chenglong)[0]
 unknown_encoding = face_recognition.face_encodings(unknown_image)[0]
 results = face_recognition.compare_faces([biden_encoding], unknown_encoding)
 print('results: ',results)
 return results[0]

这里其实跟上面第三部分的有点相似,这部分是建立在第三部分基础上的只不过是自带了compare_faces这个相似度计算接口,这里其实可以自己去实现替换的。

同样,使用了两张成龙大哥的图像来进行测试,原始图像如下所示:

测试结果如下:

5、脸部关键点识别和标注

def demoFunc(pic_path='cl.jpg'):
 '''
 脸部关键点识别、标注
 '''
 image = face_recognition.load_image_file(pic_path)
 face_landmarks_list = face_recognition.face_landmarks(image)
 print("I found {} face(s) in this photograph.".format(len(face_landmarks_list)))
 pil_image = Image.fromarray(image)
 d = ImageDraw.Draw(pil_image)
 for face_landmarks in face_landmarks_list:
 for facial_feature in face_landmarks.keys():
 print("The {} in this face has the following points: {}".format(facial_feature, face_landmarks[facial_feature]))
 for facial_feature in face_landmarks.keys():
 d.line(face_landmarks[facial_feature], width=5)
 pil_image.show()

脸部的关键点包括:鼻子、嘴巴、眼睛、眉毛等,这里还是用的上面成龙大哥的图片,下面的结果输出:

6、化妆

这部分是建立在第五部分基础上的,得到的面部的特征以后就可以进行自动化妆了,下面是具体的实现:

def demoFunc(pic_path="haiwang.jpg"):
 '''
 化妆
 '''
 image = face_recognition.load_image_file(pic_path)
 face_landmarks_list = face_recognition.face_landmarks(image)
 pil_image = Image.fromarray(image)
 for face_landmarks in face_landmarks_list:
 demo = ImageDraw.Draw(pil_image, 'RGBA')
 demo.polygon(face_landmarks['left_eyebrow'], fill=(68, 54, 39, 128))
 demo.polygon(face_landmarks['right_eyebrow'], fill=(68, 54, 39, 128))
 demo.line(face_landmarks['left_eyebrow'], fill=(68, 54, 39, 150), width=2)
 demo.line(face_landmarks['right_eyebrow'], fill=(68, 54, 39, 150), width=2)
 demo.polygon(face_landmarks['top_lip'], fill=(150, 0, 0, 128))
 demo.polygon(face_landmarks['bottom_lip'], fill=(150, 0, 0, 128))
 demo.line(face_landmarks['top_lip'], fill=(150, 0, 0, 64), width=2)
 demo.line(face_landmarks['bottom_lip'], fill=(150, 0, 0, 64), width=2)
 demo.polygon(face_landmarks['left_eye'], fill=(255, 255, 255, 30))
 demo.polygon(face_landmarks['right_eye'], fill=(255, 255, 255, 30))
 demo.line(face_landmarks['left_eye'] + [face_landmarks['left_eye'][0]], fill=(0, 0, 0, 110), width=2)
 demo.line(face_landmarks['right_eye'] + [face_landmarks['right_eye'][0]], fill=(0, 0, 0, 110), width=2)
 pil_image.show()

这里使用海王的一张图片来进行测试,原始图像如下所示:

处理后结果如下:

.还可以是这样的:

7、基于face_recognition构建自己的简单人脸识别应用

上面介绍了很多face_recognition的应用,这里才是最重要的内容我觉得是这样的,基于已有的功能来实现我们自己的个性化应用,我这里只是简单的抛砖引玉,给出来自己的最最简单的实现:

def faceRecognitionDemo(picDir='data/', test_pic='test.png'):
 '''
 基于 face_recognition 构建人脸识别模块
 '''
 pic_list=os.listdir(picDir)
 for one_pic in pic_list:
 one_pic_path=picDir+one_pic
 one_res=demo6(one_pic=one_pic_path,two_pic=test_pic)
 one_name=one_pic.split('.')[0].strip()
 if one_res:
 print('This Person is: ', one_name)
 break
 else:
 print('This Person is not: ', one_name)

data文件夹数据截图如下:

test.png内容如下:

结果输出如下:

当然了,实时计算肯定当前的计算方式不能满足的,这个只是一个最简单的应用而已,只想在这里抛砖引玉,这里是通过调用了face_recognition接口的形式来完成相似判定的工作的,还有一种非常常见的办法就是在得到人脸图像的128维特征向量之后就可以将人脸识别问题转化为基于机器学习模型的一个简单分类问题了,比如:SVM、RF、GBDT等都可以非常出色地完成上面的任务。

相关推荐

Python钩子函数实现事件驱动系统(created钩子函数)

钩子函数(HookFunction)是现代软件开发中一个重要的设计模式,它允许开发者在特定事件发生时自动执行预定义的代码。在Python生态系统中,钩子函数广泛应用于框架开发、插件系统、事件处理和中...

Python函数(python函数题库及答案)

定义和基本内容def函数名(传入参数):函数体return返回值注意:参数、返回值如果不需要,可以省略。函数必须先定义后使用。参数之间使用逗号进行分割,传入的时候,按照顺序传入...

Python技能:Pathlib面向对象操作路径,比os.path更现代!

在Python编程中,文件和目录的操作是日常中不可或缺的一部分。虽然,这么久以来,钢铁老豆也还是习惯性地使用os、shutil模块的函数式API,这两个模块虽然功能强大,但在某些情况下还是显得笨重,不...

使用Python实现智能物流系统优化与路径规划

阅读文章前辛苦您点下“关注”,方便讨论和分享,为了回馈您的支持,我将每日更新优质内容。在现代物流系统中,优化运输路径和提高配送效率是至关重要的。本文将介绍如何使用Python实现智能物流系统的优化与路...

Python if 语句的系统化学习路径(python里的if语句案例)

以下是针对Pythonif语句的系统化学习路径,从零基础到灵活应用分为4个阶段,包含具体练习项目和避坑指南:一、基础认知阶段(1-2天)目标:理解条件判断的逻辑本质核心语法结构if条件:...

[Python] FastAPI基础:Path路径参数用法解析与实例

查询query参数(上一篇)路径path参数(本篇)请求体body参数(下一篇)请求头header参数本篇项目目录结构:1.路径参数路径参数是URL地址的一部分,是必填的。路径参...

Python小案例55- os模块执行文件路径

在Python中,我们可以使用os模块来执行文件路径操作。os模块提供了许多函数,用于处理文件和目录路径。获取当前工作目录(CurrentWorkingDirectory,CWD):使用os....

python:os.path - 常用路径操作模块

应该是所有程序都需要用到的路径操作,不废话,直接开始以下是常用总结,当你想做路径相关时,首先应该想到的是这个模块,并知道这个模块有哪些主要功能,获取、分割、拼接、判断、获取文件属性。1、路径获取2、路...

原来如此:Python居然有6种模块路径搜索方式

点赞、收藏、加关注,下次找我不迷路当我们使用import语句导入模块时,Python是怎么找到这些模块的呢?今天我就带大家深入了解Python的6种模块路径搜索方式。一、Python模块...

每天10分钟,python进阶(25)(python进阶视频)

首先明确学习目标,今天的目标是继续python中实例开发项目--飞机大战今天任务进行面向对象版的飞机大战开发--游戏代码整编目标:完善整串代码,提供完整游戏代码历时25天,首先要看成品,坚持才有收获i...

python 打地鼠小游戏(打地鼠python程序设计说明)

给大家分享一段AI自动生成的代码(在这个游戏中,玩家需要在有限时间内打中尽可能多的出现在地图上的地鼠),由于我现在用的这个电脑没有安装sublime或pycharm等工具,所以还没有测试,有兴趣的朋友...

python线程之十:线程 threading 最终总结

小伙伴们,到今天threading模块彻底讲完。现在全面总结threading模块1、threading模块有自己的方法详细点击【threading模块的方法】threading模块:较低级...

Python信号处理实战:使用signal模块响应系统事件

信号是操作系统用来通知进程发生了某个事件的一种异步通信方式。在Python中,标准库的signal模块提供了处理这些系统信号的机制。信号通常由外部事件触发,例如用户按下Ctrl+C、子进程终止或系统资...

Python多线程:让程序 “多线作战” 的秘密武器

一、什么是多线程?在日常生活中,我们可以一边听音乐一边浏览新闻,这就是“多任务处理”。在Python编程里,多线程同样允许程序同时执行多个任务,从而提升程序的执行效率和响应速度。不过,Python...

用python写游戏之200行代码写个数字华容道

今天来分析一个益智游戏,数字华容道。当初对这个游戏颇有印象还是在最强大脑节目上面,何猷君以几十秒就完成了这个游戏。前几天写2048的时候,又想起了这个游戏,想着来研究一下。游戏玩法用尽量少的步数,尽量...

取消回复欢迎 发表评论: