人脸检测算法之 S3FD

简介:

 

SIGAI 特邀作者:Baoming

原创声明:本文为 SIGAI 原创文章,仅供个人学习使用,未经允许,不得转载,不能用于商业目的。

 

导言

自从anchor-based method出现之后,物体检测基本上就离不开这个神奇的anchor了。只因有了它的协助,人类才在检测任务上第一次看到了real time的曙光。但是,夹杂在通用物体检测中,某些特定物体的检测任务由于应用量巨大,以及该物体的特殊性,需要单独拎出来考虑。其中最有代表性的就是人脸检测。

人脸相对于其他物体来说有一个普遍的特点,就是在图像中所占像素少。比如,coco数据集中,有一个分类是“人”,但是人脸在人体中只占很少一部分,在全图像上所占比例就更少了。本文所要介绍的S3FD[1](Single Shot Scale-invariant Face Detector)正是要解决这个问题。

 

 

人脸检测专用数据集—widerface

Widerface可以说是目前人脸检测数据集中最难的,放一张图大家感受一下(图片来自widerface数据集)

1c9c1d68487bf6345b1c95ed8a694f840c23bf39

图片像素1024*732,平均人脸像素10*13,难度可想而知。(一共标注了132个人脸,吃饱了撑的读者可以数数看)

当然了,这张照片只是展示了人脸的大小引发的问题,还有其他像遮挡,大角度,旋转等问题,由于不是本文的重点,不予过多讨论。

 

SSD简介

由于该算法是基于SSD来做的改进,首先简单介绍一下SSD[2]。

(图片来自[2])

db17b79ae1140fd530519f81c86f516e38169460

如图为SSD和YOLO的网络结构,他们也是最早的一批实现了one-stage检测的算法。可以看到,SSD为全卷积网络,并且通过不同位置的layer进行预测。换句话说,用低层网络检测小物体,高层网络检测大物体。

当然了,SSD也有一些明显的问题,比如对于小物体的recall很一般。部分原因是在利用低层网络做预测时,由于网络不够深,不能提取到有效的语义信息。

总之,SSD检测速度可以和YOLO媲美的同时,精度又可以和Faster RCNN媲美,而且很适合作为基础框架进行进一步的改进。

 

传统anchor机制在小人脸中遇到的问题

(以下图片均来自[1])

d2aecbce246664aea5b562f22147456f2e97e63b

本文作者提出了四个问题:

1.     人脸区域本身就小,经过几个stride之后,特征图上就不剩什么了

2.     相比于感受野和anchor的尺寸来说,人脸的尺寸小的可怜

3.     对于现有的anchor匹配策略,我们可以看到,人脸像素小于10*10的tiny face基本上一个anchor都匹配不到。而outer face这个问题其实是anchor-based方法的通病,每级anchor间大小差距越大,中间尺寸的mismatch现象就越严重。

4.     图中每一个网格可以看成是某个特定尺寸的anchor。可以看到对于左边的小人脸,正负比例严重失衡,这在训练时,尤其是first layer,需要特别考虑。

本文算法就是为了解决这几个问题。

 


网络结构

fcef6d2883827b96634e015e4c47595f3fa6dda7

1.     输入大小640*640,从feature map大小为160*160开始,一直到最后5*5,共有6级预测网络,anchor scale从16*16到最后512*512,依次指数加一(看了网络结构强迫症表示很舒服)。

2.     每一个预测层,每个位置anchor只有一个(一个scale,ratio为1:1),因为在不扭曲图片的场景下,人脸的比例大概就是1:1(可能有少部分大长脸比例达到了1:2,但是太少了忽略不计)。因此,预测conv输出的特征维度是2+4=6

3.     在作为预测的最低层的layer(即feature map大小为160*160)下面可以看到预测出来的特征维度为Ns+4,不是2+4,然后跟了一个叫Max-out Background label的东西,这个后面会讲到。

