让“它”认得你

——利用opencv快速入门人脸检测与人脸识别

opencv,顾名思义“开源,计算机视觉”。OpenCV就是这样的一个特殊的框架,一群大牛然绕自己的时间,制作了一个开源的计算机视觉框架。借助它我们可以快速的创建计算机视觉的应用。而我们这里将会使用更更加快速的OpenCV-Python,也就是OpenCV的Python接口。假如你已经安装了Python和pip,那么只需简单的执行“pip install opencv-python”即可。如果你没有安装Python,那么也很简单,下载Anaconda3,然后安装,其就自带近乎完整的Python科学计算环境。之后继续pip即可。

有了以上工具的帮助,我们只需要简单地使用几十行代码就可以快速的实现人脸检测与人脸识别。让“它”认得你。

人脸检测

人脸检测技术算得上是计算机视觉的基础级的技术之一。甚至在前深度学习时代,该技术就已经得到了很高程度的发展。在深度学习时代,人脸识别一般是利用卷积神经网络进行监督式学习,也就是通过让算法(神经网络)自己去发现规律的方式,创造出有用的卷积核(一种矩阵),然后利用其进行寻找图片和视频中的人脸。而在这之前,人们需要的则是自己去设计算法,寻找人脸。不过后来人们发明了一种近似于深度学习思路的人脸寻找算法,那就是haar算法。

这个算法简单点来说,就是计算一个区域内不同像素之间的灰度差别,来判断是不是人脸。原理就是一种有规律的图像,比如一个物体,无论光线明亮与否,其不同区域之间的像素差总是有一定规律的。就是凭借这种特殊的思路,科学家们第一次创造出了一种及其有效的人脸识别算法。而且其运算性能要求真的很低。甚至在树莓派1,2这种计算性能及其低的硬件设备上都能够快速运行。

OpenCV内部集成了人脸检测算法,并且OpenCV提供了训练好的人脸检测haar模型,使用yml保存。我们只需要简单的调用其中的类库就可以对照片或者视频进行人脸检测。下面我们就可以利用OpenCV中的摄像头调用和图片处理模块和人脸检测模块共同创建一个能够实时从摄像头中检测人脸数据,并将有关数据切割保存下来的程序。有了它,我们就可以创建一个带标签的人脸数据库,然后用于人脸识别。

代码实现

第一步:加载haar数据,训练好的数据可以去github下载,或者从我的github下载:https://github.com/FontTian/DS-Exhibitio

face_cascade =cv2.CascadeClassifier('haarcascade_frontalface_default.xml')face_cascade.load('./haarcascades/haarcascade_frontalface_default.xml')

第二步:我们需要调取摄像头,读取有关数据。同时由于我们需要实时显示,因此创建循环,在循环中不断调用获取摄像头中的图片,并进行后续处理。

# 获取摄像头
camera = cv2.VideoCapture(0)
# 计数器,用于之后文件的保存
count = 0
# 创建 循环
while (True):# 调用摄像头,获取图像ret, frame = camera.read()# 判断图像是否真实存在if ret == True:...else:print("no ret")# 使用OpenCV获取键盘输入,如果输入q则退出窗口if cv2.waitKey(int(1000 / 12)) & 0xFF == ord('q'):break

第三步:我们需要创建灰度图,然后使用人脸检测器对处理后的图像进行人脸检测。同时我们利用人脸检测器返回的数据,在原图片中绘制一个方框,并实时显示。

# 转换为灰度图
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)# 获取人脸,并转换为200,200的统一格式# 原始数据返回的是正方形f = cv2.resize(gray[y:y + h, x:x + w], (200, 200))# 保存图片cv2.imwrite('./data/at/tfs/%s.pgm' % str(count), f)count += 1# 展示图片cv2.imshow('camera', frame)

这样一番操作后,我们就获得了一份人脸数据库,我们通过文件夹的名字来标识图片。

人脸识别

在完成人脸检测之后,我们就得到了一份可以用于人脸识别的人脸数据库。之后我们就可以调取OpenCV中的人脸识别方法进行人脸识别,但是人脸识别的方法是有很多种实现方式的。如果现在就要将深度学习免不了长篇大论。因此这里我们将会使用OpenCV中的三种非深度学习方法进行人脸识别,并详细介绍其使用,简单介绍其原理。

代码实现

