前言 本文介绍了MIRNetV2,它的中心模块为MRB,它是一种多标准特征提取、聚合模块。在多标准方面,它经过下采样办法构建了三个标准的特征;在特征聚合方面,它采用了SKNet一文的特征交融机制;在特征提取方面,它采用了一种全新的RCB模块。MIRNetV2的各方面功能都比MIRNetV1强!

本文转载自AIWalker

作者 | Happy

欢迎关注大众号CV技能攻略,专心于计算机视觉的技能总结、最新技能盯梢、经典论文解读、CV招聘信息。

CV各大方向专栏与各个布置结构最全教程收拾

计算机视觉入门1v3辅导班

MIRNetV2 更快、更强、更轻量!

在正式介绍MIRNetV2之前,我们先来看一下它与MIRNetV1的功能对比,见下表。真可谓,MIRNetV2把MIRNetV1放在地上使劲的“摩擦”!关于MIRNet的介绍,可拜见:zhuanlan.zhihu.com/p/261580767 。

MIRNetV2 更快、更强、更轻量!

1Method

MIRNetV2 更快、更强、更轻量!

上图为MIRNetV2的网络架构示意图,它是在MIRNet的基础上演变而来(MIRNet的整体架构形态与RCAN非常类似,差异在于其中心Block)。

SKFF

MIRNetV2 更快、更强、更轻量!

上图为MRB中用于特征聚合的SKFF模块结构示意图,关于该模块的介绍现已非常多了,也在不同结构设计中得到了广泛使用,该模块关于多标准特征交融有非常优异的作用,一起具有数据自适应性。关于SKFF直接看如下code能够看了,注:SKFF的输入为[feat1, feat2]。

class SKFF(nn.Module):
    def __init__(self, in_channels, height=3,reduction=8,bias=False):
        super(SKFF, self).__init__()
        self.height = height
        d = max(int(in_channels/reduction),4)
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.conv_du = nn.Sequential(nn.Conv2d(in_channels, d, 1, padding=0, bias=bias), nn.LeakyReLU(0.2))
        self.fcs = nn.ModuleList([])
        for i in range(self.height):
            self.fcs.append(nn.Conv2d(d, in_channels, kernel_size=1, stride=1,bias=bias))
        self.softmax = nn.Softmax(dim=1)
    def forward(self, inp_feats):
        batch_size = inp_feats[0].shape[0]
        n_feats =  inp_feats[0].shape[1]
        inp_feats = torch.cat(inp_feats, dim=1)
        inp_feats = inp_feats.view(batch_size, self.height, n_feats, inp_feats.shape[2], inp_feats.shape[3])
        feats_U = torch.sum(inp_feats, dim=1)
        feats_S = self.avg_pool(feats_U)
        feats_Z = self.conv_du(feats_S)
        attention_vectors = [fc(feats_Z) for fc in self.fcs]
        attention_vectors = torch.cat(attention_vectors, dim=1)
        attention_vectors = attention_vectors.view(batch_size, self.height, n_feats, 1, 1)
        # stx()
        attention_vectors = self.softmax(attention_vectors)
        feats_V = torch.sum(inp_feats*attention_vectors, dim=1)
        return feats_V 

RCB

MIRNetV2 更快、更强、更轻量!

上图为MRB的中心模块RCB结构示意图,它是在ResBlock基础上演变而来。常规ResBlock的残差分支只包括两个卷积一个非线性激活;而RCB将ResBlock中卷积的groups参数设为,然后引进通道相关性建模(即上图中的Modeling)信息,将该信息进行改换后输入特征相交融。关于RCB,看一下下面Modeling的实现就差不多了。

class ContextBlock(nn.Module):
    def __init__(self, n_feat, bias=False):
        super(ContextBlock, self).__init__()
        self.conv_mask = nn.Conv2d(n_feat, 1, kernel_size=1, bias=bias)
        self.softmax = nn.Softmax(dim=2)
        self.channel_add_conv = nn.Sequential(
            nn.Conv2d(n_feat, n_feat, kernel_size=1, bias=bias),
            nn.LeakyReLU(0.2),
            nn.Conv2d(n_feat, n_feat, kernel_size=1, bias=bias)
        )
    def modeling(self, x):
        batch, channel, height, width = x.size()
        input_x = x
        # [N, C, H * W]
        input_x = input_x.view(batch, channel, height * width)
        # [N, 1, C, H * W]
        input_x = input_x.unsqueeze(1)
        # [N, 1, H, W]
        context_mask = self.conv_mask(x)
        # [N, 1, H * W]
        context_mask = context_mask.view(batch, 1, height * width)
        # [N, 1, H * W]
        context_mask = self.softmax(context_mask)
        # [N, 1, H * W, 1]
        context_mask = context_mask.unsqueeze(3)
        # [N, 1, C, 1]
        context = torch.matmul(input_x, context_mask)
        # [N, C, 1, 1]
        context = context.view(batch, channel, 1, 1)
        return context
    def forward(self, x):
        # [N, C, 1, 1]
        context = self.modeling(x)
        # [N, C, 1, 1]
        channel_add_term = self.channel_add_conv(context)
        x = x + channel_add_term
        return x