4.     中间的conv_fc6,conv_fc7是从VGG的fc层提取出来然后reshape,作为初始权重。

5.     Normalization layers就是SSD_caffe中的Normalize。感兴趣的可以去Github看weiliu89的SSD版本的Caffe代码[2]。

 

  

如何解决问题:

1.     Anchor与anchor之间重叠区域多。比如第一级,stride是4,但是anchor scale是16,所以相邻两个anchor之间有很大一块重叠区域,一定程度上解决了前文提到的outer face的问题。

2.     改进了anchor匹配策略。

如果按照SSD中的匹配策略,jaccard overlap高于阈值(一般取0.5),平均每个人脸只能匹配到3个anchor,而且tiny face和outer face能匹配的anchor数量大部分为0.

作者设计了新的匹配策略:

第一步,将阈值从0.5降到0.35

第二步,对于那些仍然匹配不到anchor的人脸,直接将阈值降到0.1,然后将匹配到的anchor按照jaccard overlap排序,选取top-N个。这个N作者设计为第一步中匹配到anchor的平均值。

再来直观的对比一下新老匹配策略:

d2a5060bc2fbada15860ef4fd10b06582740e884

可以看到,average line和局部都有所提升。

3.     前面提到,小人脸导致正负样本比例严重失衡。尤其对于最浅层的预测层,一方面anchor本来就多(像本文中的结构,第一级中anchor就占了总数的75%),另一方面由于大部分anchor是背景,导致false positive显著增高。所以为了减少这里的false positive,作者采用了max-out background。

前面我们看到第一级预测出来的特征维度是Ns+4,这里NS=Nm+1。对于不采用max-out策略的网络层,Nm可以看成是1,即只预测一个该anchor为背景的分数。但是这里取3,可以理解为重复三次预测该anchor为背景的分数,然后取这三个分数中最高的那一个。最直接的结果就是提高了该anchor被预测为背景的概率,因此能够减小false positive。

 

最后在widerface medium和hard等级上看看本文的成果(测试代码可以在作者提供的github代码中查看[3])

1e64496dda8abc687c2fcec61b2d19105aa9bbf4

可以看到尤其是hard等级上,本文算法有巨大的提升。

 

参考文献

[1] Zhang, S., Zhu, X., Lei, Z., Shi, H., Wang, X., & Li, S. Z. (2017, October). S^ 3FD: Single Shot Scale-Invariant Face Detector. In Computer Vision (ICCV), 2017 IEEE International Conference on (pp. 192-201). IEEE.

[2] Liu, W., Anguelov, D., Erhan, D., Szegedy, C., Reed, S., Fu, C. Y., & Berg, A. C. (2016, October). Ssd: Single shot multibox detector. In European conference on computer vision (pp. 21-37). Springer, Cham.

[3] https://github.com/weiliu89/caffe

[4] https://github.com/sfzhang15/SFD

 

 

 

推荐阅读

[1] 机器学习-波澜壮阔40 SIGAI 2018.4.13.

[2] 学好机器学习需要哪些数学知识?SIGAI 2018.4.17.

[3] 人脸识别算法演化史 SIGAI 2018.4.20.

[4] 基于深度学习的目标检测算法综述 SIGAI 2018.4.24.

[5] 卷积神经网络为什么能够称霸计算机视觉领域?  SIGAI 2018.4.26.

[6] 用一张图理解SVM的脉络  SIGAI 2018.4.28.

[7] 人脸检测算法综述  SIGAI 2018.5.3.

[8] 理解神经网络的激活函数 SIGAI 2018.5.5.

[9] 深度卷积神经网络演化历史及结构改进脉络-40页长文全面解读 SIGAI 2018.5.8.

[10] 理解梯度下降法 SIGAI 2018.5.11.

[11] 循环神经网络综述语音识别与自然语言处理的利器 SIGAI 2018.5.15

[12] 理解凸优化  SIGAI 2018.5.18

[13] 【实验】理解SVM的核函数和参数 SIGAI 2018.5.22

