189 8069 5689

faced:基于深度学习的CPU实时人脸检测

在没有采用GPU的情况下,有可能实现具有实时性能的对象检测模型吗?faced是一个概念证明,可以为在CPU上实时运行的单个类对象(在本例中为faced)构建自定义对象检测模型。

创新互联公司坚实的技术研发基础赢得了行业内的良好口碑,公司成立10多年来,为数千家企业提供过网站建设、软件开发、搜索引擎优化技术、互联网大数据整合营销服务,多年的技术服务成功经验、众多的客户使我们能懂得更多,做得更好。"让您的网站跑起来"是我们一直追求的目标!

faced:基于深度学习的CPU实时人脸检测

问题是什么?

在许多情况下需要单个类对象检测。这意味着我们想要检测属于图像中特定类的所有对象的位置。例如,我们可以检测面部识别系统的面部或需要跟踪人员的面部。

更重要的是,大多数时候我们希望实时运行这些模型。为了实现这一目标,我们提供了以x为速率提供样本的图像,并且我们需要一个模型,用于每个样本以低于x的速率运行。然后,我们可以在图像可用时立即处理。

现在解决此任务(以及计算机视觉中的许多其他任务)的最容易访问和使用的解决方案是在先前训练的模型上进行转移学习(通常在大数据集上训练的标准模型,如Tensorflow Hub或TF Object Detection API中的那些)。

https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo.md

有许多训练有素的对象检测架构(例如FasterRCNN、SSD或YOLO)可以在GPU上运行的实时性能中实现令人印象深刻的准确性。  

faced:基于深度学习的CPU实时人脸检测

GPU很昂贵,但在训练阶段是必需的。然而在推理中,具有专用GPU以实现实时性能是不可行的。所有通用对象检测模型(如上所述)都无法在没有GPU的情况下实时运行。然后,我们如何重新审视单个类对象的对象检测问题,以实现CPU的实时性能?

主要思想:简单的任务需要较少的可学习特征

所有上述架构都设计用于检测多个对象类(在COCO或PASCAL VOC数据集上训练)。为了能够将每个边界框分类为适当的类,这些体系结构需要大量的特征提取。这转化为大量可学习的参数,大量的过滤器,大量的层。换句话说,这个网络很大。

如果我们定义更简单的任务(而不是多类边界框分类),那么我们可以想到网络需要学习更少的特征来执行任务。检测图像中的面部显然比检测汽车、人员、交通标志和狗(都在同一模型中)更简单。深度学习模型为了识别面部(或任何单个类对象)所需的特征量将小于同时检测数十个类的特征量。执行第一个任务所需的信息少于后一个任务。

单个类对象检测模型需要较少的可学习功能。参数越少意味着网络越小。较小的网络运行得更快,因为它需要更少的计算。

那么,问题是:我们可以在CPU上实现实时性能但保持准确性有多大?

faced的主要概念是:建立尽可能小的网络(希望)在CPU中实时运行,同时保持准确性。

架构

faces是两个神经网络的集合,都是使用Tensorflow实现的。

主要网络

faced的主要架构主要基于YOLO的架构。基本上,它是一个全卷积网络(FCN),通过一系列卷积层和池化层运行288×288输入图像(不涉及其他层类型)。

卷积层负责提取空间感知特征。汇集层增加了随后的卷积层的感知域。

架构的输出是9×9网格(与YOLO中的13×13网格相比)。每个网格单元负责预测面部是否在该单元内(相对于YOLO,每个单元可以检测多达5个不同的对象)。

每个网格单元具有5个关联值。第一个是包含面部中心的单元的概率p。其他4个值是检测到的面部(相对于单元)的(x_center,y_center,width,height)。

faced:基于深度学习的CPU实时人脸检测

主要架构

