基于opencv的人脸识别
opencv的一个目录:opencv/sources/data/haarcascades 提供了用于人脸检测相关的文件,加载这些文件,就可以方便的实现人脸检测的相关工作。
face_cascade = cv2.CascadeClassifier('./haarcascade_frontalface_default.xml') faces = face_cascade.detectMultiScale(face_gray, 1.3, 5)
上述代码就可以实现人脸的区域的检测,face返回人脸矩形框的左上角坐标以及矩形框的长和宽的列表。
显然,做人脸识别需要大量的训练数据。一般深度学习识别的训练集数据都是万为单位。我们这里就打算调用摄像头,然后将用上述矩形框里的图像转化为灰度图然后再resize到200*200大小作为训练数据。
下面是获取100张训练图像的代码
#coding: utf-8 import cv2 datapath = "D:/imgData/face/" def generate(name): face_cascade = cv2.CascadeClassifier('./haarcascade_frontalface_default.xml') # eye_cascade = cv2.CascadeClassifier('./haarcascade_eye.xml') camera = cv2.VideoCapture(0) count = 0 while (True): ret, frame = camera.read() gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) #p2:人脸检测中每次迭代图像的压缩率 p3:每个人脸矩形保留近邻数目的最小值ֵ faces = face_cascade.detectMultiScale(gray, 1.3, 5) for (x,y,w,h) in faces: img = cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2) f = cv2.resize(gray[y:y+h, x:x+w], (200, 200)) cv2.imwrite(datapath + str(name) + '/%s.pgm' % str(count), f) print count count += 1 if(count >= 100): break cv2.imshow("camera", frame) if cv2.waitKey(1000 / 12) & 0xff == ord("q"): break camera.release() cv2.destroyAllWindows() if __name__ == "__main__": generate('wjf')
训练数据的话都要一个文本文件来指定当前图片属于哪一个类别?caffee是用一个txt文本说明,opencv需要一个csv文件说明。
当然,这个文件肯定需要代码来生成,代码比较简单,就是一些文件的操作。python方便的就是可以用其他的包调用,而且使用起来很方便,跟Java一样。python文件操作一个好用的包就是os了。
下面是生成csv文件的代码:
#coding: utf-8 import os dataPath = "D:/imgData/face/" #列出文件夹所有文件夹 dirList = os.listdir(dataPath) label = -1; for name in dirList: path = dataPath + str(name) + '/' print path cpath = str(path)[16:str(path).rfind('/')+1] label += 1 f = open(dataPath+'train.csv', 'a+'); fileList = os.listdir(path) for fileName in fileList: print fileName f.write(cpath + fileName + ';' + str(label) + '\n')
打开这个文件,可以看到其内容如下,有必要的话可以将顺序在打乱一点。
完事具备,接下来就是训练了。opencv提供了三种人脸识别的方法,这里打算用Eigenfaces来实现,它是基于PCA原理的。
- 使用起来也很简单,传入所有图像数组的list集合X以及对应标签的list。
训练完成后,我们将模型保存到xml文件中去。
model = cv2.face.createEigenFaceRecognizer() model.train(np.asarray(X), np.asarray(y)) model.save(dataPath + 'model.xml')
模型的预测也很简单了,调用model.predict(img)就可以返回img对应的标签了。
- 如果识别的不稳定,可以增加训练数据。