论文精读 MediaPipe BlazeFace

BlazeFace:Sub-millisecond Neural Face Detection on Mobile GPUs

BlazeFace:基于移动GPUs的亚毫秒神经人脸检测

论文地址:arxiv.org/pdf/1907.05047.pdf

源码地址:GitHub - tkat0/PyTorch_BlazeFace: Unofficial PyTorch implementation of BlazeFace

目录

一、摘要

二、应用

三、介绍

(1)与推理速度有关:

(2)与预测质量相关:

四、AR管道人脸检测

五、模型架构和设计

(1)扩大感受野大小

(2)特征提取器

(3)锚定方案

(4)后期处理

六、实验

附录:BalzeFace 特征提取网络架构


一、摘要

我们介绍BlazeFace,一款为移动GPU推理量身定制的轻量级且性能良好的人脸检测器。它在旗舰设备上以200–1000 FPS的速度运行。这种超实时性能使其能够应用于任何需要准确的感兴趣面部区域作为特定任务模型输入的增强现实管道,如2D/3D面部关键点或几何估计、面部特征或表情分类以及面部区域分割。我们的贡献包括:

  1. 一个受 MobileNet V1/V2 启发但不同于MobileNet的轻量级特征提取网络
  2. 一个从单次多盒检测器(SSD)修改而来的GPU友好锚定方案
  3. 以及一个改进的平局分辨率策略,以替代非最大值抑制

二、应用

所提出的模型对完整图像或视频帧进行操作,可以作为几乎任何与面部相关的计算机视觉应用的第一步,例如2D/3D面部关键点、轮廓或表面几何估计、面部特征或表情分类以及面部区域分割。因此,计算机视觉管道中的后续任务可以根据适当的面部裁剪来定义。结合BlazeFace提供的少数面部关键点估计,还可以旋转该裁剪,使内部的面部居中,缩放标准化,并使滚动角接近零。这消除了任务特定模型中显著平移和轮换方差的要求,从而实现了更好的计算资源分配。我们用一个人脸轮廓估计的具体例子来说明这种流水线方法。在图3中,我们展示了Blaze Face的输出,即预测的边界框和面部的6个关键点(红色),是如何通过应用于略微扩展裁剪的更复杂的面部轮廓估计模型来进一步细化的。详细的关键点产生了更精细的边界框估计(绿色),该边界框估计可以在不运行面部检测器的情况下被重新用于后续帧中的跟踪。为了检测这种计算节省策略的失败,轮廓模型还可以检测面部是否确实存在并在所提供的矩形裁剪中合理对齐。每当违反该条件时,BlazeFace人脸检测器就会再次在整个视频帧上运行。本文中描述的技术正在推动手机上主要的AR自我表达应用程序和AR开发者API。

三、介绍

近年来,深度网络([4,6,8])中的各种架构改进实现了实时对象检测。在移动应用程序中,这通常是视频处理管道的第一步,然后是特定任务的组件,如分割、跟踪或几何推断。因此,目标检测模型推理必须尽可能快地运行,更可取的是其性能远高于标准实时基准。我们提出了一种新的人脸检测框架BlazeFace,该框架针对移动GPU上的推理进行了优化,改编自Single Shot Multibox Detector(SSD)框架。我们的主要贡献是:

(1)与推理速度有关:

  • 一种非常紧凑的特征提取器卷积神经网络,在结构上与 MobileNet V1/V2 相关,专为轻型物体检测而设计。
  • 在 SSD 的基础上改进的一种新的GPU友好锚定方案,旨在有效利用GPU。锚(或SSD术语中的先验)是预定义的静态边界框,用作通过网络预测进行调整的基础,并确定预测粒度。

(2)与预测质量相关:

  • 非最大值抑制[4,6,8]的平局分辨率策略,在重叠预测之间实现更稳定、更平滑的平局分辨率。

四、AR管道人脸检测

虽然所提出的框架适用于各种物体检测任务,但在本文中,我们专注于在手机相机取景器中检测人脸。由于焦距和典型的拍摄对象大小不同,我们为前置和后置相机分别构建了模型。

除了预测轴对齐的面部矩形外,我们的BlazeFace模型还产生了6个面部关键点坐标(眼睛中心、耳朵区域、嘴中心和鼻尖),使我们能够估计面部旋转(滚动角)。这使得可以将旋转的面部矩形传给视频处理管道的后期任务特定阶段,减轻了后续处理步骤中对显著平移和旋转不变性的要求(见第5节)。