确切的体系结构定义如下:

  • 2×[288×288图像上的8个过滤卷积层]

  • 最大池(288×288到144×144特征图)

  • 在144×144特征图上的2×[16个过滤卷积层]

  • 最大池(144×144到72×72特征图)

  • 72×72特征图上的2×[32个过滤卷积层]

  • 最大池(72×72到36×36特征图)

  • 36×36特征图上的2× [64个过滤卷积层]

  • 最大池(36×36到18×18特征图)

  • 18×18特征图上的2×[128个过滤卷积层]

  • 最大池(18×18到9×9特征图)

  • 最大池(18×18到9×9特征图)

  • 9×9特征图上的4×[192个过滤卷积层]

  • 9×9特征图上的5个过滤卷积层,用于最终网格

所有激活功能都是leaky_relu。

faced有6,993,517个参数。YOLOv2有51,000,657个参数。它的尺寸是YOLO尺寸的13%!

辅助网络

(x_center,y_center,width,height)主网的输出不如预期的那么准确。因此,实现了一个小型卷积神经网络(CNN),以将包含面部的小图像(用主体系结构输出裁剪)作为输入,并在面部的真实边界框上输出回归。

faced:基于深度学习的CPU实时人脸检测

网络采用包含面部的裁剪并预测正确的边界框

它的唯一任务是补充和改进主体系结构的输出坐标。

该网络的特定体系结构不相关。

数据集

两个网络都在WIDER FACE数据集上进行了训练。

faced:基于深度学习的CPU实时人脸检测

WIDER的多场景

"WIDER FACE数据集是一个人脸检测基准数据集。我们选择了32,203张图像,标记了393,703张人脸,其尺寸、姿势和遮挡程度都有很高的变化,如样本图像所示。

训练

训练是在Nvidia Titan XP GPU上完成的。训练时间约需20小时。批量归一化技术用于帮助收敛和丢失(以40%的速率)作为正则化方法以避免过度拟合。

推理和非最大抑制

当使用faced推理时,首先将图像大小调整为288×288以便馈入网络。图像位于FCN下方,提供上述9×9网格输出。

每个单元具有包含图像的概率p。通过可配置的阈值过滤单元(仅保留p>t的单元)。对于那些保留的单元格,使用单元格(x_center,y_center,width,height)定位人脸。

在某些情况下,多个单元可以竞争同一个面部。假设面部中心位于4个单元格相交的确切位置。这4个单元可能具有更高的p(在单元内包含面部中心的概率)。如果我们保留所有单元格并投影每个单元格的面部坐标,那么我们将看到相同的面部周围有4个类似的边界框。这个问题通过一种称为非最大抑制的技术得以解决。结果如下图所示:  

faced:基于深度学习的CPU实时人脸检测

非最大抑制示例

性能 faced能够在推理上达到以下速度:

faced:基于深度学习的CPU实时人脸检测

考虑到YOLOv2在i5 2015 MBP上无法达到1FPS,相当不错。

结果

让我们看看一些结果!

faced:基于深度学习的CPU实时人脸检测

faced:基于深度学习的CPU实时人脸检测

faced:基于深度学习的CPU实时人脸检测

面部图像

现在让我们看看faced和Haar Cascades之间的比较,这是一种不使用深度学习的计算机视觉传统方法。两种方法都在相似的速度性能下运行faced表现出更高的准确性。  

faced:基于深度学习的CPU实时人脸检测

Haar Cascades [左] vs faced [右]

faced怎么用?

faced是一个非常简单的程序,既可以嵌入Python代码中,也可以作为命令行程序使用。

登录github库可以获得进一步说明:

faced:基于深度学习的CPU实时人脸检测

https://github.com/iitzco/faced

结论

faced是一个概念证明,在场景中,你并不总是需要依赖于通用的训练模型,因为这些模型对于你的问题和性能问题来说过于简单。不要过高估计花费时间设计特定于你的问题的自定义神经网络架构的能力。这些特定网络将是比一般网络更好的解决方案。


当前名称:faced:基于深度学习的CPU实时人脸检测
网站地址:http://cdxtjz.com/article/gesdic.html

其他资讯