前言

前段时间摸了下机器学习,然后我发现其实openCV还是一个很浩瀚的库的,现在也正在写一篇有关yolo的博客,不过感觉理论偏多,所以在学yolo之前先摸一下opencv,简单先写个项目感受感受opencv。

流程

openCV实际上已经有一个比较完整的模型了,下载在haarcascades

这里我们下haarcascade_frontalface_default.xml以备用。

在做人脸识别的时候流程就比较简单了

  1. 读取图片
  2. 创建Haar级联器
  3. 图片转灰度图(可以不转,转了能更快而已)
  4. 通过Haar级联分类器来检测人脸面部特征,返回faces结构
  5. 使用openCV的接口,在原图上框选出结果,并展示

编码

这里代码偏简单,就不过多介绍了

import numpy as np
import cv2 img = './faces/lena.bmp'
#脸部Haar级联器
facer_path = './faces/haarcascade_frontalface_default.xml'
facer = cv2.CascadeClassifier(facer_path) img = cv2.imread(img) gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #执行人脸识别 #现在可以使用Haar级联分类器来检测人脸和其他面部特征 faces = facer.detectMultiScale(gray,1.35,3) for(x,y,w,h) in faces:
cv2.rectangle(img,(x,y),(x+w,y+h),(0,0,255),2)
roi_img = img[y:y+h, x:x+w] cv2.imshow('img', img)
cv2.waitKey()

结果:

进阶

且不看运行的结果如何,但从结果你就可以看出来,这里只是把人脸从图片中框出来了。但这还不够,我们实际上不仅希望你可以把人脸圈出来,还希望能把人脸分类,比如A是A,B是B这样。

OpenCV提供了3种人脸识别方法,分别是Eigenfaces、Fisherfaces和LBPH。这3种方法都是通过对比样本的特征最终实现人脸识别。因为这3种算法提取特征的方式不一样,侧重点不同,所以不能分出孰优孰劣,只能说每种方法都有各自的识别风格。 OpenCV为每一种人脸识别方法都提供了创建识别器、训练识别器和识别3种方法,这3种方法的语法非常相似。我这里只简单说说Eigenfaces怎么调用,至于其他的两种读者感兴趣可以自己去搜索。

Eigenfaces人脸识别器

Eigenfaces也叫作“特征脸”。Eigenfaces通过PCA(主成分分析)方法将人脸数据转换到另外一个空间维度做相似性计算。在计算过程中,算法可以忽略一些无关紧要的数据,仅识别一些具有代表性的特征数据,最后根据这些特征识别人脸。 开发者需要通过以下3种方法完成人脸识别操作。

(1)通过cv2.face.EigenFaceRecognizer_create()方法创建Eigenfaces人脸识别器,其语法如下:

recognizer = cv2.face.EigenFaceRecognizer_create(num_components, threshold)

参数说明:

num_components:可选参数,PCA方法中保留的分量个数,建议使用默认值。

threshold:可选参数,人脸识别时使用的阈值,建议使用默认值。

返回值说明:

recognizer:创建的Eigenfaces人脸识别器对象。

(2)创建识别器对象后,需要通过对象的train()方法训练识别器。建议每个人都给出2幅以上的人脸图像作为训练样本。train()方法的语法如下:

recognizer.train(src, labels)

对象说明:

recognizer:已有的Eigenfaces人脸识别器对象。 参数说明:

src:用来训练的人脸图像样本列表,格式为list。样本图像必须宽、高一致。

labels:样本对应的标签,格式为数组,元素类型为整数。数组长度必须与样本列表长度相同。样本与标签按照插入顺序一一对应。

(3)训练识别器后可以通过识别器的predict()方法识别人脸,该方法对比样本的特征,给出最相近的结果和评分,其语法如下:

label, confidence = recognizer.predict(src)

对象说明:

recognizer:已有的Eigenfaces人脸识别器对象。 参数说明:

src:需要识别的人脸图像,该图像宽、高必须与样本一致。 返回值说明:

label:与样本匹配程度最高的标签值。

confidence:匹配程度最高的信用度评分。评分小于5000匹配程度较高,0分表示2幅图像完全一样。 下面通过一个实例来演示Eigenfaces人脸识别器的用法。

确定流程

最后我们来确定一下流程:

  1. 读取数据
  2. 创建特征脸识别器
  3. 输入图片和labels开始训练
  4. 输入需要识别的人脸图像
  5. 得到输出

我这里把我的训练集整理了以下,名称打在前面。我这里照片是我自己找的,具体的图片训练集大伙可以自己去设定。

具体代码如下,代码的功能可以参考注释

