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

news2024/11/17 23:36:52

写在前面


  • 工作原因,顺便整理
  • 博文内容为一个 人脸检测服务分享
  • 以打包 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 load
        the 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_size
        self._steps_threshold = steps_threshold
        self._scale_factor = scale_factor

        self._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 cv2

img = 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: 45
    pitch_threshold: 20
    roll_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)

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

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

相关文章

11.动名词

一.什么是动名词 动名词是动词的另一种非谓语动词形式。动名词跟宾语或状语构成动名词短语,动名词跟动词不定式一样,都属于非谓语动词,不能作谓语,动名词或动名词短语可以作主语,表语,宾语,介词…

fastjson2与fury的巅峰对决,谁会笑到最后?

写在前面 两个月前,我们写过一篇关于fury和protostuff的性能对比的文章:谁才是真正的协议之王?fastjson2 vs fury,那时,两个协议框架各有千秋,不分伯仲,今天,看到fury推出了全新的0…

我用Python写了几个摸鱼小游戏,赐你2023年度上班上学摸鱼必备良品!(附源码)

文章目录 前言一丶超级玛丽二、沙漠打地鼠三、贪吃蛇四、坦克大战五、五子棋 前言 获取python整套完整教程,3263学习笔记,源码,项目实战,全部在手,python不愁~~~ Python学习资料点击领取福利 例如: 超级…

js高级(2)函数的柯里化,cookie的使用,10天免登录案例,购物车案例,拖动盒子小案例等等

1.函数的柯里化 自定义函数的柯里化 // 自定义函数的柯里化function curry(fn) {//判断输入的函数有几个参数let len fn.length;// 返回一个函数,并且有函数名为treturn function t() {// 获取到实参的个数let innerLength arguments.length// 获取到真实参数,转化为数组[.…

FPGA---UDP通信求助

项目场景: 使用UDP进行回环,网络调试助手,发送数据通过UDP接收模块接收,解析出数据,给到UDP发送模块,传回上位机。 问题描述 UDP接收模块中,接收到的CRC校验值与自己计算CRC校验值进行判断&am…

【电商API接口的应用:电商数据分析入门】初识Web API(一)

如何使用Web应用变成接口(API)自动请求网站到特定信息而不是整个网站,再对这些信息进行可视化。由于这样编写到程序始终使用最新到数据来生成可视化,因此即便数据瞬息万变,它呈现到信息也都是最新的。 使用Web API Web API是网站的一部分&am…

javapoet 注释中添加枚举值

问题描述 使用javapoet生成源代码 为了实现这么一个目的 解决 翻了一下源代码,他的实现如下: 这个方法是私有的,暂时不确定如何调用 照着这个方法,即可实现大多数类型的基本调用 即可实现上图需要的效果

为Yolov7环境安装Cuba匹配的Pytorch

1. 查看Cuba版本 方法一 nvidia-smi 找到CUDA Version 方法二 Nvidia Control Panel > 系统信息 > 组件 > 2. 安装Cuba匹配版本的PyTorch https://pytorch.org/get-started/locally/这里使用conda安装 conda install pytorch torchvision torchaudio pytorch-cu…

[华为认证]路由表和FIB表

路由器转发数据包的关键是路由表和FIB表,每个路由器都至少保存着一张路由表和一张FIB(Forwarding Information Base)表。路由器通过路由表选择路由,通过FIB表指导报文进行转发。 路由表 每台路由器中都保存着一张本地核心路由表&…

Java学数据结构(4)——PriorityQueue(优先队列) 二叉堆(binary heap)

前言 数据结构与算法作为计算机科学的基础,是一个重点和难点,在实际编程中似乎看不它们的身影,但是它们有随处不在,如影随形。 本系列博客是《数据结构与算法分析—Java语言描述》的读书笔记,合集文章列表如下&#…

delphi socket cross开源跨平台通讯库

delphi socket cross是Pascal开源跨平台的tcp通讯组件 windows下用的iocp linux下用的epoll 支持http,https 开源地址:GitHub - winddriver/Delphi-Cross-Socket: Delphi cross platform socket library 下图来自网络:

陪诊系统|陪诊系统解放繁琐,为陪诊添便利

在当代快节奏的生活中,随着医疗服务的不断发展,陪诊成为了越来越多人的需求。然而,传统的陪诊方式却存在着时间成本高、沟通不畅、服务体验差等问题。但近年来,陪诊小程序的兴起却为这一难题提供了创新的解决方案。 陪诊小程序&a…

Congestion Control for Large-Scale RDMA Deployments

文章目录 IntroductionDCQCNBuffer Setting Introduction PFC是粗粒度的流量控制机制,在端口层面发挥作用,不区别不同的流。这会导致很多弊端,比如不公平,受害流等。 解决PFC限制的解决方法是flow-level的拥塞控制,D…

拥抱AI变革,实现企业数字化重生!

在当今这个数字化快速发展的时代,人工智能(AI)正在逐渐成为企业转型的核心驱动力。本文将探讨AI如何在企业数字化转型中发挥重要作用,以及应对数字化转型中可能出现的风险和挑战。 目前,企业数字化转型的趋势日益明显…

如何更改照片底色(免费)

一、小程序截图 ①微信上找证件照的小程序,比如“独九证件照” ②换底色然后上传照片: ③ 原图: 换底色后的图: ④截图: ⑤裁剪 然后就得到免费的换底片后的证件照了。 二、PS修改 方法一(更建议用&…

VueRouter与expres/koa中间件的关联

ueRouter: runQueue 路由守卫都是有三个参数to,from,next。其中next就是下方的fn执行时候传入的第二个参数(回调函数),只有该回调执行后才会挨个遍历queue内的守卫。 中间件的作用 隔离基础设施与业务逻辑之间的细节。详细的内容位于《深入浅出Node.js》P210 另外一…

408-2014

一、单项选择题 1.下列程序段的时间复杂度是_______。 count0; for(k1;k<n;kk*2)for(j1;j<n;j)count; A.O() B.O(n) C.O() D.O(n*n) 解答&#xff1a;C 外层循环的时间复杂度为 O() &#xff0c;内层循环的时间复杂度为 O(n)&#xff0c;因此结果…

Matlab图像处理——基于机器视觉的苹果中心花及边花识别

一、简介 基于机器视觉技术&#xff0c;实现苹果中心花及边花识别&#xff0c;并将程序集合为GUI界面&#xff0c;在界面上完成相应的操作。实现了对图像进行预处理&#xff0c;分割出花心和边花&#xff0c;然后统计边花的数量。并且可以根据自己的需求和图像的特性来调整阈值…

idea中使用git【图文详解】

配置 配置Git 设置——Version Control——Git——Path to Git executab【D:\Git\Git\bin\git.exe】 创建Git查看 最上面VCS——Create Git Repository 添加忽略项 安装ignore插件&#xff1a;设置——plugins——搜索ignore 新建ignore文件&#xff1a;右击项目——new——.…

Hazelcast系列(三):hazelcast集成(服务器/客户端)

系列文章 Hazelcast系列(一)&#xff1a;初识hazelcast Hazelcast系列(二)&#xff1a;hazelcast集成&#xff08;嵌入式&#xff09; Hazelcast系列(三)&#xff1a;hazelcast集成&#xff08;服务器/客户端&#xff09; Hazelcast系列(四)&#xff1a;hazelcast管理中心 …