这是关于人脸的又一篇原创!
之前有利用C++和OpenCv写过人脸识别的系列文章,对于人脸识别的基本理解和步骤流程等基本知识不做反复叙述。比詹小白还要白的童鞋可以查看往期文章进行了解噢
一、人脸检测
python版人脸检测基本上可以参照C++版本的程序,根据语法不同进行改写即可。
1.输入为包含人脸的图片时
这种情况较为简单,只是直接使用了opencv库的训练好的人脸检测模型~其代码如下所示:(具体函数和方法和c++情况下一样,不反复叙述)
1#encoding=utf-8 2import cv2 3import numpy 4face_patterns = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') #加载分类器,在opencv库内 5sample_image = cv2.imread('image4.jpg') #这里是当输入为图片而不是摄像头采集时 6faces = face_patterns.detectMultiScale(sample_image,scaleFactor=1.1,minNeighbors=5,minSize=(80, 80)) 7for (x, y, w, h) in faces: 8 cv2.rectangle(sample_image, (x, y), (x+w, y+h), (0, 255, 0), 2) 9cv2.imshow('face', sample_image); 10cv2.waitKey(0) 11cv2.destroyAllWindows()
程序将图像中的人脸检测出来并框出来。运行结果如下所示:
2.输入为摄像头实时采集的图像时
这种情况和第一种情况大体类似,唯一的不同在于输入图像输入不来源于静止图片,而是摄像头的实时采集图像。测试效果不进行展示了(怕帅到你们)
1#encoding=utf-8 2import cv2 3import numpy 4face_patterns = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') #加载分类器,在opencv库内 5camera = cv2.VideoCapture(0) #这里是利用摄像头采集,打开摄像头操作 6while camera.isOpened: 7 #利用read方法读取摄像头的某一帧图片 8 (ok, sample_image) = camera.read() 9 if not ok: 10 break 11 faces = face_patterns.detectMultiScale(sample_image,scaleFactor=1.1,minNeighbors=5,minSize=(80, 80)) 12 for (x, y, w, h) in faces: 13 cv2.rectangle(sample_image, (x, y), (x+w, y+h), (0, 255, 0), 2) 14 cv2.imshow('face', sample_image); 15 if cv2.waitKey(10)&0xFF==ord('q'):#按下q,退出循环 16 break 17camera.release() 18#cv2.waitKey(0) 19cv2.destroyAllWindows()
二、人脸识别
人脸识别也可以和检测一样参照c++版本的程序,但是学python时候接触到一个很牛*的模块,这里做图片集的人脸识别进行介绍。
首先,这是所谓的niubi模块是face_recognition库模块,该库使用 dlib 顶尖的深度学习人脸识别技术构建,在户外脸部检测数据库基准(Labeled Faces in the Wild benchmark)上的准确率高达 99.38%。
1.模块的安装
face_recognition 的安装真的很拼人品!!linux系统一装就好,windows系统折腾来捯饬去炒鸡费劲!!还好我是python3.6版本,按照网上的一些教程也算是安装好了,(cmake、dlib啥的很难受)。
简单的说,用pip install指令进行安装还是比较容易的。一条指令即可,如果在安装dlib时出错那就可怜你得捯饬一会了~~
pip install face_recognition
2.代码实现
重点有三个,主要如下:
face_recognition.load_image_file
加载训练的对象,这里仅仅是三个类,各类一张图片
face_recognition.face_encodings
对加载好的对象,利用face_recognition中的方法进行特征识别,用于后面分类
face_recognition.compare_faces
将待分类识别的图像按照相同方法进行特征识别,并将其特征与指定对象特征对比,进行判断
以乔布斯、奥巴马和无名为例~
代码如下:
1# -*- coding: utf-8 -*- 2import cv2 3import face_recognition 4jobs_image = face_recognition.load_image_file("jobs.jpg");#乔布斯 5obama_image = face_recognition.load_image_file("obama.jpg");#奥巴马 6unknown_image = face_recognition.load_image_file("unknown.jpg");#无名人士 7jobs_encoding = face_recognition.face_encodings(jobs_image)[0] 8obama_encoding = face_recognition.face_encodings(obama_image)[0] 9unknown_encoding = face_recognition.face_encodings(unknown_image)[0] 10#重点是:compare_face 11results = face_recognition.compare_faces([jobs_encoding, obama_encoding], unknown_encoding ) 12labels = ['jobs', 'obama'] 13print('results:'+str(results)) 14for i in range(0, len(results)): 15 if results[i] == True: 16 print('The person is:'+labels[i])
代码通俗易懂(python的一大特点~),其运行结果是以文本形式指出识别对象。结果如下:
1>>>results:[False, True] 2>>>The person is:obama