
    3jX                        S SK r S SKJrJrJrJrJrJr  S SKrS SKJ	r	  S SK
Jr  S SKJr  S SKJr  S SKJr  S SKJr  S	S
KJr  S	SKJr  S	SKJr  S	SKJrJrJrJrJr  S	SK J!r!  S	SK"J#r#J$r$  S	SK%J&r&J'r'J(r(  S	SK)J*r*J+r+J,r,J-r-  S	SK.J/r/J0r0J1r1J2r2  S	SK3J4r4    S/S\Rj                  S\Rj                  S\	Rl                  S\7S\8S\Rj                  4S jjr9 " S S\	Rl                  5      r: " S S\	Rl                  5      r; " S S \;5      r< " S! S"\;5      r= " S# S$\;5      r> " S% S&\;5      r? " S' S(\;5      r@ " S) S*\;5      rA " S+ S,\	Rl                  5      rB " S- S.\#5      rCg)0    N)ClassVarDictListOptionalTupleUnion)nn)rgb_to_grayscale)pi)KORNIA_CHECK_LAF)ConvQuadInterp3d)ScalePyramid   )LAFAffNetShapeEstimator)HardNet)KeyNetDetector)extract_patches_from_pyramidget_laf_centerget_laf_orientationget_laf_scale	scale_laf)	LightGlue)GeometryAwareDescriptorMatcher	_no_match)LAFOrienterOriNetPassLAF)BlobDoGBlobDoGSingleBlobHessian
CornerGFTT)Detector_configMultiResolutionDetectorScaleSpaceDetectorget_default_detector_config)SIFTDescriptorimglafspatch_descriptor
patch_sizegrayscale_descriptorreturnc                 :   [        U5        UR                  U 5      nUR                  5         U nUR                  S   S:X  ai  [        R
                  " SUR                   S3SS9  [        R                  " UR                  S   UR                  S   SUR                  UR                  S9$ U(       a   U R                  S5      S:X  a  [        U 5      n[        XQU5      nUR                  5       u  pxpnU" UR                  Xx-  XU5      5      R                  XxS	5      $ )
a$  Get local descriptors, corresponding to LAFs (keypoints).

Args:
    img: image features with shape :math:`(B,C,H,W)`.
    lafs: local affine frames :math:`(B,N,2,3)`.
    patch_descriptor: patch descriptor module, e.g. :class:`~kornia.feature.SIFTDescriptor`
        or :class:`~kornia.feature.HardNet`.
    patch_size: patch size in pixels, which descriptor expects.
    grayscale_descriptor: True if ``patch_descriptor`` expects single-channel image.

Returns:
    Local descriptors of shape :math:`(B,N,D)` where :math:`D` is descriptor size.

r   r   zLAF contains no keypoints z, returning empty torch.Tensor)
stacklevel   )dtypedevice   )r   toevalshapewarningswarntorchemptyr0   r1   sizer
   r   view)r'   r(   r)   r*   r+   timgpatchesBNCHHWs               S/home/wildlama/miniconda3/lib/python3.13/site-packages/kornia/feature/integrated.pyget_laf_descriptorsrE   /   s    * T'**3/Dzz!}24::,>\]jkl{{4::a=$**Q-DJJW[WbWbccq 0$8ZPG \\^NA"GLLq9:??bII    c            	          ^  \ rS rSrSr   SS\\R                     S\S\	SS4U 4S jjjr
S\4S	 jrS
\R                  S\R                  S\R                  4S jrSrU =r$ )LAFDescriptorV   a  nn.Module to get local descriptors, corresponding to LAFs (keypoints).

Internally uses :func:`~kornia.feature.get_laf_descriptors`.

Args:
    patch_descriptor_module: patch descriptor module, e.g. :class:`~kornia.feature.SIFTDescriptor`
        or :class:`~kornia.feature.HardNet`. Default: :class:`~kornia.feature.HardNet`.
    patch_size: patch size in pixels, which descriptor expects.
    grayscale_descriptor: ``True`` if patch_descriptor expects single-channel image.

Npatch_descriptor_moduler*   r+   r,   c                 b   > [         TU ]  5         Uc  [        S5      nXl        X l        X0l        g )NT)super__init__r   
descriptorr*   r+   )selfrJ   r*   r+   	__class__s       rD   rM   LAFDescriptor.__init__c   s0     	"*&-dm#1$$8!rF   c                     U R                   R                   SU R                  R                  5        SU R                   SU R
                   S3$ )Nz(descriptor=z, patch_size=z, grayscale_descriptor='))rP   __name__rN   __repr__r*   r+   )rO   s    rD   rU   LAFDescriptor.__repr__p   sT    ~~&&'4??3356 7//* +%%)%>%>$?qB	
rF   r'   r(   c                 Z    [        XU R                  U R                  U R                  5      $ )ah  Three stage local feature detection.

First the location and scale of interest points are determined by
detect function. Then affine shape and orientation.

Args:
    img: image features with shape :math:`(B,C,H,W)`.
    lafs: local affine frames :math:`(B,N,2,3)`.

Returns:
    Local descriptors of shape :math:`(B,N,D)` where :math:`D` is descriptor size.

)rE   rN   r*   r+   )rO   r'   r(   s      rD   forwardLAFDescriptor.forwardx   s$     #3dootPTPiPijjrF   )rN   r+   r*   )N    T)rT   
__module____qualname____firstlineno____doc__r   r	   ModuleintboolrM   strrU   r9   TensorrX   __static_attributes____classcell__rP   s   @rD   rH   rH   V   s    
 8<%)	9!)"))!49 9 #	9
 