[14] SIGAI综述】行人检测算法 SIGAI 2018.5.25

[15] 机器学习在自动驾驶中的应用以百度阿波罗平台为例() SIGAI 2018.5.29

[16] 理解牛顿法 SIGAI 2018.5.31

[17] 【群话题精华】5月集锦机器学习和深度学习中一些值得思考的问题 SIGAI 2018.6.1

[18] 大话Adaboost算法 SIGAI 2018.6.2

[19] FlowNetFlowNet2.0:基于卷积神经网络的光流预测算法 SIGAI 2018.6.4

[20] 理解主成分分析(PCA) SIGAI 2018.6.6

[21] 人体骨骼关键点检测综述  SIGAI 2018.6.8

[22] 理解决策树 SIGAI 2018.6.11

[23] 用一句话总结常用的机器学习算法 SIGAI 2018.6.13

[24] 目标检测算法之YOLO SIGAI 2018.6.15

[25] 理解过拟合 SIGAI 2018.6.18

[26] 理解计算:从√2AlphaGo ——1 √2谈起 SIGAI 2018.6.20

[27] 场景文本检测——CTPN算法介绍  SIGAI 2018.6.22

[28] 卷积神经网络的压缩和加速 SIGAI 2018.6.25

[29] k近邻算法 SIGAI 2018.6.27

[30] 自然场景文本检测识别技术综述 SIGAI 2018.6.27

[31] 理解计算:从√2AlphaGo ——2 神经计算的历史背景 SIGAI 2018.7.4

[32] 机器学习算法地图 SIGAI2018.7.6

[33]  反向传播算法推导-全连接神经网络 SIGAI2018.7.9

[34]  生成式对抗网络模型综述 SIGAI0709.

[35]  怎样成为一名优秀的算法工程师SIGAI0711.

[36]. 理解计算:从根号2AlphaGo——第三季 神经网络的数学模型 SIGAI0716

 

原创声明:本文为 SIGAI 原创文章,仅供个人学习使用,未经允许,不得转载,不能用于商业目的。

 

 

 