五、模型架构和设计

BlazeFace模型体系结构是围绕以下四个重要的设计考虑因素构建的。

(1)扩大感受野大小

虽然大多数现代卷积神经网络架构(包括两个MobileNet版本)倾向于在模型图的任何地方都支持3×3卷积核,但我们注意到,深度可分离的卷积计算由其逐点部分主导。在 s*s*c 输入张量上,k*k 深度卷积涉及 s^{2}ck^{2} 乘加运算,而随后到 d 个输出通道的1×1卷积由 s^{2}cd 这样的运算组成,在深度部分的 d/k^{2} 因子内。

例如,在实践中,在具有Metal Performance Shaders实现[1]的Apple iPhone X上,

  • 对于56×56×128张量,16位浮点运算中的3×3深度卷积需要0.07ms,
  • 而从128到128个通道的随后的1×1卷积需要0.3ms,慢4.3倍。

这一观察结果表明,增加深度部分的内核大小是相对便宜的。我们在模型架构瓶颈中使用了5×5个内核,用内核大小的增加来换取达到特定感受野大小所需的瓶颈总量的减少(图1)。

MobileNet V2 瓶颈包含由非线性分隔的随后的深度增加扩展和深度减少投影逐点卷积。为了适应中介张量中较少的通道数量,我们交换了这些阶段,以便瓶颈中的剩余连接以“扩展”(增加)通道分辨率运行。

最后,深度卷积的低开销使我们能够在这两个逐点卷积之间引入另一个这样的层,从而进一步加速感受野大小的进展。这形成了 Double BlazeBlock 的本质,它被用作BlazeFace的更高抽象级别层的选择瓶颈(见图1,右)。

(2)特征提取器

对于一个特定的例子,我们关注的是前置摄像头模型的特征提取器。它必须考虑较小的物体尺度范围,因此计算要求较低。提取器采用128×128像素的RGB输入,由一个2D卷积组成,然后是5个单BlazeBlock和6个双BlazeBlock(完整布局见附录a中的表4)。最高张量深度(通道分辨率)为96,而最低空间分辨率为8×8(与SSD相比,SSD将分辨率一直降低到1×1)。

(3)锚定方案

类似SSD的对象检测模型依赖于预定义的固定大小的基本边界框,称为先验,或Faster-R-CNN[8]术语中的锚点。为每个锚预测一组回归(以及可能的分类)参数,例如中心偏移和尺寸调整。它们用于将预定义的锚点位置调整为紧密的边界矩形。

根据对象比例范围以多个分辨率级别定义锚点是一种常见的做法。主动下采样也是计算资源优化的一种手段。典型的SSD模型使用1×1,2×2,4×4,8×8和16×16特征图大小的预测。然而,池金字塔网络(PPN)架构[7]的成功意味着,在达到一定的特征图分辨率后,额外的计算可能是多余的。

与CPU计算相比,GPU特有的一个关键特征是调度特定层计算的显著固定成本,这对于流行的CPU定制架构所固有的深度低分辨率层来说变得相对重要。例如,在一个实验中,我们发现在4.9毫秒的MobileNet V1推理时间中,只有3.9毫秒用于实际的GPU着色器计算。

考虑到这一点,我们采用了一种替代锚方案,该方案在没有进一步下采样的情况下停止在8×8特征图维度(图2)。我们将8×8、4×4和2×2分辨率中的每个像素的2个锚替换为8×8的6个锚。由于人脸长宽比的变化有限,发现将锚固件限制在1:1的纵横比足以进行精确的面部检测。

(4)后期处理

由于我们的特征提取器没有将分辨率降低到8×8以下,因此与给定对象重叠的锚的数量随着对象大小的增加而显著增加。在典型的非最大抑制场景中,只有一个锚“获胜”,并被用作最终算法结果。当这种模型应用于后续视频帧时,预测往往在不同的锚点之间波动,并表现出时间抖动(人类可感知的噪声)。

为了最大限度地减少这种现象,我们将抑制算法替换为混合策略,该策略将边界框的回归参数估计为重叠预测之间的加权平均值。它对原始NMS算法几乎没有产生额外的成本。对于我们的人脸检测任务,这种调整导致不准确度增加了10%。