import numpy as np
import cv2
import os face_path = './faces'
photos = list()
labels = list() # 设置期望的图像大小
desired_size = (811, 843)
#定义labels
names = {"0":"mengzi","1":"qy","2":"lx","3":"qq"}
# 从当前路径中读取到所有的file
for root, dirs, files in os.walk(face_path):
for file in files:
if '.xml' in file:
continue
img_path = os.path.join(root, file)
img = cv2.imread(img_path, 0)
# 图片需要设置到期望大小,因为模型输入的图片大小都必须是统一值,否则会无法训练
img_resized = cv2.resize(img, desired_size)
# 根据图片的人脸,对应到names,插入到labels
if 'mengzi' in file:
# 读取图像并调整大小
labels.append(0)
elif 'qy' in file:
labels.append(1)
elif 'lx' in file:
labels.append(2)
elif 'qq' in file:
labels.append(3)
else:
continue
photos.append(img_resized) #创建人脸识别器
recognizer = cv2.face.EigenFaceRecognizer_create()
recognizer.train(photos, np.array(labels)) # 读取测试图像并调整大小
target = cv2.imread(face_path + '/test5.jpg', 0)
target_resized = cv2.resize(target, desired_size) #输出待识别对象
label, confidence = recognizer.predict(target_resized) print('confidence = ' + str(confidence))
print(names[str(label)])

结果

这里代码其实也能看得出,最后之能输出图片中人物的label和执行度,这样我们倒是完成了一个分类的工作。但是这里有个问题,就是我们不仅仅需要分类,还需要知道人脸的具体位置。

结合Haar级联器和Eigenfaces人脸识别器实现人脸划分

前言

刚刚说了两种,一个是划分区域,一个是打标签,那么能不能即划分区域,又打上标签呢?当然是可以的,接下来就简单说说怎么做。

流程

实际上流程就是把两个模式结合起来,先使用Haar级联器划分出脸部区域,然后再用Eigenfaces人脸识别器去检查分出的脸部区域的对象名称,然后将标签放在图片上即可。

  1. 加载Haar级联分类器
  2. 读取文件并训练Eigenfaces人脸识别器
  3. 读取目标图片
  4. 通过Haar级联分类器扫描得到目标图片中的所有人脸框
  5. 对所有人脸框使用Eigenfaces人脸识别器进行识别
  6. 画上方框,并打上标签

代码

代码如下:

