基于adaboost算法的人脸检测_人脸检测算法(一)

基于深度学习的人脸检测算法大致分为三类:

1、基于级联的人脸检测算法。

2、基于两阶段的人脸检测算法。

3、基于单阶段的人脸检测算法。

第一类基于级联的人脸检测方法(如Cascade CNN、MTCNN)运行速度较快、检测性能适中,适用于算力有限、背景简单且人脸数量较少的场景。第二类两阶段人脸检测方法一般基于Faster-RCNN框架,在第一阶段生成候选区域,然后在第二阶段对候选区域进行分类和回归,其检测准确率较高,缺点是检测速度较慢,代表方法有Face R-CNN 、ScaleFace、FDNet。最后一类单阶段的人脸检测方法主要基于Anchor的分类和回归,通常会在经典框架(如SSD、RetinaNet)的基础上进行优化,其检测速度较两阶段法快,检测性能较级联法优,是一种检测性能和速度平衡的算法,也是当前人脸检测算法优化的主流方向。

重点研究基于单阶段的人脸检测算法。今天首先研究开源最强人脸检测算法retinaface。

Retinaface

网络结构

import 

ssh模块是接在FPN模块之后,整个网络结构如下图所示:

4a524652a731a33635e682b5fa2c2a1d.png

在论文中,作者采用 FPN 中的 Feature Pyramid 结构,并以 ResNet-152 作为 Backbone,其中, C2/C3/C4/C5 为 ResNet 中各个 Residual Block 所生成的 Feature Map,而 C6 由 C5 经过 3*3 的卷积层生成(步长为 2)。

此外,类似于 PyramidBox和SSH人脸检测算法,作者也设计了 Context Module 用于增加模型的感受区域以及上下文信息。上下文网络模块的作用是用于增大感受野,一般在two-stage 的目标检测模型当中,都是通过增大候选框的尺寸大小以合并得到更多的上下文信息,SSH通过单层卷积层的方法对上下文(context)信息进行了合并,其结构图如下图所示:

48c533e1ab50d01df605e9e5aca77411.png

通过2个3✖️3的卷积层和3个3✖️3的卷积层并联,从而增大了卷积层的感受野,并作为各检测模块的目标尺寸。通过该方法构造的上下文的检测模块比候选框生成的方法具有更少的参数量,并且上下文模块可以在WIDER数据集上的AP提升0.5个百分点(SSH人脸检测算法论文结论) 。

作者还仿照 WIDER Face Challenge 2018 的冠军,将所有带有 Lateral Connection 的 3*3 卷积层和 Context Module 中的所有卷积层替换为可变形卷积网络(DDeformCable Convolution Network,DCN)。

不过在pytorch复现的代码中没有发现用可变形卷积。

class SSH(nn.Module):
    def __init__(self, in_channel, out_channel):
        super(SSH, self).__init__()
        assert out_channel % 4 == 0
        leaky = 0
        if (out_channel <= 64):
            leaky = 0.1
        self.conv3X3 = conv_bn_no_relu(in_channel, out_channel//2, stride=1)

        self.conv5X5_1 = conv_bn(in_channel, out_channel//4, stride=1, leaky = leaky)
        self.conv5X5_2 = conv_bn_no_relu(out_channel//4, out_channel//4, stride=1)

        self.conv7X7_2 = conv_bn(out_channel//4, out_channel//4, stride=1, leaky = leaky)
        self.conv7x7_3 = conv_bn_no_relu(out_channel//4, out_channel//4, stride=1)

    def forward(self, input):
        conv3X3 = self.conv3X3(input)

        conv5X5_1 = self.conv5X5_1(input)
        conv5X5 = self.conv5X5_2(conv5X5_1)

        conv7X7_2 = self.conv7X7_2(conv5X5_1)
        conv7X7 = self.conv7x7_3(conv7X7_2)

        out = torch.cat([conv3X3, conv5X5, conv7X7], dim=1)
        out = F.relu(out)
        return out

anchor设置

  • 在从P2到P6的特征金字塔级别上使用特定比例的锚点。
  • aspect ratio at 1:1
  • 在输入为640*640的图像上总共产生了102,300 anchors, 75% 的anchor都是来自P2。

a859b63832d244b3b577f19080aa55cf.png
  • 采用OHEM优化正负anchor不平衡的问题

损失函数

5e1fa9e986cc65fb59c97a8bc87eb2f2.png

4aebc83b1f07a4f489cf431cbb8652a9.png

总共有四部分组成,前两项分别是分类的损失,bbox的回归损失,第三项是五个人脸关键点的回归损失。最后一项比较陌生。这一项损失是接下来要介绍的所谓Dense Regression分支带来的损失,我下面会详细介绍。

的取值分别是0.25, 0.1和0.01,也就是说来自于带标签的检测和landamark的损失权重会更高, 而最后这个基于自监督的Dense Regression Branch的权重较少。

Dense Regression Branch

b8334a4d54c7105fb03621eaf89f0025.png

这个分支简单来说,就是将2D的人脸映射到3D模型上,再将3D模型解码为2D图片,然后计算经过编解码的图片和原始图片的差别。中间用到了图卷积。

这里实际上用到了mesh decoder来做解码,mesh decoder是一种基于图卷积的方法,参数量会比我们平时用的普通2D卷积计算量要少。可以看看下图,我们知道普通的卷机操作参数一般是

, 而图卷积在计算参数的时候,参数量只有

在Decider完之后会做一个3D到2D的映射。之后会有一个所谓Dense Regression Loss的东西。实际上就是比较没有经过编码解码的图片和编码解码完的图片的五个人脸特征点的位置的差别啦。

W, H 就是anchor I的宽高啦。

论文分析

89a56304586e81f803467f72ed198db4.png

加入DCN后有%1的提升,加入关键点后MAP值有1%的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值