基于 Mtcnn(人脸检测)+Hopenet(姿态检测)+拉普拉斯算子(模糊度检测) 的人脸检测服务

2023-10-31 21:20

本文主要是介绍基于 Mtcnn(人脸检测)+Hopenet(姿态检测)+拉普拉斯算子(模糊度检测) 的人脸检测服务,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

写在前面


  • 工作原因,顺便整理
  • 博文内容为一个 人脸检测服务分享
  • 以打包 Docker 镜像,可以直接使用
  • 服务目前支持 http 方式
  • 该检测器主要适用低质量人脸图片处理
  • 理解不足小伙伴帮忙指正,多交流,相互学习

对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的懦弱回归,是随波逐流,是对内心的恐惧 ——赫尔曼·黑塞《德米安》


简单介绍

人脸检测服务, 用于输出适合人脸识别的 人脸数据集,通过 mtcnn cnn检测人脸,通过 hopenet 开源项目确定人脸是姿态,拿到头部姿态欧拉角,通过 拉普拉斯算子 拿到人脸模糊度,通过对mtcnn 三级网络和置信度,欧拉角阈值,模糊度设置阈值筛选合适人脸

详细见项目: https://github.com/LIRUILONGS/mtcnn_demo

在这里插入图片描述

Docker 镜像见: https://hub.docker.com/r/liruilong/mtcnn-hopenet-laplacian-face

在这里插入图片描述

生成结果

克隆项目运行脚本直接生成

提供了Demo 可以克隆项目直接运行生成结果

python mtcnn_demo.py
原图
在这里插入图片描述
生成标记后图片,粉色数据为标记 不合格数据,全部标记为蓝色数据为合规数据,也就是需要处理的数据
在这里插入图片描述
标记含义:
在这里插入图片描述
符合条件筛选的人脸
在这里插入图片描述
部署

创建 虚拟环境,导入依赖

(base) C:\Users\liruilong>conda create -n mtcnn python==3.8.8
pip instasll -r  requirements.txt  -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com

也可以直接使用 conda 的方式

conda env create -f /environment.yml
source activate mtcnn
pip install -r /requirements.txt  -i  https://pypi.tuna.tsinghua.edu.cn/simple

通过 Docker 方式

部署
docker pull liruilong/mtcnn-hopenet-laplacian-face
docker run  -it -p 30025:30025 liruilong/mtcnn-hopenet-laplacian-face

在这里插入图片描述

调用方式,上传文件直接解析