9 9
# 
k5<< ku|| k k krF   rH   c            
          ^  \ rS rSrSrSS\R                  S\S\SS4U 4S jjjr	 SS	\
R                  S
\\
R                     S\\
R                  \
R                  \
R                  4   4S jjrSrU =r$ )LocalFeature   a   nn.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)

detectorrN   scaling_coefr,   Nc                 n   > [         TU ]  5         Xl        X l        US::  a  [	        SU 35      eX0l        g )Nr   z!Scaling coef should be >= 0, got )rL   rM   rj   rN   
ValueErrorrk   )rO   rj   rN   rk   rP   s       rD   rM   LocalFeature.__init__   s9     $1@OPP(rF   r'   maskc                 |    U R                  X5      u  p4[        X0R                  5      nU R                  X5      nX4U4$ )a  Run forward.

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.

)rj   r   rk   rN   )rO   r'   ro   r(   	responsesdescss         rD   rX   LocalFeature.forward   s=      --2001*''rF   )rN   rj   rk   )      ?N)rT   r[   r\   r]   r^   r	   r_   rH   floatrM   r9   rc   r   r   rX   rd   re   rf   s   @rD   rh   rh      s    ) ) )UZ )ei ) ) AE(<<('/'=(	u||U\\5<<7	8( (rF   rh   c                      ^  \ rS rSrSr       SS\S\S\S\S\\	R                  4   S\\   S	\S
\SS4U 4S jjjrSrU =r$ )SIFTFeature   a  Convenience module, which implements DoG detector + (Root)SIFT descriptor.

