From 7b6c148065ba602dccf3e75a484f83e0097dcd30 Mon Sep 17 00:00:00 2001 From: chenqiang13 Date: Fri, 8 Apr 2022 15:35:41 +0800 Subject: [PATCH 1/8] code release for mixformer --- docs/en/models/MixFormer_en.md | 26 + docs/en/models/index.rst | 1 + docs/zh_CN/models/MixFormer.md | 26 + docs/zh_CN/models/index.rst | 1 + ppcls/arch/backbone/__init__.py | 1 + ppcls/arch/backbone/model_zoo/mixformer.py | 890 ++++++++++++++++++ .../ImageNet/MixFormer/mixformer_b0.yaml | 159 ++++ .../ImageNet/MixFormer/mixformer_b1.yaml | 159 ++++ .../ImageNet/MixFormer/mixformer_b2.yaml | 159 ++++ .../ImageNet/MixFormer/mixformer_b3.yaml | 159 ++++ .../ImageNet/MixFormer/mixformer_b4.yaml | 159 ++++ .../ImageNet/MixFormer/mixformer_b5.yaml | 159 ++++ .../ImageNet/MixFormer/mixformer_b6.yaml | 159 ++++ 13 files changed, 2058 insertions(+) create mode 100644 docs/en/models/MixFormer_en.md create mode 100644 docs/zh_CN/models/MixFormer.md create mode 100644 ppcls/arch/backbone/model_zoo/mixformer.py create mode 100644 ppcls/configs/ImageNet/MixFormer/mixformer_b0.yaml create mode 100644 ppcls/configs/ImageNet/MixFormer/mixformer_b1.yaml create mode 100644 ppcls/configs/ImageNet/MixFormer/mixformer_b2.yaml create mode 100644 ppcls/configs/ImageNet/MixFormer/mixformer_b3.yaml create mode 100644 ppcls/configs/ImageNet/MixFormer/mixformer_b4.yaml create mode 100644 ppcls/configs/ImageNet/MixFormer/mixformer_b5.yaml create mode 100644 ppcls/configs/ImageNet/MixFormer/mixformer_b6.yaml diff --git a/docs/en/models/MixFormer_en.md b/docs/en/models/MixFormer_en.md new file mode 100644 index 0000000000..308e3da7eb --- /dev/null +++ b/docs/en/models/MixFormer_en.md @@ -0,0 +1,26 @@ +# MixFormer: Mixing Features across Windows and Dimensions +--- +## Catalogue + +* [1. Overview](#1) +* [2. Accuracy, FLOPs and Parameters](#2) + + +## 1. Overview + +MixFormer is an efficient and general-purpose hybrid vision transformer. There are two main designs in MixFormer: (1) combining local-window self-attention and depth-wise convolution in a parallel design, (2) proposing bi-directional interactions across branches to provide complementary clues in channel and spatial dimensions. [paper](https://arxiv.org/abs/2204.02557). + + +## 2. Accuracy, FLOPs and Parameters + +| Models | Top1 | Top5 | Reference
top1| FLOPs
(G) | +|:--:|:--:|:--:|:--:|:--:| +| MixFormer-B0 | - | - | 0.765 | 0.4 | +| MixFormer-B1 | - | - | 0.789 | 0.7 | +| MixFormer-B2 | - | - | 0.800 | 0.9 | +| MixFormer-B3 | - | - | 0.817 | 1.9 | +| MixFormer-B4 | - | - | 0.830 | 3.6 | +| MixFormer-B5 | - | - | 0.835 | 6.8 | +| MixFormer-B6 | - | - | 0.838 | 12.7 | + +The models are coming soon. diff --git a/docs/en/models/index.rst b/docs/en/models/index.rst index 4642eb1de4..2f2677bd00 100644 --- a/docs/en/models/index.rst +++ b/docs/en/models/index.rst @@ -28,3 +28,4 @@ models MixNet_en.md Twins_en.md PVTV2_en.md + MixFormer_en.md diff --git a/docs/zh_CN/models/MixFormer.md b/docs/zh_CN/models/MixFormer.md new file mode 100644 index 0000000000..aa295422c5 --- /dev/null +++ b/docs/zh_CN/models/MixFormer.md @@ -0,0 +1,26 @@ +# MixFormer: Mixing Features across Windows and Dimensions +--- +## 目录 + +* [1. 概述](#1) +* [2. 精度、FLOPS 和参数量](#2) + + +## 1. 概述 + +MixFormer是一个高效、通用的骨干网路(Vision Transformer)。在MixFormer中,主要有两个创新的设计:(1)通过平行分支的设计,将局部窗口自注意力(local-window self-attention)与Depthwise卷积进行组合,解决局部窗口自注意力的感受野受限的问题,(2)在平行分支之间提出双向交互模块,使得两个分支可以在channel和spatial两个维度都能实现信息互补,增强整体的建模能力。 [paper](https://arxiv.org/abs/2204.02557). + + +## 2. 精度、FLOPS 和参数量 + +| Models | Top1 | Top5 | Reference
top1| FLOPs
(G) | +|:--:|:--:|:--:|:--:|:--:| +| MixFormer-B0 | - | - | 0.765 | 0.4 | +| MixFormer-B1 | - | - | 0.789 | 0.7 | +| MixFormer-B2 | - | - | 0.800 | 0.9 | +| MixFormer-B3 | - | - | 0.817 | 1.9 | +| MixFormer-B4 | - | - | 0.830 | 3.6 | +| MixFormer-B5 | - | - | 0.835 | 6.8 | +| MixFormer-B6 | - | - | 0.838 | 12.7 | + +模型后续将提供下载。 diff --git a/docs/zh_CN/models/index.rst b/docs/zh_CN/models/index.rst index 7873e3a5ae..e521922990 100644 --- a/docs/zh_CN/models/index.rst +++ b/docs/zh_CN/models/index.rst @@ -27,3 +27,4 @@ Mobile.md MixNet.md Twins.md + MixFormer.md diff --git a/ppcls/arch/backbone/__init__.py b/ppcls/arch/backbone/__init__.py index 737f34d759..812e94f1f4 100644 --- a/ppcls/arch/backbone/__init__.py +++ b/ppcls/arch/backbone/__init__.py @@ -63,6 +63,7 @@ from ppcls.arch.backbone.model_zoo.cspnet import CSPDarkNet53 from ppcls.arch.backbone.model_zoo.pvt_v2 import PVT_V2_B0, PVT_V2_B1, PVT_V2_B2_Linear, PVT_V2_B2, PVT_V2_B3, PVT_V2_B4, PVT_V2_B5 from ppcls.arch.backbone.model_zoo.mobilevit import MobileViT_XXS, MobileViT_XS, MobileViT_S +from ppcls.arch.backbone.model_zoo.mixformer import MixFormer_B0, MixFormer_B1, MixFormer_B2, MixFormer_B3, MixFormer_B4, MixFormer_B5, MixFormer_B6 from ppcls.arch.backbone.model_zoo.repvgg import RepVGG_A0, RepVGG_A1, RepVGG_A2, RepVGG_B0, RepVGG_B1, RepVGG_B2, RepVGG_B1g2, RepVGG_B1g4, RepVGG_B2g4, RepVGG_B3g4 from ppcls.arch.backbone.variant_models.resnet_variant import ResNet50_last_stage_stride1 from ppcls.arch.backbone.variant_models.vgg_variant import VGG19Sigmoid diff --git a/ppcls/arch/backbone/model_zoo/mixformer.py b/ppcls/arch/backbone/model_zoo/mixformer.py new file mode 100644 index 0000000000..ee01032196 --- /dev/null +++ b/ppcls/arch/backbone/model_zoo/mixformer.py @@ -0,0 +1,890 @@ +# copyright (c) 2022 PaddlePaddle Authors. All Rights Reserve. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import numpy as np +import paddle +import paddle.nn as nn +import paddle.nn.functional as F + +from .vision_transformer import ( + trunc_normal_, zeros_, ones_, to_2tuple, DropPath, Identity) +from .swin_transformer import Mlp, window_partition, window_reverse + +from ppcls.utils.save_load import ( + load_dygraph_pretrain, load_dygraph_pretrain_from_url) + +# TODO: update the urls of the pre-trained models +MODEL_URLS = { + "mixformer-B0": "", + "mixformer-B1": "", + "mixformer-B2": "", + "mixformer-B3": "", + "mixformer-B4": "", + "mixformer-B5": "", + "mixformer-B6": "", +} + +__all__ = list(MODEL_URLS.keys()) + + +def window_partition2(x, window_size): + """ Split the feature map to windows. + B, C, H, W --> B * H // win * W // win x win*win x C + + Args: + x: (B, C, H, W) + window_size (tuple[int]): window size + + Returns: + windows: (num_windows*B, window_size * window_size, C) + """ + B, C, H, W = x.shape + x = x.reshape([B, C, H // window_size[0], window_size[0], + W // window_size[1], window_size[1]]) + windows = x.transpose([0, 2, 4, 3, 5, 1]).reshape( + [-1, window_size[0] * window_size[1], C]) + return windows + + +def window_reverse2(windows, window_size, H, W, C): + """ Windows reverse to feature map. + B * H // win * W // win x win*win x C --> B, C, H, W + + Args: + windows: (num_windows*B, window_size, window_size, C) + window_size (tuple[int]): Window size + H (int): Height of image + W (int): Width of image + + Returns: + x: (B, C, H, W) + """ + x = windows.reshape([-1, H // window_size[0], W // window_size[1], + window_size[0], window_size[1], C]) + x = x.transpose([0, 5, 1, 3, 2, 4]).reshape([-1, C, H, W]) + return x + + +class MixingAttention(nn.Layer): + r""" Mixing Attention Module. + Modified from Window based multi-head self attention (W-MSA) module + with relative position bias. + + Args: + dim (int): Number of input channels. + window_size (tuple[int]): The height and width of the window. + dwconv_kernel_size (int): The kernel size for dw-conv + num_heads (int): Number of attention heads. + qkv_bias (bool, optional): If True, add a learnable bias to + query, key, value. Default: True + qk_scale (float | None, optional): Override default qk scale + of head_dim ** -0.5 if set + attn_drop (float, optional): Dropout ratio of attention weight. + Default: 0.0 + proj_drop (float, optional): Dropout ratio of output. Default: 0.0 + """ + def __init__(self, + dim, + window_size, + dwconv_kernel_size, + num_heads, + qkv_bias=True, + qk_scale=None, + attn_drop=0., + proj_drop=0.): + super().__init__() + self.dim = dim + attn_dim = dim // 2 + self.window_size = window_size # Wh, Ww + self.dwconv_kernel_size = dwconv_kernel_size + self.num_heads = num_heads + head_dim = attn_dim // num_heads + self.scale = qk_scale or head_dim ** -0.5 + + # define a parameter table of relative position bias + self.relative_position_bias_table = self.create_parameter( + shape=((2 * window_size[0] - 1) * (2 * window_size[1] - 1), + num_heads), + default_initializer=zeros_) + self.add_parameter("relative_position_bias_table", + self.relative_position_bias_table) + + # get pair-wise relative position index for each token + # inside the window + relative_coords = self._get_rel_pos() + self.relative_position_index = relative_coords.sum(-1) # Wh*Ww, Wh*Ww + self.register_buffer("relative_position_index", + self.relative_position_index) + # prev proj layer + self.proj_attn = nn.Linear(dim, dim // 2) + self.proj_attn_norm = nn.LayerNorm(dim // 2) + self.proj_cnn = nn.Linear(dim, dim) + self.proj_cnn_norm = nn.LayerNorm(dim) + + # conv branch + self.dwconv3x3 = nn.Sequential( + nn.Conv2D( + dim, dim, + kernel_size=self.dwconv_kernel_size, + padding=self.dwconv_kernel_size // 2, + groups=dim + ), + nn.BatchNorm(dim), + nn.GELU() + ) + self.channel_interaction = nn.Sequential( + nn.Conv2D(dim, dim // 8, kernel_size=1), + nn.BatchNorm(dim // 8), + nn.GELU(), + nn.Conv2D(dim // 8, dim // 2, kernel_size=1), + ) + self.projection = nn.Conv2D(dim, dim // 2, kernel_size=1) + self.conv_norm = nn.BatchNorm(dim // 2) + + # window-attention branch + self.qkv = nn.Linear(dim // 2, dim // 2 * 3, bias_attr=qkv_bias) + self.attn_drop = nn.Dropout(attn_drop) + self.spatial_interaction = nn.Sequential( + nn.Conv2D(dim // 2, dim // 16, kernel_size=1), + nn.BatchNorm(dim // 16), + nn.GELU(), + nn.Conv2D(dim // 16, 1, kernel_size=1) + ) + self.attn_norm = nn.LayerNorm(dim // 2) + + # final projection + self.proj = nn.Linear(dim, dim) + self.proj_drop = nn.Dropout(proj_drop) + + trunc_normal_(self.relative_position_bias_table) + self.softmax = nn.Softmax(axis=-1) + + def _get_rel_pos(self): + """ Get pair-wise relative position index for each token inside the window. + + Args: + window_size (tuple[int]): window size + """ + coords_h = paddle.arange(self.window_size[0]) + coords_w = paddle.arange(self.window_size[1]) + # 2, Wh, Ww + coords = paddle.stack(paddle.meshgrid([coords_h, coords_w])) + coords_flatten = paddle.flatten(coords, 1) # 2, Wh*Ww + coords_flatten_1 = coords_flatten.unsqueeze(axis=2) + coords_flatten_2 = coords_flatten.unsqueeze(axis=1) + relative_coords = coords_flatten_1 - coords_flatten_2 + relative_coords = relative_coords.transpose( + [1, 2, 0]) # Wh*Ww, Wh*Ww, 2 + relative_coords[:, :, 0] += self.window_size[ + 0] - 1 # shift to start from 0 + relative_coords[:, :, 1] += self.window_size[1] - 1 + relative_coords[:, :, 0] *= 2 * self.window_size[1] - 1 + return relative_coords + + def forward(self, x, H, W, mask=None): + """ + Args: + x: input features with shape of (num_windows*B, N, C) + H: the height of the feature map + W: the width of the feature map + mask: (0/-inf) mask with shape of (num_windows, Wh*Ww, Wh*Ww) + or None + """ + # B * H // win * W // win x win*win x C + x_atten = self.proj_attn_norm(self.proj_attn(x)) + x_cnn = self.proj_cnn_norm(self.proj_cnn(x)) + # B * H // win * W // win x win*win x C --> B, C, H, W + x_cnn = window_reverse2(x_cnn, self.window_size, H, W, x_cnn.shape[-1]) + + # conv branch + x_cnn = self.dwconv3x3(x_cnn) + channel_interaction = self.channel_interaction( + F.adaptive_avg_pool2d(x_cnn, output_size=1)) + x_cnn = self.projection(x_cnn) + + # attention branch + B_, N, C = x_atten.shape + qkv = self.qkv(x_atten).reshape( + [B_, N, 3, self.num_heads, C // self.num_heads]).transpose( + [2, 0, 3, 1, 4]) + # make torchscript happy (cannot use tensor as tuple) + q, k, v = qkv[0], qkv[1], qkv[2] + # channel interaction + x_cnn2v = F.sigmoid(channel_interaction).reshape( + [-1, 1, self.num_heads, 1, C // self.num_heads]) + v = v.reshape( + [x_cnn2v.shape[0], -1, self.num_heads, N, C // self.num_heads]) + v = v * x_cnn2v + v = v.reshape([-1, self.num_heads, N, C // self.num_heads]) + + q = q * self.scale + attn = paddle.mm(q, k.transpose([0, 1, 3, 2])) + + index = self.relative_position_index.reshape([-1]) + + relative_position_bias = paddle.index_select( + self.relative_position_bias_table, index) + relative_position_bias = relative_position_bias.reshape([ + self.window_size[0] * self.window_size[1], + self.window_size[0] * self.window_size[1], -1 + ]) # Wh*Ww,Wh*Ww,nH + relative_position_bias = relative_position_bias.transpose( + [2, 0, 1]) # nH, Wh*Ww, Wh*Ww + attn = attn + relative_position_bias.unsqueeze(0) + + if mask is not None: + nW = mask.shape[0] + attn = attn.reshape([B_ // nW, nW, self.num_heads, N, N]) + \ + mask.unsqueeze(1).unsqueeze(0) + attn = attn.reshape([-1, self.num_heads, N, N]) + attn = self.softmax(attn) + else: + attn = self.softmax(attn) + + attn = self.attn_drop(attn) + + x_atten = paddle.mm(attn, v).transpose([0, 2, 1, 3]).reshape( + [B_, N, C]) + + # spatial interaction + x_spatial = window_reverse2(x_atten, self.window_size, H, W, C) + spatial_interaction = self.spatial_interaction(x_spatial) + x_cnn = F.sigmoid(spatial_interaction) * x_cnn + x_cnn = self.conv_norm(x_cnn) + # B, C, H, W --> B * H // win * W // win x win*win x C + x_cnn = window_partition2(x_cnn, self.window_size) + + # concat + x_atten = self.attn_norm(x_atten) + x = paddle.concat([x_atten, x_cnn], axis=-1) + x = self.proj(x) + x = self.proj_drop(x) + return x + + +class MixingBlock(nn.Layer): + r""" Mixing Block in MixFormer. + Modified from Swin Transformer Block. + + Args: + dim (int): Number of input channels. + num_heads (int): Number of attention heads. + window_size (int): Window size. + dwconv_kernel_size (int): kernel size for depth-wise convolution. + shift_size (int): Shift size for SW-MSA. + We do not use shift in MixFormer. Default: 0 + mlp_ratio (float): Ratio of mlp hidden dim to embedding dim. + qkv_bias (bool, optional): If True, add a learnable bias to + query, key, value. Default: True + qk_scale (float | None, optional): Override default qk scale of + head_dim ** -0.5 if set. + drop (float, optional): Dropout rate. Default: 0.0 + attn_drop (float, optional): Attention dropout rate. Default: 0.0 + drop_path (float, optional): Stochastic depth rate. Default: 0.0 + act_layer (nn.Layer, optional): Activation layer. Default: nn.GELU + norm_layer (nn.Layer, optional): Normalization layer. + Default: nn.LayerNorm + """ + + def __init__(self, + dim, + num_heads, + window_size=7, + dwconv_kernel_size=3, + shift_size=0, + mlp_ratio=4., + qkv_bias=True, + qk_scale=None, + drop=0., + attn_drop=0., + drop_path=0., + act_layer=nn.GELU, + norm_layer=nn.LayerNorm): + super().__init__() + self.dim = dim + self.num_heads = num_heads + self.window_size = window_size + self.shift_size = shift_size + self.mlp_ratio = mlp_ratio + assert self.shift_size == 0, "No shift in MixFormer" + + self.norm1 = norm_layer(dim) + self.attn = MixingAttention( + dim, + window_size=to_2tuple(self.window_size), + dwconv_kernel_size=dwconv_kernel_size, + num_heads=num_heads, + qkv_bias=qkv_bias, + qk_scale=qk_scale, + attn_drop=attn_drop, + proj_drop=drop) + + self.drop_path = DropPath(drop_path) if drop_path > 0. else Identity() + self.norm2 = norm_layer(dim) + mlp_hidden_dim = int(dim * mlp_ratio) + self.mlp = Mlp(in_features=dim, + hidden_features=mlp_hidden_dim, + act_layer=act_layer, + drop=drop) + self.H = None + self.W = None + + def forward(self, x, mask_matrix): + """ Forward function. + + Args: + x: Input feature, tensor size (B, H*W, C). + H, W: Spatial resolution of the input feature. + mask_matrix: Attention mask for cyclic shift. + """ + B, L, C = x.shape + H, W = self.H, self.W + assert L == H * W, "input feature has wrong size" + + shortcut = x + x = self.norm1(x) + x = x.reshape([B, H, W, C]) + + # pad feature maps to multiples of window size + pad_l = pad_t = 0 + pad_r = (self.window_size - W % self.window_size) % self.window_size + pad_b = (self.window_size - H % self.window_size) % self.window_size + x = F.pad(x, [0, pad_l, 0, pad_b, 0, pad_r, 0, pad_t]) + _, Hp, Wp, _ = x.shape + + # cyclic shift + if self.shift_size > 0: + shifted_x = paddle.roll( + x, shifts=(-self.shift_size, -self.shift_size), axis=(1, 2)) + attn_mask = mask_matrix + else: + shifted_x = x + attn_mask = None + + # partition windows + x_windows = window_partition( + shifted_x, self.window_size) # nW*B, window_size, window_size, C + x_windows = x_windows.reshape( + [-1, self.window_size * self.window_size, + C]) # nW*B, window_size*window_size, C + + # W-MSA/SW-MSA + # nW*B, window_size*window_size, C + attn_windows = self.attn( + x_windows, Hp, Wp, mask=attn_mask) + + # merge windows + attn_windows = attn_windows.reshape( + [-1, self.window_size, self.window_size, C]) + shifted_x = window_reverse(attn_windows, self.window_size, Hp, + Wp, C) # B H' W' C + + # reverse cyclic shift + if self.shift_size > 0: + x = paddle.roll( + shifted_x, + shifts=(self.shift_size, self.shift_size), + axis=(1, 2)) + else: + x = shifted_x + + if pad_r > 0 or pad_b > 0: + x = x[:, :H, :W, :] + + x = x.reshape([B, H * W, C]) + + # FFN + x = shortcut + self.drop_path(x) + x = x + self.drop_path(self.mlp(self.norm2(x))) + + return x + + +class ConvMerging(nn.Layer): + r""" Conv Merging Layer. + + Args: + dim (int): Number of input channels. + out_dim (int): Output channels after the merging layer. + norm_layer (nn.Module, optional): Normalization layer. + Default: nn.LayerNorm + """ + + def __init__(self, dim, out_dim, norm_layer=nn.LayerNorm): + super().__init__() + self.dim = dim + self.out_dim = out_dim + self.reduction = nn.Conv2D(dim, out_dim, kernel_size=2, stride=2) + self.norm = nn.BatchNorm(dim) + + def forward(self, x, H, W): + """ + Args: + x: Input feature, tensor size (B, H*W, C). + H, W: Spatial resolution of the input feature. + """ + B, L, C = x.shape + assert L == H * W, "input feature has wrong size" + assert H % 2 == 0 and W % 2 == 0, f"x size ({H}*{W}) are not even." + + x = x.reshape([B, H, W, C]).transpose([0, 3, 1, 2]) + + x = self.norm(x) + # B, C, H, W -> B, H*W, C + x = self.reduction(x).flatten(2).transpose([0, 2, 1]) + return x + + +class BasicLayer(nn.Layer): + """ A basic layer for one stage in MixFormer. + Modified from Swin Transformer BasicLayer. + + Args: + dim (int): Number of input channels. + depth (int): Number of blocks. + num_heads (int): Number of attention heads. + window_size (int): Local window size. + dwconv_kernel_size (int): kernel size for depth-wise convolution. + mlp_ratio (float): Ratio of mlp hidden dim to embedding dim. + qkv_bias (bool, optional): If True, add a learnable bias to + query, key, value. Default: True + qk_scale (float | None, optional): Override default qk scale of + head_dim ** -0.5 if set. + drop (float, optional): Dropout rate. Default: 0.0 + attn_drop (float, optional): Attention dropout rate. Default: 0.0 + drop_path (float | tuple[float], optional): Stochastic depth rate. + Default: 0.0 + norm_layer (nn.Layer, optional): Normalization layer. + Default: nn.LayerNorm + downsample (nn.Layer | None, optional): Downsample layer at the end + of the layer. Default: None + out_dim (int): Output channels for the downsample layer. Default: 0. + """ + + def __init__(self, + dim, + depth, + num_heads, + window_size=7, + dwconv_kernel_size=3, + mlp_ratio=4., + qkv_bias=True, + qk_scale=None, + drop=0., + attn_drop=0., + drop_path=0., + norm_layer=nn.LayerNorm, + downsample=None, + out_dim=0): + super().__init__() + self.window_size = window_size + self.depth = depth + + # build blocks + self.blocks = nn.LayerList([ + MixingBlock( + dim=dim, + num_heads=num_heads, + window_size=window_size, + dwconv_kernel_size=dwconv_kernel_size, + shift_size=0, + mlp_ratio=mlp_ratio, + qkv_bias=qkv_bias, + qk_scale=qk_scale, + drop=drop, + attn_drop=attn_drop, + drop_path=drop_path[i] + if isinstance(drop_path, (np.ndarray, list)) else drop_path, + norm_layer=norm_layer) for i in range(depth) + ]) + + # patch merging layer + if downsample is not None: + self.downsample = downsample( + dim=dim, out_dim=out_dim, norm_layer=norm_layer) + else: + self.downsample = None + + def forward(self, x, H, W): + """ Forward function. + + Args: + x: Input feature, tensor size (B, H*W, C). + H, W: Spatial resolution of the input feature. + """ + for blk in self.blocks: + blk.H, blk.W = H, W + x = blk(x, None) + if self.downsample is not None: + x_down = self.downsample(x, H, W) + Wh, Ww = (H + 1) // 2, (W + 1) // 2 + return H, W, x_down, Wh, Ww + else: + return H, W, x, H, W + + +class ConvEmbed(nn.Layer): + r""" Image to Conv Stem Embedding + + Args: + img_size (int): Image size. Default: 224. + patch_size (int): Patch token size. Default: 4. + in_chans (int): Number of input image channels. Default: 3. + embed_dim (int): Number of linear projection output channels. + Default: 96. + norm_layer (nn.Module, optional): Normalization layer. + Default: None + """ + + def __init__(self, + img_size=224, + patch_size=4, + in_chans=3, + embed_dim=96, + norm_layer=None): + super().__init__() + img_size = to_2tuple(img_size) + patch_size = to_2tuple(patch_size) + patches_resolution = [ + img_size[0] // patch_size[0], img_size[1] // patch_size[1]] + self.img_size = img_size + self.patch_size = patch_size + self.patches_resolution = patches_resolution + self.num_patches = patches_resolution[0] * patches_resolution[1] + + self.in_chans = in_chans + self.embed_dim = embed_dim + + self.stem = nn.Sequential( + nn.Conv2D(in_chans, embed_dim // 2, kernel_size=3, + stride=patch_size[0] // 2, padding=1), + nn.BatchNorm(embed_dim // 2), + nn.GELU(), + nn.Conv2D(embed_dim // 2, embed_dim // 2, kernel_size=3, + stride=1, padding=1), + nn.BatchNorm(embed_dim // 2), + nn.GELU(), + nn.Conv2D(embed_dim // 2, embed_dim // 2, kernel_size=3, + stride=1, padding=1), + nn.BatchNorm(embed_dim // 2), + nn.GELU(), + ) + self.proj = nn.Conv2D(embed_dim // 2, embed_dim, + kernel_size=patch_size[0] // 2, + stride=patch_size[0] // 2) + if norm_layer is not None: + self.norm = norm_layer(embed_dim) + else: + self.norm = None + + def forward(self, x): + B, C, H, W = x.shape + if W % self.patch_size[1] != 0: + x = F.pad( + x, [0, self.patch_size[1] - W % self.patch_size[1], 0, 0]) + if H % self.patch_size[0] != 0: + x = F.pad( + x, [0, 0, 0, self.patch_size[0] - H % self.patch_size[0]]) + + x = self.stem(x) + x = self.proj(x) + if self.norm is not None: + _, _, Wh, Ww = x.shape + x = x.flatten(2).transpose([0, 2, 1]) # B Ph*Pw C + if self.norm is not None: + x = self.norm(x) + x = x.transpose([0, 2, 1]) + x = x.reshape([-1, self.embed_dim, Wh, Ww]) + return x + + +class MixFormer(nn.Layer): + """ A PaddlePaddle impl of MixFormer: + MixFormer: Mixing Features across Windows and Dimensions (CVPR 2022, Oral) + + Modified from Swin Transformer. + + Args: + img_size (int | tuple(int)): Input image size. Default 224 + patch_size (int | tuple(int)): Patch size. Default: 4 + in_chans (int): Number of input image channels. Default: 3 + num_classes (int): Number of classes for classification head. + Default: 1000 + embed_dim (int): Patch embedding dimension. Default: 96 + depths (tuple(int)): Depth of each Swin Transformer layer. + num_heads (tuple(int)): Number of attention heads in different layers. + window_size (int): Window size. Default: 7 + dwconv_kernel_size (int): kernel size for depth-wise convolution. + mlp_ratio (float): Ratio of mlp hidden dim to embedding dim. Default: 4 + qkv_bias (bool): If True, add a learnable bias to query, key, value. + Default: True + qk_scale (float): Override default qk scale of head_dim ** -0.5 if set. + Default: None + drop_rate (float): Dropout rate. Default: 0 + attn_drop_rate (float): Attention dropout rate. Default: 0 + drop_path_rate (float): Stochastic depth rate. Default: 0.1 + norm_layer (nn.Layer): Normalization layer. Default: nn.LayerNorm. + ape (bool): If True, add absolute position embedding to the + patch embedding. Default: False + patch_norm (bool): If True, add normalization after patch embedding. + Default: True + use_checkpoint (bool): Whether to use checkpointing to save memory. + Default: False + """ + + def __init__(self, + img_size=224, + patch_size=4, + in_chans=3, + class_num=1000, + embed_dim=96, + depths=[2, 2, 6, 2], + num_heads=[3, 6, 12, 24], + window_size=7, + dwconv_kernel_size=3, + mlp_ratio=4., + qkv_bias=True, + qk_scale=None, + drop_rate=0., + attn_drop_rate=0., + drop_path_rate=0.1, + norm_layer=nn.LayerNorm, + ape=False, + patch_norm=True, + use_checkpoint=False, + **kwargs): + super(MixFormer, self).__init__() + self.num_classes = num_classes = class_num + self.num_layers = len(depths) + if isinstance(embed_dim, int): + embed_dim = [embed_dim * 2 ** i_layer + for i_layer in range(self.num_layers)] + assert isinstance(embed_dim, list) and \ + len(embed_dim) == self.num_layers + self.embed_dim = embed_dim + self.ape = ape + self.patch_norm = patch_norm + self.num_features = int(self.embed_dim[-1]) + self.mlp_ratio = mlp_ratio + + # split image into patches + self.patch_embed = ConvEmbed( + img_size=img_size, + patch_size=patch_size, + in_chans=in_chans, + embed_dim=embed_dim[0], + norm_layer=norm_layer if self.patch_norm else None) + num_patches = self.patch_embed.num_patches + patches_resolution = self.patch_embed.patches_resolution + self.patches_resolution = patches_resolution + + # absolute position embedding + if self.ape: + self.absolute_pos_embed = self.create_parameter( + shape=(1, num_patches, self.embed_dim[0]), + default_initializer=zeros_) + self.add_parameter( + "absolute_pos_embed", self.absolute_pos_embed) + trunc_normal_(self.absolute_pos_embed) + + self.pos_drop = nn.Dropout(p=drop_rate) + + # stochastic depth + # stochastic depth decay rule + dpr = np.linspace(0, drop_path_rate, + sum(depths)).tolist() + + # build layers + self.layers = nn.LayerList() + for i_layer in range(self.num_layers): + layer = BasicLayer( + dim=int(self.embed_dim[i_layer]), + depth=depths[i_layer], + num_heads=num_heads[i_layer], + window_size=window_size, + dwconv_kernel_size=dwconv_kernel_size, + mlp_ratio=self.mlp_ratio, + qkv_bias=qkv_bias, + qk_scale=qk_scale, + drop=drop_rate, + attn_drop=attn_drop_rate, + drop_path=dpr[sum(depths[:i_layer]):sum(depths[:i_layer + 1])], + norm_layer=norm_layer, + downsample=ConvMerging + if (i_layer < self.num_layers - 1) else None, + out_dim=int(self.embed_dim[i_layer + 1]) + if (i_layer < self.num_layers - 1) else 0) + self.layers.append(layer) + + self.norm = norm_layer(self.num_features) + self.last_proj = nn.Linear(self.num_features, 1280) + self.activate = nn.GELU() + self.avgpool = nn.AdaptiveAvgPool1D(1) + self.head = nn.Linear( + 1280, + num_classes) if self.num_classes > 0 else Identity() + + self.apply(self._init_weights) + + def _init_weights(self, m): + if isinstance(m, nn.Linear): + trunc_normal_(m.weight) + if isinstance(m, nn.Linear) and m.bias is not None: + zeros_(m.bias) + elif isinstance(m, nn.LayerNorm): + zeros_(m.bias) + ones_(m.weight) + + def forward_features(self, x): + x = self.patch_embed(x) + _, _, Wh, Ww = x.shape + x = x.flatten(2).transpose([0, 2, 1]) + if self.ape: + x = x + self.absolute_pos_embed + x = self.pos_drop(x) + + for layer in self.layers: + H, W, x, Wh, Ww = layer(x, Wh, Ww) + + x = self.norm(x) # B L C + x = self.last_proj(x) + x = self.activate(x) + x = self.avgpool(x.transpose([0, 2, 1])) # B C 1 + x = paddle.flatten(x, 1) + return x + + def forward(self, x): + x = self.forward_features(x) + x = self.head(x) + return x + + +def _load_pretrained(pretrained, model, model_url, use_ssld=False): + if pretrained is False: + pass + elif pretrained is True: + load_dygraph_pretrain_from_url(model, model_url, use_ssld=use_ssld) + elif isinstance(pretrained, str): + load_dygraph_pretrain(model, pretrained) + else: + raise RuntimeError( + "pretrained type is not available. \ + Please use `string` or `boolean` type." + ) + + +def MixFormer_B0(pretrained=False, use_ssld=False, **kwargs): + model = MixFormer( + embed_dim=24, + depths=[1, 2, 6, 6], + num_heads=[3, 6, 12, 24], + drop_path_rate=0., + **kwargs) + _load_pretrained( + pretrained, + model, + MODEL_URLS["mixformer-B0"], + use_ssld=use_ssld) + return model + + +def MixFormer_B1(pretrained=False, use_ssld=False, **kwargs): + model = MixFormer( + embed_dim=32, + depths=[1, 2, 6, 6], + num_heads=[2, 4, 8, 16], + drop_path_rate=0., + **kwargs) + _load_pretrained( + pretrained, + model, + MODEL_URLS["mixformer-B1"], + use_ssld=use_ssld) + return model + + +def MixFormer_B2(pretrained=False, use_ssld=False, **kwargs): + model = MixFormer( + embed_dim=32, + depths=[2, 2, 8, 8], + num_heads=[2, 4, 8, 16], + drop_path_rate=0.05, + **kwargs) + _load_pretrained( + pretrained, + model, + MODEL_URLS["mixformer-B2"], + use_ssld=use_ssld) + return model + + +def MixFormer_B3(pretrained=False, use_ssld=False, **kwargs): + model = MixFormer( + embed_dim=48, + depths=[2, 2, 8, 6], + num_heads=[3, 6, 12, 24], + drop_path_rate=0.1, + **kwargs) + _load_pretrained( + pretrained, + model, + MODEL_URLS["mixformer-B3"], + use_ssld=use_ssld) + return model + + +def MixFormer_B4(pretrained=False, use_ssld=False, **kwargs): + model = MixFormer( + embed_dim=64, + depths=[2, 2, 8, 8], + num_heads=[4, 8, 16, 32], + drop_path_rate=0.2, + **kwargs) + _load_pretrained( + pretrained, + model, + MODEL_URLS["mixformer-B4"], + use_ssld=use_ssld) + return model + + +def MixFormer_B5(pretrained=False, use_ssld=False, **kwargs): + model = MixFormer( + embed_dim=96, + depths=[1, 2, 8, 6], + num_heads=[6, 12, 24, 48], + drop_path_rate=0.3, + **kwargs) + _load_pretrained( + pretrained, + model, + MODEL_URLS["mixformer-B5"], + use_ssld=use_ssld) + return model + + +def MixFormer_B6(pretrained=False, use_ssld=False, **kwargs): + model = MixFormer( + embed_dim=96, + depths=[2, 4, 16, 12], + num_heads=[6, 12, 24, 48], + drop_path_rate=0.5, + **kwargs) + _load_pretrained( + pretrained, + model, + MODEL_URLS["mixformer-B6"], + use_ssld=use_ssld) + return model diff --git a/ppcls/configs/ImageNet/MixFormer/mixformer_b0.yaml b/ppcls/configs/ImageNet/MixFormer/mixformer_b0.yaml new file mode 100644 index 0000000000..8fa6bed0dd --- /dev/null +++ b/ppcls/configs/ImageNet/MixFormer/mixformer_b0.yaml @@ -0,0 +1,159 @@ +# global configs +Global: + checkpoints: null + pretrained_model: null + output_dir: ./output/ + device: gpu + save_interval: 1 + eval_during_train: True + eval_interval: 1 + epochs: 300 + print_batch_step: 10 + use_visualdl: False + # used for static mode and model export + image_shape: [3, 224, 224] + save_inference_dir: ./inference + # training model under @to_static + to_static: False + +# model architecture +Arch: + name: MixFormer_B0 + class_num: 1000 + +# loss function config for traing/eval process +Loss: + Train: + - CELoss: + weight: 1.0 + epsilon: 0.1 + Eval: + - CELoss: + weight: 1.0 + + +Optimizer: + name: AdamW + beta1: 0.9 + beta2: 0.999 + epsilon: 1e-8 + weight_decay: 0.04 + no_weight_decay_name: absolute_pos_embed relative_position_bias_table .bias norm + one_dim_param_no_weight_decay: True + lr: # for 8-gpus + name: Cosine + learning_rate: 8e-4 + eta_min: 1e-6 + warmup_epoch: 20 + warmup_start_lr: 1e-7 + + +# data loader for train and eval +DataLoader: + Train: + dataset: + name: ImageNetDataset + image_root: ./dataset/ILSVRC2012/ + cls_label_path: ./dataset/ILSVRC2012/train_list.txt + transform_ops: + - DecodeImage: + to_rgb: True + channel_first: False + - RandCropImage: + size: 224 + interpolation: bicubic + backend: pil + - RandFlipImage: + flip_code: 1 + - TimmAutoAugment: + config_str: rand-m9-mstd0.5-inc1 + interpolation: bicubic + img_size: 224 + - NormalizeImage: + scale: 1.0/255.0 + mean: [0.485, 0.456, 0.406] + std: [0.229, 0.224, 0.225] + order: '' + - RandomErasing: + EPSILON: 0.25 + sl: 0.02 + sh: 1.0/3.0 + r1: 0.3 + attempt: 10 + use_log_aspect: True + mode: pixel + batch_transform_ops: + - OpSampler: + MixupOperator: + alpha: 0.2 + prob: 0.5 + CutmixOperator: + alpha: 1.0 + prob: 0.5 + + sampler: + name: DistributedBatchSampler + batch_size: 128 + drop_last: False + shuffle: True + loader: + num_workers: 4 + use_shared_memory: True + + Eval: + dataset: + name: ImageNetDataset + image_root: ./dataset/ILSVRC2012/ + cls_label_path: ./dataset/ILSVRC2012/val_list.txt + transform_ops: + - DecodeImage: + to_rgb: True + channel_first: False + - ResizeImage: + resize_short: 256 + interpolation: bicubic + backend: pil + - CropImage: + size: 224 + - NormalizeImage: + scale: 1.0/255.0 + mean: [0.485, 0.456, 0.406] + std: [0.229, 0.224, 0.225] + order: '' + sampler: + name: DistributedBatchSampler + batch_size: 128 + drop_last: False + shuffle: False + loader: + num_workers: 4 + use_shared_memory: True + +Infer: + infer_imgs: docs/images/inference_deployment/whl_demo.jpg + batch_size: 10 + transforms: + - DecodeImage: + to_rgb: True + channel_first: False + - ResizeImage: + resize_short: 256 + interpolation: bicubic + backend: pil + - CropImage: + size: 224 + - NormalizeImage: + scale: 1.0/255.0 + mean: [0.485, 0.456, 0.406] + std: [0.229, 0.224, 0.225] + order: '' + - ToCHWImage: + PostProcess: + name: Topk + topk: 5 + class_id_map_file: ppcls/utils/imagenet1k_label_list.txt + +Metric: + Eval: + - TopkAcc: + topk: [1, 5] diff --git a/ppcls/configs/ImageNet/MixFormer/mixformer_b1.yaml b/ppcls/configs/ImageNet/MixFormer/mixformer_b1.yaml new file mode 100644 index 0000000000..94ce590f29 --- /dev/null +++ b/ppcls/configs/ImageNet/MixFormer/mixformer_b1.yaml @@ -0,0 +1,159 @@ +# global configs +Global: + checkpoints: null + pretrained_model: null + output_dir: ./output/ + device: gpu + save_interval: 1 + eval_during_train: True + eval_interval: 1 + epochs: 300 + print_batch_step: 10 + use_visualdl: False + # used for static mode and model export + image_shape: [3, 224, 224] + save_inference_dir: ./inference + # training model under @to_static + to_static: False + +# model architecture +Arch: + name: MixFormer_B1 + class_num: 1000 + +# loss function config for traing/eval process +Loss: + Train: + - CELoss: + weight: 1.0 + epsilon: 0.1 + Eval: + - CELoss: + weight: 1.0 + + +Optimizer: + name: AdamW + beta1: 0.9 + beta2: 0.999 + epsilon: 1e-8 + weight_decay: 0.04 + no_weight_decay_name: absolute_pos_embed relative_position_bias_table .bias norm + one_dim_param_no_weight_decay: True + lr: # for 8-gpus + name: Cosine + learning_rate: 8e-4 + eta_min: 1e-6 + warmup_epoch: 20 + warmup_start_lr: 1e-7 + + +# data loader for train and eval +DataLoader: + Train: + dataset: + name: ImageNetDataset + image_root: ./dataset/ILSVRC2012/ + cls_label_path: ./dataset/ILSVRC2012/train_list.txt + transform_ops: + - DecodeImage: + to_rgb: True + channel_first: False + - RandCropImage: + size: 224 + interpolation: bicubic + backend: pil + - RandFlipImage: + flip_code: 1 + - TimmAutoAugment: + config_str: rand-m9-mstd0.5-inc1 + interpolation: bicubic + img_size: 224 + - NormalizeImage: + scale: 1.0/255.0 + mean: [0.485, 0.456, 0.406] + std: [0.229, 0.224, 0.225] + order: '' + - RandomErasing: + EPSILON: 0.25 + sl: 0.02 + sh: 1.0/3.0 + r1: 0.3 + attempt: 10 + use_log_aspect: True + mode: pixel + batch_transform_ops: + - OpSampler: + MixupOperator: + alpha: 0.2 + prob: 0.5 + CutmixOperator: + alpha: 1.0 + prob: 0.5 + + sampler: + name: DistributedBatchSampler + batch_size: 128 + drop_last: False + shuffle: True + loader: + num_workers: 4 + use_shared_memory: True + + Eval: + dataset: + name: ImageNetDataset + image_root: ./dataset/ILSVRC2012/ + cls_label_path: ./dataset/ILSVRC2012/val_list.txt + transform_ops: + - DecodeImage: + to_rgb: True + channel_first: False + - ResizeImage: + resize_short: 256 + interpolation: bicubic + backend: pil + - CropImage: + size: 224 + - NormalizeImage: + scale: 1.0/255.0 + mean: [0.485, 0.456, 0.406] + std: [0.229, 0.224, 0.225] + order: '' + sampler: + name: DistributedBatchSampler + batch_size: 128 + drop_last: False + shuffle: False + loader: + num_workers: 4 + use_shared_memory: True + +Infer: + infer_imgs: docs/images/inference_deployment/whl_demo.jpg + batch_size: 10 + transforms: + - DecodeImage: + to_rgb: True + channel_first: False + - ResizeImage: + resize_short: 256 + interpolation: bicubic + backend: pil + - CropImage: + size: 224 + - NormalizeImage: + scale: 1.0/255.0 + mean: [0.485, 0.456, 0.406] + std: [0.229, 0.224, 0.225] + order: '' + - ToCHWImage: + PostProcess: + name: Topk + topk: 5 + class_id_map_file: ppcls/utils/imagenet1k_label_list.txt + +Metric: + Eval: + - TopkAcc: + topk: [1, 5] diff --git a/ppcls/configs/ImageNet/MixFormer/mixformer_b2.yaml b/ppcls/configs/ImageNet/MixFormer/mixformer_b2.yaml new file mode 100644 index 0000000000..81312f24ca --- /dev/null +++ b/ppcls/configs/ImageNet/MixFormer/mixformer_b2.yaml @@ -0,0 +1,159 @@ +# global configs +Global: + checkpoints: null + pretrained_model: null + output_dir: ./output/ + device: gpu + save_interval: 1 + eval_during_train: True + eval_interval: 1 + epochs: 300 + print_batch_step: 10 + use_visualdl: False + # used for static mode and model export + image_shape: [3, 224, 224] + save_inference_dir: ./inference + # training model under @to_static + to_static: False + +# model architecture +Arch: + name: MixFormer_B2 + class_num: 1000 + +# loss function config for traing/eval process +Loss: + Train: + - CELoss: + weight: 1.0 + epsilon: 0.1 + Eval: + - CELoss: + weight: 1.0 + + +Optimizer: + name: AdamW + beta1: 0.9 + beta2: 0.999 + epsilon: 1e-8 + weight_decay: 0.04 + no_weight_decay_name: absolute_pos_embed relative_position_bias_table .bias norm + one_dim_param_no_weight_decay: True + lr: # for 8-gpus + name: Cosine + learning_rate: 8e-4 + eta_min: 1e-6 + warmup_epoch: 20 + warmup_start_lr: 1e-7 + + +# data loader for train and eval +DataLoader: + Train: + dataset: + name: ImageNetDataset + image_root: ./dataset/ILSVRC2012/ + cls_label_path: ./dataset/ILSVRC2012/train_list.txt + transform_ops: + - DecodeImage: + to_rgb: True + channel_first: False + - RandCropImage: + size: 224 + interpolation: bicubic + backend: pil + - RandFlipImage: + flip_code: 1 + - TimmAutoAugment: + config_str: rand-m9-mstd0.5-inc1 + interpolation: bicubic + img_size: 224 + - NormalizeImage: + scale: 1.0/255.0 + mean: [0.485, 0.456, 0.406] + std: [0.229, 0.224, 0.225] + order: '' + - RandomErasing: + EPSILON: 0.25 + sl: 0.02 + sh: 1.0/3.0 + r1: 0.3 + attempt: 10 + use_log_aspect: True + mode: pixel + batch_transform_ops: + - OpSampler: + MixupOperator: + alpha: 0.2 + prob: 0.5 + CutmixOperator: + alpha: 1.0 + prob: 0.5 + + sampler: + name: DistributedBatchSampler + batch_size: 128 + drop_last: False + shuffle: True + loader: + num_workers: 4 + use_shared_memory: True + + Eval: + dataset: + name: ImageNetDataset + image_root: ./dataset/ILSVRC2012/ + cls_label_path: ./dataset/ILSVRC2012/val_list.txt + transform_ops: + - DecodeImage: + to_rgb: True + channel_first: False + - ResizeImage: + resize_short: 256 + interpolation: bicubic + backend: pil + - CropImage: + size: 224 + - NormalizeImage: + scale: 1.0/255.0 + mean: [0.485, 0.456, 0.406] + std: [0.229, 0.224, 0.225] + order: '' + sampler: + name: DistributedBatchSampler + batch_size: 128 + drop_last: False + shuffle: False + loader: + num_workers: 4 + use_shared_memory: True + +Infer: + infer_imgs: docs/images/inference_deployment/whl_demo.jpg + batch_size: 10 + transforms: + - DecodeImage: + to_rgb: True + channel_first: False + - ResizeImage: + resize_short: 256 + interpolation: bicubic + backend: pil + - CropImage: + size: 224 + - NormalizeImage: + scale: 1.0/255.0 + mean: [0.485, 0.456, 0.406] + std: [0.229, 0.224, 0.225] + order: '' + - ToCHWImage: + PostProcess: + name: Topk + topk: 5 + class_id_map_file: ppcls/utils/imagenet1k_label_list.txt + +Metric: + Eval: + - TopkAcc: + topk: [1, 5] diff --git a/ppcls/configs/ImageNet/MixFormer/mixformer_b3.yaml b/ppcls/configs/ImageNet/MixFormer/mixformer_b3.yaml new file mode 100644 index 0000000000..b42e468790 --- /dev/null +++ b/ppcls/configs/ImageNet/MixFormer/mixformer_b3.yaml @@ -0,0 +1,159 @@ +# global configs +Global: + checkpoints: null + pretrained_model: null + output_dir: ./output/ + device: gpu + save_interval: 1 + eval_during_train: True + eval_interval: 1 + epochs: 300 + print_batch_step: 10 + use_visualdl: False + # used for static mode and model export + image_shape: [3, 224, 224] + save_inference_dir: ./inference + # training model under @to_static + to_static: False + +# model architecture +Arch: + name: MixFormer_B3 + class_num: 1000 + +# loss function config for traing/eval process +Loss: + Train: + - CELoss: + weight: 1.0 + epsilon: 0.1 + Eval: + - CELoss: + weight: 1.0 + + +Optimizer: + name: AdamW + beta1: 0.9 + beta2: 0.999 + epsilon: 1e-8 + weight_decay: 0.04 + no_weight_decay_name: absolute_pos_embed relative_position_bias_table .bias norm + one_dim_param_no_weight_decay: True + lr: # for 8-gpus + name: Cosine + learning_rate: 8e-4 + eta_min: 1e-6 + warmup_epoch: 20 + warmup_start_lr: 1e-7 + + +# data loader for train and eval +DataLoader: + Train: + dataset: + name: ImageNetDataset + image_root: ./dataset/ILSVRC2012/ + cls_label_path: ./dataset/ILSVRC2012/train_list.txt + transform_ops: + - DecodeImage: + to_rgb: True + channel_first: False + - RandCropImage: + size: 224 + interpolation: bicubic + backend: pil + - RandFlipImage: + flip_code: 1 + - TimmAutoAugment: + config_str: rand-m9-mstd0.5-inc1 + interpolation: bicubic + img_size: 224 + - NormalizeImage: + scale: 1.0/255.0 + mean: [0.485, 0.456, 0.406] + std: [0.229, 0.224, 0.225] + order: '' + - RandomErasing: + EPSILON: 0.25 + sl: 0.02 + sh: 1.0/3.0 + r1: 0.3 + attempt: 10 + use_log_aspect: True + mode: pixel + batch_transform_ops: + - OpSampler: + MixupOperator: + alpha: 0.2 + prob: 0.5 + CutmixOperator: + alpha: 1.0 + prob: 0.5 + + sampler: + name: DistributedBatchSampler + batch_size: 128 + drop_last: False + shuffle: True + loader: + num_workers: 4 + use_shared_memory: True + + Eval: + dataset: + name: ImageNetDataset + image_root: ./dataset/ILSVRC2012/ + cls_label_path: ./dataset/ILSVRC2012/val_list.txt + transform_ops: + - DecodeImage: + to_rgb: True + channel_first: False + - ResizeImage: + resize_short: 256 + interpolation: bicubic + backend: pil + - CropImage: + size: 224 + - NormalizeImage: + scale: 1.0/255.0 + mean: [0.485, 0.456, 0.406] + std: [0.229, 0.224, 0.225] + order: '' + sampler: + name: DistributedBatchSampler + batch_size: 128 + drop_last: False + shuffle: False + loader: + num_workers: 4 + use_shared_memory: True + +Infer: + infer_imgs: docs/images/inference_deployment/whl_demo.jpg + batch_size: 10 + transforms: + - DecodeImage: + to_rgb: True + channel_first: False + - ResizeImage: + resize_short: 256 + interpolation: bicubic + backend: pil + - CropImage: + size: 224 + - NormalizeImage: + scale: 1.0/255.0 + mean: [0.485, 0.456, 0.406] + std: [0.229, 0.224, 0.225] + order: '' + - ToCHWImage: + PostProcess: + name: Topk + topk: 5 + class_id_map_file: ppcls/utils/imagenet1k_label_list.txt + +Metric: + Eval: + - TopkAcc: + topk: [1, 5] diff --git a/ppcls/configs/ImageNet/MixFormer/mixformer_b4.yaml b/ppcls/configs/ImageNet/MixFormer/mixformer_b4.yaml new file mode 100644 index 0000000000..3482b064a9 --- /dev/null +++ b/ppcls/configs/ImageNet/MixFormer/mixformer_b4.yaml @@ -0,0 +1,159 @@ +# global configs +Global: + checkpoints: null + pretrained_model: null + output_dir: ./output/ + device: gpu + save_interval: 1 + eval_during_train: True + eval_interval: 1 + epochs: 300 + print_batch_step: 10 + use_visualdl: False + # used for static mode and model export + image_shape: [3, 224, 224] + save_inference_dir: ./inference + # training model under @to_static + to_static: False + +# model architecture +Arch: + name: MixFormer_B4 + class_num: 1000 + +# loss function config for traing/eval process +Loss: + Train: + - CELoss: + weight: 1.0 + epsilon: 0.1 + Eval: + - CELoss: + weight: 1.0 + + +Optimizer: + name: AdamW + beta1: 0.9 + beta2: 0.999 + epsilon: 1e-8 + weight_decay: 0.05 + no_weight_decay_name: absolute_pos_embed relative_position_bias_table .bias norm + one_dim_param_no_weight_decay: True + lr: # for 8-gpus + name: Cosine + learning_rate: 1e-3 + eta_min: 1e-6 + warmup_epoch: 20 + warmup_start_lr: 1e-7 + + +# data loader for train and eval +DataLoader: + Train: + dataset: + name: ImageNetDataset + image_root: ./dataset/ILSVRC2012/ + cls_label_path: ./dataset/ILSVRC2012/train_list.txt + transform_ops: + - DecodeImage: + to_rgb: True + channel_first: False + - RandCropImage: + size: 224 + interpolation: bicubic + backend: pil + - RandFlipImage: + flip_code: 1 + - TimmAutoAugment: + config_str: rand-m9-mstd0.5-inc1 + interpolation: bicubic + img_size: 224 + - NormalizeImage: + scale: 1.0/255.0 + mean: [0.485, 0.456, 0.406] + std: [0.229, 0.224, 0.225] + order: '' + - RandomErasing: + EPSILON: 0.25 + sl: 0.02 + sh: 1.0/3.0 + r1: 0.3 + attempt: 10 + use_log_aspect: True + mode: pixel + batch_transform_ops: + - OpSampler: + MixupOperator: + alpha: 0.2 + prob: 0.5 + CutmixOperator: + alpha: 1.0 + prob: 0.5 + + sampler: + name: DistributedBatchSampler + batch_size: 128 + drop_last: False + shuffle: True + loader: + num_workers: 4 + use_shared_memory: True + + Eval: + dataset: + name: ImageNetDataset + image_root: ./dataset/ILSVRC2012/ + cls_label_path: ./dataset/ILSVRC2012/val_list.txt + transform_ops: + - DecodeImage: + to_rgb: True + channel_first: False + - ResizeImage: + resize_short: 256 + interpolation: bicubic + backend: pil + - CropImage: + size: 224 + - NormalizeImage: + scale: 1.0/255.0 + mean: [0.485, 0.456, 0.406] + std: [0.229, 0.224, 0.225] + order: '' + sampler: + name: DistributedBatchSampler + batch_size: 128 + drop_last: False + shuffle: False + loader: + num_workers: 4 + use_shared_memory: True + +Infer: + infer_imgs: docs/images/inference_deployment/whl_demo.jpg + batch_size: 10 + transforms: + - DecodeImage: + to_rgb: True + channel_first: False + - ResizeImage: + resize_short: 256 + interpolation: bicubic + backend: pil + - CropImage: + size: 224 + - NormalizeImage: + scale: 1.0/255.0 + mean: [0.485, 0.456, 0.406] + std: [0.229, 0.224, 0.225] + order: '' + - ToCHWImage: + PostProcess: + name: Topk + topk: 5 + class_id_map_file: ppcls/utils/imagenet1k_label_list.txt + +Metric: + Eval: + - TopkAcc: + topk: [1, 5] diff --git a/ppcls/configs/ImageNet/MixFormer/mixformer_b5.yaml b/ppcls/configs/ImageNet/MixFormer/mixformer_b5.yaml new file mode 100644 index 0000000000..700e3b5085 --- /dev/null +++ b/ppcls/configs/ImageNet/MixFormer/mixformer_b5.yaml @@ -0,0 +1,159 @@ +# global configs +Global: + checkpoints: null + pretrained_model: null + output_dir: ./output/ + device: gpu + save_interval: 1 + eval_during_train: True + eval_interval: 1 + epochs: 300 + print_batch_step: 10 + use_visualdl: False + # used for static mode and model export + image_shape: [3, 224, 224] + save_inference_dir: ./inference + # training model under @to_static + to_static: False + +# model architecture +Arch: + name: MixFormer_B5 + class_num: 1000 + +# loss function config for traing/eval process +Loss: + Train: + - CELoss: + weight: 1.0 + epsilon: 0.1 + Eval: + - CELoss: + weight: 1.0 + + +Optimizer: + name: AdamW + beta1: 0.9 + beta2: 0.999 + epsilon: 1e-8 + weight_decay: 0.05 + no_weight_decay_name: absolute_pos_embed relative_position_bias_table .bias norm + one_dim_param_no_weight_decay: True + lr: # for 8-gpus + name: Cosine + learning_rate: 1e-3 + eta_min: 1e-6 + warmup_epoch: 40 + warmup_start_lr: 1e-7 + + +# data loader for train and eval +DataLoader: + Train: + dataset: + name: ImageNetDataset + image_root: ./dataset/ILSVRC2012/ + cls_label_path: ./dataset/ILSVRC2012/train_list.txt + transform_ops: + - DecodeImage: + to_rgb: True + channel_first: False + - RandCropImage: + size: 224 + interpolation: bicubic + backend: pil + - RandFlipImage: + flip_code: 1 + - TimmAutoAugment: + config_str: rand-m9-mstd0.5-inc1 + interpolation: bicubic + img_size: 224 + - NormalizeImage: + scale: 1.0/255.0 + mean: [0.485, 0.456, 0.406] + std: [0.229, 0.224, 0.225] + order: '' + - RandomErasing: + EPSILON: 0.25 + sl: 0.02 + sh: 1.0/3.0 + r1: 0.3 + attempt: 10 + use_log_aspect: True + mode: pixel + batch_transform_ops: + - OpSampler: + MixupOperator: + alpha: 0.2 + prob: 0.5 + CutmixOperator: + alpha: 1.0 + prob: 0.5 + + sampler: + name: DistributedBatchSampler + batch_size: 128 + drop_last: False + shuffle: True + loader: + num_workers: 4 + use_shared_memory: True + + Eval: + dataset: + name: ImageNetDataset + image_root: ./dataset/ILSVRC2012/ + cls_label_path: ./dataset/ILSVRC2012/val_list.txt + transform_ops: + - DecodeImage: + to_rgb: True + channel_first: False + - ResizeImage: + resize_short: 256 + interpolation: bicubic + backend: pil + - CropImage: + size: 224 + - NormalizeImage: + scale: 1.0/255.0 + mean: [0.485, 0.456, 0.406] + std: [0.229, 0.224, 0.225] + order: '' + sampler: + name: DistributedBatchSampler + batch_size: 128 + drop_last: False + shuffle: False + loader: + num_workers: 4 + use_shared_memory: True + +Infer: + infer_imgs: docs/images/inference_deployment/whl_demo.jpg + batch_size: 10 + transforms: + - DecodeImage: + to_rgb: True + channel_first: False + - ResizeImage: + resize_short: 256 + interpolation: bicubic + backend: pil + - CropImage: + size: 224 + - NormalizeImage: + scale: 1.0/255.0 + mean: [0.485, 0.456, 0.406] + std: [0.229, 0.224, 0.225] + order: '' + - ToCHWImage: + PostProcess: + name: Topk + topk: 5 + class_id_map_file: ppcls/utils/imagenet1k_label_list.txt + +Metric: + Eval: + - TopkAcc: + topk: [1, 5] diff --git a/ppcls/configs/ImageNet/MixFormer/mixformer_b6.yaml b/ppcls/configs/ImageNet/MixFormer/mixformer_b6.yaml new file mode 100644 index 0000000000..21c51af333 --- /dev/null +++ b/ppcls/configs/ImageNet/MixFormer/mixformer_b6.yaml @@ -0,0 +1,159 @@ +# global configs +Global: + checkpoints: null + pretrained_model: null + output_dir: ./output/ + device: gpu + save_interval: 1 + eval_during_train: True + eval_interval: 1 + epochs: 300 + print_batch_step: 10 + use_visualdl: False + # used for static mode and model export + image_shape: [3, 224, 224] + save_inference_dir: ./inference + # training model under @to_static + to_static: False + +# model architecture +Arch: + name: MixFormer_B6 + class_num: 1000 + +# loss function config for traing/eval process +Loss: + Train: + - CELoss: + weight: 1.0 + epsilon: 0.1 + Eval: + - CELoss: + weight: 1.0 + + +Optimizer: + name: AdamW + beta1: 0.9 + beta2: 0.999 + epsilon: 1e-8 + weight_decay: 0.05 + no_weight_decay_name: absolute_pos_embed relative_position_bias_table .bias norm + one_dim_param_no_weight_decay: True + lr: # for 8-gpus + name: Cosine + learning_rate: 1e-3 + eta_min: 1e-6 + warmup_epoch: 40 + warmup_start_lr: 1e-7 + + +# data loader for train and eval +DataLoader: + Train: + dataset: + name: ImageNetDataset + image_root: ./dataset/ILSVRC2012/ + cls_label_path: ./dataset/ILSVRC2012/train_list.txt + transform_ops: + - DecodeImage: + to_rgb: True + channel_first: False + - RandCropImage: + size: 224 + interpolation: bicubic + backend: pil + - RandFlipImage: + flip_code: 1 + - TimmAutoAugment: + config_str: rand-m9-mstd0.5-inc1 + interpolation: bicubic + img_size: 224 + - NormalizeImage: + scale: 1.0/255.0 + mean: [0.485, 0.456, 0.406] + std: [0.229, 0.224, 0.225] + order: '' + - RandomErasing: + EPSILON: 0.25 + sl: 0.02 + sh: 1.0/3.0 + r1: 0.3 + attempt: 10 + use_log_aspect: True + mode: pixel + batch_transform_ops: + - OpSampler: + MixupOperator: + alpha: 0.2 + prob: 0.5 + CutmixOperator: + alpha: 1.0 + prob: 0.5 + + sampler: + name: DistributedBatchSampler + batch_size: 128 + drop_last: False + shuffle: True + loader: + num_workers: 4 + use_shared_memory: True + + Eval: + dataset: + name: ImageNetDataset + image_root: ./dataset/ILSVRC2012/ + cls_label_path: ./dataset/ILSVRC2012/val_list.txt + transform_ops: + - DecodeImage: + to_rgb: True + channel_first: False + - ResizeImage: + resize_short: 256 + interpolation: bicubic + backend: pil + - CropImage: + size: 224 + - NormalizeImage: + scale: 1.0/255.0 + mean: [0.485, 0.456, 0.406] + std: [0.229, 0.224, 0.225] + order: '' + sampler: + name: DistributedBatchSampler + batch_size: 128 + drop_last: False + shuffle: False + loader: + num_workers: 4 + use_shared_memory: True + +Infer: + infer_imgs: docs/images/inference_deployment/whl_demo.jpg + batch_size: 10 + transforms: + - DecodeImage: + to_rgb: True + channel_first: False + - ResizeImage: + resize_short: 256 + interpolation: bicubic + backend: pil + - CropImage: + size: 224 + - NormalizeImage: + scale: 1.0/255.0 + mean: [0.485, 0.456, 0.406] + std: [0.229, 0.224, 0.225] + order: '' + - ToCHWImage: + PostProcess: + name: Topk + topk: 5 + class_id_map_file: ppcls/utils/imagenet1k_label_list.txt + +Metric: + Eval: + - TopkAcc: + topk: [1, 5] From 68d5992fa444c1a56d8c0acf6be2cc3e01debdc0 Mon Sep 17 00:00:00 2001 From: chenqiang13 Date: Mon, 11 Apr 2022 23:48:37 +0800 Subject: [PATCH 2/8] update readme --- docs/en/models/MixFormer_en.md | 89 +++++++++++++++++++++++-- docs/images/MixFormer/MixingBlock.png | Bin 0 -> 179889 bytes docs/zh_CN/models/MixFormer.md | 91 ++++++++++++++++++++++++-- 3 files changed, 166 insertions(+), 14 deletions(-) create mode 100644 docs/images/MixFormer/MixingBlock.png diff --git a/docs/en/models/MixFormer_en.md b/docs/en/models/MixFormer_en.md index 308e3da7eb..693a23647e 100644 --- a/docs/en/models/MixFormer_en.md +++ b/docs/en/models/MixFormer_en.md @@ -1,19 +1,35 @@ -# MixFormer: Mixing Features across Windows and Dimensions +# MixFormer --- ## Catalogue -* [1. Overview](#1) -* [2. Accuracy, FLOPs and Parameters](#2) +- [1. Introduction](#1) +- [2. Main Results](#2) + - [2.1 Results on ImageNet-1K](#2.1) + - [2.2 Results on MS COCO with Mask R-CNN](#2.2) + - [2.3 Results on ADE20K with UperNet](#2.3) + - [2.4 Results on MS COCO for Keypoint Detection](#2.4) + - [2.4 Results on LVIS 1.0 with Mask R-CNN](#2.5) +- [3. Reference](#3) -## 1. Overview +## 1. Introduction -MixFormer is an efficient and general-purpose hybrid vision transformer. There are two main designs in MixFormer: (1) combining local-window self-attention and depth-wise convolution in a parallel design, (2) proposing bi-directional interactions across branches to provide complementary clues in channel and spatial dimensions. [paper](https://arxiv.org/abs/2204.02557). +MixFormer is an efficient and general-purpose hybrid vision transformer. There are two main designs in MixFormer: (1) combining local-window self-attention and depth-wise convolution in a parallel design, (2) proposing bi-directional interactions across branches to provide complementary clues in channel and spatial dimensions. These two designs are integrated to achieve efficient feature mixing among windows and dimensions. MixFormer provides superior performance than other vision transformer variants on image classification and 5 dense prediction tasks. + +> [**MixFormer: Mixing Features across Windows and Dimensions**](https://arxiv.org/abs/2204.02557), +> Qiang Chen, Qiman Wu, Jian Wang, Qinghao Hu, Tao Hu, Errui Ding, Jian Cheng, Jingdong Wang +> CVPR2022, **Oral** presentation + +![image](../../images/MixFormer/MixingBlock.png) -## 2. Accuracy, FLOPs and Parameters +## 2. Main Results -| Models | Top1 | Top5 | Reference
top1| FLOPs
(G) | + +### Results on ImageNet-1K +We provide the accuracy with FLOPs of MixFormer on ImageNet-1K. Unlike other vision transformer variants, they only show promising results when the FLOPs are pretty large (e.g., 4.5G). MixFormer can achieve favorable results **with small model sizes (FLOPs < 1G)**, which are nontrivial results. + +| Models | Top1 | Top5 | Reference top1| FLOPs (G) | |:--:|:--:|:--:|:--:|:--:| | MixFormer-B0 | - | - | 0.765 | 0.4 | | MixFormer-B1 | - | - | 0.789 | 0.7 | @@ -24,3 +40,62 @@ MixFormer is an efficient and general-purpose hybrid vision transformer. There a | MixFormer-B6 | - | - | 0.838 | 12.7 | The models are coming soon. + + +### Results on MS COCO with Mask R-CNN +All results are trained with a multi-scale 3x schedule. + +| Backbone | Params (M) | FLOPs (G) | schedule | mAP_box| mAP_mask | +|:--:|:--:|:--:|:--:|:--:| --:| +| Swin-T | 48 | 264 | 3x | 46.0| 41.6 | +|:--:|:--:|:--:|:--:|:--:| --:| +| MixFormer-B1 | 26 | 183 | 3x | 43.9 | 40.0 | +| MixFormer-B2 | 28 | 187 | 3x | 45.1 | 40.8 | +| MixFormer-B3 | 35 | 207 | 3x | 46.2 | 41.9 | +| MixFormer-B4 | 53 | 243 | 3x | **47.6** | **43.0** | + + +### Results on ADE20K with UperNet + +| Backbone | Params (M) | FLOPs (G) | iterations | mIoU_ss | mIoU_ms | +|:--:|:--:|:--:|:--:|:--:| --:| +| Swin-T | 60 | 945 | 160k | 44.5| 45.8 | +|:--:|:--:|:--:|:--:|:--:| --:| +| MixFormer-B1 | 35 | 854 | 160k | 42.0 | 43.5 | +| MixFormer-B2 | 37 | 859 | 160k | 43.1 | 43.9 | +| MixFormer-B3 | 44 | 880 | 160k | 44.5 | 45.5 | +| MixFormer-B4 | 63 | 918 | 160k | **46.8** | **48.0** | + + +### Results on MS COCO for Keypoint Detection + +| Backbone | mAP | mAP_50 | mAP_75 | +|:--:|:--:|:--:|:--:| +| ResNet50 | 71.8 | 89.8 | 79.5 | +| Swin-T | 74.2 | 92.5 | 82.5 | +| HRFormer-S | 74.5 | 92.3 | 82.1 | +|:--:|:--:|:--:|:--:| +| MixFormer-B4 | **75.3** | **93.5** | **83.5** | + + +### Results on LVIS 1.0 with Mask R-CNN + +| Backbone | mAP_mask | mAP_mask_50 | mAP_mask_75 | +|:--:|:--:|:--:|:--:| +| ResNet50 | 21.7 | 34.3 | 23.0 | +| Swin-T | 27.6 | 43.0 | 29.3 | +|:--:|:--:|:--:|:--:| +| MixFormer-B4 | **28.6** | **43.4** | **30.5** | + + +## 3. Reference + +If you find MixFormer helpful, please consider citing: +``` +@inproceedings{chen2022mixformer, + title={MixFormer: Mixing Features across Windows and Dimensions}, + author={Chen, Qiang and Wu, Qiman and Wang, Jian and Hu, Qinghao and Hu, Tao and Ding, Errui and Cheng, Jian and Wang, Jingdong}, + booktitle={IEEE Conference on Computer Vision and Pattern Recognition}, + year={2022} +} +``` diff --git a/docs/images/MixFormer/MixingBlock.png b/docs/images/MixFormer/MixingBlock.png new file mode 100644 index 0000000000000000000000000000000000000000..f741cc7a60f7c7be9566aaf008623f96e91708a8 GIT binary patch literal 179889 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 IQCQgp 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 WcEfL@gcLE*$6G}W1(2Lo#Qy>}JyN*< literal 0 HcmV?d00001 diff --git a/docs/zh_CN/models/MixFormer.md b/docs/zh_CN/models/MixFormer.md index aa295422c5..ff28029b40 100644 --- a/docs/zh_CN/models/MixFormer.md +++ b/docs/zh_CN/models/MixFormer.md @@ -1,19 +1,36 @@ -# MixFormer: Mixing Features across Windows and Dimensions +# MixFormer --- ## 目录 -* [1. 概述](#1) -* [2. 精度、FLOPS 和参数量](#2) +- [1. 介绍](#1) +- [2. 主要结果](#2) + - [2.1 图像分类](#2.1) + - [2.2 目标检测与实例分割](#2.2) + - [2.3 语义分割](#2.3) + - [2.4 人体关键点](#2.4) + - [2.4 长尾实例分割](#2.5) +- [3. 引用](#3) -## 1. 概述 +## 1. 介绍 + +MixFormer是一个高效、通用的骨干网路(Vision Transformer)。在MixFormer中,主要有两个创新的设计:(1)通过平行分支的设计,将局部窗口自注意力(local-window self-attention)与Depthwise卷积进行组合,解决局部窗口自注意力的感受野受限的问题,(2)在平行分支之间提出双向交互模块,使得两个分支可以在channel和spatial两个维度都能实现信息互补,增强整体的建模能力。上述两个设计的组合使得MixFormer可以融合不同局部窗口与不同维度的特征信息,从而在图像分类以及5个重要的下游任务中取得比其他vision transformer骨干网络更好的结果。 + +> [**MixFormer: Mixing Features across Windows and Dimensions**](https://arxiv.org/abs/2204.02557), +> Qiang Chen, Qiman Wu, Jian Wang, Qinghao Hu, Tao Hu, Errui Ding, Jian Cheng, Jingdong Wang +> CVPR2022, **Oral** presentation + +![image](../../images/MixFormer/MixingBlock.png) -MixFormer是一个高效、通用的骨干网路(Vision Transformer)。在MixFormer中,主要有两个创新的设计:(1)通过平行分支的设计,将局部窗口自注意力(local-window self-attention)与Depthwise卷积进行组合,解决局部窗口自注意力的感受野受限的问题,(2)在平行分支之间提出双向交互模块,使得两个分支可以在channel和spatial两个维度都能实现信息互补,增强整体的建模能力。 [paper](https://arxiv.org/abs/2204.02557). -## 2. 精度、FLOPS 和参数量 +## 2. 主要结果 + + +### 图像分类 +我们提供了MixFormer在ImageNet-1K数据集上的精度。与其他vision transformer不同的是,MixFormer即使在小模型的场景下,也能有很好的性能表现,而其他的vision transformer往往只有在模型较大的情况下(例如,4.5G FLOPs)才比较有效。 -| Models | Top1 | Top5 | Reference
top1| FLOPs
(G) | +| Models | Top1 | Top5 | Reference top1| FLOPs (G) | |:--:|:--:|:--:|:--:|:--:| | MixFormer-B0 | - | - | 0.765 | 0.4 | | MixFormer-B1 | - | - | 0.789 | 0.7 | @@ -24,3 +41,63 @@ MixFormer是一个高效、通用的骨干网路(Vision Transformer)。在Mi | MixFormer-B6 | - | - | 0.838 | 12.7 | 模型后续将提供下载。 + + +### 目标检测与实例分割 +下表中的所有结果都以Mask R-CNN为基础模型,并且采用3x多尺度训练得到的。 + +| Backbone | Params (M) | FLOPs (G) | schedule | mAP_box| mAP_mask | +|:--:|:--:|:--:|:--:|:--:| --:| +| Swin-T | 48 | 264 | 3x | 46.0| 41.6 | +|:--:|:--:|:--:|:--:|:--:| --:| +| MixFormer-B1 | 26 | 183 | 3x | 43.9 | 40.0 | +| MixFormer-B2 | 28 | 187 | 3x | 45.1 | 40.8 | +| MixFormer-B3 | 35 | 207 | 3x | 46.2 | 41.9 | +| MixFormer-B4 | 53 | 243 | 3x | **47.6** | **43.0** | + + +### 语义分割 +下表中的所有结果都以UperNet为基础模型。 + +| Backbone | Params (M) | FLOPs (G) | iterations | mIoU_ss | mIoU_ms | +|:--:|:--:|:--:|:--:|:--:| --:| +| Swin-T | 60 | 945 | 160k | 44.5| 45.8 | +|:--:|:--:|:--:|:--:|:--:| --:| +| MixFormer-B1 | 35 | 854 | 160k | 42.0 | 43.5 | +| MixFormer-B2 | 37 | 859 | 160k | 43.1 | 43.9 | +| MixFormer-B3 | 44 | 880 | 160k | 44.5 | 45.5 | +| MixFormer-B4 | 63 | 918 | 160k | **46.8** | **48.0** | + + +### 人体关键点 + +| Backbone | mAP | mAP_50 | mAP_75 | +|:--:|:--:|:--:|:--:| +| ResNet50 | 71.8 | 89.8 | 79.5 | +| Swin-T | 74.2 | 92.5 | 82.5 | +| HRFormer-S | 74.5 | 92.3 | 82.1 | +|:--:|:--:|:--:|:--:| +| MixFormer-B4 | **75.3** | **93.5** | **83.5** | + + +### 长尾实例分割 + +| Backbone | mAP_mask | mAP_mask_50 | mAP_mask_75 | +|:--:|:--:|:--:|:--:| +| ResNet50 | 21.7 | 34.3 | 23.0 | +| Swin-T | 27.6 | 43.0 | 29.3 | +|:--:|:--:|:--:|:--:| +| MixFormer-B4 | **28.6** | **43.4** | **30.5** | + + +## 3. Reference + +如果MixFormer对你有所启发,请考虑引用我们的MixFormer: +``` +@inproceedings{chen2022mixformer, + title={MixFormer: Mixing Features across Windows and Dimensions}, + author={Chen, Qiang and Wu, Qiman and Wang, Jian and Hu, Qinghao and Hu, Tao and Ding, Errui and Cheng, Jian and Wang, Jingdong}, + booktitle={IEEE Conference on Computer Vision and Pattern Recognition}, + year={2022} +} +``` From 8df9bc6d7ed150006e589fdfbbdff57168be7156 Mon Sep 17 00:00:00 2001 From: chenqiang13 Date: Mon, 11 Apr 2022 23:51:58 +0800 Subject: [PATCH 3/8] update readme --- docs/en/models/MixFormer_en.md | 8 ++------ docs/zh_CN/models/MixFormer.md | 10 +++------- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/docs/en/models/MixFormer_en.md b/docs/en/models/MixFormer_en.md index 693a23647e..897899346b 100644 --- a/docs/en/models/MixFormer_en.md +++ b/docs/en/models/MixFormer_en.md @@ -46,9 +46,8 @@ The models are coming soon. All results are trained with a multi-scale 3x schedule. | Backbone | Params (M) | FLOPs (G) | schedule | mAP_box| mAP_mask | -|:--:|:--:|:--:|:--:|:--:| --:| +|:--:|:--:|:--:|:--:|:--:| :--:| | Swin-T | 48 | 264 | 3x | 46.0| 41.6 | -|:--:|:--:|:--:|:--:|:--:| --:| | MixFormer-B1 | 26 | 183 | 3x | 43.9 | 40.0 | | MixFormer-B2 | 28 | 187 | 3x | 45.1 | 40.8 | | MixFormer-B3 | 35 | 207 | 3x | 46.2 | 41.9 | @@ -58,9 +57,8 @@ All results are trained with a multi-scale 3x schedule. ### Results on ADE20K with UperNet | Backbone | Params (M) | FLOPs (G) | iterations | mIoU_ss | mIoU_ms | -|:--:|:--:|:--:|:--:|:--:| --:| +|:--:|:--:|:--:|:--:|:--:| :--:| | Swin-T | 60 | 945 | 160k | 44.5| 45.8 | -|:--:|:--:|:--:|:--:|:--:| --:| | MixFormer-B1 | 35 | 854 | 160k | 42.0 | 43.5 | | MixFormer-B2 | 37 | 859 | 160k | 43.1 | 43.9 | | MixFormer-B3 | 44 | 880 | 160k | 44.5 | 45.5 | @@ -74,7 +72,6 @@ All results are trained with a multi-scale 3x schedule. | ResNet50 | 71.8 | 89.8 | 79.5 | | Swin-T | 74.2 | 92.5 | 82.5 | | HRFormer-S | 74.5 | 92.3 | 82.1 | -|:--:|:--:|:--:|:--:| | MixFormer-B4 | **75.3** | **93.5** | **83.5** | @@ -84,7 +81,6 @@ All results are trained with a multi-scale 3x schedule. |:--:|:--:|:--:|:--:| | ResNet50 | 21.7 | 34.3 | 23.0 | | Swin-T | 27.6 | 43.0 | 29.3 | -|:--:|:--:|:--:|:--:| | MixFormer-B4 | **28.6** | **43.4** | **30.5** | diff --git a/docs/zh_CN/models/MixFormer.md b/docs/zh_CN/models/MixFormer.md index ff28029b40..38649a4355 100644 --- a/docs/zh_CN/models/MixFormer.md +++ b/docs/zh_CN/models/MixFormer.md @@ -47,9 +47,8 @@ MixFormer是一个高效、通用的骨干网路(Vision Transformer)。在Mi 下表中的所有结果都以Mask R-CNN为基础模型,并且采用3x多尺度训练得到的。 | Backbone | Params (M) | FLOPs (G) | schedule | mAP_box| mAP_mask | -|:--:|:--:|:--:|:--:|:--:| --:| +|:--:|:--:|:--:|:--:|:--:| :--:| | Swin-T | 48 | 264 | 3x | 46.0| 41.6 | -|:--:|:--:|:--:|:--:|:--:| --:| | MixFormer-B1 | 26 | 183 | 3x | 43.9 | 40.0 | | MixFormer-B2 | 28 | 187 | 3x | 45.1 | 40.8 | | MixFormer-B3 | 35 | 207 | 3x | 46.2 | 41.9 | @@ -60,9 +59,8 @@ MixFormer是一个高效、通用的骨干网路(Vision Transformer)。在Mi 下表中的所有结果都以UperNet为基础模型。 | Backbone | Params (M) | FLOPs (G) | iterations | mIoU_ss | mIoU_ms | -|:--:|:--:|:--:|:--:|:--:| --:| +|:--:|:--:|:--:|:--:|:--:| :--:| | Swin-T | 60 | 945 | 160k | 44.5| 45.8 | -|:--:|:--:|:--:|:--:|:--:| --:| | MixFormer-B1 | 35 | 854 | 160k | 42.0 | 43.5 | | MixFormer-B2 | 37 | 859 | 160k | 43.1 | 43.9 | | MixFormer-B3 | 44 | 880 | 160k | 44.5 | 45.5 | @@ -76,7 +74,6 @@ MixFormer是一个高效、通用的骨干网路(Vision Transformer)。在Mi | ResNet50 | 71.8 | 89.8 | 79.5 | | Swin-T | 74.2 | 92.5 | 82.5 | | HRFormer-S | 74.5 | 92.3 | 82.1 | -|:--:|:--:|:--:|:--:| | MixFormer-B4 | **75.3** | **93.5** | **83.5** | @@ -86,11 +83,10 @@ MixFormer是一个高效、通用的骨干网路(Vision Transformer)。在Mi |:--:|:--:|:--:|:--:| | ResNet50 | 21.7 | 34.3 | 23.0 | | Swin-T | 27.6 | 43.0 | 29.3 | -|:--:|:--:|:--:|:--:| | MixFormer-B4 | **28.6** | **43.4** | **30.5** | -## 3. Reference +## 3. 引用 如果MixFormer对你有所启发,请考虑引用我们的MixFormer: ``` From a6ce0e0c306912828ddf66aad06d060a1cbd9ca7 Mon Sep 17 00:00:00 2001 From: chenqiang13 Date: Mon, 11 Apr 2022 23:53:28 +0800 Subject: [PATCH 4/8] update readme --- docs/en/models/MixFormer_en.md | 4 +++- docs/zh_CN/models/MixFormer.md | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/en/models/MixFormer_en.md b/docs/en/models/MixFormer_en.md index 897899346b..5806251ca9 100644 --- a/docs/en/models/MixFormer_en.md +++ b/docs/en/models/MixFormer_en.md @@ -16,8 +16,10 @@ MixFormer is an efficient and general-purpose hybrid vision transformer. There are two main designs in MixFormer: (1) combining local-window self-attention and depth-wise convolution in a parallel design, (2) proposing bi-directional interactions across branches to provide complementary clues in channel and spatial dimensions. These two designs are integrated to achieve efficient feature mixing among windows and dimensions. MixFormer provides superior performance than other vision transformer variants on image classification and 5 dense prediction tasks. -> [**MixFormer: Mixing Features across Windows and Dimensions**](https://arxiv.org/abs/2204.02557), +> [**MixFormer: Mixing Features across Windows and Dimensions**](https://arxiv.org/abs/2204.02557) + > Qiang Chen, Qiman Wu, Jian Wang, Qinghao Hu, Tao Hu, Errui Ding, Jian Cheng, Jingdong Wang + > CVPR2022, **Oral** presentation ![image](../../images/MixFormer/MixingBlock.png) diff --git a/docs/zh_CN/models/MixFormer.md b/docs/zh_CN/models/MixFormer.md index 38649a4355..4e38e31b9b 100644 --- a/docs/zh_CN/models/MixFormer.md +++ b/docs/zh_CN/models/MixFormer.md @@ -16,8 +16,10 @@ MixFormer是一个高效、通用的骨干网路(Vision Transformer)。在MixFormer中,主要有两个创新的设计:(1)通过平行分支的设计,将局部窗口自注意力(local-window self-attention)与Depthwise卷积进行组合,解决局部窗口自注意力的感受野受限的问题,(2)在平行分支之间提出双向交互模块,使得两个分支可以在channel和spatial两个维度都能实现信息互补,增强整体的建模能力。上述两个设计的组合使得MixFormer可以融合不同局部窗口与不同维度的特征信息,从而在图像分类以及5个重要的下游任务中取得比其他vision transformer骨干网络更好的结果。 -> [**MixFormer: Mixing Features across Windows and Dimensions**](https://arxiv.org/abs/2204.02557), +> [**MixFormer: Mixing Features across Windows and Dimensions**](https://arxiv.org/abs/2204.02557) + > Qiang Chen, Qiman Wu, Jian Wang, Qinghao Hu, Tao Hu, Errui Ding, Jian Cheng, Jingdong Wang + > CVPR2022, **Oral** presentation ![image](../../images/MixFormer/MixingBlock.png) From c2921cfc29b5ff4bec2147afa02a97a3aaf73bdc Mon Sep 17 00:00:00 2001 From: chenqiang13 Date: Mon, 11 Apr 2022 23:54:49 +0800 Subject: [PATCH 5/8] update readme --- docs/en/models/MixFormer_en.md | 6 ++---- docs/zh_CN/models/MixFormer.md | 6 ++---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/docs/en/models/MixFormer_en.md b/docs/en/models/MixFormer_en.md index 5806251ca9..3f83c9e3c9 100644 --- a/docs/en/models/MixFormer_en.md +++ b/docs/en/models/MixFormer_en.md @@ -16,10 +16,8 @@ MixFormer is an efficient and general-purpose hybrid vision transformer. There are two main designs in MixFormer: (1) combining local-window self-attention and depth-wise convolution in a parallel design, (2) proposing bi-directional interactions across branches to provide complementary clues in channel and spatial dimensions. These two designs are integrated to achieve efficient feature mixing among windows and dimensions. MixFormer provides superior performance than other vision transformer variants on image classification and 5 dense prediction tasks. -> [**MixFormer: Mixing Features across Windows and Dimensions**](https://arxiv.org/abs/2204.02557) - -> Qiang Chen, Qiman Wu, Jian Wang, Qinghao Hu, Tao Hu, Errui Ding, Jian Cheng, Jingdong Wang - +> [**MixFormer: Mixing Features across Windows and Dimensions**](https://arxiv.org/abs/2204.02557)
+> Qiang Chen, Qiman Wu, Jian Wang, Qinghao Hu, Tao Hu, Errui Ding, Jian Cheng, Jingdong Wang
> CVPR2022, **Oral** presentation ![image](../../images/MixFormer/MixingBlock.png) diff --git a/docs/zh_CN/models/MixFormer.md b/docs/zh_CN/models/MixFormer.md index 4e38e31b9b..11458c8096 100644 --- a/docs/zh_CN/models/MixFormer.md +++ b/docs/zh_CN/models/MixFormer.md @@ -16,10 +16,8 @@ MixFormer是一个高效、通用的骨干网路(Vision Transformer)。在MixFormer中,主要有两个创新的设计:(1)通过平行分支的设计,将局部窗口自注意力(local-window self-attention)与Depthwise卷积进行组合,解决局部窗口自注意力的感受野受限的问题,(2)在平行分支之间提出双向交互模块,使得两个分支可以在channel和spatial两个维度都能实现信息互补,增强整体的建模能力。上述两个设计的组合使得MixFormer可以融合不同局部窗口与不同维度的特征信息,从而在图像分类以及5个重要的下游任务中取得比其他vision transformer骨干网络更好的结果。 -> [**MixFormer: Mixing Features across Windows and Dimensions**](https://arxiv.org/abs/2204.02557) - -> Qiang Chen, Qiman Wu, Jian Wang, Qinghao Hu, Tao Hu, Errui Ding, Jian Cheng, Jingdong Wang - +> [**MixFormer: Mixing Features across Windows and Dimensions**](https://arxiv.org/abs/2204.02557)
+> Qiang Chen, Qiman Wu, Jian Wang, Qinghao Hu, Tao Hu, Errui Ding, Jian Cheng, Jingdong Wang
> CVPR2022, **Oral** presentation ![image](../../images/MixFormer/MixingBlock.png) From 60239c9d80c5b3486bab6b1ca66cb87df65047c0 Mon Sep 17 00:00:00 2001 From: chenqiang13 Date: Tue, 27 Sep 2022 11:12:23 +0800 Subject: [PATCH 6/8] add part of pretrained models for mixformer --- ppcls/arch/backbone/model_zoo/mixformer.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/ppcls/arch/backbone/model_zoo/mixformer.py b/ppcls/arch/backbone/model_zoo/mixformer.py index ee01032196..e4054c4865 100644 --- a/ppcls/arch/backbone/model_zoo/mixformer.py +++ b/ppcls/arch/backbone/model_zoo/mixformer.py @@ -27,13 +27,11 @@ # TODO: update the urls of the pre-trained models MODEL_URLS = { - "mixformer-B0": "", - "mixformer-B1": "", - "mixformer-B2": "", - "mixformer-B3": "", - "mixformer-B4": "", - "mixformer-B5": "", - "mixformer-B6": "", + "mixformer-B1": "https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MixFormer_B1_pretrained.pdparams", + "mixformer-B2": "https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MixFormer_B2_pretrained.pdparams", + "mixformer-B3": "https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MixFormer_B3_pretrained.pdparams", + "mixformer-B4": "https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MixFormer_B4_pretrained.pdparams", + "mixformer-B6": "https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MixFormer_B6_pretrained.pdparams", } __all__ = list(MODEL_URLS.keys()) From 633f25c033060e92cf3f13e5dee8d617fae07a22 Mon Sep 17 00:00:00 2001 From: chenqiang13 Date: Tue, 27 Sep 2022 11:57:31 +0800 Subject: [PATCH 7/8] update readme for mixformer --- docs/zh_CN/models/ImageNet1k/MixFormer.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/zh_CN/models/ImageNet1k/MixFormer.md b/docs/zh_CN/models/ImageNet1k/MixFormer.md index 11458c8096..c5253b42c6 100644 --- a/docs/zh_CN/models/ImageNet1k/MixFormer.md +++ b/docs/zh_CN/models/ImageNet1k/MixFormer.md @@ -30,15 +30,15 @@ MixFormer是一个高效、通用的骨干网路(Vision Transformer)。在Mi ### 图像分类 我们提供了MixFormer在ImageNet-1K数据集上的精度。与其他vision transformer不同的是,MixFormer即使在小模型的场景下,也能有很好的性能表现,而其他的vision transformer往往只有在模型较大的情况下(例如,4.5G FLOPs)才比较有效。 -| Models | Top1 | Top5 | Reference top1| FLOPs (G) | -|:--:|:--:|:--:|:--:|:--:| -| MixFormer-B0 | - | - | 0.765 | 0.4 | -| MixFormer-B1 | - | - | 0.789 | 0.7 | -| MixFormer-B2 | - | - | 0.800 | 0.9 | -| MixFormer-B3 | - | - | 0.817 | 1.9 | -| MixFormer-B4 | - | - | 0.830 | 3.6 | -| MixFormer-B5 | - | - | 0.835 | 6.8 | -| MixFormer-B6 | - | - | 0.838 | 12.7 | +| Models | Top1 | FLOPs (G) | +|:--:|:--:|:--:| +| MixFormer-B0 | 0.765 | 0.4 | +| MixFormer-B1 | 0.789 | 0.7 | +| MixFormer-B2 | 0.800 | 0.9 | +| MixFormer-B3 | 0.817 | 1.9 | +| MixFormer-B4 | 0.830 | 3.6 | +| MixFormer-B5 | 0.835 | 6.8 | +| MixFormer-B6 | 0.838 | 12.7 | 模型后续将提供下载。 From bf5f021b0e9d162e77af86b5ba1604ab122c321e Mon Sep 17 00:00:00 2001 From: chenqiang13 Date: Tue, 27 Sep 2022 12:16:26 +0800 Subject: [PATCH 8/8] minor fix for mixformer --- docs/en/models/MixFormer_en.md | 20 +++++++++----------- docs/zh_CN/models/ImageNet1k/MixFormer.md | 5 ++--- ppcls/arch/backbone/__init__.py | 2 +- 3 files changed, 12 insertions(+), 15 deletions(-) diff --git a/docs/en/models/MixFormer_en.md b/docs/en/models/MixFormer_en.md index 3f83c9e3c9..20779d866e 100644 --- a/docs/en/models/MixFormer_en.md +++ b/docs/en/models/MixFormer_en.md @@ -29,17 +29,15 @@ MixFormer is an efficient and general-purpose hybrid vision transformer. There a ### Results on ImageNet-1K We provide the accuracy with FLOPs of MixFormer on ImageNet-1K. Unlike other vision transformer variants, they only show promising results when the FLOPs are pretty large (e.g., 4.5G). MixFormer can achieve favorable results **with small model sizes (FLOPs < 1G)**, which are nontrivial results. -| Models | Top1 | Top5 | Reference top1| FLOPs (G) | -|:--:|:--:|:--:|:--:|:--:| -| MixFormer-B0 | - | - | 0.765 | 0.4 | -| MixFormer-B1 | - | - | 0.789 | 0.7 | -| MixFormer-B2 | - | - | 0.800 | 0.9 | -| MixFormer-B3 | - | - | 0.817 | 1.9 | -| MixFormer-B4 | - | - | 0.830 | 3.6 | -| MixFormer-B5 | - | - | 0.835 | 6.8 | -| MixFormer-B6 | - | - | 0.838 | 12.7 | - -The models are coming soon. +| Models | Top1 | FLOPs (G) | +|:--:|:--:|:--:| +| MixFormer-B0 | 0.765 | 0.4 | +| MixFormer-B1 | 0.789 | 0.7 | +| MixFormer-B2 | 0.800 | 0.9 | +| MixFormer-B3 | 0.817 | 1.9 | +| MixFormer-B4 | 0.830 | 3.6 | +| MixFormer-B5 | 0.835 | 6.8 | +| MixFormer-B6 | 0.838 | 12.7 | ### Results on MS COCO with Mask R-CNN diff --git a/docs/zh_CN/models/ImageNet1k/MixFormer.md b/docs/zh_CN/models/ImageNet1k/MixFormer.md index c5253b42c6..ab96dbed4d 100644 --- a/docs/zh_CN/models/ImageNet1k/MixFormer.md +++ b/docs/zh_CN/models/ImageNet1k/MixFormer.md @@ -20,7 +20,7 @@ MixFormer是一个高效、通用的骨干网路(Vision Transformer)。在Mi > Qiang Chen, Qiman Wu, Jian Wang, Qinghao Hu, Tao Hu, Errui Ding, Jian Cheng, Jingdong Wang
> CVPR2022, **Oral** presentation -![image](../../images/MixFormer/MixingBlock.png) +![image](../../../images/MixFormer/MixingBlock.png) @@ -38,9 +38,8 @@ MixFormer是一个高效、通用的骨干网路(Vision Transformer)。在Mi | MixFormer-B3 | 0.817 | 1.9 | | MixFormer-B4 | 0.830 | 3.6 | | MixFormer-B5 | 0.835 | 6.8 | -| MixFormer-B6 | 0.838 | 12.7 | +| MixFormer-B6 | 0.838 | 12.7 | -模型后续将提供下载。 ### 目标检测与实例分割 diff --git a/ppcls/arch/backbone/__init__.py b/ppcls/arch/backbone/__init__.py index 593b3a9aaf..61aba63cbb 100644 --- a/ppcls/arch/backbone/__init__.py +++ b/ppcls/arch/backbone/__init__.py @@ -65,7 +65,7 @@ from .model_zoo.cspnet import CSPDarkNet53 from .model_zoo.pvt_v2 import PVT_V2_B0, PVT_V2_B1, PVT_V2_B2_Linear, PVT_V2_B2, PVT_V2_B3, PVT_V2_B4, PVT_V2_B5 from .model_zoo.mobilevit import MobileViT_XXS, MobileViT_XS, MobileViT_S -from ppcls.arch.backbone.model_zoo.mixformer import MixFormer_B0, MixFormer_B1, MixFormer_B2, MixFormer_B3, MixFormer_B4, MixFormer_B5, MixFormer_B6 +from .model_zoo.mixformer import MixFormer_B0, MixFormer_B1, MixFormer_B2, MixFormer_B3, MixFormer_B4, MixFormer_B5, MixFormer_B6 from .model_zoo.repvgg import RepVGG_A0, RepVGG_A1, RepVGG_A2, RepVGG_B0, RepVGG_B1, RepVGG_B2, RepVGG_B1g2, RepVGG_B1g4, RepVGG_B2g4, RepVGG_B3g4 from .model_zoo.van import VAN_tiny from .model_zoo.peleenet import PeleeNet