class_docstr: Full network for SOLD².
  
  Args:
      model_cfg: the configuration as a Dict.
  Returns:
      a Dict with the following values:
          junctions: heatmap of junctions.
          heatmap: line heatmap.
          descriptors: semi-dense descriptors.
class_docstr_tok: ["Full","network","for","SOLD\u00b2",".","Args",":","model_cfg",":","the","configuration","as","a","Dict",".","Returns",":","a","Dict","with","the","following","values",":","junctions",":","heatmap","of","junctions",".","heatmap",":","line","heatmap",".","descriptors",":","semi-dense","descriptors","."]
code: def __init__(self, model_cfg: Dict[str, Any]) -> None:
      super().__init__()
      self.cfg = model_cfg
  
      # Backbone
      self.backbone_net = HourglassBackbone(**self.cfg["backbone_cfg"])
      feat_channel = 256
  
      # Junction decoder
      self.junction_decoder = SuperpointDecoder(
          feat_channel, self.cfg["grid_size"]
      )
  
      # Line heatmap decoder
      self.heatmap_decoder = PixelShuffleDecoder(
          feat_channel, num_upsample=2
      )
  
      # Descriptor decoder
      if "use_descriptor" in self.cfg:
          self.descriptor_decoder = SuperpointDescriptor(feat_channel)
  
imports: from typing import Any, Dict, List, NamedTuple, Optional, Tuple, Type, Union
  import torch
  import torch.nn.functional
  from torch import nn
  from torch.nn.functional import pixel_shuffle, softmax
  from kornia.core import Module, Tensor
label_desc: Use image node_id 1 to create a new SOLD2Net object from inherited base classes: Module with example: obj = SOLD2Net(model_cfg)