|
@@ -7,7 +7,7 @@ import torch
|
|
|
import torch.nn as nn
|
|
import torch.nn as nn
|
|
|
import torch.nn.functional as F
|
|
import torch.nn.functional as F
|
|
|
|
|
|
|
|
-from .layers_2d import Conv2dBN
|
|
|
|
|
|
|
+from .layers_2d import Conv2dGN
|
|
|
from .lib_mamba.vmamba import SS2D as VMambaSS2D
|
|
from .lib_mamba.vmamba import SS2D as VMambaSS2D
|
|
|
|
|
|
|
|
|
|
|
|
@@ -16,13 +16,13 @@ class XNetStem2d(nn.Module):
|
|
|
def __init__(self, in_channels: int, stem_channels: int, out_channels: int) -> None:
|
|
def __init__(self, in_channels: int, stem_channels: int, out_channels: int) -> None:
|
|
|
super().__init__()
|
|
super().__init__()
|
|
|
self.block = nn.Sequential(
|
|
self.block = nn.Sequential(
|
|
|
- Conv2dBN(in_channels, stem_channels, 3, 2, 1),
|
|
|
|
|
|
|
+ Conv2dGN(in_channels, stem_channels, 3, 2, 1),
|
|
|
nn.ReLU(inplace=True),
|
|
nn.ReLU(inplace=True),
|
|
|
- Conv2dBN(stem_channels, stem_channels, 3, 1, 1, groups=stem_channels),
|
|
|
|
|
|
|
+ Conv2dGN(stem_channels, stem_channels, 3, 1, 1, groups=stem_channels),
|
|
|
nn.ReLU(inplace=True),
|
|
nn.ReLU(inplace=True),
|
|
|
- Conv2dBN(stem_channels, out_channels, 1, 1, 0),
|
|
|
|
|
|
|
+ Conv2dGN(stem_channels, out_channels, 1, 1, 0),
|
|
|
nn.ReLU(inplace=True),
|
|
nn.ReLU(inplace=True),
|
|
|
- Conv2dBN(out_channels, out_channels, 3, 2, 1),
|
|
|
|
|
|
|
+ Conv2dGN(out_channels, out_channels, 3, 2, 1),
|
|
|
nn.ReLU(inplace=True),
|
|
nn.ReLU(inplace=True),
|
|
|
)
|
|
)
|
|
|
|
|
|
|
@@ -36,7 +36,7 @@ class XNetDownsample2d(nn.Module):
|
|
|
if mode != "conv":
|
|
if mode != "conv":
|
|
|
raise ValueError(f"Unsupported downsample mode: {mode}")
|
|
raise ValueError(f"Unsupported downsample mode: {mode}")
|
|
|
self.block = nn.Sequential(
|
|
self.block = nn.Sequential(
|
|
|
- Conv2dBN(in_channels, out_channels, 3, 2, 1),
|
|
|
|
|
|
|
+ Conv2dGN(in_channels, out_channels, 3, 2, 1),
|
|
|
nn.ReLU(inplace=True),
|
|
nn.ReLU(inplace=True),
|
|
|
)
|
|
)
|
|
|
|
|
|
|
@@ -49,14 +49,14 @@ class XLocalBranch2d(nn.Module):
|
|
|
def __init__(self, channels: int) -> None:
|
|
def __init__(self, channels: int) -> None:
|
|
|
super().__init__()
|
|
super().__init__()
|
|
|
self.branch3 = nn.Sequential(
|
|
self.branch3 = nn.Sequential(
|
|
|
- Conv2dBN(channels, channels, 3, 1, 1, groups=channels),
|
|
|
|
|
|
|
+ Conv2dGN(channels, channels, 3, 1, 1, groups=channels),
|
|
|
nn.ReLU(inplace=True),
|
|
nn.ReLU(inplace=True),
|
|
|
- Conv2dBN(channels, channels, 1, 1, 0),
|
|
|
|
|
|
|
+ Conv2dGN(channels, channels, 1, 1, 0),
|
|
|
)
|
|
)
|
|
|
self.branch5 = nn.Sequential(
|
|
self.branch5 = nn.Sequential(
|
|
|
- Conv2dBN(channels, channels, 5, 1, 2, groups=channels),
|
|
|
|
|
|
|
+ Conv2dGN(channels, channels, 5, 1, 2, groups=channels),
|
|
|
nn.ReLU(inplace=True),
|
|
nn.ReLU(inplace=True),
|
|
|
- Conv2dBN(channels, channels, 1, 1, 0),
|
|
|
|
|
|
|
+ Conv2dGN(channels, channels, 1, 1, 0),
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
def forward(self, x: torch.Tensor) -> torch.Tensor:
|
|
def forward(self, x: torch.Tensor) -> torch.Tensor:
|
|
@@ -114,16 +114,16 @@ class XWaveletBranch2d(nn.Module):
|
|
|
channels, wavelet_type=wavelet_type, wavelet_level=wavelet_level
|
|
channels, wavelet_type=wavelet_type, wavelet_level=wavelet_level
|
|
|
)
|
|
)
|
|
|
self.ll_proj = nn.Sequential(
|
|
self.ll_proj = nn.Sequential(
|
|
|
- Conv2dBN(channels, channels, 3, 1, 1),
|
|
|
|
|
|
|
+ Conv2dGN(channels, channels, 3, 1, 1),
|
|
|
nn.ReLU(inplace=True),
|
|
nn.ReLU(inplace=True),
|
|
|
)
|
|
)
|
|
|
self.high_proj = nn.Sequential(
|
|
self.high_proj = nn.Sequential(
|
|
|
- Conv2dBN(channels * 3, channels * 3, 3, 1, 1, groups=channels * 3),
|
|
|
|
|
|
|
+ Conv2dGN(channels * 3, channels * 3, 3, 1, 1, groups=channels * 3),
|
|
|
nn.ReLU(inplace=True),
|
|
nn.ReLU(inplace=True),
|
|
|
- Conv2dBN(channels * 3, channels * 3, 1, 1, 0),
|
|
|
|
|
|
|
+ Conv2dGN(channels * 3, channels * 3, 1, 1, 0),
|
|
|
)
|
|
)
|
|
|
self.out_proj = nn.Sequential(
|
|
self.out_proj = nn.Sequential(
|
|
|
- Conv2dBN(channels, channels, 1, 1, 0),
|
|
|
|
|
|
|
+ Conv2dGN(channels, channels, 1, 1, 0),
|
|
|
nn.ReLU(inplace=True),
|
|
nn.ReLU(inplace=True),
|
|
|
)
|
|
)
|
|
|
|
|
|
|
@@ -150,7 +150,7 @@ class XSSMGlobalBranch2d(nn.Module):
|
|
|
hidden_ratio = max(global_ratio, 1.0)
|
|
hidden_ratio = max(global_ratio, 1.0)
|
|
|
self.backend = ssm_backend
|
|
self.backend = ssm_backend
|
|
|
self.pre = nn.Sequential(
|
|
self.pre = nn.Sequential(
|
|
|
- Conv2dBN(channels, channels, 1, 1, 0),
|
|
|
|
|
|
|
+ Conv2dGN(channels, channels, 1, 1, 0),
|
|
|
nn.ReLU(inplace=True),
|
|
nn.ReLU(inplace=True),
|
|
|
)
|
|
)
|
|
|
self.ssm = VMambaSS2D(
|
|
self.ssm = VMambaSS2D(
|
|
@@ -164,7 +164,7 @@ class XSSMGlobalBranch2d(nn.Module):
|
|
|
channel_first=True,
|
|
channel_first=True,
|
|
|
)
|
|
)
|
|
|
self.post = nn.Sequential(
|
|
self.post = nn.Sequential(
|
|
|
- Conv2dBN(channels, channels, 1, 1, 0),
|
|
|
|
|
|
|
+ Conv2dGN(channels, channels, 1, 1, 0),
|
|
|
nn.ReLU(inplace=True),
|
|
nn.ReLU(inplace=True),
|
|
|
)
|
|
)
|
|
|
|
|
|
|
@@ -225,7 +225,7 @@ class XBranchFusion2d(nn.Module):
|
|
|
fused_channels = channels * num_branches
|
|
fused_channels = channels * num_branches
|
|
|
hidden_channels = max(channels // 4, 8)
|
|
hidden_channels = max(channels // 4, 8)
|
|
|
self.fuse = nn.Sequential(
|
|
self.fuse = nn.Sequential(
|
|
|
- Conv2dBN(fused_channels, channels, 1, 1, 0),
|
|
|
|
|
|
|
+ Conv2dGN(fused_channels, channels, 1, 1, 0),
|
|
|
nn.ReLU(inplace=True),
|
|
nn.ReLU(inplace=True),
|
|
|
)
|
|
)
|
|
|
self.gate = nn.Sequential(
|
|
self.gate = nn.Sequential(
|
|
@@ -258,7 +258,7 @@ class XTEB2d(nn.Module):
|
|
|
ssm_backend: str = "auto",
|
|
ssm_backend: str = "auto",
|
|
|
) -> None:
|
|
) -> None:
|
|
|
super().__init__()
|
|
super().__init__()
|
|
|
- self.pre_norm = Conv2dBN(channels, channels, 1, 1, 0)
|
|
|
|
|
|
|
+ self.pre_norm = Conv2dGN(channels, channels, 1, 1, 0)
|
|
|
self.local_branch = XLocalBranch2d(channels)
|
|
self.local_branch = XLocalBranch2d(channels)
|
|
|
self.wavelet_branch = (
|
|
self.wavelet_branch = (
|
|
|
XWaveletBranch2d(
|
|
XWaveletBranch2d(
|
|
@@ -280,14 +280,14 @@ class XTEB2d(nn.Module):
|
|
|
)
|
|
)
|
|
|
self.fusion = XBranchFusion2d(channels, num_branches=3)
|
|
self.fusion = XBranchFusion2d(channels, num_branches=3)
|
|
|
self.post = nn.Sequential(
|
|
self.post = nn.Sequential(
|
|
|
- Conv2dBN(channels, channels, 3, 1, 1),
|
|
|
|
|
|
|
+ Conv2dGN(channels, channels, 3, 1, 1),
|
|
|
nn.ReLU(inplace=True),
|
|
nn.ReLU(inplace=True),
|
|
|
- Conv2dBN(channels, channels, 1, 1, 0, bn_weight_init=0.0),
|
|
|
|
|
|
|
+ Conv2dGN(channels, channels, 1, 1, 0, bn_weight_init=0.0),
|
|
|
)
|
|
)
|
|
|
self.ffn = nn.Sequential(
|
|
self.ffn = nn.Sequential(
|
|
|
- Conv2dBN(channels, channels * 2, 1, 1, 0),
|
|
|
|
|
|
|
+ Conv2dGN(channels, channels * 2, 1, 1, 0),
|
|
|
nn.ReLU(inplace=True),
|
|
nn.ReLU(inplace=True),
|
|
|
- Conv2dBN(channels * 2, channels, 1, 1, 0, bn_weight_init=0.0),
|
|
|
|
|
|
|
+ Conv2dGN(channels * 2, channels, 1, 1, 0, bn_weight_init=0.0),
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
def forward(self, x: torch.Tensor) -> torch.Tensor:
|
|
def forward(self, x: torch.Tensor) -> torch.Tensor:
|
|
@@ -426,15 +426,15 @@ class XSkipFusion2d(nn.Module):
|
|
|
def __init__(self, in_channels: int, skip_channels: int, out_channels: int) -> None:
|
|
def __init__(self, in_channels: int, skip_channels: int, out_channels: int) -> None:
|
|
|
super().__init__()
|
|
super().__init__()
|
|
|
self.input_proj = nn.Sequential(
|
|
self.input_proj = nn.Sequential(
|
|
|
- Conv2dBN(in_channels, out_channels, 1, 1, 0),
|
|
|
|
|
|
|
+ Conv2dGN(in_channels, out_channels, 1, 1, 0),
|
|
|
nn.ReLU(inplace=True),
|
|
nn.ReLU(inplace=True),
|
|
|
)
|
|
)
|
|
|
self.skip_proj = nn.Sequential(
|
|
self.skip_proj = nn.Sequential(
|
|
|
- Conv2dBN(skip_channels, out_channels, 1, 1, 0),
|
|
|
|
|
|
|
+ Conv2dGN(skip_channels, out_channels, 1, 1, 0),
|
|
|
nn.ReLU(inplace=True),
|
|
nn.ReLU(inplace=True),
|
|
|
)
|
|
)
|
|
|
self.fuse = nn.Sequential(
|
|
self.fuse = nn.Sequential(
|
|
|
- Conv2dBN(out_channels * 2, out_channels, 3, 1, 1),
|
|
|
|
|
|
|
+ Conv2dGN(out_channels * 2, out_channels, 3, 1, 1),
|
|
|
nn.ReLU(inplace=True),
|
|
nn.ReLU(inplace=True),
|
|
|
)
|
|
)
|
|
|
|
|
|
|
@@ -467,9 +467,9 @@ class XFrequencyRefine2d(nn.Module):
|
|
|
nn.Sigmoid(),
|
|
nn.Sigmoid(),
|
|
|
)
|
|
)
|
|
|
self.refine = nn.Sequential(
|
|
self.refine = nn.Sequential(
|
|
|
- Conv2dBN(channels, channels, 3, 1, 1, groups=channels),
|
|
|
|
|
|
|
+ Conv2dGN(channels, channels, 3, 1, 1, groups=channels),
|
|
|
nn.ReLU(inplace=True),
|
|
nn.ReLU(inplace=True),
|
|
|
- Conv2dBN(channels, channels, 1, 1, 0),
|
|
|
|
|
|
|
+ Conv2dGN(channels, channels, 1, 1, 0),
|
|
|
)
|
|
)
|
|
|
self.learnable_low_freq_radius = learnable_low_freq_radius
|
|
self.learnable_low_freq_radius = learnable_low_freq_radius
|
|
|
if learnable_low_freq_radius:
|
|
if learnable_low_freq_radius:
|
|
@@ -565,9 +565,9 @@ class XCRB2d(nn.Module):
|
|
|
else nn.Identity()
|
|
else nn.Identity()
|
|
|
)
|
|
)
|
|
|
self.out_refine = nn.Sequential(
|
|
self.out_refine = nn.Sequential(
|
|
|
- Conv2dBN(out_channels, out_channels, 3, 1, 1),
|
|
|
|
|
|
|
+ Conv2dGN(out_channels, out_channels, 3, 1, 1),
|
|
|
nn.ReLU(inplace=True),
|
|
nn.ReLU(inplace=True),
|
|
|
- Conv2dBN(out_channels, out_channels, 3, 1, 1, bn_weight_init=0.0),
|
|
|
|
|
|
|
+ Conv2dGN(out_channels, out_channels, 3, 1, 1, bn_weight_init=0.0),
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
def forward(
|
|
def forward(
|
|
@@ -586,9 +586,9 @@ class XNetHeadRefine2d(nn.Module):
|
|
|
if out_channels is None:
|
|
if out_channels is None:
|
|
|
out_channels = channels
|
|
out_channels = channels
|
|
|
self.block = nn.Sequential(
|
|
self.block = nn.Sequential(
|
|
|
- Conv2dBN(channels, out_channels, 3, 1, 1),
|
|
|
|
|
|
|
+ Conv2dGN(channels, out_channels, 3, 1, 1),
|
|
|
nn.ReLU(inplace=True),
|
|
nn.ReLU(inplace=True),
|
|
|
- Conv2dBN(out_channels, out_channels, 3, 1, 1),
|
|
|
|
|
|
|
+ Conv2dGN(out_channels, out_channels, 3, 1, 1),
|
|
|
nn.ReLU(inplace=True),
|
|
nn.ReLU(inplace=True),
|
|
|
)
|
|
)
|
|
|
|
|
|
|
@@ -662,7 +662,7 @@ class XNetSegHead2d(nn.Module):
|
|
|
) -> None:
|
|
) -> None:
|
|
|
super().__init__()
|
|
super().__init__()
|
|
|
self.block = nn.Sequential(
|
|
self.block = nn.Sequential(
|
|
|
- Conv2dBN(in_channels, in_channels, 3, 1, 1),
|
|
|
|
|
|
|
+ Conv2dGN(in_channels, in_channels, 3, 1, 1),
|
|
|
nn.ReLU(inplace=True),
|
|
nn.ReLU(inplace=True),
|
|
|
nn.Conv2d(in_channels, num_classes, kernel_size=1, bias=True),
|
|
nn.Conv2d(in_channels, num_classes, kernel_size=1, bias=True),
|
|
|
)
|
|
)
|