avatar

目录
人脸识别+二维数组去重


前不久下定决心,难为我的笔记本一次,用Python 来实现 人脸识别 。

干正事

根据网上的方法,把相关的库都装好以后。

已经用了半天时间

先是为难了一下我笔记本的摄像机,用 cv2 的库,来调用电脑摄像头获取人脸。

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# -*- coding: utf-8 -*-
import numpy as np
import cv2


detector = cv2.CascadeClassifier('G:\Face\haarcascade_frontalface_default.xml')
eyeCasecade = cv2.CascadeClassifier('G:\Face\haarcascade_eye.xml')


cap = cv2.VideoCapture(0)
result = []
while True:
ret,img = cap.read()
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#faces = detector.detectMultiScale(gray,1.3,5)
faces = detector.detectMultiScale(gray,scaleFactor=1.2,minNeighbors=5,minSize=(32,32))

for (x,y,w,h) in faces:
fac_gray = gray[y:(y+h),x:(x+w)]
eyes = eyeCasecade.detectMultiScale(fac_gray,1.3,2)

for (ex,ey,ew,eh) in eyes:
result.append((x+ex,y+ey,ew,eh))


for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)

for (ex, ey, ew, eh) in result:
cv2.rectangle(img, (ex, ey), (ex+ew, ey+eh), (0, 255, 0), 2)

cv2.imshow('windowname', img)

if cv2.waitKey(1)& 0xFF == ord('q'):
break

cap.release()
cv2.destroyAllWindows()

只是正常的函数库调用, 中间的for 语句,是画矩形,就是识别到我的脸以后,在我的脸哪里画方框,蓝色的。

至于为什么那么写,我也不知道。 百度了很多篇文章都是只给源码没做解释,我数学也不好,也懒得深究。毕竟不是深度学习。

由于笔记本摄像头一直都被粘着,导致摄像头也快废了,最后调用的时候,就成了这么一副灵魂出窍模样的图片,不过这都能识别到我的脸。也是牛逼。

wrp

由于摄像头不行,后面的人脸采集器什么的也就只是试了一下。

识别网络图片

后面发现有一个叫face_recognition 的库,他可以识别图片中的人脸,然后分析脸部特征,根据特征给出一系列的编码,还可以使用这些编码来匹配人脸。不说也是挺牛逼的,只是准确度有待提高。

当给定一个图片时,我们可以标注不同的特征并将其转化为如下的特征向量:

640?wx_fmt=png

如此一来,我们的图片现在被转化为一个向量,可以表示为(23.1,15.8,255,224,189,5.2,4.4)。当然我们还可以从图片中衍生出无数的其他特征(如,头发颜色,胡须,眼镜等)。然而在这个简单的例子中,我们只考虑这五个简单的特征。

在这里,我把我的图片作为匹配的对象,把女朋友的照片作为被匹配对象,我以为结果是Not Match的,结果是出人意料的 Match。介于网络划水的准则,就不放出图片了。

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# -*- coding: utf-8 -*-
import face_recognition
import os

images = os.listdir('images')
image_to_be_matched = face_recognition.load_image_file('2.jpg')
image_to_be_matched_encoded = face_recognition.face_encodings(image_to_be_matched)[0]
lists.append(image_to_be_matched_encoded)

for image in images:
current_image = face_recognition.load_image_file("images/"+image)
current_image_encoded = face_recognition.face_encodings(current_image)[0]
result = face_recognition.compare_faces([image_to_be_matched_encoded],current_image_encoded)

if result[0] == True:
print("Mathced:" + image)
else:
print("Not matched:" + image)

后面,我还在被匹配的文件夹素材中添加了胡歌,易烊千玺,陈立农等照片作为被匹配对象。

但是除了陈立农的是匹配,胡歌和易烊千玺的都是不同。

由于他匹配的方法好像就是对比编码,我出于好奇,就把本人图片的编码和胡歌的一起输出,打算找些哪里不同,不过很乱,因为是list,所以决定采用去重的方法。

wrp

你说这怎么看嘛。

二维数组去重

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# -*- coding: utf-8 -*-
import face_recognition
import os

lists = []
images = os.listdir('images')

image_to_be_matched = face_recognition.load_image_file('2.jpg')
image_to_be_matched_encoded = face_recognition.face_encodings(image_to_be_matched)[0]
lists.append(image_to_be_matched_encoded)

image_to_be_matched2 = face_recognition.load_image_file('1.jpg')
image_to_be_matched_encoded2 = face_recognition.face_encodings(image_to_be_matched)[0]

image_to_be_matched3 = face_recognition.load_image_file('5.png')
image_to_be_matched_encoded3 = face_recognition.face_encodings(image_to_be_matched)
lists.append(image_to_be_matched_encoded3)

#二维数组去重
dic = list(set([tuple(t) for t in lists]))
#print(dic)
dic = [list(v) for v in dic]
print(dic)

首先把两个值 添加进一个 列表内,后来通过百度,找到了二维数组去重的方法。

这是一条列表推导式,我对他产生了极大的好奇

我想试着把他分解出来。根据列表推导式的格式

列表推导式的执行顺序:各语句之间是嵌套关系,左边第二个语句是最外层,依次往右进一层,左边第一条语句是最后一层。

Code
1
[x*y for x in range(1,5) if x > 2 for y in range(1,4) if y < 3]

他的执行顺序是:

Code
1
2
3
4
5
6
7
8
9
for x in range(1,5)
if x > 2
for y in range(1,4)
if y < 3
x*y
x=[0 for i in range(3)] #结果为[0,0,0]
#相当于:x=[]
for i in range(3):
x.append(i)

后面我写出来了一串这样的代码,执行后发现是错的。

Code
1
2
for t in lists:
dic=list(set(tuple(t)))

经过再三研究,才发现推导出来

Code
1
2
3
4
dics = []
for i in lists:
dics.append(tuple(i))
print(list(set(dics)))

这是真的花里胡哨

文章作者: KeyboArd
文章链接: https://www.wrpzkb.cn/Python-Face-List/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 KeyboArd's Blog
打赏
  • 微信
    微信
  • 支付寶
    支付寶

评论