class_docstr: Inspired by: Multi-Scale Progressive Fusion Learning for Depth Map Super-Resolution
  https://arxiv.org/pdf/2011.11865v1.pdf
code: def __init__(
      self,
      input_channels: List[int],
      output_channels: List[int],
      upsample_factor: int,
  ):
      super().__init__()
  
      activation = "relu"
      batch_norm = None
      self.scales = ["x32", "x16", "x8", "x4", "x2", "x1"]
  
      self.depth_encoder = MultiscaleConvDepthEncoder(upsample_factor)
      depth_output_channels = self.depth_encoder.output_channels[::-1]
      rgb_output_channels = input_channels
  
      self.upsample_blocks = {}
      for i in range(len(self.scales) - 1):
          ch_input = (
              rgb_output_channels[i]
              + depth_output_channels[i]
              + (output_channels[i - 1] if i > 0 else 0)
          )
          conv_layers = nn.Sequential(
              Conv2D(
                  ch_input,
                  output_channels[i],
                  kernel_size=3,
                  activation=activation,
                  padding=1,
                  batch_norm=batch_norm,
              ),
              Conv2D(
                  output_channels[i],
                  output_channels[i],
                  kernel_size=3,
                  activation=activation,
                  padding=1,
                  batch_norm=batch_norm,
              ),
          )
  
          upsample = Upsample2D(
              output_channels[i],
              output_channels[i],
          )
          setattr(self, f"conv_layers_{self.scales[i]}", conv_layers)
          setattr(self, f"upsample_{self.scales[i]}", upsample)
          self.upsample_blocks[self.scales[i]] = (conv_layers, upsample)
  
      ch_input = (
          3
          + depth_output_channels[-1]
          + (output_channels[i - 1] if i > 0 else 0)
      )
  
      conv_layers = nn.Sequential(
          Conv2D(
              ch_input,
              output_channels[i],
              kernel_size=3,
              activation=activation,
              padding=1,
              batch_norm=batch_norm,
          ),
          Conv2D(
              output_channels[i],
              1,
              kernel_size=3,
              activation=None,
              padding=1,
              batch_norm=batch_norm,
          ),
      )
      setattr(self, f"conv_layers_x1", conv_layers)
      self.upsample_blocks["x1"] = (conv_layers, None)
  
file_path: ARKitScenes/depth_upsampling/models/mspf/MultiScaleDepthSR.py
imports: from typing import List
  import torch
  from torch import nn
  from models.mspf.MultiscaleConvDepthEncoder import MultiscaleConvDepthEncoder
  from models.mspf.blocks.multi_scale_depth import Upsample2D, Conv2D
label_desc: Use image node_id 1 to create a new MultiscaleDepthDecoder object from inherited base classes: nn with example: obj = MultiscaleDepthDecoder(input_channels, output_channels, upsample_factor)