class_docstr: Junction decoder based on the SuperPoint architecture.
  
  Args:
      input_feat_dim: channel size of the input features.
  Returns:
      the junction heatmap, with shape (B, H, W).
class_docstr_tok: ["Junction","decoder","based","on","the","SuperPoint","architecture",".","Args",":","input_feat_dim",":","channel","size","of","the","input","features",".","Returns",":","the","junction","heatmap",",","with","shape","(","B",",","H",",","W",")","."]
code: def forward(self, input_features: Tensor) -> Tensor:
      feat = self.relu(self.convPa(input_features))
      semi = self.convPb(feat)
  
      # Convert from semi-dense to dense heatmap
      junc_prob = softmax(semi, dim=1)
      junc_pred = pixel_shuffle(
          junc_prob[:, :-1, :, :], self.grid_size
      )[:, 0]
      return junc_pred
  
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 2 for calling the SuperpointDecoder obj's underlying member method code with example usage: obj.forward(input_features) and returns: junc_pred