人脸检测的5种实现方法

众所周知,人脸识别是计算机视觉应用的一个重大领域,在学习人脸识别之前,我们先来简单学习下人脸检测的几种用法。

常见的人脸检测方法大致有5种,Haar、Hog、CNN、SSD、MTCNN

相关构造检测器的文件:opencv/data at master · opencv/opencv · GitHub

基本步骤

  1. 读入图片
  2. 构造检测器
  3. 获取检测结果
  4. 解析检测结果

一、Haar

# 调整参数
img = cv2.imread('./images/001.jpg')
cv_show('img',img)# 构造harr检测器
face_detector = cv2.CascadeClassifier('./weights/haarcascade_frontalface_default.xml')# 转为灰度图
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
plt.imshow(img_gray,'gray')# 检测结果 上图4个人脸所以4个方框坐标
# image  
# scaleFactor控制人脸尺寸  默认1.1 
detections = face_detector.detectMultiScale(img_gray,scaleFactor=1.3)# 解析
for x,y,w,h in detections:cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0))
plt.imshow(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))

在这里插入图片描述

# 调整参数
img = cv2.imread('./images/004.jpeg')
cv_show('img',img)# 构造harr检测器
face_detector = cv2.CascadeClassifier('./weights/haarcascade_frontalface_default.xml')# 转为灰度图
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
plt.imshow(img_gray,'gray')# 检测结果 上图4个人脸所以4个方框坐标
# image  
# scaleFactor控制人脸尺寸  默认1.1 
# minNeighbors 确定一个人脸框至少要有n个候选值 越高 质量越好
# [, flags[, 
# minSize  maxSize 人脸框的最大最小尺寸 如minSize=(40,40) 
detections = face_detector.detectMultiScale(img_gray,scaleFactor=1.2, minNeighbors=10)# 在质量和数量上平衡# 解析
for x,y,w,h in detections:cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0))
plt.imshow(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))

在这里插入图片描述

上述过程中:

  • scaleFactor参数:用来控制人脸框的大小,可以用它来排除一些错误检测;
  • minNeighbors参数:我们给人脸框起来的时候,一般一张脸会框许多的框,假如这张脸框得越多,说明质量越好,越是一张正确的“脸”。

二、Hog

对于第一次使用这个功能的同学,要提前下载一下dlib

import dlib# 构造HOG人脸检测器 不需要参数
hog_face_detetor = dlib.get_frontal_face_detector()# 检测人脸获取数据
# img 
# scale类似haar的scalFactor
detections = hog_face_detetor(img,1)# 解析获取的数据
for face in detections:# 左上角x = face.left()y = face.top()# 右下角r = face.right()b = face.bottom()cv2.rectangle(img,(x,y),(r,b),(0,255,0))
plt.imshow(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))

在这里插入图片描述

三、CNN

import dlib# 构造CNN人脸检测器
cnn_face_detector = dlib.cnn_face_detection_model_v1("./weights/mmod_human_face_detector.dat")# 检测人脸  参数与上一种相似
detections = cnn_face_detector(img,1)for face in detections:# 左上角x = face.rect.left()y = face.rect.top()# 右下角r = face.rect.right()b = face.rect.bottom()# 置信度c = face.confidenceprint(c)cv2.rectangle(img,(x,y),(r,b),(0,255,0))plt.imshow(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))

通过神经网络完成,这个过程中我们还可以查看每张脸检测时的置信度。

在这里插入图片描述

四、SSD

# 加载模型
face_detector = cv2.dnn.readNetFromCaffe('./weights/deploy.prototxt.txt','./weights/res10_300x300_ssd_iter_140000.caffemodel')# 原图尺寸
img_height = img.shape[0]
img_width = img.shape[1]# 放缩至输入尺寸
img_resized = cv2.resize(img,(500,300)) # 转为2进制
img_blob = cv2.dnn.blobFromImage(img_resized,1.0,(500,300),(104.0,177.0,123.0))# 输入
face_detector.setInput(img_blob)# 推理
detections = face_detector.forward()

此时

detections.shape # (1, 1, 200, 7)

说明有200个结果,后面的7则是我们做需要的一些数据,继续如下:

