Now you see me

Chao's Blog

Tag: Image segmentation

MobileNetV3是该系列的最新版本,该架构在一定程度上是通过自动网络架构搜索(NAS)找到的。 使用MnasNet-A1作为起点,但使用NetAdapt对其进行优化,NetAdapt是一种算法,可自动简化预训练模型,直到达到给定的延迟,同时保持较高的准确性。 除此以外,作者还手工进行了许多改进。 一、V3的改进 本质上,MobileNet版本3是对MnasNet的手工改进。 主要变化是: (1)重新设计了耗时的层; (2)使用h-wish而不是ReLU6; (3)扩展层使用的滤波器数量不同(使用NetAdapt算法获得最佳数量) (4)瓶颈层输出的通道数量不同(使用NetAdapt算法获得最佳数量) (5)Squeeze-and-excitation模块(SE)将通道数仅缩减了3或4倍 (6)对于SE模块,不再使用sigmoid,而是采用ReLU6(x + 3) / 6作为近似(就像h-swish那样) 针对第1点,MobileNet v1和v2都从具有32个滤波器的常规3×3卷积层开始,然而实验表明,这是一个相对耗时的层,只要16个滤波器就足够完成对224 x 224特征图的滤波。虽然这样并没有节省很多参数,但确实可以提高速度。 对于第2点,之前V1和V2都是用ReLU6作为激活层,但是在V3中,作者使用了hard swish(h-swish): \text{h-swish}(x)=x\times \text{ReLU6}(x+3)/6 常规的swish使用的是x\times \text{sigmoid}(x),它可以显著提高神经网络的精度,但是sigmoid的计算实在是太耗时了,所以在这里作者使用了ReLU6作为替代。作者认为几乎所有的软件和硬件框架上都可以使用ReLU6的优化实现。其次,它能在特定模式下消除了由于近似sigmoid的不同实现而带来的潜在数值精度损失。图1即为sigmoid和wish以及对应的hard版本,hard形式其实就是soft形式的低精度化。 图1(源自Ref [1]) 需要注意的是,MobileNet是来自于Google的,自然它更关注的是网络在Android设备上的表现,事实也的确如此,作者主要针对Google Pixel硬件对网络做了参数优化。 当然这并不意味着MobileNet V3就是慢的了,只不过它无法在iOS上达到最佳效果。 不过,并非整个模型都使用了h-swish,模型的前一半层使用常规ReLU(第一个conv层之后的除外)。 为什么要这样做呢? 因为作者发现,h-swish仅在更深层次上有用。 此外,考虑到特征图在较浅的层中往往更大,因此计算其激活成本更高,所以作者选择在这些层上简单地使用ReLU(而非ReLU6),因为它比h-swish省时。 对于第6点,具体解释一下如何完成ReLU6(x + 3) / 6的。如图2所示,在Mul层中,做了乘以0.16667的乘法,这就相当于除以6;ReLU6则融合在了卷积层之中;另外,对于x+3,这里的3被加在了卷积层的偏置层中了。这样做也是一种小的优化方式。 图2(源自Ref [2]) 除了以上提到的,相对于V2,在V3中作者还对最后的层进行了优化。 在MobileNetV2中,在全局平均池化层之前,是一个1 × 1卷积,将通道数从320扩展到1280,因此我们就能得到更高维度的特征,供分类器层使用。 这样做的好处是,在预测时有更多更丰富的特征来满足预测,但是同时也引入了额外的计算成本与延时。 所以,需要改进的地方就是要保留高维特征的前提下减小延时。 在MobileNetV3中,这个1 x 1卷积层位于全局平均池化层的后面,因此它可用于更小的特征图,因此速度更快。如图3所示, 这样使我们就能够删除前面的bottleneck层和depthwise convolution层,而不会降低准确性。 图3(源自Ref […]

一、V2与V1的架构区别 和MobielNetV1相比,MobileNet V2 仍使用深度可分离卷积,但其主要构成模块如下图1所示: 图1(源自Ref [2]) 这次block中有三个卷积层,作者分别将其称之为1 x 1 expansion layer、3 x 3 depthwise convolution和1 x 1 projection layer。后两层其实就是V1中的depthwise convolution和1×1 pointwise convolution layer,只不过在V2中,作者后者称为1 x 1 projection layer,并有不同的作用。下面就来看看,两者的差异究竟在哪里。 在V1中,逐点卷积要么使通道数保持不变,要么使通道数翻倍。 在V2中,情况恰恰相反:它使通道数变小。 这就是为什么现在将该层称为投影层( Projection Layer)的原因:它将具有大量维(通道)的数据投影到具有较少维数的张量中。 例如,depthwise convolution可以在具有144个通道的张量上工作,然后projection layer张量缩小至24个通道。这种层也称为bottleneck layer,因为它减少了流经网络的数据量。(这就体现了“bottleneck residual block”名称的一部分:每个块的输出都是瓶颈。) 此外,bottleneck residual block的第一层是新出现的,也就是expansion layer。 它也是1×1卷积, 其目的是在数据进入深度卷积之前扩展数据中的通道数。 因此,expansion layer始终具有比输入通道更多的输出通道(与projection layer相反)。 Expansion layer将通道数扩展多少倍,这个由扩展因子(expansion factor)给出。 这也是调整不同架构的超参数之一, 默认扩展因子为6。 例如图2所示,如果有一个具有24个通道的张量进入一个bottleneck residual block,则expansion […]

在本文中,主要介绍了MobileNetV1,其中使用的深度可分离卷积能够减小模型尺寸和复杂度,这对于移动端和嵌入式的视觉应用十分有效。作者提出了两个全局超参数(宽度乘子和分辨率乘子),用于取得效率和准确率之间的平衡。MobileNetV1的核心就是更小、更高效。 一、深度可分离卷积 深度可分离卷积之所以如此命名,是因为它不仅涉及空间维度,而且涉及深度维度(通道数)。深度可分离卷积将一个内核拆分为两个独立的内核,这些内核执行两个卷积:逐深度卷积(depthwise convolution)和逐点卷积(pointwise convolution)。 但首先,让我们看看普通卷积的工作原理。 1.1 普通卷积 一般来说,典型的图像不一定是2D图像, 它可能具有深度、宽度和高度。 我们假设有一张12 x 12 x 3像素的输入图像。我们在图像上进行5 x 5的卷积,不使用填充,步幅为1。如果仅考虑图像的宽度和高度,则卷积过程类似于:12 x 12\to5 x 5\to 8 x 8。 在5×5内核中,每25个像素进行标量乘法,每次给出1个数字。 由于没有填充(12 – 5 + 1 = 8),因此最终得到8×8像素的图像。 但是,由于图像具有3个通道,因此我们的卷积内核也需要具有3个通道。 这意味着,每次内核移动时,我们实际上都执行5 x 5 x 3 = 75乘法,而不是执行5 x 5 = 25乘法。 如图1所示,我们以每25个像素执行标量矩阵乘法,输出1个数字。 经过5 x 5 x 3内核后,12 x 12 x 3图像将变为8 x […]

一、介绍 VGG-nets、ResNet和Inception Networks在特征提取领域已经取得了极大的成就,但他们仍然面对一系列的难题。例如,这些模型可能适用于某些数据集,但是由于它们使用了太多的超参数和计算过程,我们就很难将其直接移植到新的数据集上。 为了克服这些问题,业界已经考虑了结合VGG/ResNet(ResNet是从VGG演变而来的)和Inception Networks的优势。 简而言之,就是将ResNet的重复策略(repetition strategy)与Inception Network的拆分-转换-合并策略(split-transform-merge strategy)相结合。 换句话说,网络模块将输入分割,将其转换为所需的格式,然后合并以获取输出,每个模块都遵循相同的拓扑(如图1右侧)。 ResNeXt出现于Aggregated Residual Transformations for Deep Neural Networks,它是一种具有均一性的神经网络,相对于传统的ResNet,ResNeXt减小了超参数的数量。ResNeXt,其中包含了Next,这就意味一个额外的维度。作者在宽度(width)和深度(depth)以外,还提出了一个称为cardinality的参数。 图1左侧是传统的ResNet block;右侧是ResNeXt block,其cardinality是32,可以看出该参数其实就是内部路径数。 图1 ResNeXt block遵循 split-transform-aggregate策略。 ResNeXt block内部路径的数量就是cardinality,在图1中C=32。 ResNeXt block的所有路径具有相同的拓扑结构。 作者没有使用深度和宽度,而是采用了cardinality,较高的数值能够减小验证误差。 和ResNet相比,ResNeXt block使用了更多的子空间(也就是C>1)。 两个架构具有不同的宽度(即通道数)。ResNet的Layer-1的1个卷积层通道数为64,ResNeXt的Layer-1有32个不同卷积层,通道数均为4(一共是32$\times$4个通道数)。虽然ResNeXt block的通道数更多,但两个架构的参数量是一样的(约70k)。 ResNet: $256\times64+3\times3\times64\times64+64\times26$ ResNeXt: $C\times(256 \times d+3\times3 \times d \times d+d \times 256$, with$ C=32$ and $d=4$ 二、合并转换策略 2.1 回顾一下简单的神经元 图2 如图2所示,一个简单神经元的输出是$w{i} x{i}$的总和。上述的操作就可以定义为 […]

一、初识HarDNet 在一部分,我首先简单展示一下HarDNet的效果, 它使用了经过ImageNet预训练的权重。在这里采用的是PyTorch框架,在Google Colab上测试运行。 1.1 介绍HarDNet HarDNet指的是Harmonic DenseNet: A low memory traffic network,其突出的特点就是低内存占用率。过去几年,随着更强的计算能力和更大的数据集,我们能够训练更加复杂的网络。对于实时应用,我们面临的问题是如何在提高计算效率的同时,降低功耗。在这种情况下,作者们提出了HarDNet在两者之间寻求最佳平衡。 1.2 HarDNet的架构 HarDNet可以用于图像分割和目标检测,其架构是基于Densely Connected Network。在HarDNet中,作者提出了Harmonic Dense Bocks的概念。如图1所示,可以看到该网络就像多个谐波。HarDNet的全称就是Harmonic Densely Connected Network。 图1. Illustrations for HarDNet 1.3 HarDNet的可能应用 我们有许多图像分类算法,但是与其他分类算法相比,HarDNet可以降低功耗并达到类似的精度。 在目标检测中,SSD使用HarDNet-68作为最先进的骨干网络;在图像分割中,可以使用HarDNet对图像进行下采样。 二、再看HarDNet 2.1 背景 在神经网络的推理阶段,如何增加计算效率,并减小功耗,这是一个关键问题。 过去是怎么做的呢?首先就是减小模型的尺寸(模型的参数量和权重),这就意味着更小的MACs(number of multiply-accumulate operations or floating point operations)和更少的动态随机访问存储器(DRAM),这些主要用来读写模型参数和特征图。主要的工作有:Residual Networks 、SqueezeNets、Densely Connected Networks等。也可以通过pruning和quantization来减小模型尺寸和功耗。 对于语义分割任务,中间特征图的总尺寸是模型尺寸的几百倍,这样就会使DRAM过度存取特征图,导致推理速度变慢。 目前减小特征图尺寸的方法基本都是有损的(比如,subsampling),这样会使准确率下降。本文作者设计了一种CNN结构,减小了特征图的DRAM存取量,同时不损害准确率。 2.2 评价指标 Nvidia profiler:DRAM读/写的字节数。 ARM Scale […]