人脸遮挡检测的几种思路

2024-04-21 20:08

本文主要是介绍人脸遮挡检测的几种思路,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

遮挡是一直以来困扰研究人员及技术人员的问题,原因是存在遮挡后,不管是对人脸进行检测,还是其它属性识别(如关键点、角度、姿态、年龄等)的效果都会有很大影响。

为了消除这些影响,一种思路是先判断是否被遮挡,再进行属性识别,另一种思路是在对人脸进行属性识别时加入对遮挡的处理,提高算法的鲁棒性。

目前,暂时还没有通用的解决方案。

如何判断是否被遮挡或者定位?

1、分类器:将是否被遮挡作为分类器的一个标签,可以用单标签,也可用多标签来区分不用部位的遮挡。或者将单个部位抠patch出来,进行单个部位的遮挡分类。这种方案简单易用,是目前的主流方案,但是全脸的遮挡检测存在一定的瓶颈,适用于对准确率要求不高的问题,而单个部分的遮挡检测强依赖于预处理,难以迁移且不利于对badcase进行后期维护。

2、CNN直接识别出人脸的各个部分(眼睛、鼻子及嘴巴等)生成partness maps,利用已经标注好的遮挡标签,进行打分,例如Faceness Net。这种思路不新了,但应用也不多,适用于不要求将手部遮挡分开的情况。

3、利用空间三维关系判断遮挡物与被遮挡物的前后生成遮挡关系边界图,再分割出人脸与遮挡物,从而根据分割轮廓判断是否被遮挡。这是学术界存在的一种思路,但是相对来说,概念(三维关系的判断)与步骤(三维关系-边界图-分割轮廓)都较为复杂,难以应用于实际。

如何在对人脸属性识别时加入对遮挡的处理?

1、在标注数据时就加上对遮挡的标注处理,将遮挡物的边缘区分开来。

这种思路适用于需要准确识别出遮挡部位并作下一步处理的情况,先加入标注好的遮挡数据再根据遮挡部位的连贯性不同进行区分,例如在人脸分割中将遮挡物从人脸的mask之间划分出来,或者在人脸关键点中带遮挡的landmark标注为遮挡物边缘。如果采用这种思路,后期还可根据分割区域的IoU来计算遮挡面积的大小。

2、进行多任务训练,把是否被遮挡的属性作为一个分支任务。

这种思路适用于遮挡只是一个辅助信息来帮助提高原有的算法效果。

附:人脸遮挡相关数据集

1、各种遮挡物:The MAFA dataset、the IJB-C dataset

2、主要为墨镜遮挡:Pgu-Face: A dataset of partially covered facial images

3、其它遮挡数据集:the Caltech Occluded Faces in the Wild (COFW) benchmark dataset、Large-scale Datasets: Faces with Partial Occlusions and Pose Variations in the Wild

数据集还可以利用其它数据集+人脸数据集自行制造,如这篇中的将手部数据集(ego-hands)加入人脸数据集:On Face Segmentation, Face Swapping, and Face Perception

这篇关于人脸遮挡检测的几种思路的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

Python获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下:

CSS去除a标签的下划线的几种方法

《CSS去除a标签的下划线的几种方法》本文给大家分享在CSS中,去除a标签(超链接)的下划线的几种方法,本文给大家介绍的非常详细,感兴趣的朋友一起看看吧... 在 css 中,去除a标签(超链接)的下划线主要有以下几种方法:使用text-decoration属性通用选择器设置:使用a标签选择器,将tex

Flutter打包APK的几种方式小结

《Flutter打包APK的几种方式小结》Flutter打包不同于RN,Flutter可以在AndroidStudio里编写Flutter代码并最终打包为APK,本篇主要阐述涉及到的几种打包方式,通... 目录前言1. android原生打包APK方式2. Flutter通过原生工程打包方式3. Futte

MySQL INSERT语句实现当记录不存在时插入的几种方法

《MySQLINSERT语句实现当记录不存在时插入的几种方法》MySQL的INSERT语句是用于向数据库表中插入新记录的关键命令,下面:本文主要介绍MySQLINSERT语句实现当记录不存在时... 目录使用 INSERT IGNORE使用 ON DUPLICATE KEY UPDATE使用 REPLACE

Python实现Microsoft Office自动化的几种方式及对比详解

《Python实现MicrosoftOffice自动化的几种方式及对比详解》办公自动化是指利用现代化设备和技术,代替办公人员的部分手动或重复性业务活动,优质而高效地处理办公事务,实现对信息的高效利用... 目录一、基于COM接口的自动化(pywin32)二、独立文件操作库1. Word处理(python-d

python中字符串拼接的几种方法及优缺点对比详解

《python中字符串拼接的几种方法及优缺点对比详解》在Python中,字符串拼接是常见的操作,Python提供了多种方法来拼接字符串,每种方法有其优缺点和适用场景,以下是几种常见的字符串拼接方法,需... 目录1. 使用 + 运算符示例:优缺点:2. 使用&nbsjsp;join() 方法示例:优缺点:3

Linux修改pip和conda缓存路径的几种方法

《Linux修改pip和conda缓存路径的几种方法》在Python生态中,pip和conda是两种常见的软件包管理工具,它们在安装、更新和卸载软件包时都会使用缓存来提高效率,适当地修改它们的缓存路径... 目录一、pip 和 conda 的缓存机制1. pip 的缓存机制默认缓存路径2. conda 的缓

Spring 中使用反射创建 Bean 实例的几种方式

《Spring中使用反射创建Bean实例的几种方式》文章介绍了在Spring框架中如何使用反射来创建Bean实例,包括使用Class.newInstance()、Constructor.newI... 目录1. 使用 Class.newInstance() (仅限无参构造函数):2. 使用 Construc

SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法

《SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法》本文主要介绍了SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法,具有一定的参考价值,感兴趣的可以了解一下... 目录方法1:更改IDE配置方法2:在Eclipse中清理项目方法3:使用Maven命令行在开发Sprin