基于开源模型搭建实时人脸识别系统(四):人脸质量
续人脸识别实战之基于开源模型搭建实时人脸识别系统(三):人脸关键点、对齐模型概览与模型选型_CodingInCV的博客-CSDN博客
不论对于静态的人脸识别还是动态的人脸识别,我们都会面临一个问题,就是输入的人脸图像的质量可能会很差,比如人脸角度很大,人脸很模糊,人脸亮度很亮或很暗。这些质量低的图像不仅造成识别失败,还可能引起误识别。因此,对输入人脸识别进行一定的质量过滤是很必要的。这个领域的英文为Face Image Quality Assessment。


传统方法
传统的方法一般是将图像质量领域(Image Quality Assessment)的方法应用到人脸图像上,比如使用边缘检测来评测模糊、统计平均像素值来评测亮度。这些方法没有特别考虑人脸图像的特点,效果一般。
深度学习方法
普通深度学习方法
这类方法将人脸图像质量作为一个普通的深度学习问题,通过人工或预设算法对数据打标,然后设计一个网络,回归质量分数。这个方法的学习目标主要还是人眼感知上的质量,因为标签来源于人工打标,而并不是对于识别效果更好的质量。
这类方法的主要难题在于数据标签难获得,网络结构上只是简单的回归网络。
面向人脸识别的人脸质量评估
人脸质量的筛选目标是提高人脸识别的效果,因此越来越多的方法开始将人脸质量和人脸识别任务结合起来,结合的方式主要有2种:
一种是直接训一个特征能够用来衡量人脸质量的模型,代表是MagFace, 基本思想是用特征的模长来表征人脸质量。个人觉得这种方式实用起来存在一个问题就是要获得人脸质量就得进行人脸特征提取,开销太大。
另一种方式是通过人脸识别模型的特征关系来生成质量标签,代表方法:
SER-FIQ: 同一个人脸多次推理(开启dropout),统计多次推理特征的距离,对于质量好的图片,特征平均距离小,反之越大
SDD-FIQ: 统计计算人脸与同一ID和不同ID人脸的距离
FaceQnet, PCNet等
方法选择
理论上,面向人脸识别的人脸质量评估效果更好,不过这些方法与识别模型存在较大的耦合关系,根据笔者在私有数据上的实际测试,训练比较困难,开源出来的预训练模型也较大。KaenChan/lightqnet: Deployment of the Lightweight Face Image Quality Assessment (github.com) 这个比较轻量,但实测对于人脸区域比较敏感,没有区分度。
综合速度要求,选择 KS‐FQA: Keyframe selection based on face quality assessment for efficient face recognition in video - Bahroun - 2021 - IET Image Processing - Wiley Online Library
这个方法考虑了人脸角度、亮度、大小、模糊。速度较快,也有一定区分度,不过也还是有些缺陷,对于大侧脸的过滤效果一般。
import numpy as np
import cv2class FaceQualityOverall:def __init__(self, **kwargs) -> None:passdef pose_score(self, face_box: np.ndarray, landmarks: np.ndarray):center_x, center_y = (face_box[0] + face_box[2]) / 2, (face_box[1] + face_box[3]) / 2nose_x, nose_y = landmarks[2][0], landmarks[2][1]distance = np.sqrt((center_x - nose_x) ** 2 + (center_y - nose_y) ** 2)face_size = np.sqrt((face_box[2] - face_box[0]) ** 2 + (face_box[3] - face_box[1]) ** 2)pose_score = max(0, 1 - distance / face_size)return pose_scoredef sharpness_and_brightness_score(self, image: np.ndarray, face_box: np.ndarray):box = face_box[:]box = box.astype(np.int32)face_image = image[box[1] : box[3], box[0] : box[2], :]face_image_gray = cv2.cvtColor(face_image, cv2.COLOR_BGR2GRAY)# blur the face image with a 5x5 guassian kernelblur_face_image = cv2.GaussianBlur(face_image_gray, (5, 5), sigmaX=1, sigmaY=1)# calculate the sharpness scoresharpness_score = np.sum(np.abs(face_image_gray - blur_face_image)) / np.prod(face_image_gray.shape)sharpness_score = sharpness_score / 255.0sharpness_score = min(1, sharpness_score * 2)brightness_score = np.mean(face_image_gray)# normalize the brightness scoreif brightness_score < 20 or brightness_score > 230:brightness_score = 0else:brightness_score = 1 - abs(brightness_score - 127.5) / 127.5return sharpness_score, brightness_scoredef resolution_score(self, face_box: np.ndarray):face_width = face_box[2] - face_box[0]face_height = face_box[3] - face_box[1]resolution_score = min(1, min(face_width, face_height) / 224)if face_height/face_width > 2.5:resolution_score = 0if min(face_width, face_height) < 48:resolution_score = 0return resolution_scoredef run(self, image: np.ndarray, face_box: np.ndarray, landmarks: np.ndarray):pose_score = self.pose_score(face_box, landmarks)if pose_score < 0.3:return 0sharpness_score, brightness_score = self.sharpness_and_brightness_score(image, face_box)if sharpness_score<0.1:return 0resolution_score = self.resolution_score(face_box)if resolution_score < 48/224:return 0output = np.array([pose_score, sharpness_score, brightness_score, resolution_score])weight = np.array([0.3, 0.4, 0.1, 0.2])return np.sum(output * weight)if __name__ == "__main__":from face_recognition_modules.face_alignment.face_landmarks import FaceLandmarksfrom face_recognition_modules.face_detection.yolov8_face import Yolov8Faceimport cv2yolo8face = Yolov8Face(model_path="models/yolov8-lite-t.onnx", device="gpu")landmarks_det = FaceLandmarks(model_path="models/student_128.onnx", device="gpu")image = cv2.imread("test_images/1.jpg")if image is None:raise Exception("read image failed")face_box, _ = yolo8face.run(image)landmarks = landmarks_det.run(image, face_box[0])face_quality = FaceQualityOverall()quality = face_quality.run(image, face_box[0], landmarks)print(quality)
结语
这篇我们简要介绍了一下人脸质量评估,不过笔者在这方面涉猎也不深,只是做个简单的总结,需要深入做还是有不少工作。