import numpy as np
import cv2
import os # 加载Haar级联分类器
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
face_path = './faces'
photos = list()
labels = list() # 读取学习图片
desired_size = (811, 843)
names = {"0":"mengzi","1":"qy","2":"lx","3":"qq","4":"ch"}
for root, dirs, files in os.walk(face_path):
for file in files:
if '.xml' in file:
continue
img_path = os.path.join(root, file)
img = cv2.imread(img_path, 0)
img_resized = cv2.resize(img, desired_size) if 'mengzi' in file:
# 读取图像并调整大小
labels.append(0)
elif 'qy' in file:
labels.append(1)
elif 'lx' in file:
labels.append(2)
elif 'qq' in file:
labels.append(3)
elif 'ch' in file:
labels.append(4)
else:
continue
photos.append(img_resized) # 训练人脸识别器
recognizer = cv2.face.EigenFaceRecognizer_create()
recognizer.train(photos, np.array(labels))
# 读取测试图像
target = cv2.imread(face_path + '/test_ch.jpg')
target_gray = cv2.cvtColor(target, cv2.COLOR_BGR2GRAY) # 检测人脸
faces = face_cascade.detectMultiScale(target_gray, scaleFactor=1.2, minNeighbors=5, minSize=(30, 30)) # 对于每个检测到的人脸
for (x, y, w, h) in faces:
# 在原图上绘制矩形框出人脸
cv2.rectangle(target, (x, y), (x+w, y+h), (255, 0, 0), 2) # 提取人脸区域并调整到期望大小
face_region = target_gray[y:y+h, x:x+w]
face_resized = cv2.resize(face_region, desired_size) # 使用EigenFaceRecognizer进行预测
label, confidence = recognizer.predict(face_resized) # 将识别的名字和置信度打印在图像上方
cv2.putText(target, f'{names[str(label)]} - {confidence:.2f}', (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (36,255,12), 2) # 显示图像
cv2.imshow('Face Recognition', target)
cv2.waitKey(0)
cv2.destroyAllWindows()

测试结果:

虽然打了马赛克,但是实际上结果是可以置信的。在这里,还可以根据置信程度来对不同的人脸进行筛选,比如不想要的脸或者置信程度不高的脸可以再进行舍弃。

简易机器学习笔记(十一)opencv 简易使用-人脸识别、分类任务的更多相关文章

  1. 机器学习实战:用nodejs实现人脸识别

    机器学习实战:用nodejs实现人脸识别   在本文中,我将向你展示如何使用face-recognition.js执行可靠的人脸检测和识别 . 我曾经试图找一个能够精确识别人脸的Node.js库,但是 ...

  2. 【从零学习openCV】IOS7人脸识别实战

    前言 接着上篇<IOS7下的人脸检測>,我们顺藤摸瓜的学习怎样在IOS7下用openCV的进行人脸识别,实际上非常easy,因为人脸检測部分已经完毕,剩下的无非调用openCV的方法对採集 ...

  3. 基于Opencv快速实现人脸识别(完整版)

    无耻收藏网页链接: 基于OpenCV快速实现人脸识别:https://blog.csdn.net/beyond9305/article/details/92844258 基于Opencv快速实现人脸识 ...

  4. OpenCV 和 Dlib 人脸识别基础

    00 环境配置 Anaconda 安装 1 下载 https://repo.anaconda.com/archive/ 考虑到兼容性问题,推荐下载Anaconda3-5.2.0版本. 2 安装 3 测 ...

  5. Opencv摄像头实时人脸识别

    Introduction 网上存在很多人脸识别的文章,这篇文章是我的一个作业,重在通过摄像头实时采集人脸信息,进行人脸检测和人脸识别,并将识别结果显示在左上角. 利用 OpenCV 实现一个实时的人脸 ...

  6. 手把手教你如何用 OpenCV + Python 实现人脸识别

    下午的时候,配好了OpenCV的Python环境,OpenCV的Python环境搭建.于是迫不及待的想体验一下opencv的人脸识别,如下文. 必备知识 Haar-like 通俗的来讲,就是作为人脸特 ...

  7. opencv 利用Haar 人脸识别

    #include <opencv2/opencv.hpp> #include <cstdio> #include <cstdlib> #include <io ...

  8. OpenCV学习(38) 人脸识别(3)

                前面我们学习了基于特征脸的人脸识别,现在我们学习一下基于Fisher脸的人脸识别,Fisher人脸识别基于LDA(线性判别算法)算法,算法的详细介绍可以参考下面两篇教程内容: ...

  9. OpenCV学习(37) 人脸识别(2)

          在前面一篇教程中,我们学习了OpenCV中基于特征脸的人脸识别的代码实现,我们通过代码 Ptr<FaceRecognizer> model = createEigenFaceR ...

  10. OpenCV学习(36) 人脸识别(1)

    本文主要参考OpenCV人脸识别教程:http://docs.opencv.org/modules/contrib/doc/facerec/facerec_tutorial.html 1.OpenCV ...

随机推荐

  1. [最佳实践]配置sshd只允许sftp登录

    sftp 是 Secure File Transfer Protocol 的缩写,即安全文件传送协议,可为传输文件提供一种安全的加密方法. sftp 为 SSH 的一部分,由于这种传输方式使用了加密/ ...

  2. 深入MySQL索引,这篇千万不能错过

    大家好,我是[码老思],索引是一个数据库绕不开的话题,今天和大家一起聊聊. 1. 索引 索引是对数据库表中一列或多列的值进行排序的一种结构. MySQL索引的建立对于MySQL的高效运行是很重要的,索 ...

  3. Lora升级!ReLoRa!最新论文 High-Rank Training Through Low-Rank Updates

    关注公众号TechLead,分享AI与云服务技术的全维度知识.作者拥有10+年互联网服务架构.AI产品研发经验.团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理专 ...

  4. redis主从同步及redis哨兵机制

    1.主从和哨兵的作用: 角色 作用 主从 1.(提供)数据副本:多一份数据副本,保证redis高可用 2.  扩展(读)性能:如容量.QPS等 哨兵 1.监控: 监控redis主库及从库运行状态: 2 ...

  5. #866 div1A

    A. Constructive Problem 题意:给定一个长度为n的非负数组a,我们可以进行一次操作,操作是将l~r这个区间内的所有数变为k(k >= 0),得到b,能不能使mex(a)+ ...

  6. Leetcode.456单调栈

    给你一个整数数组 nums ,数组中共有 n 个整数.132 模式的子序列 由三个整数 nums[i].nums[j] 和 nums[k] 组成,并同时满足:i < j < k 和 num ...

  7. AJAX入门实例

    1.什么是 AJAX ? AJAX = 异步 JavaScript 和 XML. AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这 ...

  8. 手撕Vue-Router-初始化路由信息

    前言 经过上一节课的学习,我们已经完成了提取我们想要的路由信息数据格式,提取完毕了之后,接下来我们该干什么,接下来需要做的步骤就是监听路由的变化,保存当前的路由. 那么就会遇到几个问题,就是怎么监听, ...

  9. 🔥🔥Java开发者的Python快速进修指南:面向对象--高级篇

    首先,让我来介绍一下今天的主题.今天我们将讨论封装.反射以及单例模式.除此之外,我们不再深入其他内容.关于封装功能,Python与Java大致相同,但写法略有不同,因为Python没有修饰符.而对于反 ...

  10. preparedStatement.setString()方法

    PreparedStatement作用:PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程. 1.预编译sql语句,效率高 2.安全,避免sql注入 3 ...