# 查看人脸数量
num_of_detections = detections.shape[2]img_copy = img.copy()for index in range(num_of_detections):# 置信度detections_confidence = detections[0,0,index,2]# 通过置信度筛选if detections_confidence > 0.15:# 位置  乘以宽高恢复大小locations = detections[0,0,index,3:7] * np.array([img_width,img_height,img_width,img_height])# 打印print(detections_confidence)lx,ly,rx,ry = locations.astype('int')# 绘制cv2.rectangle(img_copy,(lx,ly),(rx,ry),(0,255,0),2)plt.imshow(cv2.cvtColor(img_copy,cv2.COLOR_BGR2RGB))     

在这里插入图片描述

五、MTCNN

# 导入MTCNN
from mtcnn.mtcnn import MTCNN# 记载模型
face_detetor = MTCNN()# 检测人脸
detections = face_detetor.detect_faces(img_cvt)
for face in detections:x,y,w,h = face['box']cv2.rectangle(img_cvt,(x,y),(x+w,y+h),(0,255,0),2)
plt.imshow(img_cvt)

在这里插入图片描述

对比

优势劣势
Haar速度最快、清凉、适合算力较小的设备准确度低、偶尔误报、无旋转不变性
HOG+Dlib比Haar准确率高速度比Haar低,计算量大、无旋转不变性、Dlib兼容性问题
SSD比Haar和hog准确率高、深度学习、大小一般低光照片准确率低,受肤色影响。
CNN最准确、误报率低、轻量相对于其他方法慢、计算量大、Dlib兼容性问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/750558.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

服务器机器学习环境搭建(包括AanConda的安装和Pytorch的安装)

服务器机器学习环境搭建 1 服务器与用户 在学校中,我们在学校中是以用户的身份进行访问学校的服务器的。整体框架大致如下: 我们与root用户共享服务器的一些资源,比如显卡驱动,Cuda以及一些其他的公共软件。 一般情况下&#…

力扣新思路题:字符串轮转