Using `kornia.feature.MultiResolutionDetector` without blur pyramid Still not as good as OpenCV/VLFeat because of
https://github.com/kornia/kornia/pull/884,
but we are working on it
Nnum_featuresuprightrootsiftr1   configcompile_modelscore_thresholdr,   c           
      J  > SnUc  [         R                  " S5      nUc
  [        5       n[        [	        SS5      UUU(       a
  [        5       O
[        S5      [        5       UUS9R                  U5      n	[        [        XS9USS	9R                  U5      n
[        TU ]-  X5        g )
N)   cpurt   皙?   )
ori_module
aff_moduler~   r   r*   r|   Tr*   r+   )r9   r1   r%   r#   r   r   r   r4   rH   r&   rL   rM   )rO   rz   r{   r|   r1   r}   r~   r   r*   rj   rN   rP   s              rD   rM   SIFTFeature.__init__   s     
>\\%(F>02F*#s#$+wyRy'+
 "V* 	 #jDQ[rv

"V* 	 	.rF    )@  FTNNF        )rT   r[   r\   r]   r^   r`   ra   r   rb   r9   r1   r   r"   rv   rM   rd   re   rf   s   @rD   rx   rx      s     !15,0#!$// / 	/
 dC-./ )/ / / 
/ /rF   rx   c                      ^  \ rS rSrSr     SS\S\S\S\S\\	R                  4   S\\\\   4   S	S4U 4S
 jjjrSrU =r$ )SIFTFeatureScaleSpace   zConvenience module, which implements DoG detector + (Root)SIFT descriptor.

Using `kornia.feature.ScaleSpaceDetector` with blur pyramid.

Still not as good as OpenCV/VLFeat because of https://github.com/kornia/kornia/pull/884, but we are working on it
Nrz   r{   r|   r1   compile_modulesr,   c                 B  > Uc  [         R                  " S5      nSn[        U[        5       [	        SS9[        SSSSS	9U(       a
  [        5       O
[        S
5      SSSUS9	R                  U5      n[        [        XcS9USS9R                  U5      n[        T	U ]1  Xx5        g )Nr   r   r   )strict_maxima_bonusr2   r   rZ   Tdouble_imager         @)resp_modulesubpix_modulescale_pyr_moduler   scale_space_responseminima_are_also_goodmr_sizer   r   r   )r9   r1   r$   r   r   r   r   r   r4   rH   r&   rL   rM   )
rO   rz   r{   r|   r1   r   r*   rj   rN   rP   s
            rD   rM   SIFTFeatureScaleSpace.__init__   s     >\\%(F
%	*sC)!S"4H$+wyR!%!%+

 "V* 	 #jDQ[rv

"V* 	 	.rF   r   )r   FTNFrT   r[   r\   r]   r^   r`   ra   r   rb   r9   r1   r   rM   rd   re   rf   s   @rD   r   r      sz     !1527// / 	/
 dC-./ tT#Y// 
/ /rF   r   c                      ^  \ rS rSrSr    SS\S\S\S\\	R                  4   S\\\\   4   SS4
U 4S	 jjjrS
rU =r$ )GFTTAffNetHardNet   zOConvenience module, which implements GFTT detector + AffNet-HardNet descriptor.Nrz   r{   r1   r   r,   c                 N  > Uc  [         R                  " S5      n[        U[        5       [	        SSSSS9U(       a
  [        5       O
[        S5      [        SSS	9R                  5       SSS
US9	R                  U5      n[        S SSS9R                  U5      n[        TU ]1  XV5        g Nr   r2   r   rZ   Tr   r   Fpreserve_orientationr   )r   r   r   r   r   r   r   r   r   )r9   r1   r$   r!   r   r   r   r   r5   r4   rH   rL   rM   rO   rz   r{   r1   r   rj   rN   rP   s          rD   rM   GFTTAffNetHardNet.__init__   s     >\\%(F%")!S"4H$+wyR.t%PUUW!&!&+

 "V* 	 #4BTRUUV\]
.rF   r   )r   FNFr   rf   s   @rD   r   r      sk    Y !1527// / dC-.	/
 tT#Y// 
/ /rF   r   c                      ^  \ rS rSrSr    SS\S\S\S\\	R                  4   S\\\\   4   SS4
U 4S	 jjjrS
rU =r$ )HesAffNetHardNeti  zRConvenience module, which implements Hessian detector + AffNet-HardNet descriptor.Nrz   r{   r1   r   r,   c                 N  > Uc  [         R                  " S5      n[        U[        5       [	        SSSSS9U(       a
  [        5       O
[        S5      [        SSS	9R                  5       SSS
US9	R                  U5      n[        S SSS9R                  U5      n[        TU ]1  XV5        g r   )r9   r1   r$   r    r   r   r   r   r5   r4   rH   rL   rM   r   s          rD   rM   HesAffNetHardNet.__init__  s     >\\%(F%#)!S"4H$+wyR.t%PUUW!&!&+

 "V* 	 #4BTRUUV\]
.rF   r   )i   FNFr   rf   s   @rD   r   r     sk    \ !1527// / dC-.	/
 tT#Y// 
/ /rF   r   c                   |   ^  \ rS rSrSr      SS\S\S\S\\	R                  4   S\S\S	\S
S4U 4S jjjrSrU =r$ )KeyNetHardNeti1  zJConvenience module, which implements KeyNet detector + HardNet descriptor.Nrz   r{   r1   r   r~   r   r,   c                 
  > Uc  [         R                  " S5      nU(       a
  [        5       O[        [	        S5      S9n[        SUUUUS9R                  U5      n[        S SSS9R                  U5      n	[        T
U ]%  XU5        g )Nr   Tangle_detector)rz   r   r~   r   rZ   r   )
r9   r1   r   r   r   r   r4   rH   rL   rM   rO   rz   r{   r1   r   r~   r   r   rj   rN   rP   s             rD   rM   KeyNetHardNet.__init__4  s     >\\%(F")WY{&QU,/W
!%!'+
 "V* 	 #4BTRUUV\]
y9rF   r   r   FNrt   Fr   rT   r[   r\   r]   r^   r`   ra   r   rb   r9   r1   rv   rM   rd   re   rf   s   @rD   r   r   1  sx    T !15#!$:: : dC-.	:
 : : : 
: :rF   r   c                   |   ^  \ rS rSrSr      SS\S\S\S\\	R                  4   S\S\S	\S
S4U 4S jjjrSrU =r$ )KeyNetAffNetHardNetiK  z~Convenience module, which implements KeyNet detector + AffNet + HardNet descriptor.

.. image:: _static/img/keynet_affnet.jpg
Nrz   r{   r1   r   r~   r   r,   c           
      8  > Uc  [         R                  " S5      nU(       a
  [        5       O[        [	        S5      S9n[        SUU[        SSS9R                  5       UUS9R                  U5      n[        S SSS9R                  U5      n	[        T
U ]-  XU5        g )	Nr   Tr   Fr   )rz   r   r   r~   r   rZ   r   )r9   r1   r   r   r   r   r   r5   r4   rH   rL   rM   r   s             rD   rM   KeyNetAffNetHardNet.__init__Q  s     >\\%(F")WY{&QU,/W
!%!.t%PUUW'+
 "V* 	 #4BTRUUV\]
y9rF   r   r   r   rf   s   @rD   r   r   K  sz     !15#!$:: : dC-.	:
 : : : 
: :rF   r   c            	         ^  \ rS rSrSrS\R                  S\R                  SS4U 4S jjrSS\R                  S	\
\R                     S\\\R                  4   4S
 jjrS\\\R                  S4   S\R                   S\\\R                  4   4S jrS\\\R                  4   S\\\R                  4   4S jrSrU =r$ )LocalFeatureMatcherii  a  nn.Module, which finds correspondences between two images based on local features.

Args:
    local_feature: Local feature detector. See :class:`~kornia.feature.GFTTAffNetHardNet`.
    matcher: Descriptor matcher, see :class:`~kornia.feature.DescriptorMatcher`.

Returns:
    Dict[str, torch.Tensor]: Dictionary with image correspondences and confidence scores.

Example:
    >>> img1 = torch.rand(1, 1, 320, 200)
    >>> img2 = torch.rand(1, 1, 128, 128)
    >>> input = {"image0": img1, "image1": img2}
    >>> gftt_hardnet_matcher = LocalFeatureMatcher(
    ...     GFTTAffNetHardNet(10), kornia.feature.DescriptorMatcher('snn', 0.8)
    ... )
    >>> out = gftt_hardnet_matcher(input)

local_featurematcherr,   Nc                 Z   > [         TU ]  5         Xl        X l        U R	                  5         g ru   )rL   rM   r   r   r5   )rO   r   r   rP   s      rD   rM   LocalFeatureMatcher.__init__~  s"    *		rF   imagero   c                 4    U R                  X5      u  p4nX4US.$ )z#Extract features from simple image.)r(   rq   descriptors)r   )rO   r   ro   lafs0resps0descs0s         rD   extract_features$LocalFeatureMatcher.extract_features  s"     $ 2 25 ?v6JJrF   r1   r0   c                 &   [         R                  " SSXS9[         R                  " SSXS9[         R                  " SSSSXS9[         R                  " SSSSXS9[         R                  " SXS9[         R                  " SU[         R                  S9S.$ )Nr      r1   r0   r2   
keypoints0
keypoints1r   lafs1
confidencebatch_indexes)r9   r:   long)rO   r1   r0   s      rD   no_match_output#LocalFeatureMatcher.no_match_output  sv    ++a6G++a6G[[Aq!FH[[Aq!FH++aD"[[6L
 	
rF   datac           
         US   R                   S   nSUR                  5       ;  d  SUR                  5       ;  a  U R                  US   5      nUS   US   pTO	US   US   pTSUR                  5       ;  d  SUR                  5       ;  a  U R                  US	   5      nUS   US   pO	US   US   p[        U5      n	[        U5      n
/ n/ n/ n/ n/ n/ n[	        U5       GH  nU R                  UU   UU   5      u  nn[        U5      S:X  a  M0  U	UUS
S
2S4   4   nU
UUS
S
2S4   4   nUUUS
S
2S4   4   nUUUS
S
2S4   4   nUR                  SU-
  5        U[        R                  " [        U5      U	R                  [        R                  S9-  nUR                  U5        UR                  U5        UR                  U5        UR                  U5        UR                  U5        GM     [        U5      S:X  a,  U R                  US   R                  US   R                  5      $ [        R                  " USS9R                  SS5      [        R                  " USS9R                  SS5      [        R                  " USS9R                  SSSS5      [        R                  " USS9R                  SSSS5      [        R                  " USS9R                  S5      [        R                  " USS9R                  S5      S.$ )a@  Run forward.

Args:
    data: dictionary containing the input data in the following format:

Keyword Args:
    image0: left image with shape :math:`(N, 1, H1, W1)`.
    image1: right image with shape :math:`(N, 1, H2, W2)`.
    mask0 (optional): left image mask. '0' indicates a padded position :math:`(N, H1, W1)`.
    mask1 (optional): right image mask. '0' indicates a padded position :math:`(N, H2, W2)`.

Returns:
    - ``keypoints0``, matching keypoints from image0 :math:`(NC, 2)`.
    - ``keypoints1``, matching keypoints from image1 :math:`(NC, 2)`.
    - ``confidence``, confidence score [0, 1] :math:`(NC)`.
    - ``lafs0``, matching LAFs from image0 :math:`(1, NC, 2, 3)`.
    - ``lafs1``, matching LAFs from image1 :math:`(1, NC, 2, 3)`.
    - ``batch_indexes``, batch indexes for the keypoints and lafs :math:`(NC)`.

image0r   r   descriptors0r(   r   r   descriptors1image1Nr   rt   r   dimr3   r   r2   r   )r6   keysr   r   ranger   lenappendr9   onesr1   r   r   r0   catr<   )rO   r   num_image_pairsfeats_dict0r   r   feats_dict1r   descs1r   r   out_keypoints0out_keypoints1out_confidenceout_batch_indexes	out_lafs0	out_lafs1	batch_idxdistsidxscurrent_keypoints_0current_keypoints_1current_lafs_0current_lafs_1
batch_idxss                            rD   rX   LocalFeatureMatcher.forward  s   *  $H~33A6499;&N$))+,M373H3Hh3XK'/]1K6 M4+?6499;&N$))+,M373H3Hh3XK'/]1K6 M4+?6#1%#8
#1%#8
-/-/-/02(*	(*	/I,,vi'8&:KLKE44yA~",YQT
-B"C",YQT
-B"C"9d1a4j#89N"9d1a4j#89N!!#+."UZZE
:CTCT\a\f\f%ggJ!!"56!!"56^,^,$$Z0! 0$  !Q&''X(=(=tH~?S?STT  ))N:??AF))N:??AFYYya055aQBYYya055aQB))N:??C"YY'8a@EEbI
 	
rF   )r   r   ru   )rT   r[   r\   r]   r^   r	   r_   rM   r9   rc   r   r   rb   r   r   r1   r0   r   rX   rd   re   rf   s   @rD   r   r   i  s    (bii "))  Kell K(5<<:P K\`adfkfrfrar\s K

eCt,C&D 
U[[ 
]abeglgsgsbs]t 
J
Dell!23 J
S%,,=N8O J
 J
rF   r   c                   6  ^  \ rS rSr% Sr/ SQr\\\      \	S'   SS\S\
\   SS4U 4S	 jjjr  SS
\R                  S\R                  S\R                  S\R                  S\
\\\4      S\
\\\4      S\\R                  \R                  4   4S jjrSrU =r$ )LightGlueMatcheri  a+  LightGlue-based matcher in kornia API.

This is based on the original code from paper "LightGlue: Local Feature Matching at Light Speed".
See :cite:`LightGlue2023` for more details.

Args:
    feature_name: type of feature for matching, can be `disk` or `superpoint`.
    params: LightGlue params.

)	alikeddedodebdedodegdiskdog_affnet_hardnet
doghardnetkeynet_affnet_hardnetsift
superpointknown_modesNfeature_nameparamsr,   c                    > UR                  5       n[        TU ]	  U5        X0l        Uc  0 nX l        [        U R                  40 UD6U l        g ru   )lowerrL   rM   r   r   r   r   )rO   r   r   feature_name_rP   s       rD   rM   LightGlueMatcher.__init__  sJ    )//1')>F !2!2=f=rF   desc1desc2r   lafs2hw1hw2c           
         UR                   S   S:  d  UR                   S   S:  a  [        U5      $ [        U5      n[        U5      n[        UR                   5      S:X  a  UR	                  S5      n[        UR                   5      S:X  a  UR	                  S5      nUR
                  n	Uc0  UR                  SS9S   R                  5       R                  S5      n
O[        R                  " XYS9n
Uc0  UR                  SS9S   R                  5       R                  S5      nO[        R                  " XiS9n[        R                  " [        U5      R                  SS5      5      nXS:  ==   S[        -  -  ss'   [        R                  " [        U5      R                  SS5      5      nXS:  ==   S[        -  -  ss'   U[        U5      R                  SS5      UUUU
R                  S5      R                  SS5      R!                  U	5      S.UU[        U5      R                  SS5      UUUR                  S5      R                  SS5      R!                  U	5      S	.S
.nU R#                  U5      nUS   US   nnUS:  n[        R$                  " [        R&                  " U5      S   UU   /S5      nUU   R                  SS5      U4$ )a  Run forward.

Args:
    desc1: Batch of descriptors of a shape :math:`(B1, D)`.
    desc2: Batch of descriptors of a shape :math:`(B2, D)`.
    lafs1: LAFs of a shape :math:`(1, B1, 2, 3)`.
    lafs2: LAFs of a shape :math:`(1, B2, 2, 3)`.
    hw1: Height/width of image.
    hw2: Height/width of image.

Return:
    - Descriptor distance of matching descriptors, shape of :math:`(B3, 1)`.
    - Long torch.Tensor indexes of matching descriptors in desc1 and desc2,
        shape of :math:`(B3, 2)` where :math:`0 <= B3 <= B1`.

r   r   r   r   )r1   r3   g       @)	keypointsscalesorisr(   r   
image_size)r  r(   r  r  r   r  )r   r   matches0matching_scores0)r6   r   r   r   	unsqueezer1   maxsqueezeflipr9   tensordeg2radr   reshaper   r   r4   r   stackwhere)rO   r  r  r   r  r  r	  r   
keypoints2devhw1_hw2_ori0ori1
input_dictpredr  mscores0validmatchess                       rD   rX   LightGlueMatcher.forward  sx   2 KKNQEKKNQ$6U###E*
#E*
u{{q OOA&Eu{{q OOA&Ell;>>a>(+335::1=D<<0D;>>a>(+335::1=D<<0D}}07??2FGAX#("}}07??2FGAX#(" ('.66q"=$"iil222q9<<SA ('.66q"=$"iil222q9<<SA

$ ||J'!*-t4F/G(2++u{{51!4huoFK&&r1-w66rF   )r   r   r   )r   N)NN)rT   r[   r\   r]   r^   r   r   r   rb   __annotations__r   r   rM   r9   rc   r   r`   rX   rd   re   rf   s   @rD   r   r     s    	
(K$s)$ 
>S >8D> >UY > > *.)-D7||D7 ||D7 ||	D7
 ||D7 eCHo&D7 eCHo&D7 
u||U\\)	*D7 D7rF   r   )rZ   T)Dr7   typingr   r   r   r   r   r   r9   r	   kornia.colorr
   kornia.constantsr   kornia.core.checkr   kornia.geometry.subpixr   kornia.geometry.transformr   affine_shaper   hardnetr   keynetr   lafr   r   r   r   r   	lightgluer   matchingr   r   orientationr   r   r   rq   r   r   r    r!   scale_space_detectorr"   r#   r$   r%   siftdescr&   rc   r_   r`   ra   rE   rH   rh   rx   r   r   r   r   r   r   r   r   rF   rD   <module>r6     sB  $  ? ?   )  . 3 2 1  " l l   ? 5 5 F F  % !%$J	$J
,,$J ii$J 	$J
 $J \\$JN0kBII 0kf%(299 %(P#/, #/L!/L !/H/ /6/| /6:L :4:, :<t
")) t
ne75 e7rF   