OpenCV的人脸识别在face这个类库中,其自带三种人脸识别器。我们可以直接调用有关类库进行训练和测试以及使用。在这之前我们首先创建链表将原来保存的图片以矩阵形式加载。

import numpy as np#  创建空链表
images = []
# 使用OpenCV加载fonttian的几张人脸照片
images.append(cv2.imread("data/at/fonttian/15.pgm",cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread("data/at/fonttian/17.pgm",cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread("data/at/fonttian/55.pgm",cv2.IMREAD_GRAYSCALE))# 使用OpenCV加载zjz的几章人脸照片
images.append(cv2.imread("data/at/zjz/15.pgm",cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread("data/at/zjz/17.pgm",cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread("data/at/zjz/60.pgm",cv2.IMREAD_GRAYSCALE))# 创建标签
labels = [0,0,0,1,1,1]

之后我们就可以调取不同人脸识别器来进行人脸识别了。OpenCV中自带三种人脸识别器——LBPH,EigenFace,Fisher。我们首先创建一个方法,来展示不同人脸识别器的判断结果和输出的置信度,置信度的范围选择我们在下一步会详细描述。

# 创建测试文件路径
imgPath = "data/at/fonttian/570.pgm"# 传入测试图片路径,识别器,原始人脸数据库,人脸数据库标签
def showConfidence(imgPath,recognizer,images,labels):# 训练识别器recognizer.train(images,np.array(labels))# 加载测试图片predict_image=cv2.imread(imgPath,cv2.IMREAD_GRAYSCALE)# 预测并打印结果labels,confidence = recognizer.predict(predict_image)print("label=",labels)print("conficence=",confidence)

上面的几个步骤就是人脸识别器的一般步骤,本质上来说人脸识别器与一般的机器学习模型都是一样的。需要有标签的数据,然后来做分类。所以首先需要使用标记好的数据来进行训练,并用新的数据进行预测。而人脸识别器的关键则在于如何从人脸中提取特征,并使用特征进行人脸识别。这是人脸识别的永恒套路,以前如此,现在也如此。

EigenFace是基于PCA的人脸识别器,一般置信程度5000以下判断为可靠,PCA就是主成分分析,其在人脸识别中的作用就是提取出人脸的主要信息,以此来判断不同人。

LBPH是局部二值模式直方图,局部二值,指的是某一点像素与周围点的大小差别,0和1指的就是其大小关系。其核心原理类似于haar都是计算局部像素之间的差异关系来进行图像识别。

Fisher是基于线性判别的人脸识别器。线性判别广泛应用于机器学习的多个领域,分类,聚类,推荐中都存储在其身影。在这里其基本思想与PCA一致,都是降维获得该人脸的人脸特征然后通过人脸特征来进行人脸识别。

具体的置信度如下所示,我们如果直接选择打印labels,那么程序会直接从给出最佳结果,对于测试而言或许是足够的。但是使用置信度来进行检测才是更好地方法。

# EigenFace(PCA,5000以下判断可靠)
recognizer = cv2.face.EigenFaceRecognizer_create()
showConfidence(imgPath,recognizer,images,labels)
# LBPH(局部二值模式直方图,0完全匹配,50以下可接受,80不可靠)
recognizer = cv2.face.LBPHFaceRecognizer_create()
showConfidence(imgPath,recognizer,images,labels)
# Fisher(线判别分析 , 5000以下判断为可靠)
recognizer = cv2.face.FisherFaceRecognizer_create()
showConfidence(imgPath,recognizer,images,labels)

现在运行上面的代就可以告诉我们最终结果了。下面就是运行结果

人脸识别,人脸检测的技术虽然一直都在发展,准确度和计算量都在不断提升。但是作为一项应用或者说一个领域,万变不离其宗。我们可以首先从OpenCV的几十行代码起步,逐步掌握深度学习下的人脸识别。

opencv快速入门人脸检测与人脸识别相关推荐

  1. python+opencv+dlib实现人脸检测与表情识别

    python+opencv+dlib实现人脸检测与表情识别 一,dlib简单介绍:Dlib包含广泛的机器学习算法.所有的设计都是高度模块化的,快速执行,并且通过一个干净而现代的C ++ API,使用起 ...

  2. 使用 OpenCV与 HAAR 级联算法进行人脸检测和人脸识别

    AI人脸识别是一种从数字图像或视频帧中识别或验证人脸的技术.人类可以毫不费力地快速识别面部.这对我们来说是一项轻松的任务,但对计算机来说却是一项艰巨的任务.因为存在各种复杂性,例如低分辨率.遮挡.光照 ...

  3. OpenCV人脸检测与人脸识别

    OpenCV是开源的计算机视觉库,实现了很多图像处理和计算机视觉方面的通用算法.下面主要OpenCV中的内置算法来实现人脸检测与人脸识别. 人脸检测 流程 通过OpenCV自带的级联分类器来加载人脸检 ...

  4. 基于OpenCV读取摄像头进行人脸检测和人脸识别

    前段时间使用OpenCV的库函数实现了人脸检测和人脸识别,笔者的实验环境为VS2010+OpenCV2.4.4,OpenCV的环境配置网上有很多,不再赘述.检测的代码网上很多,记不清楚从哪儿copy的 ...

  5. 人脸检测和人脸识别综述(调研)

    5_人脸检测和人脸识别综述(调研) 一.人脸检测 1.基于知识的方法 2.基于模板匹配的方法 3.基于统计模型的方法 4.人脸检测的评价指标 4.人脸识别方法的对比 5.人脸检测目前和未来的研究方向和 ...

  6. 利用MTCNN和FaceNet实现人脸检测和人脸识别 | CSDN博文精选

    作者 | pan_jinquan 来源 | CSDN博文精选 (*点击阅读原文,查看作者更多文章) 人脸检测和人脸识别技术算是目前人工智能方面应用最成熟的技术了.本博客将利用MTCNN和FaceNet ...

  7. 十三.人脸检测和车牌识别

    人脸检测和车牌识别 1. 人脸检测 首先我们要搞清楚人脸检测中的一些概念. 人脸检测: 在一张图像中判断是否存在人脸并找出人脸所在的位置 人脸识别: 在人脸检测的基础上收集人脸数据集合进行处理保存信息 ...

  8. 人脸检测和人脸识别的基础知识

    1. 人脸识别和人脸检测概念 人脸识别(Face Recognition)是基于人的脸部特征信息进行身份识别的一种生物识别技术.说简单点,人脸识别解决"这是谁的脸"问题. 人脸检测 ...

  9. 深度学习人脸检测与人脸识别

    一.概述 1. 基本概念 人脸是个人重要的生物特征,业界很早就对人脸图像处理技术进行了研究.人脸图像处理包括人脸检测.人脸识别.人脸检索等.人脸检测是在输入图像中检测人脸的位置.大小:人脸识别是对人脸 ...

最新文章

  1. liunx查看python的site-packages路径
  2. Android百度地图scode,“androidsdk | 百度地图API SDK
  3. python 小说-用Python爬下十几万本小说,再也不会闹书荒!
  4. Java-利用Spring提供的Resource/ResourceLoader接口操作资源文件
  5. Thymeleaf th:include、th:replace使用
  6. b树与b+树的区别_一文详解 B-树,B+树,B*树
  7. 程序员夏天格子衫,冬天穿什么?
  8. 涅槃重生的下一个超级风口:8本书助你赢在未来
  9. hybird之web动态换肤实现
  10. Convert Sorted List to Binary Search Tree ------C++ 递归创建平衡二叉查找树
  11. ★★停止动画和停止所有动画$(selector).stop() 详解
  12. 同步虚拟机与本机的时间
  13. python百度文库文字提取_百度文库文字爬取
  14. ScienceWord控件问题以及IE8对于base64编码图片长度限制的解决方案
  15. C++整数快速读写模板(快速读入+快速写)详解
  16. 定时任务二:No thread-bound request found
  17. shell脚本修改mysql密码
  18. 服务器错误信息泄露,Cisco WebEx Meeting Center冗长服务器错误响应远程信息泄露漏洞...
  19. XAMPP Apache关于https配置问题
  20. 光纤传感器实验模块_光纤传感器实验报告.doc

热门文章

  1. iOS抓包工具Charles基本抓包步骤
  2. 每日一记 - 3.8
  3. 994. 腐烂的橘子(Leetcode)(多源BFS)
  4. Python中logging:设置打印级别,打印格式,打印颜色
  5. 本地播放哔哩哔哩弹幕+视频
  6. Bently Nevada本特利9200速度传感器简介 及选型注意事项
  7. python resample函数_python resample() 函数
  8. omnipeek关于抓包信道的介绍
  9. cadence SPB17.4 - allegro - create and switch Visibility view
  10. allegro 对齐元器件_Allegro怎么对元器件进行对齐?