class_docstr: Descriptor decoder based on the SuperPoint arcihtecture.
  
  Args:
      input_feat_dim: channel size of the input features.
  Returns:
      the semi-dense descriptors with shape (B, 128, H/4, W/4).
class_docstr_tok: ["Descriptor","decoder","based","on","the","SuperPoint","arcihtecture",".","Args",":","input_feat_dim",":","channel","size","of","the","input","features",".","Returns",":","the","semi-dense","descriptors","with","shape","(","B",",","128",",","H\/4",",","W\/4",")","."]
code: def forward(self, input_features: Tensor) -> Tensor:
      feat = self.relu(self.convPa(input_features))
      semi = self.convPb(feat)
  
      return semi
  
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 SuperpointDescriptor obj's underlying member method code with example usage: obj.forward(input_features) and returns: semi