前不久下定决心,难为我的笔记本一次,用Python 来实现 人脸识别 。
干正事 根据网上的方法,把相关的库都装好以后。
已经用了半天时间
先是为难了一下我笔记本的摄像机,用 cv2 的库,来调用电脑摄像头获取人脸。
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 语句,是画矩形,就是识别到我的脸以后,在我的脸哪里画方框,蓝色的。
至于为什么那么写,我也不知道。 百度了很多篇文章都是只给源码没做解释,我数学也不好,也懒得深究。毕竟不是深度学习。
由于笔记本摄像头一直都被粘着,导致摄像头也快废了,最后调用的时候,就成了这么一副灵魂出窍模样的图片,不过这都能识别到我的脸。也是牛逼。
由于摄像头不行,后面的人脸采集器什么的也就只是试了一下。
识别网络图片 后面发现有一个叫face_recognition 的库,他可以识别图片中的人脸,然后分析脸部特征,根据特征给出一系列的编码,还可以使用这些编码来匹配人脸。不说也是挺牛逼的,只是准确度有待提高。
当给定一个图片时,我们可以标注不同的特征并将其转化为如下的特征向量:
如此一来,我们的图片现在被转化为一个向量,可以表示为(23.1,15.8,255,224,189,5.2,4.4)。当然我们还可以从图片中衍生出无数的其他特征(如,头发颜色,胡须,眼镜等)。然而在这个简单的例子中,我们只考虑这五个简单的特征。
在这里,我把我的图片作为匹配的对象,把女朋友的照片作为被匹配对象,我以为结果是Not Match的,结果是出人意料的 Match。介于网络划水的准则,就不放出图片了。
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,所以决定采用去重的方法。
你说这怎么看嘛。
二维数组去重 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 # -*- 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)
首先把两个值 添加进一个 列表内,后来通过百度,找到了二维数组去重的方法。
这是一条列表推导式,我对他产生了极大的好奇
我想试着把他分解出来。根据列表推导式的格式
列表推导式 的执行顺序:各语句之间是嵌套关系,左边第二个语句是最外层,依次往右进一层,左边第一条语句是最后一层。
1 [x*y for x in range(1,5) if x > 2 for y in range(1,4) if y < 3]
他的执行顺序是:
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)
后面我写出来了一串这样的代码,执行后发现是错的。
1 2 for t in lists: dic=list(set(tuple(t)))
经过再三研究,才发现推导出来
1 2 3 4 dics = [] for i in lists: dics.append(tuple(i)) print(list(set(dics)))
这是真的花里胡哨