相关文章:
基于开源模型搭建实时人脸识别系统(四):人脸质量
续人脸识别实战之基于开源模型搭建实时人脸识别系统(三):人脸关键点、对齐模型概览与模型选型_CodingInCV的博客-CSDN博客 不论对于静态的人脸识别还是动态的人脸识别,我们都会面临一个问题,就是输入的人脸图像的质量可…...
【开发笔记】ubuntu部署指定版本的前后端运行环境(npm nodejs mysql)
目录 1 背景2 环境要求3 部署流程3.1 npm的安装3.2 nodejs的安装3.3 MySQL的安装 4 可能的问题 1 背景 在远程服务器上的Ubuntu系统中,部署指定版本的前后端项目的运行环境 2 环境要求 npm 9.5.1Nodejs v18.16.1MySQL 8.0.33 3 部署流程 3.1 npm的安装 通过安…...
用于优化开关性能的集成异质结二极管的4H-SiC沟道MOSFET
标题:4H-SiC Trench MOSFET with Integrated Heterojunction Diode for Optimizing Switching Performance 摘要 本研究提出了一种新型的4H-SiC沟道MOSFET,其在栅槽底部集成了异质结二极管(HJD-TMOS),并通过TCAD模拟进…...
优化个人博客总结
前面学习完怎么搭建个人博客,后面要做的就是排版优化自己的博客了,今天通过教程学习到了然后更爱美化其中的效果,还通过改写代码来带到基本的效果展示,同时也把最开始学习的计算速成课的笔记输出在上面,这也是一个很好…...
从零构建深度学习推理框架-9 再探Tensor类,算子输入输出的分配
再探Tensor类: 第二节中我们编写的Tensor类其实并不能满足我们的使用需要,我们将在这一节以代码阅读的方式来看看一个完全版本的Tensor应该具备怎样的要素,同时我们对Tensor类的分析来看看在C中一个设计好的类应该是怎么样的。 Tensor<fl…...
Vue使用element-ui
main.js配置 //引入Vue import Vue from vue //引入App import App from ./App.vue//完整引入 //引入ElementUI组件库 // import ElementUI from element-ui; //引入ElementUI全部样式 // import element-ui/lib/theme-chalk/index.css;//按需引入 import { Button,Row,DatePi…...
使用ApplicationRunner简化Spring Boot应用程序的初始化和启动
ApplicationRunner这个接口,我们一起来了解这个组件,并简单使用它吧。🤭 引言 在开发Spring Boot应用程序时,应用程序的初始化和启动是一个重要的环节。ApplicationRunner是Spring Boot提供的一个有用的接口,可以帮助…...
Vue 2.x 项目升级到 Vue 3详细指南【修改清单】
文章目录 前言0.迁移过程1. 安装 Vue 32. 逐一处理迁移中的警告3. 迁移全局和内部 API4. 迁移 Vue Router 和 Vuex5. 处理其他的不兼容变更 1. Vue3特性1. Composition API2. 更好的性能3. 更好的 TypeScript 支持4. 多个根元素5. Suspense 组件6. Teleport 组件7. 全局 API 的…...
【算法日志】贪心算法刷题:重叠区问题(day31)
代码随想录刷题60Day 目录 前言 无重叠区间(筛选区间) 划分字母区间(切割区间) 合并区间 前言 今日的重点是掌握重叠区问题。 无重叠区间(筛选区间) int eraseOverlapIntervals(vector<vector<in…...
基于Jenkins构建生产CICD环境、jenkins安装
目录 Jenkins简介 安装配置Jenkins Jenkins简介 Jenkins是一个用Java编写的开源的持续集成工具。在与Oracle发生争执后,项目从Hudson项目独立。官方网站:https://jenkins.io/。 Jenkins提供了软件开发的持续集成服务。它运行在Servlet容器中ÿ…...
基于Java SpringBoot+vue+html 的地方美食系统(2.0版本)
博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W,csdn、博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 1 简介2 技术栈3 系统流程的分析3.1 用户管理的流程3.2个人中心管理流程3.3登录流程 4系统设计…...
opencv-gpu版本编译(添加java支持,可选)实现硬解码
目录 opencv gpu版本编译,实现硬解码,加速rtsp视频流读取1、准备文件2、复制 NVCUVID 头文件到 cuda 安装目录 include3、安装相关依赖4、 执行cmake5、编译安装6、测试 opencv gpu版本编译,实现硬解码,加速rtsp视频流读取 前置条…...
数据分析问答总结
一、SQL窗口函数 1.是什么 OLAP(Online Anallytical Processing联机分析处理),对数据库数据进行实时分析处理。 2.基本语法: <窗口函数>OVER (PARTITION BY <用于分组的列名> ORDER BY <用于排序的…...
Python学习笔记_实战篇(二)_django多条件筛选搜索
多条件搜索在很多网站上都有用到,比如京东,淘宝,51cto,等等好多购物教育网站上都有,当然网上也有很多开源的比楼主写的好的多了去了,仅供参考,哈哈 先来一张效果图吧,不然幻想不出来…...
【生态经济学】利用R语言进行经济学研究技术——从数据的收集与清洗、综合建模评价、数据的分析与可视化、因果推断等方面入手
查看原文>>>如何快速掌握利用R语言进行经济学研究技术——从数据的收集与清洗、综合建模评价、数据的分析与可视化、因果推断等方面入手 近年来,人工智能领域已经取得突破性进展,对经济社会各个领域都产生了重大影响,结合了统计学、…...
xml中的vo是干什么用的
在Java中,VO(Value Object)是一种常见的设计模式,用于表示纯粹的数据对象。VO 通常用于在不同层或模块之间传递数据,并且它们的主要目的是封装和组织数据,而不包含业务逻辑。 VO 在Java中的具体作用有以下…...
现代企业数据泄露的原因分析与建议
近年来,随着信息技术的飞速发展,数据已经成为现代企业不可或缺的发展资源。然而,随之而来的数据泄露危机,给个人、企业甚至整个社会带来了巨大的风险与威胁。本文将综合探讨企业数据泄露的主要途径和原因,并提出防护建…...
飞天使-kubeadm安装一主一从集群
文章目录 安装前准备安装前准备配置yum源等安装前准备docker安装 安装kubeadm配置kubeadm验证集群 参考链接 安装前准备 cat >> /etc/hosts <<EOF 192.168.100.30 k8s-01 192.168.100.31 k8s-02 EOF hostnamectl set-hostname k8s-01 #所有机器按照要求修改 ho…...
string类写时拷贝
文章目录 1.string类拷贝构造函数的现代写法2.string类写时拷贝vs和g下string结构的不同vs下string的结构:g下string的结构 3.总结 1.string类拷贝构造函数的现代写法 string类拷贝构造函数的传统写法: string(const string& s){if (this ! &s)…...
QT VS编译环境无法打开包括文件type_traits
这问题,别人给的处理方法都是: 添加环境变量执行vsvars32.bat/vcvarsall.bat/vsdevcmd.bat重新安装QT项目:执行qmake。。。。 个人不推荐配置环境编译,除非你非常熟,因为配置环境变量需要你知道有哪些路径需要添加&a…...
保姆级教程:在Ubuntu上为Ouster激光雷达配置PTP时间同步(含linuxptp/phc2sys避坑指南)
在Ubuntu上为Ouster激光雷达实现纳秒级PTP时间同步的完整指南 当自动驾驶车辆以60公里时速行驶时,1毫秒的时间误差会导致1.7厘米的位置偏差——这正是我们需要为激光雷达实现纳秒级时间同步的原因。本文将手把手带您完成Ouster激光雷达在Ubuntu系统上的PTP精确时间…...
从鼠类到人体:汉坦病毒的全球威胁与科研突破
2026年5月17日,加拿大正式确诊一名“洪迪厄斯”号邮轮乘员感染汉坦病毒。结合世界卫生组织(WHO)的通报,疫情已陆续造成9人感染并出现3例死亡。这引起广泛的关注和担忧。汉坦病毒究竟是哪类病毒呢?感染力强吗࿱…...
龙芯2K3000与国产OS在轨道交通AFC系统中的工程实践
1. 项目概述:当国产芯遇上城市动脉每天早晚高峰,地铁站里人头攒动,闸机开合的“嘀嘀”声此起彼伏。你可能没留意,支撑这套庞大自动售检票系统(AFC)稳定运行的“大脑”,正经历一场静默而深刻的变…...
企业无线组网避坑指南:AP发现AC失败?从DHCP Option 43配置到防火墙策略的排查清单
企业无线组网实战:AP发现AC失败的九步精准排查法 当企业IT团队部署Fit APAC架构时,AP无法发现AC的问题就像网络世界的"鬼打墙"——明明配置看起来正确,设备却始终无法建立连接。这种故障往往发生在凌晨割接后或紧急扩容时ÿ…...
如何扛住十万级流量洪峰?扒开高并发架构的五层防御体系
在互联网的残酷战场上,流量既是黄金,也是洪水。试想这样一个场景:你们公司花重金请了一位顶流代言人,晚上 8 点准时开启一场“一元秒杀”活动。时间一到,原本平时只有几百 QPS(每秒请求数)的系统…...
MPC-BE:为什么这款开源播放器能成为Windows多媒体播放的终极解决方案?
MPC-BE:为什么这款开源播放器能成为Windows多媒体播放的终极解决方案? 【免费下载链接】MPC-BE MPC-BE – универсальный проигрыватель аудио и видеофайлов для операционной систем…...
抖音去水印下载器终极指南:批量保存视频、音乐、图集和直播
抖音去水印下载器终极指南:批量保存视频、音乐、图集和直播 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback …...
折叠表达式:左折叠,右折叠
关于何为左右折叠表达式可以直接通过 C Insights (C Insights) 来进行查看原理。左折叠template <typename... Args> auto getSum(Args... args) {return (args ...); }int main() {getSum(1, 2, 3, 4, 5); } template <typename... Args> auto getSum(Args... ar…...
【免费下载】 探索高效CAN通信:PCAN PRO/PRO FD USB2CAN固件实现
探索高效CAN通信:PCAN PRO/PRO FD USB2CAN固件实现 项目介绍 PCAN PRO/PRO FD USB2CAN固件实现是一个专为基于STM32F4的廉价硬件设计的开源项目。该项目旨在为使用STM32F407/405开发板的用户提供一个高效、稳定的USB2CAN通信解决方案。通过该固件,用户可…...
RVC-WebUI语音克隆工具:从零开始的完整实战指南
RVC-WebUI语音克隆工具:从零开始的完整实战指南 【免费下载链接】rvc-webui liujing04/Retrieval-based-Voice-Conversion-WebUI reconstruction project 项目地址: https://gitcode.com/gh_mirrors/rv/rvc-webui RVC-WebUI是一款基于检索式语音转换技术的开…...