curl --location --request POST 'http://192.168.26.81:30025/upload' \
--header 'Authorization: eyJhbGciOiJSUzI1NiIsImtpZCI6ImF2MmJVZ3d6M21JRC1BZUwwaHlDdzZHSGNyaVJON1BkUHF6MlhPV2NfX00ifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJoZWFkbGFtcC1hZG1pbi10b2tlbi04ZDVwciIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJoZWFkbGFtcC1hZG1pbiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjI0NDMxNTA4LWU4ZjEtNGYxOC1hMWIxLTlmMmUzZmFhNDU3ZSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTpoZWFkbGFtcC1hZG1pbiJ9.oSA_i8gZOXYNRQMyoUKCK_wivtSiEjJ78EDUzZ1R7_HFxiLBKWLtxYN81wyf19bp9y9BFc2YYAW9lBy9QfVxg6LzBhW1sb4tcJJ0SOldxQX8z9kWK9m1MPMMs3aqtt1S9n8ShMBeobyY5AXSkBMDvVh6_E1P22dnPyOH7r_m0DEM0pgOP7B347sDKHiKx60hHBTfayvF7WDgfVlqsItBrc-MupC7NieRe8pztCllQ8awPksZXPRAJdcKwlSPvskoYxaqOBGbfZvFAFeLJaiGHdwkb6jUKyVfcB_hX_Pm5aEHGU8LZq7twrup859zxLxwn3nAgQpM6-NySZt8ax24kg' \
--form 'image=@"/C:/Users/liruilong/Pictures/vlcsnap-2023-08-10-02h42m48s407.png"'
{"image_id": "f12314cd5c814c1d85137daf774b8806","face_total": 18,"face_efficient_total_resp": 1,"resp": [{"face_id": "d0915a12c1cd4181a15718c812a85f29","face_blur": 246.4111740893992,"face_pose": {"pitch": -17.97052001953125,"yaw": -21.107192993164062,"roll": 0.6877593994140625},"face_confidence": 0.9999333620071411,"face_coordinate": [1484,305,36,44],"facie5points": {"left_eye": [1496,323],"right_eye": [1513,318],"nose": [1509,331],"mouth_left": [1500,339],"mouth_right": [1515,336]},"face_native_image_b64": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAIB.....","face_native_images_b64": "iVBO...............GiAAAAAElFTkSuQmCC"}],"mark_image_face_b64": "/9j/4AA............"
}

项目简单介绍:

检测使用 mtcnn

使用的下面的库,关于 mtcnn 是什么,这里不多介绍,综合考虑使用这个,这里主要看下和识别精度相关的参数

对应的pip 库位置: https://pypi.org/project/mtcnn/

def __init__(self, weights_file: str = None, min_face_size: int = 20, steps_threshold: list = None,scale_factor: float = 0.709):"""Initializes the MTCNN.:param weights_file: file uri with the weights of the P, R and O networks from MTCNN. By default it will loadthe ones bundled with the package.:param min_face_size: minimum size of the face to detect:param steps_threshold: step's thresholds values:param scale_factor: scale factor"""if steps_threshold is None:steps_threshold = [0.6, 0.7, 0.7]if weights_file is None:weights_file = pkg_resources.resource_stream('mtcnn', 'data/mtcnn_weights.npy')self._min_face_size = min_face_sizeself._steps_threshold = steps_thresholdself._scale_factor = scale_factorself._pnet, self._rnet, self._onet = NetworkFactory().build_P_R_O_nets_from_file(weights_file)

影响 MTCNN 单张测试结果的准确度和测试用时的主要因素为:

网络阈值(steps_threshold)

MTCNN 使用了一系列的阈值来进行人脸检测和关键点定位。这些阈值包括人脸 置信度阈值(Face Confidence Threshold)、人脸框关键点之间的IoU(Intersection over Union)阈值等。上面的构造函数 MTCNN的三个阶段(P-Net、R-Net和O-Net)中,相应的阈值设置为0.6、0.7和0.7。

  1. P-Net阶段,它是一个浅层的卷积神经网络,生成 候选人脸框时,只有置信度大于等于0.6的候选框将被接受,其他低于该阈值的候选框将被拒绝。
  2. R-Net阶段,一个较深的卷积神经网络,用于对P-Net生成的候选框进行筛选和精细调整。R-Net会对每个候选框进行特征提取,并输出判断该框是否包含人脸的概率以及对应的边界框调整值,对于从P-Net阶段获得的候选框,只有置信度大于等于0.7的框将被接受,其他低于该阈值的框将被拒绝。
  3. O-Net阶段,最深的卷积神经网络,用于进一步筛选和精细调整R-Net输出的候选框。O-Net与R-Net类似,对于从R-Net阶段获得的候选框,同样只有置信度大于等于0.7的框将被接受,其他低于该阈值的框将被拒绝。O-Net还可以输出 人脸关键点的位置坐标。最终,O-Net提供了最终的人脸检测结果和人脸关键点的位置信息。

在这里插入图片描述

影响因子(原始图像的比例跨度)(scale_factor):

MTCNN 使用了图像金字塔来检测不同尺度的人脸。通过对图像进行 缩放,可以检测到不同大小的人脸。影响因子是指图像金字塔中的 缩放因子,控制了不同尺度之间的跨度。较小的影响因子会导致 更多的金字塔层级,可以检测到 更小的人脸,但会增加计算时间。较大的影响因子可以 加快检测速度,但可能会错过 较小的人脸。因此,选择合适的影响因子是在准确度和速度之间进行权衡的关键。

要检测的 最小面容参数(min_face_size):

这是 MTCNN 中用于 过滤掉较小人脸的参数。最小面容参数定义了一个 人脸框最小边长,小于此值的人脸将被 忽略。较小的最小面容参数可以检测到更小的人脸,但可能会增加 虚警(错误接受)的机会。较大的最小面容参数可以 减少虚警,但可能会漏检一些较小的人脸。因此,根据应用需求和场景,需要调整最小面容参数以平衡 准确度和召回率

from mtcnn import MTCNN
import cv2img = cv2.cvtColor(cv2.imread("ivan.jpg"), cv2.COLOR_BGR2RGB)
detector = MTCNN()
detector.detect_faces(img)

box 为人脸矩形框,keypoints 为人脸特征点,confidence 为置信度

[{'box': [277, 90, 48, 63],'keypoints':{'nose': (303, 131),'mouth_right': (313, 141),'right_eye': (314, 114),'left_eye': (291, 117),'mouth_left': (296, 143)},'confidence': 0.99851983785629272}
]

姿态判断 Hopenet

姿态判断使用 Hopenet ,论文地址: https://arxiv.org/abs/1710.00925

在这里插入图片描述

使用的模型来自项目

https://github.com/natanielruiz/deep-head-pose

一个 大佬写好的 colab Demo

https://colab.research.google.com/drive/1vvntbLyVxxBHoVN0e6-pfs7gB3pp-VUS?usp=sharing

模糊度检测 拉普拉斯算子

opencv 拉普拉斯方差方法 方法

在这里插入图片描述

def calculate_blur(image):# 计算图像的拉普拉斯梯度gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)laplacian = cv2.Laplacian(gray, cv2.CV_64F).var()return laplacian

来源 : https://pyimagesearch.com/2015/09/07/blur-detection-with-opencv/

配置文件简单说明:

### 人脸检测配置文件
## mtcnn 检测相关:
mtcnn:zero:# 最小人脸尺寸min_face_size: 20# 影响因子scale_factor: 0.709# 三层网络阈值steps_threshold: - 0.6- 0.7- 0.7# 结果置信度阈值face_threshold: 0.995# 模糊度阈值blur_threshold: 100
## hopenet 姿态检测相关
hopenet:zero:# 模型位置snapshot_path: "./content/dhp/hopenet_robust_alpha1.pkl"# 欧拉角阈值yaw_threshold: 45pitch_threshold: 20roll_threshold: 25 
# 是否输出结果图片
is_objectification: true
# 输出图片结果
objectification_dir: './output/'
# 需要处理的图片位置
parse_dir: "./mtcnn_test/"

博文部分内容参考

© 文中涉及参考链接内容版权归原作者所有,如有侵权请告知,这是一个开源项目,如果你认可它,不要吝啬星星哦 😃


https://pyimagesearch.com/2015/09/07/blur-detection-with-opencv/

https://github.com/natanielruiz/deep-head-pose


© 2018-2023 liruilonger@gmail.com, All rights reserved. 保持署名-非商用-相同方式共享(CC BY-NC-SA 4.0)

这篇关于基于 Mtcnn(人脸检测)+Hopenet(姿态检测)+拉普拉斯算子(模糊度检测) 的人脸检测服务的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/318220

相关文章

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X

【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积水检测系统,结合深度学习和直观的图形界面,为用户提供高效的解决方案。 源码地址: PyQt5+YoloV5 实现积水检测系统 预览: 项目背景

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端,一般来说需要版本检测和自动更新功能,这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤: 读取本地应用版本拉取远程版本并比较两个版本如果需要升级,那么拉取更新历史弹出升级控制窗口用户选择升级时,拉取升级包解压,重启应用用户选择忽略时,本地版本标志为忽略版本用户选择取消时,隐藏升级控制窗口 2.

基于SpringBoot的宠物服务系统+uniapp小程序+LW参考示例

系列文章目录 1.基于SSM的洗衣房管理系统+原生微信小程序+LW参考示例 2.基于SpringBoot的宠物摄影网站管理系统+LW参考示例 3.基于SpringBoot+Vue的企业人事管理系统+LW参考示例 4.基于SSM的高校实验室管理系统+LW参考示例 5.基于SpringBoot的二手数码回收系统+原生微信小程序+LW参考示例 6.基于SSM的民宿预订管理系统+LW参考示例 7.基于

[数据集][目标检测]血细胞检测数据集VOC+YOLO格式2757张4类别

数据集格式:Pascal VOC格式+YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2757 标注数量(xml文件个数):2757 标注数量(txt文件个数):2757 标注类别数:4 标注类别名称:["Platelets","RBC","WBC","sickle cell"] 每个类别标注的框数:

Golang支持平滑升级的HTTP服务

前段时间用Golang在做一个HTTP的接口,因编译型语言的特性,修改了代码需要重新编译可执行文件,关闭正在运行的老程序,并启动新程序。对于访问量较大的面向用户的产品,关闭、重启的过程中势必会出现无法访问的情况,从而影响用户体验。 使用Golang的系统包开发HTTP服务,是无法支持平滑升级(优雅重启)的,本文将探讨如何解决该问题。 一、平滑升级(优雅重启)的一般思路 一般情况下,要实现平滑

Golang服务平滑重启

与重载配置相同的是我们也需要通过信号来通知server重启,但关键在于平滑重启,如果只是简单的重启,只需要kill掉,然后再拉起即可。平滑重启意味着server升级的时候可以不用停止业务。 我们先来看下Github上有没有相应的库解决这个问题,然后找到了如下三个库: facebookgo/grace - Graceful restart & zero downtime deploy for G