| from konfai.network import network | |
| import segmentation_models_pytorch as smp | |
| import torch | |
| class Head(network.ModuleArgsDict): | |
| def __init__(self): | |
| super().__init__() | |
| self.add_module("Tanh", torch.nn.Tanh()) | |
| class UNetpp(network.Network): | |
| # 5 input channels = a 2.5D stack of 5 adjacent slices. This is intrinsic to the pretrained weights, | |
| # not a tunable — so it is fixed here and never exposed in the config. | |
| IN_CHANNELS = 5 | |
| def __init__(self, | |
| optimizer : network.OptimizerLoader = network.OptimizerLoader(), | |
| schedulers: dict[str, network.LRSchedulersLoader] = { | |
| "default:ReduceLROnPlateau": network.LRSchedulersLoader(0) | |
| }, | |
| outputs_criterions: dict[str, network.TargetCriterionsLoader] = {"default" : network.TargetCriterionsLoader()}): | |
| super().__init__(in_channels = UNetpp.IN_CHANNELS, optimizer = optimizer, schedulers = schedulers, outputs_criterions = outputs_criterions, dim = 2) | |
| self.add_module("model", smp.UnetPlusPlus( | |
| encoder_name="resnet34", | |
| encoder_weights=None, | |
| in_channels=UNetpp.IN_CHANNELS, | |
| classes=1, | |
| activation=None | |
| )) | |
| self.add_module("Head", Head()) |