class_docstr: Module, which combines local feature detector and descriptor.
  
  Args:
      detector: the detection module.
      descriptor: the descriptor module.
      scaling_coef: multiplier for change default detector scale (e.g. it is too small for KeyNet by default)
class_docstr_tok: ["Module",",","which","combines","local","feature","detector","and","descriptor",".","Args",":","detector",":","the","detection","module",".","descriptor",":","the","descriptor","module",".","scaling_coef",":","multiplier","for","change","default","detector","scale","(","e.g",".","it","is","too","small","for","KeyNet","by","default",")"]
docstr: Args:
      img: image to extract features with shape :math:`(B,C,H,W)`.
      mask: a mask with weights where to apply the response function.
          The shape must be the same as the input image.
  
  Returns:
      - Detected local affine frames with shape :math:`(B,N,2,3)`.
      - Response function values for corresponding lafs with shape :math:`(B,N,1)`.
      - Local descriptors of shape :math:`(B,N,D)` where :math:`D` is descriptor size.
docstr_tok: ["Args",":","img",":","image","to","extract","features","with","shape",":","math",":","`","(","B",",","C",",","H",",","W",")","`",".","mask",":","a","mask","with","weights","where","to","apply","the","response","function",".","The","shape","must","be","the","same","as","the","input","image",".","Returns",":","-","Detected","local","affine","frames","with","shape",":","math",":","`","(","B",",","N,2,3",")","`",".","-","Response","function","values","for","corresponding","lafs","with","shape",":","math",":","`","(","B",",","N,1",")","`",".","-","Local","descriptors","of","shape",":","math",":","`","(","B",",","N",",","D",")","`","where",":","math",":","`","D","`","is","descriptor","size","."]
code: def forward(
      self, img: Tensor, mask: Optional[Tensor] = None
  ) -> Tuple[Tensor, Tensor, Tensor]:
      """
      Args:
          img: image to extract features with shape :math:`(B,C,H,W)`.
          mask: a mask with weights where to apply the response function.
              The shape must be the same as the input image.
  
      Returns:
          - Detected local affine frames with shape :math:`(B,N,2,3)`.
          - Response function values for corresponding lafs with shape :math:`(B,N,1)`.
          - Local descriptors of shape :math:`(B,N,D)` where :math:`D` is descriptor size.
      """
      lafs, responses = self.detector(img, mask)
      lafs = scale_laf(lafs, self.scaling_coef)
      descs = self.descriptor(img, lafs)
      return (lafs, responses, descs)
  
imports: import warnings
  from typing import ClassVar, Dict, List, Optional, Tuple
  import torch
  from kornia.color import rgb_to_grayscale
  from kornia.constants import pi
  from kornia.core import Device, Module, Tensor, concatenate, deg2rad
  from kornia.core.check import KORNIA_CHECK_LAF
  from kornia.geometry.subpix import ConvQuadInterp3d
  from kornia.geometry.transform import ScalePyramid
  from .affine_shape import LAFAffNetShapeEstimator
  from .hardnet import HardNet
  from .keynet import KeyNetDetector
  from .laf import extract_patches_from_pyramid, get_laf_center, get_laf_orientation, get_laf_scale, scale_laf
  from .lightglue import LightGlue
  from .matching import GeometryAwareDescriptorMatcher, _no_match
  from .orientation import LAFOrienter, OriNet, PassLAF
  from .responses import BlobDoG, BlobDoGSingle, BlobHessian, CornerGFTT
  from .scale_space_detector import Detector_config, MultiResolutionDetector, ScaleSpaceDetector, get_default_detector_config
  from .siftdesc import SIFTDescriptor
label_desc: Use image node_id 2 for calling the LocalFeature obj's underlying member method code with example usage: obj.forward(img, mask) and returns: lafs,  responses,  descs