【目标检测】|GhostNet

GhostNet
在这里插入图片描述
如果按照传统的思考方式,可能认为这些相似的特征图存在冗余,是多余信息,想办法避免产生这些高度相似的特征图。

本文推测CNN的强大特征提取能力和这些相似的特征图(Ghost对)正相关。提出并非所有特征图都要用卷积操作来得到,“幻影”特征图可以用更简单的线性操作来生成。

深度神经网络中的普通卷积层将分为两部分。第一部分涉及普通卷积,但是将严格控制它们的总数。给定第一部分的固有特征图,然后将一系列简单的线性运算应用于生成更多特征图。与普通卷积神经网络相比,在不更改输出特征图大小的情况下,该Ghost模块中所需的参数总数和计算复杂度均已降低。基于Ghost模块,作者建立了一种有效的神经体系结构,即GhostNet。

Ghost Module

传统卷积输出n层
在这里插入图片描述

step1:缩减输出通道为m的卷积

在这里插入图片描述
step2:然后将Y‘每一个通道的特征图,用 [公式]
操作来产生Ghost特征图
在这里插入图片描述
step3: 最后将第一步得到的本征特征图和第二步得到的Ghost特征图拼接(identity连接)得到最终结果OutPut。

(PS: 当然也可以认为(论文中的思路),第2步中线性操作中包含一个单位/恒等映射,即将本征特征图直接输出,则不需用第三部,例如:对于Y’(m通道)中的每一个特征图,对其进行s次映射,s次中包含一次恒等映射,其余s-1次为cheap operate来得到Ghost特征图。所以最终得到n = m · s通道的输出结果。理论上完全一致。)

对线性操作的理解:论文中表示,可以探索仿射变换和小波变换等其他低成本的线性运算来构建Ghost模块。但是,卷积是当前硬件已经很好支持的高效运算,它可以涵盖许多广泛使用的线性运算,例如平滑、模糊等。 此外,线性运算的滤波器的大小不一致将降低计算单元(例如CPU和GPU)的效率,所以论文中实验中让Ghost模块中的滤波器size取固定值,并利用Depthwise卷积实现,以构建高效的深度神经网络。

所以说,论文中使用的线性操作并不是常见的旋转、平移、仿射变换、小波变换等,而是用的Depthwise卷积。个人猜测可能是传统的线性操作效果没有Depthwise效果好,毕竟CNN可以自动调整filter的权值。那么Ghost Module和深度分离卷积就很类似了,不同之处在于先进行PointwiseConv,后进行DepthwiseConv,另外增加了DepthwiseConv的数量,包括一个恒定映射。

小结:很明显,相比于直接用常规卷积,Ghost Module的计算量大幅度降低。个人认为从另一个角度可以看做是对卷积得到的特征图做了增强/增广,和数据增广似乎有点相似。

