美文网首页
MTCNN之基础知识笔记

MTCNN之基础知识笔记

作者: 小黄不头秃 | 来源:发表于2023-06-17 18:23 被阅读0次

    MTCNN网络是多任务级联卷积神经网络,基于级联的特定目标检测器,在人脸识别中有着出色的表现。由P、R、O三个网络构成。常用于目标检测的算法还有SSD(单激多发探测器)、RCNN、YOLO等

    一、MTCNN网络的优缺点

    (1)优点

    1. 使用级联的思想,将复杂问题简单化,将人脸识别问题分解成三个步骤。对设备算力要求低,
    2. 神经网络小易于训练,网络模型容易收敛。
    3. 准确率高,识别精度高。
    4. 不限制图片大小和人脸的数量。

    (2)缺点

    1. 利用了图像金字塔和级联的思想导致了识别的效率比较低,推流的时候帧率上不去。
    2. 负样本过少会导致网络容易误判。
    3. 对原模型可改进的地方还很多。

    二、核心工作原理

    首先我们需要明确人眼是怎么进行人脸检测的,我们总是从图片的左上角向右观察,每次只观察一部分的图像,并匹配是否有人脸出现,最后将整个图像观察完。为了能做到不重复并且不漏检,MTCNN的作法也一样,使用滑动窗口,将图像划分为很多个小格子,每张图片都要放到神经网络中去检测。这样一个多目标识别任务就转换成了单目标识别任务,最后统计人脸结果。

    (1)滑动窗口和图像金字塔

    滑动窗口 的作用是为了在检测的过程中不遗漏目标,所以我们需要找一个窗口,从左往右,从上往下扫描整个网络。每一次滑动的步长往往小于一个窗口的长度,这是防止出现人脸出现在窗口边缘的情况。并且将P网络窗口的大小设置为12*12,之所以设置成正方形,是应为人脸的形状接近于一个正方形。

    滑动窗口解决了不漏检的问题,但是人脸离相机的远近会导致人脸的大小不一,那如何解决,窗口和人脸大小不匹配的问题呢?MTCNN采用了图像金字塔的思想。也就是窗口的大小不变,但是将图片进行缩放。例如一次检测完,将图片缩小到原来的0.8倍,再去检测,再缩小,知道图像的宽高小于窗口的大小

    (2)交并比 (IOU)

    我们可以将其理解为在目标识别中的损失函数,损失函数的作用就是判断两个目标的距离或者相似程度。那么IOU就是判断两个方框之间的相似度。使用的是两个方框的交集除以并集。

    (3)非极大值抑制 (NMS)

    由于使用图像金字塔和滑动窗口,我们的目标有可能出现下面的情况,如下图所示,一个人脸被多个框框选住。

    这是我们可以使用非极大值抑制来实现对框的筛选。

    • 第一步:找出所有预测目标中得分最高的预测框作为基准框;
    • 第二步:计算剩余的预测框与基准框的IOU,如果IOU>阈值t,则将这些预测框删除,因为,这些预测框与0.97的太相似了,所以是冗余框,需要抑制;
    • 第三步:在去除冗余框后剩余预测框中,找到得分第二高的预测框0.95作为基准框,执行第二步操作;
    • 第四步:重复上述过程,直至剩余预测框中的每个预测框都曾被用作过基准框。即剩余的预测框任意两个IOU均小于t,没有两个预测框过于相似,完成nms操作。
    (4)使用卷积将图片进行切分

    在实现滑动窗口和图像金字塔的时候,我们需要对图片进行切分,切分出来的每一块交给神经网络进行目标检测。那么问题就出现了,怎么切分图片,首先我们想到的就是使用PIL和openCV两个库来切分图片。但是由于在切分过程中需要进行大量的文件的读写操作,这样会导致效率非常慢。这时候问题出现了:是用什么方法对图片进行切分?

    MTCNN采用了卷积的方式,因为卷积操作不就是对图片进行滑动窗口的特征提取吗。我们只需要将卷积核大小设置为窗口大小1212,卷积步长设置为窗口滑动步长就行了!并且1212的卷积核可以等价于多个小的卷积核的组合使用,这样加深了神经网络进行特征提取,并且将图片进行了切分。但是神经网络的输出怎么办呢?

    通常我们实现单目标检测时,在输出层之前,我们需要将卷积层的输出结果摊平,然后再经过线性全连接层进行通道融合,然后输出结果,例如:输出维度为(N, 5),N代表批量大小,5表示一个置信度,四个坐标值。在MTCNN中,我们不使用全连接层来进行通道融合,而是全部交给卷积层来做。其输出结果就变成了 (N, 5, 1,1)宽高为1,一共五个通道。这样做和使用全连接层的作用是一样的。

    此时网络就变成了全卷积结构,全卷积结构,理论上可以输入任意大小的图片(宽高大于卷积核)。

    三、网络结构

    MTCNN由三个子网络构成:P网络、R网络、O网络
    P网络的输入是12*12,R网络输入是24*24,O网络输入是48*48。P网络注重从大量数据中筛选有效信息,R网络对P网络的筛选结果做二次筛选,O网络注重识别的精度。

    (1)P网络(3层)

    图像金字塔和滑动窗口把一张图片分割成了很多张图片,所以P网络面对的数据量是最大的。

    P网络就相当于是一个12*12的卷积核,对大量图片进行筛选。并且P网络是全卷积结构,这就说明P网络的输入可以是大小不固定的图片。

    P网络结构的pytorch代码实现和训练代码的实现可以参考我的笔记:
    MTCNN网络之P网络——pytorch代码实现 - 简书 (jianshu.com)

    (2)R网络(4层)

    使用三层卷积层后接一个全连接层。这里与P网络不一样。然而P网络是全卷积结构,为什么会造成这样的差异呢?因为我们并不清楚一张图片中有多少个人脸,图片大小也不一样,自然不能使用全连接层。但是R网络接收的是P网络的输出结果,输入的大小是固定的。所以这里并没有使用全卷积结构,而是使用传统的但目标识别网络结构。

    R网络结构的pytorch代码实现和训练代码的实现可以参考我的笔记:
    MTCNN之R网络——pytorch代码实现 - 简书 (jianshu.com)

    (3)O网络(5层)

    是三个网络中参数最多,网络层数最深的,因为到了最后一步,我们需要对目标进行更加精确的识别,所以相对神经网络的能力要求更高。

    O网络结构的pytorch代码实现和训练代码的实现可以参考我的笔记:
    MTCNN网络之O网络——pytorch代码实现 - 简书 (jianshu.com)

    以上就是MTCNN的基础知识啦,欢迎大家纠正和点赞~~

    相关文章

      网友评论

          本文标题:MTCNN之基础知识笔记

          本文链接:https://www.haomeiwen.com/subject/neowedtx.html