非常简单的思路:将两个字符串s1接起来,并判断s2字符串是否是加长版s1字符串的子串 bool isFlipedString(char* s1, char* s2){if (strlen(s1) ! strlen(s2)) {return false;}int len strlen(s1);int i 0;char* arr (char*)malloc(sizeof(char) * len…

Netty之@Sharable注解

1.背景 熟悉Netty的人都了解,netty为每个连接的客户端都会创建一个channel用于通信相关。每个channel都绑定到一条channelpipeline上。而channelpipeline里由一个一个的节点channelhandler组成(严格来说是channelhandlercontext)。如果为所有…

【蓝桥杯选拔赛真题38】C++判断数字 第十四届蓝桥杯青少年创意编程大赛 算法思维 C++编程选拔赛真题解析

目录 C判断数字 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、推荐资料 C判断数字 第十四届蓝桥杯青少年创意编程大赛C选拔赛真题 一、题目要求 1、编程实现 给定一个正整数N(100≤N<100000)…

nginx实时流量拷贝ngx_http_mirror_module

参考&#xff1a; Module ngx_http_mirror_module Nginx流量拷贝ngx_http_mirror_module模块使用方法详解 ngx_http_mirror_module用于实时流量拷贝 请求一个接口&#xff0c;想实时拷贝这个请求转发到自己的服务上&#xff0c;可以使用ngx_http_mirror_module模块。 官网好像…

(done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW

一个视频&#xff1a;https://www.bilibili.com/video/BV1mb4y1y7EB/?spm_id_from333.337.search-card.all.click&vd_source7a1a0bc74158c6993c7355c5490fc600 这里有个视频&#xff0c;讲解得更加生动形象一些 总得来说&#xff0c;词袋模型(Bow, bag-of-words) 是最简…

PHP+golang开源办公系统CRM管理系统

基于ThinkPHP6 Layui MySQL的企业办公系统。集成系统设置、人事管理、消息管理、审批管理、日常办公、客户管理、合同管理、项目管理、财务管理、电销接口集成、在线签章等模块。系统简约&#xff0c;易于功能扩展&#xff0c;方便二次开发。 服务器运行环境要求 PHP > 7.…

手搭手RocketMQ发送消息

消息中间件的对比 消息中间件 ActiveMQ RabbitMQ RocketMQ kafka 开发语言 java erlang java scala 单击吞吐量 万级 万级 10万级 10万级 时效性 ms us ms ms 可用性 高(主从架构) 高(主从架构) 非常高(主从架构) 非常高(主从架构) 消息中间件: acti…

LabVIEW湍流等离子体束热效率优化

LabVIEW湍流等离子体束热效率优化 利用LabVIEW虚拟仪器技术&#xff0c;对湍流等离子体束的热效率进行了实时监测与优化&#xff0c;提高其在材料处理领域的应用效率和精度。通过双进气湍流等离子体发生器&#xff0c;实现了在不同工作参数下对热效率的实时在线监测&#xff0…

Luckysheet + Exceljs:H5实现Excel在线编辑、导入、导出及上传服务器的示例代码(完整版demo)

创建xeditor.html <!DOCTYPE html> <html><head><meta charset"UTF-8" /><title>Hello World!</title><!-- <link relstylesheet href./luckysheet/plugins/css/pluginsCss.css /><link relstylesheet href./luck…

idea找不到或无法加载主类

前言 今天在运行项目的时候突然出了这样一个错误&#xff1a;IDEA 错误 找不到或无法加载主类,相信只要是用过IDEA的朋友都 遇到过它吧&#xff0c;但是每次遇到都是一顿焦头烂额、抓耳挠腮、急赤白咧&#xff01;咋整呢&#xff1f;听我给你吹~ 瞧我这张嘴~ 问题报错 找不…

vscode通过多个跳板机连接目标机(两种方案亲测成功)

1、ProxyJump&#xff08;推荐使用&#xff09; 需要OpenSSH 7.3以上版本才可使用&#xff0c;可用下列命令查看&#xff1a; ssh -V ProxyJump命令行使用方法 ssh -J [email protected]:port1,[email protected]:port2 一层跳板机&#xff1a; ssh dst_usernamedst_ip -…

ARP和DDOS攻击防御介绍

学习目标&#xff1a; 1. 如何利用ARP漏洞进行攻击&#xff1f; 2. 怎样有效地防御ARP攻击&#xff1f; 3. 如何应对DDOS攻击&#xff1f; ARP攻击如何产生&#xff1f; ARP如何进行有效防御&#xff1f; ARP基础工作原理&#xff1a; 交换机会根据mac地址表&#xff0c;进行转…

pytorch 入门基础知识一(Pytorch 01)

一 深度学习基础相关 深度学习三个主要的方向&#xff1a;计算机视觉&#xff0c;自然语言&#xff0c;语音识别。 机器学习核心组件&#xff1a;1 数据集(data)&#xff0c;2 前向传播的model(net)&#xff0c;3 目标函数(loss)&#xff0c; 4 调整模型参数和优化函数的算法…

【STM32定时器(一)内部时钟定时与外部时钟 TIM小总结】

STM32 TIM详解 TIM介绍定时器类型基本定时器通用定时器高级定时器常用名词时序图预分频时序计数器时序图 定时器中断配置图定时器定时 代码调试代码案例1代码案例2 TIM介绍 定时器&#xff08;Timer&#xff09;是微控制器中的一个重要模块&#xff0c;用于生成定时和延时信号…

mybatis源码阅读系列(一)

源码下载 mybatis 初识mybatis MyBatis 是一个优秀的持久层框架&#xff0c;它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解用于配置和原始映射&#xff0c;将接口和 Java 的…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的自动驾驶目标检测系统详解(深度学习+Python代码+PySide6界面+训练数据集)

摘要&#xff1a;开发自动驾驶目标检测系统对于提高车辆的安全性和智能化水平具有至关重要的作用。本篇博客详细介绍了如何运用深度学习构建一个自动驾驶目标检测系统&#xff0c;并提供了完整的实现代码。该系统基于强大的YOLOv8算法&#xff0c;并对比了YOLOv7、YOLOv6、YOLO…

相机与相机模型(针孔/鱼眼/全景相机)

本文旨在较为直观地介绍相机成像背后的数学模型&#xff0c;主要的章节组织如下&#xff1a; 第1章用最简单的针孔投影模型为例讲解一个三维点是如何映射到图像中的一个像素 第2章介绍除了针孔投影模型外其他一些经典投影模型&#xff0c;旨在让读者建立不同投影模型之间的建模…

RabbitMQ高级-高级特性

1.消息可靠性传递 在使用RabbitMQ的时候&#xff0c;作为消息发送方希望杜绝任何消息丢失或者投递失败场景。RabbitMQ为我们提供了两种方式来控制消息的投递可靠性模式 1.confirm 确认模式 确认模式是由exchange决定的 2.return 退回模式 回退模式是由routing…

力扣热题100_矩阵_240_搜索二维矩阵 II

文章目录 题目链接解题思路解题代码 题目链接 240. 搜索二维矩阵 II 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 示例 1&#xff1a; 输入&#xf…