基于开源模型搭建实时人脸识别系统(三):人脸关键点、对齐模型概览与模型选型

news2024/11/14 20:29:20

续 基于开源模型搭建实时人脸识别系统(二):人脸检测概览与模型选型_CodingInCV的博客-CSDN博客

摘要

人脸对齐(face alignment)或者人脸关键点(face alignment)是定位人脸上的关键点,是很多基于人脸的任务的前置步骤,比如人脸识别、表情分析、人脸变装(makeup)等。人脸对齐有2D和3D对齐,本篇主要讲2D对齐。

  • 人脸姿态对齐:人脸识别等算法都需要对人脸的姿态进行对齐从而提高模型的精度。
  • 人脸美颜与编辑:基于关键点可以精确分析脸型、眼睛形状、鼻子形状等,从而对人脸的特定位置进行修饰加工,实现人脸特效美颜,贴片等娱乐功能。
  • 人脸表情分析与嘴型识别:基于关键点可以对人的面部表情进行分析,从而用于互动娱乐,行为预测等场景。
    image.png
    根据关键点个数,主要分为5点、68点、98点、106点等。
    image.png
    image.png
    image.png
    人脸关键点定位的困难主要来源于以下几个方面:
  • 人脸姿态
  • 人脸遮挡
  • 人脸表情
  • 环境光照
    image.png

人脸关键点算法概览

同样的人脸关键点算法也分为传统和深度学习时期,目前主要使用深度学习。
对于关键点任务,一般将其作为一个回归任务,即目标是回归每个关键点的位置;另一种方式是引入heatmap。这里不展开阐述,需要更深入了解,可以阅读下面的链接。
image.png
更多:
人脸关键点综述 - 知乎 (zhihu.com)
Article (iasj.net)

算法选型

Face Alignment | Papers With Code
人脸对齐开源的算法还挺多,但是这sota算法开源的权重都太大,无法达到我们的轻量化要求。人脸对齐作为人脸质量筛选和人脸识别前的步骤,不能计算量太大。
按照计算量要求,我们选择了这一算法(选择其中的Student@128):
image.png
人脸关键点模型的输入是人脸区域,具体而言是对人脸检测模型得到的人脸框进行一定的放大后的区域。
修改后模型的推理代码如下:

