人脸识别经典算法之一:特征脸方法(Eigenface)攻略
一、什么是特征脸(Eigenface)方法
特征脸(Eigenface)方法是一种常用的人脸识别方法,其思想核心是通过对一组人脸图像进行主成分分析(PCA),提取人脸图像的主要特征信息,即所谓的特征脸,从而实现人脸图像的快速识别。该方法是基于图像本身的统计特性进行数据降维,提取人脸的最主要特征并进行分类识别。这种方法具有效果好、时间短、可靠性高等优点,因而被广泛应用于人脸识别、人脸验证等领域。
二、特征脸(Eigenface)方法原理
特征脸(Eigenface)方法的具体实现流程如下:
-
收集人脸数据集(训练集)。
-
通过对人脸数据集的主成分分析(PCA)降维处理,得到训练集中每张人脸的特征向量(即特征脸)。
-
将特征脸作为一个基矢量,根据权值进行线性组合,建立一个人脸空间模型。
-
将待识别人脸图像也降维到该人脸空间模型中,计算其在人脸空间中的距离,即可进行识别。
三、特征脸(Eigenface)方法实现
特征脸(Eigenface)方法具体实现的流程是作为一个大型的项目进行的,需要用到多个步骤,每个步骤都是非常关键的,其中最复杂和关键的是人脸特征向量的提取。
这是一个典型的图像处理过程,涉及到很多领域的知识,如图像灰度化、图像标准化、图像增强、人脸检测和特征提取,其中的每一步操作都需要用到相应的算法。
考虑到篇幅问题,在此,我们仅提供一个简单的python实现示例,但对于实际应用而言,这个示例要比实际应用复杂得多。
#导入库函数
import numpy as np
import cv2
#获取训练集
def read_images(path, sz=None):
c = 0
X, y = [], []
for dirname, dirnames, filenames in os.walk(path):
for subdirname in dirnames:
subject_path = os.path.join(dirname, subdirname)
for filename in os.listdir(subject_path):
try:
img = cv2.imread(os.path.join(subject_path, filename), cv2.IMREAD_GRAYSCALE)
if sz is not None:
img = cv2.resize(img, (200,200))
X.append(np.asarray(img, dtype=np.uint8))
y.append(c)
except IOError:
print("I/O error({0}): {1}".format(errno, strerror))
except:
print("Unexpected error:", sys.exc_info()[0])
raise
c = c+1
return [X,y]
def face_rec():
names = ['Steve Jobs', 'Bill Gates']
if len(sys.argv) < 2:
print("USAGE: facerec.py ")
sys.exit()
[X,y] = read_images(sys.argv[1])
y = np.asarray(y, dtype=np.int32)
model = cv2.face.EigenFaceRecognizer_create()
model.train(np.asarray(X), np.asarray(y))
camera = cv2.VideoCapture(0)
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
while(True):
read, img = camera.read()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
roi = gray[y:y+h, x:x+w]
try:
roi = cv2.resize(roi, (200,200), interpolation=cv2.INTER_LINEAR)
params = model.predict(roi)
print("Label: %s, Confidence: %.2f" % (names[params[0]], params[1]))
cv2.putText(img, names[params[0]], (x,y-20), cv2.FONT_HERSHEY_SIMPLEX, 1, 255, 2)
except:
continue
cv2.imshow("camera",img)
if cv2.waitKey(1000 / 12) & 0xff == ord("q"):
break
camera.release()
cv2.destroyAllWindows()
四、特征脸(Eigenface)方法优缺点
特征脸(Eigenface)方法的优点:
-
该方法在人脸识别中具有较高的准确率和精度,且不会受到光照、遮挡、表情等因素的影响,因此具有较强的稳健性和鲁棒性。
-
特征脸方法在计算时间上比较短,可以适用于实时的人脸识别系统。
-
即使数据集较大,该方法也可以实现快速分类。
特征脸(Eigenface)方法的缺点:
-
该方法需要较为复杂的计算步骤,如主成分分析(PCA)等,需要占用较高的计算资源
-
该方法对于输入数据的依赖性比较强,如果输入的图像质量太差,很容易导致算法失效。
总结
本文简单介绍了特征脸(Eigenface)方法在人脸识别领域中的应用,以及该方法的原理、实现过程、优缺点等方面。在实际应用中,特征脸(Eigenface)方法能够直接应用于识别门禁、银行卡、身份证等,可以为生活带来不少便利。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:人脸识别经典算法一 特征脸方法(Eigenface) - Python技术站