SqueezeDet:一种应用于自动驾驶实时目标检测中的标准、小型、低功耗的全卷积神经网络(二)
论文原文:SqueezeDet: Unified, Small, Low Power Fully Convolutional Neural Networks for Real-Time Object Detection for Autonomous Driving
源代码:https://github.com/BichenWuUCB/squeezeDet
论文翻译:XJTU_Ironboy
时间:2017年8月
3. 方法描述
3.1 检测管道(Detection Pipeline)
受到YOLO(You Only Look Once)的启发,我们采用单级的检测管道(detection pipeline),把 region proposition和分类器同时放在一个单独的网络中去实现,正如我们在图1所示:一个卷积神经网络首先将一张图片作为输入,并且从图片中提取一个低分辨率、高维度的特征图,然后这个特征图输入到ConvDet中,来计算在
图1 SqueezeDet detection pipeline。一个卷积神经网络从输入图片中提取一个特征图,并且将其输入到ConvDet层中,然后ConvDet层计算在W×H空间中均匀分布网格的边界框,每个边界框和一个置信评分、C个条件分类概率相联系,然后我们保留前N个具有最高置信评分的边界框,并且使用NMS(非最大值抑制)过滤得到最后的检测结果。
每个边界框和C+1个值相联系,其中C是用来分类的概率向量,另外一个值是置信评分(表征边界框中实际包含一个对象的概率)。和YOLO相似,我们将置信评分理解为一个高的置信评分意味着边界框中存在对象的概率较高,预测情况与真实情况吻合程度较高。其他的C个值是假定边界框中有对象存在时该对象的条件分类概率,更正式地说,我们定义这个条件概率为:
最后我们保留前N个具有最高置信评分的边界框,使用NMS(非最大值抑制)的方法过滤多余的边界框以获得最终的检测结果。在整个训练过程中,整个检测管道(detection pipeline)仅由一个神经网络的一个前向传递组成,后期处理很少。
3.2 ConvDet
SqueezeDet 的检测管道(detection pipeline)是受YOLO的启发而提出的。但是正如我们在这节所描述,ConvDet层的设计使得SqueezeDet与YOLO相比,能够在更少的模型参数下生成成千上万张 region proposals。
ConvDet层实际上是用来训练输出边界框坐标和分类概率的一个卷积层,它的工作原理类似一个滑动窗口, 在特征图上的每个空间位置移动,在每一个位置,它会计算K x (4+1+C) 个值来对边界框预测情况进行编码。此处,K是具有预先选定形状的引用边界框的数目。使用Girshick 提出的概念,我们称这些引用边界框为锚(anchor) ,特征图的每一个位置在原图上对应一个网格,所以每个anchor可由四个标量来描述
对于每一个anchor( i, j, k),我们计算四个相关的坐标
其中
正如前面的解释,对于每个anchor的其他C+1个输出实质是将置信评分和分类概率进行了编码。
图2 边界框转换,每一个网格中心都有已经确定形状的K个anchor,然后使用 ConvDet 层计算的相对坐标将每个锚点转换为新的位置和形状。每一个anchor与一个置信评分和分类概率联系。
ConvDet和Faster R-CNN中RPN的最后一层相似。主要的区别就是,RPN 被认为是一个很弱的检测器,它只能检测目标是否存在并且为这个对象生成边界框,分类就交给了全连接层(全连接层被视为是一种很强的分类器),但实际上,卷积层也是足够强大,可以同时检测、定位和分类对象。
为了简单起见,我们将YOLO的检测层视为FcDet(只计算最后两个全连接层),与 FcDet 相比, ConvDet 层具有数量较少的参数, 并且仍然能够生成更高空间分辨率的区域方案, ConvDet 和 FcDet的对比在图3中。
假定输入的特征图的尺寸是
FcDet 是由两个全连接层组成。假定
在YOLO中,其输入特征图的尺寸是
3.3 训练方法
和 Faster R-CNN不一样,Faster R-CNN需要部署一个(4-step)的交替训练策略(来训练RPN)和探测器网络,而我们的SqeezeDet检测网络和YOLO相似,可以实现端对端训练。
为了训练ConvDet层来学习检测、定位、分类,我们定义了一个多任务的损失函数:
这损失函数的第一部分是边界框回归函数,各变量的微分形式对应于位于网格中心
这个等式其实是第一个等式的反变换,各个变量表示的是对应于真实情况的边界框的坐标。在训练过程中, 我们将真实边界框与所有的锚点(anchor)进行比较, 并将它们分配给具有最大重叠 (IOU) 的anchor。原因是, 我们要选择 “最接近” 的anchor匹配的真实边界框, 这样的转换需要减少到最低。如果在位置
图3 和RPN相比,YOLO的ConvDet和Detection 层。Activations 表示为蓝色立方体,层 (及其参数) 表示为橙色的。Activations 和参数尺寸也被标注。
这个损失函数的第二部分是置信评分回归函数,
这个损失函数的最后一部分是分类的交叉熵函数(cross entropy),
公式2中的超参数都是经过实际赋值的,在我们的实验中,
3.4 神经网络结构设计
在这节之前,我们已经介绍了检测管道、ConvDet层、端对端的训练方法。这些方法都是通用的,并且和各种不同的CNN结构,包括 VGG16、ResNet等等。当选择核心的CNN结构的时候,我们的关注点主要在于模型的大小和能量利用效率,那么SqueezeNet是我们的首选。
Model size: SqueezeNet的建立基于Fire模块(由一个作为输入的squeeze层和两个并联作为输出的expand层构成),其中squeeze层是由1 x 1的卷积层构成,其作用是将具有大的通道数的输入张量压缩成同样batch和空间维度,但具有更少通道数的输出张量。而expand层是由1 x 1的卷积核与3 x 3的卷积核混合而成,他们将前面压缩的张量作为输入,重新恢复其中的丰富特征,并且输出一个具有更大通道数的 activation tensor ,squeeze层和expand层交替使用的方法在不损失较大准确度的情况下非常高效地降低了模型的参数量。
Energy efficiency: 在神经网络前向运行过程中,不同的操作对能耗的需求是不一样的。其中资源消耗最大的是DRAM的连接,它是SRAM能量消耗的100倍并且执行浮点运算,因此我们尽可能希望减少DRAM的连接。
减少DRAM连接的最简单的方法是使用小的模型,从而减少参数的存储。一个减少模型参数的高效的方法是尽可能使用卷积层而不是全连接层,卷积层的参数只需要访问一次, 并可在输入数据 (如果 batch>1) 的所有邻区重复使用。然而,全连接层只在“batch”的维度下才能重复使用参数,它的每个参数仅在输入数据的一个邻域中使用。除了模型大小之外,另一个很重要的方面是控制中间**层的大小。假定计算硬件的SRAM的大小是16MB,SqueezeNet模型的大小是5MB,如果任何两个连续层的**输出的总大小小于11MB,则所有内存访问都可以在 SRAM 中完成, 不需要 DRAM 访问。详细的能效讨论将在本文末尾的补充材料提供(不予翻译,可参考原文文末,望见谅)。
在这篇论文中,我们采用了两种版本的SqueezeNet结构。第一种结构是SqueezeNet v1.1模型,模型大小是4.72MB, 在ImageNet top-5上的准确度超过80.3%。第二个是一个更强大版本的SqueezeNet结构,它的挤压比是0.75,模型大小是19MB,在ImageNet top-5上的准确度为86%。在本论文中,我们把第一种结构称为SqueezeNet,第二种结构是SqueezeNet+。我们预先在ImageNet分类数据库中训练了这两种结构,并且把两个随机初始化权重的fire模块放在预先训练的模型的最上层,然后将它和ConvDet层连接。
由于本论文较长,中文翻译分为几个部分连载:
SqueezeDet:一种应用于自动驾驶实时目标检测中的标准、小型、低功耗的全卷积神经网络(一)
SqueezeDet:一种应用于自动驾驶实时目标检测中的标准、小型、低功耗的全卷积神经网络(三)
注:第一次写博客,且水平有限,有些地方翻译的很不到位,望谅解!
如有问题需要讨论,可发送问题到我的邮箱:[email protected]