class GhostModule(nn.Module):
    def __init__(self, inp, oup, kernel_size=1, ratio=2, dw_size=3, stride=1, relu=True):
        super(GhostModule, self).__init__()
        self.oup = oup
        init_channels = math.ceil(oup / ratio)
        new_channels = init_channels*(ratio-1)

        self.primary_conv = nn.Sequential(
            nn.Conv2d(inp, init_channels, kernel_size, stride, kernel_size//2, bias=False),
            nn.BatchNorm2d(init_channels),
            nn.ReLU(inplace=True) if relu else nn.Sequential(),
        )

        self.cheap_operation = nn.Sequential(
            nn.Conv2d(init_channels, new_channels, dw_size, 1, dw_size//2, groups=init_channels, bias=False),
            nn.BatchNorm2d(new_channels),
            nn.ReLU(inplace=True) if relu else nn.Sequential(),
        )

    def forward(self, x):
        x1 = self.primary_conv(x)
        x2 = self.cheap_operation(x1)
        out = torch.cat([x1,x2], dim=1)
        return out[:,:self.oup,:,:]


复杂度分析

首先,假设我们输入特征图的尺寸是hwc,输出特征图的尺寸是h’*w’n,卷积核大小为kk。

在cheap operation变换中,我们假设特征图的channel是m,m << n,变换的数量是s,最终得到的新的特征图的数量是n,那么我们可以得到等式:n=m∗s

由于Ghost的变换过程中最后存在一个恒等变换(Identity),所以实际有效的变换数量是s-1,所以上式可以得到如下公式:

m ∗ ( s − 1 ) = n / s ∗ ( s − 1 ) m * (s-1) = n/s * (s-1)
m∗(s−1)=n/s∗(s−1)
在这里插入图片描述

GhostNet结构

在这里插入图片描述

GhostNet:基于Ghost bottleneck,作者提出GhostNet,如表1所属。
在这里插入图片描述

class GhostBottleneck(nn.Module):
def init(self, inp, hidden_dim, oup, kernel_size, stride, use_se):
super(GhostBottleneck, self).init()
assert stride in [1, 2]

    self.conv = nn.Sequential(
        # pw
        GhostModule(inp, hidden_dim, kernel_size=1, relu=True),
        # dw
        depthwise_conv(hidden_dim, hidden_dim, kernel_size, stride, relu=False) if stride==2 else nn.Sequential(),
        # Squeeze-and-Excite
        SELayer(hidden_dim) if use_se else nn.Sequential(),
        # pw-linear
        GhostModule(hidden_dim, oup, kernel_size=1, relu=False),
    )

    if stride == 1 and inp == oup:
        self.shortcut = nn.Sequential()
    else:
        self.shortcut = nn.Sequential(
            depthwise_conv(inp, inp, 3, stride, relu=True),
            nn.Conv2d(inp, oup, 1, 1, 0, bias=False),
            nn.BatchNorm2d(oup),
        )

def forward(self, x):
    return self.conv(x) + self.shortcut(x)

作者遵循MobileNetV3的基本体系结构的优势,然后使用Ghost bottleneck替换MobileNetV3中的bottleneck。GhostNet主要由一堆Ghost bottleneck组成,其中Ghost bottleneck以Ghost模块为构建基础。第一层是具有16个卷积核的标准卷积层,然后是一系列Ghost bottleneck,通道逐渐增加。

这些Ghost bottleneck根据其输入特征图的大小分为不同的阶段。除了每个阶段的最后一个Ghost bottleneck是stride = 2,其他所有Ghost bottleneck都以stride = 1进行应用。

最后,利用全局平均池和卷积层将特征图转换为1280维特征向量以进行最终分类。

SE模块也用在了某些Ghost bottleneck中的残留层,如表1中所示。
与MobileNetV3相比,这里用ReLU换掉了Hard-swish激活函数。尽管进一步的超参数调整或基于自动架构搜索的Ghost模块将进一步提高性能,但表1所提供的架构提供了一个基本设计参考。

实验

硬件推理速度:由于提出的GhostNet是为移动设备设计的,因此作者使用TFLite工具在基于ARM的手机华为P30Pro上进一步测量GhostNet和其他模型的实际推理速度。遵循MobileNet中的常用设置,作者使用Batch size为1的单线程模式。从图6的结果中,我们可以看到与具有相同延迟的MobileNetV3相比,GhostNet大约提高了0.5%的top-1的准确性,另一方面GhostNet需要更少的运行时间来达到相同的精度。例如,精度为75.0%的GhostNet仅具有40毫秒的延迟,而精度类似的MobileNetV3大约需要46毫秒来处理一张图像。总体而言,作者的模型总体上胜过其他最新模型,例如谷歌MobileNet系列,ProxylessNAS,FBNet和MnasNet。
ref
作者:https://zhuanlan.zhihu.com/p/109325275
https://blog.csdn.net/u011995719/article/details/105207344

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值