概述
上文提到人脸检测,本文关注人脸识别。
人脸检测是OpenCV的一个很不错的功能,是人脸识别的基础。
1. 生成人脸识别数据
确保样本图像满足一下条件:
+图像是灰度格式,后缀名为.pgm
+图像形状为正方形
+图像大小要一样
generate_train.py脚本如下:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
"""
This program is debugged by Harden Qiu.
You can send a e-mail to hardenqiu@foxmail.com for more details.
"""
import cv2
def generate():
face_cascade = cv2.CascadeClassifier('./cascades/haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('./cascades/haarcascade_eye.xml')
camera = cv2.VideoCapture(0)
count = 0
while (True):
ret, frame = camera.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
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('./data/sw/%s.pgm' % str(count), f)
print(count)
count += 1
cv2.imshow("camera", frame)
if cv2.waitKey(1) & 0xff == ord("q"):
break
camera.release()
cv2.destroyAllWindows()
if __name__ == "__main__":
generate()
在执行本代码前注意按照程序中的路径创建文件夹,否则无法生成图片。
注意不同的人要单独创建文件夹。
2. 准备训练数据
将样本图像加载到人脸识别算法中,算法train()函数包括两个参数:图像数组和标签数组。需要创建一个基于逗号分隔符值(Comma-Separated Value, CSV)的文件,用来根据ID记录样本图像的路径。CSV_Write.py代码如下:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
"""
This program is debugged by Harden Qiu.
You can send a e-mail to hardenqiu@foxmail.com for more details.
"""
import os
path = "data"
dirnames = os.listdir(path)
strText = ""
with open("faces.csv", "w") as fid:
for a in dirnames:
filenames = os.listdir(path + os.sep + a)
for b in range(len(filenames)):
strText = path + os.sep + a + os.sep + filenames[b] + ";" + a + "n"
fid.write(strText)
fid.close()
例如,有小王(xw)和小李(xl)两组图片,运行程序后得到faces.csv,如下:
包括名字和标签。
3. 加载数据并识别人脸
将图像数组和CSV文件加载到人脸识别算法中,首先需要创建函数逐行读取CSV文件,并将对应路径的图像加载到图像数组中,将ID加载到标签数组中。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
"""
This program is debugged by Harden Qiu.
You can send a e-mail to hardenqiu@foxmail.com for more details.
"""
import os
#import sys
import cv2
import numpy as np
#读取图像和标签
def read_images(path):
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):
filepath = os.path.join(subject_path, filename)
im = cv2.imread(os.path.join(subject_path, filename), cv2.IMREAD_GRAYSCALE)
im = cv2.resize(im, (20,20))
X.append(np.asarray(im, dtype=np.uint8))
y.append(c)
print(c)
c = c + 1
return [X, y]
#人脸识别
def face_rec():
names = ['xw', 'xl']
path = "./data/"
[X, y] = read_images(path)
y = np.asarray(y, dtype=np.int32)
model = cv2.face.LBPHFaceRecognizer_create()
model.train(np.asarray(X), np.asarray(y))
camera = cv2.VideoCapture(0)
face_cascade = cv2.CascadeClassifier('./cascades/haarcascade_frontalface_default.xml')
while (True):
read, img = camera.read()
faces = face_cascade.detectMultiScale(img, 1.2, 5)
for (x, y, w, h) in faces:
img = cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
roi = gray[x:x + w, y:y + h]
roi = cv2.resize(roi, (200, 200), interpolation=cv2.INTER_LINEAR)
print(roi.shape)
params = model.predict(roi)
print("Label: %s, Confidence: %.2f" % (params[0], params[1]))
cv2.putText(img, names[params[0]], (x, y - 20), cv2.FONT_HERSHEY_SIMPLEX, 1, 255, 2)
cv2.imshow("camera", img)
if cv2.waitKey(1) & 0xff == ord("q"):
break
cv2.destroyAllWindows()
if __name__ == "__main__":
face_rec()
以上程序完成了基本的图像识别过程,但由于只是展示了一个完整的识别过程,在识别准确度上有待提高,可通过多种方法进行完善,本文不在赘述。程序用到的训练库可通过generate_train.py制作,也可以从网上下载pgm格式人脸数据库,或者留言询问。
声明
如有侵权,请邮件联系博主删除。
本文只做学习研究!
如有疑问,可留言反馈或通过邮件交流(hardenqiu@foxmail.com)。
最后
以上就是积极皮卡丘为你收集整理的人脸检测和识别:人脸识别(Python)1. 生成人脸识别数据2. 准备训练数据3. 加载数据并识别人脸声明的全部内容,希望文章能够帮你解决人脸检测和识别:人脸识别(Python)1. 生成人脸识别数据2. 准备训练数据3. 加载数据并识别人脸声明所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复