我们通过将同一输入图像的几个稍微偏移的版本传递到网络中,并观察模型结果(根据翻译进行调整)如何受到影响,来量化抖动量。在所述的分辨率策略修改后,抖动度量(定义为原始输入和位移输入预测之间的均方根差)在我们的正面相机数据集上下降了40%,在包含较小人脸的背面相机数据集中下降了30%。

六、实验

我们在66K图像的数据集上训练了我们的模型。为了进行评估,我们使用了一个由2K张图像组成的私人地理多样性数据集。对于前置摄像头型号,由于预期使用情况,仅考虑占据图像面积20%以上的人脸(后置摄像头型号的阈值为5%)。

回归参数误差通过眼间距离(IOD)进行尺度不变性归一化,测量的中值绝对误差为IOD的7.4%。通过上述过程评估的抖动度量是IOD的3%。

表1显示了所提出的正面人脸检测网络的平均精度(AP)度量[5](在并集边界框匹配阈值上具有标准的0.5交点)和移动GPU推断时间,并将sit与具有相同锚点编码方案(MobileNetV2-SSD)的基于MobileNetV2的对象检测器进行了比较推理时间评估。

表2给出了两种网络模型在更多旗舰设备上的GPU推理速度。

表3示出了由较小的模型大小引起的回归参数预测质量的退化量。如下一节所述,这不一定会导致整个AR管道质量的成比例下降。

附录:BalzeFace 特征提取网络架构

>>> 如有疑问,欢迎评论区一起探讨。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

无需数据库服务器部署脚本,全能型开源数据库监控平台lepus

Lepus 是一款开源的数据库监控平台,目前已经支持 MySQL、Oracle、SQLserver、MongoDB、Redis 等数据库的基本监控和告警。 Lepus 在监控数据库时,无需在每台数据库服务器上部署脚本或 Agent,只需要在数据库中创建授权账号后,即可…

Python-Python高阶技巧:HTTP协议、静态Web服务器程序开发、循环接收客户端的连接请求

版本说明 当前版本号[20231114]。 版本修改说明20231114初版 目录 文章目录 版本说明目录HTTP协议1、网址1.1 网址的概念1.2 URL的组成1.3 知识要点 2、HTTP协议的介绍2.1 HTTP协议的概念及作用2.2 HTTP协议的概念及作用2.3 浏览器访问Web服务器的过程 3、HTTP请求报文3.1 H…

算法萌新闯力扣:x的平方根

力扣热题:69.x的平方根 开篇 这是一道练习二分查找的题目,简单但也有一些细节需要注意,如判断条件、溢出等。 题目链接:69.x的平方根 题目描述 代码思路 1.一开始使用暴力解,发现超时了,看了标签,原来又…

thinkphp6(TP6)访问控制器报404(Nginx)

