作为目标检测任务,几乎所有的通用目标检测算法都可以用于口罩检测,不过由于各类算法的模型复杂度以及检测精度之间存在巨大差异,导致它们在检测过程中可能会面临检测速度过低或者检测精度不足等问题。
R-CNN 算法是 Girshick 等人于 2015 年提出的两阶段通用目标检测算法,是早期目标检测领域的代表作之一。R-CNN 算法首先在区域提议阶段生成 2000个左右的候选区域,并将每个候选区域缩放至227 × 227的固定尺寸之后输入CNN 模型进行特征提取,然后将输出的特征向量使用支持向量机(Support Vector Machine,SVM)进行分类,最后使用边界框回归生成的预测参数对原始候选区域进行校正,以获取最终的预测框。R-CNN 算法的步骤相当繁琐,模型训练耗时极为严重而且中间步骤会生成大量的临时文件,尤其占用磁盘空间,最后的检测速度也相当不理想,在常规 GPU 上面预测单张图片的耗时高达几十秒。鉴于R-CNN 算法的上述缺点,Girshick 又对其进行了部分改进并提出了 Fast R-CNN算法,Fast R-CNN 在区域提议阶段的处理类似 R-CNN 算法,但之后直接将归一化处理的输入图像送入 CNN 模型进行特征提取,并建立候选区域与最后一个卷积层的输出特征图之间的映射关系,然后使用新增的 ROI 池化层生成固定尺寸的特征向量,最后使用多任务联合损失函数对 CNN 模型进行训练。R-CNN 算法生成的多个候选区域之间存在大量的重叠部分,而使用 CNN 模型逐一对候选区域提取特征必然会造成大量的冗余计算,Fast R-CNN 则将输入图像归一化后直接输入 CNN 模型,并建立候选区域与输出特征图之间的映射关系以实现特征值的共享,节省了大量的时间、空间资源。而 ROI 池化层的增加则不再需要对输入图像进行缩放操作,避免了尺度缩放带来的信息丢失问题。Ren 等人在 Fast R-CNN 算法的基础上进一步改进并提出了 Faster R-CNN 算法,Faster R-CNN 使用区域提议网络(Region Proposal Networks,RPN)生成多个目标先验框,并使用逻辑回归对先验框进行二分类(前景,背景),然后进行边界框回归以校正其位置信息,得到数量更少且更加准确的候选框,最后同样通过多任务联合损失进行 CNN 模型的训练。Faster R-CNN 算法使用 CNN 生成候选区域,使候选区域的数量由原来的 1000~2000 个降低至大约 300 个,大幅提升了算法效率,在检测精度和检测速度上实现了对 Fast R-CNN 算法的双向超越。不过需要注意的是,两阶段检测算法由于本身检测策略的局限性,执行步骤繁琐、网络结构复杂的缺点难以规避,将 Faster R-CNN 等两阶段检测算法应用于口罩检测任务,几乎不可能满足该任务的实时性要求。
不同于 Faster R-CNN 等两阶段检测算法,SSD算法仅使用单个深度 CNN模型对输入图像进行目标检测,在训练阶段,将边界框的输出空间离散化为一系列不同尺度、长宽比的候选框;在测试阶段,生成每一个候选框的类别得分与位置调整参数。除此之外,SSD 还使用不同尺度的特征图来预测多种尺寸的目标,提高了对浅层网络的细节信息的利用率,增强了算法对小尺寸目标的鲁棒性。SSD 算法在 PASCAL VOC数据集(VOC2007+VOC2012)和 COCO 数据集上以512 × 512的输入尺寸分别获得了 74.95 和 46.4%的 mAP,比 Faster R-CNN 算法分别提高了 4.5%和 3.7%,并且在检测速度上实现了对 Faster R-CNN 算法的大幅超越。
YOLOv2 算法是 Redmon 等人在前作 YOLO的基础上改进而来的单阶段目标检测算法,它使用了包含“跳跃”结构的全新骨干网络 Darknet19,并且引入了先验框(anchor box)、多尺度特征层、批量归一化 (Batch Normalization)和多尺度联合训练等概念或训练策略,在 VOC 2007 数据集上取得了比 YOLO、SSD 和 Faster R-CNN 等当时的主流算法更优的检测效果。
Retinaface算法是 Deng 等人提出的单阶段像素级人脸检测算法,作者在WIDER FACE人脸检测数据集中添加了 5 个额外标注点以引入用于人脸对齐的额外监督损失函数,并新增了预测 3D 人脸信息的自监督解码分支,然后结合特征金字塔网络(Feature Pyramid Networks,FPN)实现多尺度特征的融合以增强算法对小尺寸目标的感知能力,最终在 WIDER FACE 数据集上取得了非常优秀的检测效果。作为专门的人脸检测算法,RetinaFace 对人脸目标有着极强的感知能力,但是由于口罩目标缺失了很多人脸面部信息,尤其是关键的口、鼻部分的细节信息基本被口罩遮挡严实,所以 RetinaFace 对口罩目标的表达能力非常一般,将其直接用于口罩检测任务很难满足该任务的检测精度要求。牛作东等人在 RetinaFace 算法的基础上加入了口罩目标类别并对分类损失函数进行了改进,然后在 RetinaFace 的特征金字塔模块中引入注意力机制以提高特征层对目标信息的表征能力并减少无用信息的干扰,算法在口罩目标上的检测精度为 84.7%,相比于 RetinaFace 提高了 8.2%,低于人脸目标的检测精度 90.6%,不过 RetinaFace本身复杂的网络结构以及注意力机制的添加也导致了算法的实时检测速度并不理想。
YOLOv3算法是目标检测领域里具有里程碑意义的巨作,之后的YOLOv3-tiny、YOLOv4 和 YOLOv4-tiny 等常见算法均由 YOLOv3 发展而来。相比之前的YOLO 系列算法,YOLOv3 算法采用了全新的骨干网络 Darknet53(一共包含 53 个卷积层),Darknet53 最重要的特点是引入了 ResNet 的残差思想,通过多个残差块的堆叠缓解深度卷积神经网络中的梯度消失或梯度爆炸问题,让神经网络的优化变得更加容易。YOLOv3 算法骨干网络 Darknet53由大量的残差块堆叠而来,自上而下依次包含了 1、2、8、8、4 个不同尺寸的残差块,这也是 YOLOv3 算法模型参数量巨大的重要原因。YOLOv3 算法使用 FPN作为特征增强网络,对不同尺度的特征层进行上采样之后加以堆叠以达到特征融合的目的,最后输出三个不同尺度的预测特征层用于目标检测框的解码工作。作为通用目标检测算法,YOLOv3 可以应用于口罩检测任务,其检测速度略优于改进的RetinaFace 算法,但仍旧不够理想,在 GTX 1050Ti GPU 上的测试结果低于 18 FPS,复杂的网络结构仍然是 YOLOv3 算法检测速度提升过程中的阻碍。王艺皓等人 在 YOLOv3 算法的基础上引入了 CSPNet 结构]对 YOLOv3 的骨干网络 Darknet53 进行改造以降低网络的参数量,在改造的骨干网络之后加入了改进的空间金字塔结构,并对多尺度特征预测网络进行优化以实现特征增强,然后用于口罩检测任务,相比 YOLOv3 算法实现了检测精度和检测速度的小幅度提升,不过作者也提到了算法采用的数据集的背景相对单一(均来自理想光照情况),难以扩展到复杂的多场景口罩检测任务中去,应用场景比较受限。
YOLOv4算法由Bochkovskiy等人对YOLOv3算法进行一系列改进而来,包括了网络结构的优化(骨干网络由 Darknet53 变为 CSPDarknet53、空间金字塔结构的引入等)以及众多训练策略(Mosaic 数据增强方法、CIoU 损失函数、Mish 激活函数等)的引入,在 COCO 数据集上的 mAP 达到了 65.7%,相比YOLOv3 有 7.8%的大幅提升。不过 YOLOv4 算法整体上并没有对 YOLOv3 进行大刀阔斧的改动,两种算法的网络结构比较类似,网络参数量上面 YOLOv4 算法甚至要略大一点,这导致了它的实时检测速度依旧不理想,在同样的 GPU(GTX 1050Ti GPU)上的测试结果比 YOLOv3 降低了 3~6 FPS。
YOLOv3-tiny 算法是 YOLOv3 算法的简化版本,它对 YOLOv3 算法的骨干网络 Darknet53 进行了大幅改动,预测特征层由三个减少为两个,并使用了更为朴素的特征融合策略。YOLOv3-tiny 算法的网络结构如图 1.3 所示,可以看到,它的骨干网络几乎不再具有 Darknet53 的影子:不再使用残差网络结构,仅由简单的卷积层和池化层堆叠而成。YOLOv3-tiny 算法结构一共包含了 13 个卷积层,6 池化层和 2 个预测特征层,相比 YOLOv3 算法大幅简化,甚至过于简化,这为其带来了非常优秀的检测速度(YOLOv3 的 5~6 倍),但遗憾的是 YOLOv3-tiny算法的检测精度非常一般,即使应用于类别较少的检测任务也难以得到令人满意的效果。正如 YOLOv3-tiny 算法是由 YOLOv3 算法简化而来,YOLOv4-tiny 算法则是由 YOLOv4 算法简化而来的。不过相比 YOLOv3-tiny 算法简单粗暴、大刀阔斧式的简化,YOLOv4-tiny 算法采用的模型尺度缩放策略更加有效,在减少YOLOv4 算法的骨干网络 CSPDarknet53 中的残差块的个数以及堆叠次数的同时保留了网络的残差结构以及 CSPNet 结构,这让 YOLOv4-tiny 算法在检测精度和检测速度之间上达到了比 YOLOv3-tiny 算法更好的平衡。