class FaceLandmarks(BaseModel):
    def __init__(self, model_path, device="cpu", **kwargs) -> None:
        super().__init__(model_path, device, **kwargs)
        self.input_size = 128
        self.extend = [0.2, 0.3]

    def preprocess(self, image: np.ndarray, bbox: np.ndarray):
        bbox_width = bbox[2] - bbox[0]
        bbox_height = bbox[3] - bbox[1]

        face_size = bbox_width
        # face_size = int(max(bbox_width, bbox_height))
        face_width = (1 + 2 * self.extend[0]) * face_size
        center = [(bbox[0] + bbox[2]) // 2, (bbox[1] + bbox[3]) // 2]

        ### make the box as square
        crop_bbox = np.zeros(4, dtype=np.int32)
        crop_bbox[0] = center[0] - face_width // 2
        crop_bbox[1] = center[1] - face_width // 2
        crop_bbox[2] = center[0] + face_width // 2
        crop_bbox[3] = center[1] + face_width // 2

        # limit the box in the image
        crop_bbox[0] = max(0, crop_bbox[0])
        crop_bbox[1] = max(0, crop_bbox[1])
        crop_bbox[2] = min(image.shape[1], crop_bbox[2])
        crop_bbox[3] = min(image.shape[0], crop_bbox[3])
        
        # crop
        crop_bbox = crop_bbox.astype(np.int32)
        crop_image = image[crop_bbox[1] : crop_bbox[3], crop_bbox[0] : crop_bbox[2], :]
        crop_image = cv2.resize(crop_image, (self.input_size, self.input_size))

        return crop_image, crop_bbox

    def run(self, image: np.ndarray, bbox: np.ndarray) -> np.ndarray:
        input, crop_box = self.preprocess(image, bbox)
        input = input.astype(np.float32)
        input = input / 255.0
        input = input.transpose((2, 0, 1))
        input = np.expand_dims(input, axis=0)
        output, _ = self.inference(input)
        landmarks = np.array(output)[:98*2].reshape(-1, 2)
        landmarks = self.postprocess(landmarks, crop_box)

        #change 98 points to 5 points
        landmarks = landmarks[[96, 97, 54, 88, 92], :]
        return landmarks

    def postprocess(self, landmarks: np.ndarray, crop_box)->np.ndarray:
        h = crop_box[3] - crop_box[1]
        w = crop_box[2] - crop_box[0]

        landmarks[:, 0] = landmarks[:, 0] * w + crop_box[0]
        landmarks[:, 1] = landmarks[:, 1] * h + crop_box[1]
        return landmarks

测试

得到的关键点如下(为了方便后续的使用,我们将98关键点转换为了5个关键点):
image.png

CPU上的平均耗时为8ms, 还是非常快的。

结语

本篇简单介绍了人脸对齐,但只是从实用的角度浅尝辄止,感兴趣的还是需要搜索相关文献进一步学习。

欢迎光临我的面包多:CoderInCV的个人主页 (mbd.pub)

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

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

相关文章

chatGLM 本地部署(windows+linux)

chatGLM算是个相对友好的模型,支持中英文双语的对话交流,清华出的 我的教程无需特别的网络设置,不过部分情况因为国内网络速度慢,需要反复重复 chatGLM github地址 一、硬件需求 N卡8G显存以上,最好16G以上&#xff…

redis 集群 1:李代桃僵 —— Sentinel

目前我们讲的 Redis 还只是主从方案,最终一致性。读者们可思考过,如果主节点凌晨 3 点突发宕机怎么办?就坐等运维从床上爬起来,然后手工进行从主切换,再通知所有的程序把地址统统改一遍重新上线么?毫无疑问…

电路暂态过程

本文仅提取了课程的部分内容,原视频课程如下:姜三勇《电工学》暂态过程 电路暂态过程——产生的原因: 1、内部原因:电路内部含有储能元件(如:电容、电感),其中存储的能量不能发生改…

vscode如何退出/切换 github 账号

退出/切换 github 账号 左下角点击头像按钮,选择注销,然后再重新登录

GateOne任意文件读取

人的生命力,是在痛苦的煎熬中强大起来的。 简介 GateOne 是一款使用 HTML5 技术编写的网页版 SSH 终端模拟器。基于现代的 HTML5技术,无需任何浏览器插件、支持多个 SSH 进程、可以嵌入到其他任意应用程序中、支持使用 JavaScript,Python 甚…

SaaS销售打法:常规有效的四种SaaS营销策略,落地执行增长突破

在外面常规的认知中:SaaS营销与常规的营销其实没有什么不同,都在遵循着传统的推广和销售策略,简单来说就是将自己的产品卖给更多的用户,从而换取利润。 SaaS营销策略 但是SaaS产品与其他产品不同的地方在于它本身是没有实体的&am…

如何基于eBPF实现跨语言、无侵入的流量录制?

测试是产品发布上线的一个重要环节,但随着业务规模和复杂度不断提高,每次上线需要回归的功能越来越多,给测试工作带来了巨大的压力。在这样的大背景下,越来越多的团队开始使用流量回放对服务进行回归测试。 在建设流量回放能力之前…

一台电脑给另外一台电脑共享网络

这里写自定义目录标题 有网的电脑上操作一根网线连接两台电脑没网的电脑上 有网的电脑上操作 右键->属性->共享 如同选择以太网,勾选。确认。 一根网线连接两台电脑 没网的电脑上 没网的电脑为mips&麒麟V10 新增个网络配置ww,设置如下。 …

产品设计中的小体验:带来大问题解决之道

在激烈的市场竞争中,产品的体验设计已成为区分优劣的重要标志。用户不仅仅关注产品的核心功能,更重视产品在使用过程中的舒适度、易用性和情感体验。产品设计中的细节体验,看似微不足道,却往往能带来意想不到的效果。这是因为&…

线上服务挂了 3 分钟

在一个风和日丽的下午,刚打算饮茶,线上就开始报警了,一看情况网关报 500 了。。 网关(用的是Spring Cloud Gateway)挂了可还行,这可是对外的们,门没了岂不是所有请求都进不来了! 说…

Linux 系统编程 开篇/ 文件的打开/创建

从本节开始学习关于Linux系统编程的知识! 学习Linux的系统编程有非常多的知识点,在应用层面,很重要的一点就是学习如何“用代码操作文件来实现文件创建,打开,编辑等自动化执行” 那如何自动化实现对文件的创建&#…

成本控制策略:加强企业安全

我们生活在一个不确定的时代。大多数经济学家预测,今年全球经济将继续放缓,亚太地区当然也不会逆势而上。 在供应链问题、大规模裁员、高通胀和高利率之间,我们毫不奇怪地看到大多数公司和行业采取谨慎态度,战略、增长计划和预算…

使用docker安装wordpress详细教程及出现数据库无法连接问题解决方法

1.获取wordpress镜像 docker pull wordpress 2.创建wordpress 的容器 a.创建wordpress的文件镜像卷文件夹 mkdir wordpress b.创建wordpress镜像 docker run --name wp -p8080:80 -v /home/wordpress/:/var/www/html -d wordpress c.查看容器运行情况 3.在本地或者其他服务器创…

AutoDL从0到1搭建stable-diffusion-webui

前言 AI绘画当前非常的火爆,随着Stable diffusion,Midjourney的出现将AI绘画推到顶端,各大行业均受其影响,离我们最近的AI绘画当属Stable diffusion,可本地化部署,只需电脑配备显卡即可完成AI绘画工作&…

Go语言并发编程(千锋教育)

Go语言并发编程(千锋教育) 视频地址:https://www.bilibili.com/video/BV1t541147Bc?p14 作者B站:https://space.bilibili.com/353694001 源代码:https://github.com/rubyhan1314/go_goroutine 1、基本概念 1.1、…

宋老板教我做人--背后少说别人

宋老板教我做人——背后少说别人 2000年~2004年间发生的事 让我很难忘,让我长记性 趣讲大白话:是不是传说中的,发自内心的善良? 【趣讲信息科技246期】 **************************** 真实故事1: 2000年5月…

Embedding入门介绍以及为什么Embedding在大语言模型中很重要

Embeddings技术简介及其历史概要 在机器学习和自然语言处理中,embedding是指将高维度的数据(例如文字、图片、音频)映射到低维度空间的过程。embedding向量通常是一个由实数构成的向量,它将输入的数据表示成一个连续的数值空间中…

【python】绘图代码模板

【python】绘图代码模板 pandas.DataFrame.plot( )画图函数Seaborn绘图 -数据可视化必备导入数据集可视化统计关系使用Seaborn绘制散点图抖动图箱线图小提琴图Pointplot群图 可视化数据集的分布绘制单变量分布柱状图直方图 绘制双变量分布Hex图KDE 图可视化数据集中的成对关系 …

【数据结构与算法】线索化二叉树

线索化二叉树 n 个节点的二叉链表中含有 n 1 【公式 2n - (n - 1) n 1】个空指针域。利用二叉链表中的空指针域,存放指向该节点在某种遍历次序下的前驱和后继节点的指针(这种附加的指针称为“线索”)。这种加上了线索的二叉链表称为线索链…

Anteater/食蚁兽 V1.0.0 (帮助开发者快速找到项目中敏感信息)

Github>https://github.com/MartinxMax/Anteater 首页 Anteater/食蚁兽 V1.0.0 帮助开发者快速找到项目中存在敏感信息的文件,并且以时间戳为文件名保存日志 Anteater/食蚁兽 使用方法 #python3 anteater.py -h ps:当前目录下存在Windows_install.bat,Linux_install.sh请…