起因: 安装thinphp6后,发现无法访问控制器,直接通过URL访问,就报错404。 错误原因: Nginx不支持URL的 PathInfo。 解决方法: 配置伪静态。 伪静态代码: location / {if (!-e $request_filen…

MyBatis源码分析

MyBatis源码分析 MyBatis是常用的持久层框架,帮助我们减少了很多的访问数据库的代码。这次我们就来看看MyBatis是怎么做到这些的?看看它里面用到了哪些值得我们借鉴的技术。 一、示例程序 为了方便后续在本地进行debug调试,首先准备一个示…

【Hello Algorithm】单调栈(未完待续)

单调栈解决的问题 我们单调栈的提出主要是为了解决这么一个问题 现在给我们一个数组 现在要求你建立一张表 这张表中能够查询到两个信息 这两个信息分别是 当前数字左边小于该数字并且下标位置最相近的下标当前数字右边小于该数字并且下标位置最相近的下标 同理 大于也可以…

机器学习入门案例(3)之使用决策树预测是否适合打网球

大家好,我是邵奈一,一个不务正业的程序猿、正儿八经的斜杠青年。 1、世人称我为:被代码耽误的诗人、没天赋的书法家、五音不全的歌手、专业跑龙套演员、不合格的运动员… 2、这几年,我整理了很多IT技术相关的教程给大家&#xff0…

如何解决网页中的pdf文件无法下载?pdf打印显示空白怎么办?

问题描述 偶然间,遇到这样一个问题,一个网页上的附件pdf想要下载打印下来,奈何尝试多种办法都不能将其下载下载,点击打印出现的也是一片空白 百度搜索了一些解决方案都不太行,主要解决方案如:https://zh…

【万字长文】Python 日志记录器logging 百科全书 之 日志过滤

Python 日志记录器logging 百科全书 之 日志过滤 前言 在Python的logging模块中,日志过滤器(Filter)用于提供更细粒度的日志控制。通过过滤器,我们可以决定哪些日志记录应该被输出,哪些应该被忽略。这对于复杂的应用…

【每日一题】—— D. Epic Transformation(Codeforces Round 710 (Div. 3))(找规律+贪心)

🌏博客主页:PH_modest的博客主页 🚩当前专栏:每日一题 💌其他专栏: 🔴 每日反刍 🟡 C跬步积累 🟢 C语言跬步积累 🌈座右铭:广积粮,缓称…

vue离线地图(瓦片)

最近公司要弄一个这样的离线地图,要求在图上打点画线之类的。折腾了几天,学习了三种方式: 1.拿到各省市区的经纬度json,通过echarts来制作,再套一个卫星图的地图背景 2.下载地图瓦片,再通过百度/高德的离线…

image J 对Western blot 条带进行灰度分析 量化分析

用ImageJ对条带进行定量分析 | Public Library of Bioinformatics (plob.org) 3分钟Get!大牛教你用 image J 对Western blot 条带进行灰度分析! - 哔哩哔哩 (bilibili.com) 科研人员做的western blot实验一般需要对其结果扫描后进行灰度分析&#xff0…

【Qt之QWizard】使用2,示例分析

效果图 根据首页的选择不同&#xff0c;进入不同的选项。 以下是代码。 示例 .h #ifndef LICENSEWIZARD_H #define LICENSEWIZARD_H#include <QWizard>QT_BEGIN_NAMESPACE class QCheckBox; class QLabel; class QLineEdit; class QRadioButton; QT_END_NAMESPACEcla…

vue请求代理查看真实地址

查看真实地址方式&#xff1a; 通过配置vue.config.js文件&#xff0c;直接在请求头输出完整地址&#xff1a; /api/: { changeOrigin: true, target: process.env.VUE_APP_PLATFORM_URL, logLevel: debug, // 在终端输出 onProxyRes(proxyR…

请求头,响应头

目录 常见的请求方式 GET/POST HEAD&#xff08;报文首部&#xff0c;验证URI有效性&#xff09; PUT/DELETE(报文文件) OPTIONS&#xff08;查询URI支持的HTTP方法&#xff09; Connection: keep-alive TCP 就会一直保持连接。 Cache-Control public&#xff1a;响应…

数据银行:安全保障的重要一环

随着信息技术的快速发展&#xff0c;数据银行已经成为了我们日常生活中不可或缺的一部分。它存储了我们的个人信息、财务数据、医疗记录等重要信息&#xff0c;这些信息对于我们的生活和工作至关重要。然而&#xff0c;由于数据的安全性备受关注&#xff0c;因此&#xff0c;对…

【星海出品】SDN neutron (四) 流分析

Neutron框架之流分析 1.控制端neutron-server通过wsgi接收北向REST API请求&#xff0c;neutron-plugin通过rpc与设备端进行南向通信。 2.设备端agent则向上通过rpc与控制端进行通信&#xff0c;向下则直接在本地对网络设备进行配置。 3.Neutron-agent的实现很多&#xff0c;彼…

容斥dp,二项式反演

前言 由于水平有限&#xff0c;这篇文章比较难懂&#xff0c;并且也有很多不够透彻的地方&#xff0c;如果您有任何的看法&#xff0c;非常感谢您私信指导。 容斥dp 用dp的方法来描述容斥&#xff0c;大概的想法是&#xff0c;把容斥系数分到每一步里去乘。 通常当你有容斥…

本田发布全新CB1000 Hornet,是杜卡迪街霸劈了腿还是Z1000红杏出墙?

米兰车展上&#xff0c;本田带来了全新的大黄蜂CB1000 Hornet&#xff0c;外观方面抛弃了之前的本田推出的Neo Sports Caf风格&#xff0c;新款的外观看起来要更加战斗一点。不过新的这个前脸改的&#xff0c;我只能说是杜卡迪街霸劈了腿还是Z1000红杏出墙&#xff1f;外观方面…

【Python】Numpy(学习笔记)

一、Numpy概述 1、Numpy Numpy&#xff08;Numerical Python&#xff09;是一个开源的Python科学计算库&#xff0c;用于快速处理任意维度的数组。 Numpy使用ndarray对象来处理多维数组&#xff0c;该对象是一个快速而灵活的大数据容器&#xff0c; Numpy num - numerical 数…