Training Regime

在练习方面,图画复原算法根本都采用随机裁剪的图画块进行模型练习。关于较大的图画块,CNN能够捕获更细粒度的细节并能够取得更优的功能,但会导致更长的练习时长;关于较小的图画块,尽管练习速度快,但会导致模型功能下降。

为达到练习效率与功能均衡,本文提出一种渐进式学习方案:网络先在小图画块上进行练习,在练习过程中阶段性的将图画块的标准调大。这种混合标准学习机制不仅能够加快练习,一起能够提高模型功能,可参照下表。

MIRNetV2 更快、更强、更轻量!

2Experiments

MIRNetV2 更快、更强、更轻量!

MIRNetV2 更快、更强、更轻量!

MIRNetV2 更快、更强、更轻量!

MIRNetV2 更快、更强、更轻量!

MIRNetV2 更快、更强、更轻量!

MIRNetV2 更快、更强、更轻量!

MIRNetV2 更快、更强、更轻量!

3MIRNetV1 vs MIRNetV2

MIRNetV2 更快、更强、更轻量!

关于没有看过MIRNetV1的同学来说,直接看MIRNetV2的话,可能不知道MIRNetV2的改善点在哪里。在这里,我们对两者的差异进行简略的汇总(可参阅上图),主要体现在两个方面:

  • 模块方面:模块方面的差异能够参阅上图。这里又有两个差异:(1) MRB的中心方面方面,MIRNet在ResBlock基础上引进了对偶注意力单元,MIRNetV2则引进了前面所说到的RCB单元;(2) 特征聚合方面,MIRNet关于每个标准的特征都与其他两个标准的特征进行一次交融,而MIRNetV2则只进行了低分辨率特征向高分辨率特征的交融。事实上,在实现上,两者所使用的上采样和下采样也存在一些差异,MIRNetV1的实现更“臃肿”(多标准),MIRNetV2的实现则更“简略”(插值+卷积)。

  • 练习机制:MIRNetV1采用的是最根本的固定块标准办法进行练习,而MIRNetV2则采用了渐进式(随同练习周期提高图画块标准)机制进行练习。

欢迎关注大众号CV技能攻略,专心于计算机视觉的技能总结、最新技能盯梢、经典论文解读、CV招聘信息。

计算机视觉入门1v3辅导班

【技能文档】《从零建立pytorch模型教程》122页PDF下载

QQ沟通群:444129970。群内有大佬负责解答我们的日常学习、科研、代码问题。

其它文章

AI布置与算法/自动驾驶/深度学习资料汇总!

点云模型专栏(一)概述、特性、存储格式、数据集

AAAI 2023 | 一种通用的粗-细视觉Transformer加快方案

计算机视觉各个方向沟通群与常识星球

【免费送书活动】 全新轻量化模型 | 轻量化沙漏网络助力视觉感知涨点

方针盯梢专栏(一)根本任务、常用办法

CV各大方向专栏与各个布置结构最全教程收拾

一文尽览 | 自动驾驶中光流的使用、挑战和改善

方针检测、实例切割、旋转框样样精通!详解高功能检测算法 RTMDet

CV算法工程师卷得要死,布置工程师却成为了香饽饽

大卷积模型 + 大数据集 + 有监督练习!探寻ViT的前身:Big Transfer (BiT)

高效轻量级语义切割综述

超快语义切割 | PP-LiteSeg集速度快、精度高、易布置等优点于一身,必会模型!!!

数据集+插件,一把子处理遮挡下方针检测难题

AAAI | Panini-Net | 根据GAN先验的退化感知特征插值人脸修

一文带你掌握轻量化模型设计原则和练习技巧!

图画增强新思路:DeepLPF

LCCL网络:彼此辅导博弈来提高方针检测精度(附源代码)

与SENet互补提高,华为诺亚提出自注意力新机制:Weight Excitation

最新FPN | CFPNet即插即用,助力检测涨点,YOLOX/YOLOv5均有效

DeepLSD:根据深度图画梯度的线段检测和细化

CVPR 2023 | 基础模型推动语义切割的弱增量学习

消费级显卡的春天,GTX 3090 YOLOv5s单卡完好练习COCO数据集缩短11.35个小时

BOE告诉你:一层卷积能够做超分!

卫星图画公开数据集资源汇总

DiffusionDet:用于目标检测的扩散模型

CV小常识讨论与分析(7) 寻找论文立异点的新办法

CV小常识分析与讨论(6)论文立异的一点误区

计算机视觉入门1v3辅导班

计算机视觉沟通群

聊聊计算机视觉入门