相关文章
|
6月前
|
开发框架 算法 .NET
基于ADMM无穷范数检测算法的MIMO通信系统信号检测MATLAB仿真,对比ML,MMSE,ZF以及LAMA
简介:本文介绍基于ADMM的MIMO信号检测算法,结合无穷范数优化与交替方向乘子法,降低计算复杂度并提升检测性能。涵盖MATLAB 2024b实现效果图、核心代码及详细注释,并对比ML、MMSE、ZF、OCD_MMSE与LAMA等算法。重点分析LAMA基于消息传递的低复杂度优势,适用于大规模MIMO系统,为通信系统检测提供理论支持与实践方案。(238字)
|
6月前
|
监控 安全 算法
137_安全强化:输入过滤与水印 - 实现输出水印的检测算法与LLM安全防护最佳实践
随着大语言模型(LLM)在各行业的广泛应用,安全问题日益凸显。从提示注入攻击到恶意输出生成,从知识产权保护到内容溯源,LLM安全已成为部署和应用过程中不可忽视的关键环节。在2025年的LLM技术生态中,输入过滤和输出水印已成为两大核心安全技术,它们共同构建了LLM服务的安全防护体系。
643 148
|
7月前
|
传感器 资源调度 算法
DDMA-MIMO雷达多子带相干累积目标检测算法——论文阅读
本文提出一种多子带相干累积(MSCA)算法,通过引入空带和子带相干处理,解决DDMA-MIMO雷达的多普勒模糊与能量分散问题。该方法在低信噪比下显著提升检测性能,实测验证可有效恢复目标速度,适用于车载雷达高精度感知。
850 4
DDMA-MIMO雷达多子带相干累积目标检测算法——论文阅读
|
9月前
|
存储 监控 算法
基于跳表数据结构的企业局域网监控异常连接实时检测 C++ 算法研究
跳表(Skip List)是一种基于概率的数据结构,适用于企业局域网监控中海量连接记录的高效处理。其通过多层索引机制实现快速查找、插入和删除操作,时间复杂度为 $O(\log n)$,优于链表和平衡树。跳表在异常连接识别、黑名单管理和历史记录溯源等场景中表现出色,具备实现简单、支持范围查询等优势,是企业网络监控中动态数据管理的理想选择。
237 0
|
10月前
|
机器学习/深度学习 运维 监控
实时异常检测实战:Flink+PAI 算法模型服务化架构设计
本文深入探讨了基于 Apache Flink 与阿里云 PAI 构建的实时异常检测系统。内容涵盖技术演进、架构设计、核心模块实现及金融、工业等多领域实战案例,解析流处理、模型服务化、状态管理等关键技术,并提供性能优化与高可用方案,助力企业打造高效智能的实时异常检测平台。
931 1
|
10月前
|
机器学习/深度学习 监控 算法
面向办公室屏幕监控系统的改进型四叉树屏幕变化检测算法研究
本文提出一种改进型四叉树数据结构模型,用于优化办公室屏幕监控系统。通过动态阈值调节、变化优先级索引及增量更新策略,显著降低计算复杂度并提升实时响应能力。实验表明,该算法在典型企业环境中将屏幕变化检测效率提升40%以上,同时减少资源消耗。其应用场景涵盖安全审计、工作效能分析及远程协作优化等,未来可结合深度学习实现更智能化的功能。
181 0
|
机器学习/深度学习 数据采集 算法
基于yolov2和googlenet网络的疲劳驾驶检测算法matlab仿真
本内容展示了基于深度学习的疲劳驾驶检测算法,包括算法运行效果预览(无水印)、Matlab 2022a 软件版本说明、部分核心程序(完整版含中文注释与操作视频)。理论部分详细阐述了疲劳检测原理,通过对比疲劳与正常状态下的特征差异,结合深度学习模型提取驾驶员面部特征变化。具体流程包括数据收集、预处理、模型训练与评估,使用数学公式描述损失函数和推理过程。课题基于 YOLOv2 和 GoogleNet,先用 YOLOv2 定位驾驶员面部区域,再由 GoogleNet 分析特征判断疲劳状态,提供高准确率与鲁棒性的检测方法。
|
机器学习/深度学习 存储 算法
基于MobileNet深度学习网络的活体人脸识别检测算法matlab仿真
本内容主要介绍一种基于MobileNet深度学习网络的活体人脸识别检测技术及MQAM调制类型识别方法。完整程序运行效果无水印,需使用Matlab2022a版本。核心代码包含详细中文注释与操作视频。理论概述中提到,传统人脸识别易受非活体攻击影响,而MobileNet通过轻量化的深度可分离卷积结构,在保证准确性的同时提升检测效率。活体人脸与非活体在纹理和光照上存在显著差异,MobileNet可有效提取人脸高级特征,为无线通信领域提供先进的调制类型识别方案。
|
机器学习/深度学习 人工智能 运维
[ICDE2024]多正常模式感知的频域异常检测算法MACE
[ICDE2024]多正常模式感知的频域异常检测算法MACE
215 0
|
机器学习/深度学习 算法 数据安全/隐私保护
基于GRU网络的MQAM调制信号检测算法matlab仿真,对比LSTM
本研究基于MATLAB 2022a,使用GRU网络对QAM调制信号进行检测。QAM是一种高效调制技术,广泛应用于现代通信系统。传统方法在复杂环境下性能下降,而GRU通过门控机制有效提取时间序列特征,实现16QAM、32QAM、64QAM、128QAM的准确检测。仿真结果显示,GRU在低SNR下表现优异,且训练速度快,参数少。核心程序包括模型预测、误检率和漏检率计算,并绘制准确率图。
393 65
基于GRU网络的MQAM调制信号检测算法matlab仿真,对比LSTM
下一篇
开通oss服务