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

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

在这里插入图片描述

定位结果如下所示:

在这里插入图片描述

感觉还是很强大的,当然了,在我实践的过程中也发现了部分图像识别检测人脸失败的问题,这个毕竟不是一个百分之百的问题,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))

现在能在网上找到很多很多的学习资源,有免费的也有收费的,当我拿到1套比较全的学习资源之前,我并没着急去看第1节,我而是去审视这套资源是否值得学习,有时候也会去问一些学长的意见,如果可以之后,我会对这套学习资源做1个学习计划,我的学习计划主要包括规划图和学习进度表。

分享给大家这份我薅到的免费视频资料,质量还不错,大家可以跟着学习

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里无偿获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 29
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值