
    3j                         % S SK Jr  S SKrS SKJs  Jr  S SKJr  S SKJr  S SK	J
r
  0 r\\\4   \S'   S\S'   S	\S
'   S\S'    " S S\R                  5      r " S S\R                  5      rg)    )DictN)nn)KORNIA_CHECK_SHAPE)is_mps_tensor_safeurlsz]https://github.com/DagnyT/hardnet/raw/master/pretrained/pretrained_all_datasets/HardNet++.pthz	hardnet++znhttps://github.com/DagnyT/hardnet/raw/master/pretrained/train_liberty_with_aug/checkpoint_liberty_with_aug.pthliberty_augz/http://cmp.felk.cvut.cz/~mishkdmy/hardnet8v2.pt
hardnet8v2c                      ^  \ rS rSrSrSrSS\SS4U 4S jjjr\SS\	R                  S	\S\	R                  4S
 jj5       rS\	R                  S\	R                  4S jrSrU =r$ )HardNet#   aF  Module, which computes HardNet descriptors of given grayscale patches of 32x32.

This is based on the original code from paper "Working hard to know your neighbor's
margins: Local descriptor learning loss". See :cite:`HardNet2017` for more details.

Args:
    pretrained: Download and set pretrained weights to the model.

Returns:
    torch.Tensor: HardNet descriptor of the patches.

Shape:
    - Input: :math:`(B, 1, 32, 32)`
    - Output: :math:`(B, 128)`

Examples:
    >>> input = torch.rand(16, 1, 32, 32)
    >>> hardnet = HardNet()
    >>> descs = hardnet(input) # 16x128

    
pretrainedreturnNc                   > [         TU ]  5         [        R                  " [        R                  " SSSSSS9[        R
                  " SSS9[        R                  " 5       [        R                  " SSSSSS9[        R
                  " SSS9[        R                  " 5       [        R                  " SSSSSSS	9[        R
                  " SSS9[        R                  " 5       [        R                  " SSSSSS9[        R
                  " SSS9[        R                  " 5       [        R                  " SS
SSSSS	9[        R
                  " S
SS9[        R                  " 5       [        R                  " S
S
SSSS9[        R
                  " S
SS9[        R                  " 5       [        R                  " S5      [        R                  " S
S
SSS9[        R
                  " S
SS95      U l        U(       aL  [        R                  R                  [        S   [        R                  " S5      S9nU R                  US   SS9  U R                  5         g )N   r      Fkernel_sizepaddingbiasaffine@      r   strider   r      333333?   r   r   r   cpumap_location
state_dictTstrict)super__init__r   
SequentialConv2dBatchNorm2dReLUDropoutfeaturestorchhubload_state_dict_from_urlr   deviceload_state_dictevalselfr   pretrained_dict	__class__s      P/home/wildlama/miniconda3/lib/python3.13/site-packages/kornia/feature/hardnet.pyr(   HardNet.__init__<   s   IIaAEBNN2e,GGIIIb"!QUCNN2e,GGIIIb"!AquMNN2e,GGIIIb"!QUCNN2e,GGIIIb#1QNNN3u-GGIIIc3AquENN3u-GGIJJsOIIc3AE:NN3u-+
2 #ii@@mATchcocopucv@wO  !>t L		    xepsc                     [        U 5      (       d  [        R                  " U SSS9u  p#O,[        R                  " U SSS9n[        R                  " U SSS9nXR                  5       -
  UR                  5       U-   -  $ zNormalize the input by batch.)T)dimkeepdimr   r/   std_meanmeanstddetachr<   r=   spmps       r9   _normalize_inputHardNet._normalize_input\   i     "!$$^^A<FFBA<>B1,=B IIKBIIK#$566r;   inputc                     [        U/ SQ5        U R                  U5      nU R                  U5      nUR                  UR	                  S5      S5      n[
        R                  " USS9$ N)B132rU   r   rB   r   )rC   )r   rM   r.   viewsizeF	normalize)r6   rP   x_norm
x_featuresx_outs        r9   forwardHardNet.forwardi   sU    5"89#44U;#'==#8

 2B7{{5a((r;   r.   F)gư>)__name__
__module____qualname____firstlineno____doc__
patch_sizeboolr(   staticmethodr/   TensorfloatrM   r]   __static_attributes____classcell__r8   s   @r9   r   r   #   sy    , J4 D  @ 
7ELL 
7u 
7 
7 
7)U\\ )ell ) )r;   r   c                      ^  \ rS rSrSrSrSS\SS4U 4S jjjr\S\	SS4S	 j5       r
\SS
\R                  S\S\R                  4S jj5       rS\R                  S\R                  4S jrSrU =r$ )HardNet8q   a  Module, which computes HardNet8 descriptors of given grayscale patches of 32x32.

This is based on the original code from paper "Improving the HardNet Descriptor".
See :cite:`HardNet2020` for more details.

Args:
    pretrained: Download and set pretrained weights to the model.

Returns:
    torch.Tensor: HardNet8 descriptor of the patches.

Shape:
    - Input: :math:`(B, 1, 32, 32)`
    - Output: :math:`(B, 128)`

Examples:
    >>> input = torch.rand(16, 1, 32, 32)
    >>> hardnet = HardNet8()
    >>> descs = hardnet(input) # 16x128

r   r   r   Nc                 "  > [         TU ]  5         [        R                  " [        R                  " SSSSSS9[        R
                  " SSS9[        R                  " 5       [        R                  " SSSSSS9[        R
                  " SSS9[        R                  " 5       [        R                  " SSSSSSS	9[        R
                  " SSS9[        R                  " 5       [        R                  " SSSSSS9[        R
                  " SSS9[        R                  " 5       [        R                  " SS
SSSSS	9[        R
                  " S
SS9[        R                  " 5       [        R                  " S
S
SSSS9[        R
                  " S
SS9[        R                  " 5       [        R                  " S
SSSSS9[        R
                  " SSS9[        R                  " 5       [        R                  " S5      [        R                  " SSSSS9[        R
                  " SSS95      U l        U R                  R                  U R                  5        U R                  S[        R                  " SS
[        R                  S95        U R                  S[        R                  " S[        R                  S95        U(       aI  [        R                   R#                  [$        S   [        R&                  " S5      S9nU R)                  USS9  U R+                  5         g )Nr   r   r   Fr   r   r   r   r   r      r   i   r   r    
components)dtyperG   r	   r!   r"   Tr%   )r'   r(   r   r)   r*   r+   r,   r-   r.   applyweights_initregister_bufferr/   onesrj   zerosr0   r1   r   r2   r3   r4   r5   s      r9   r(   HardNet8.__init__   s    IIaAEBNN2e,GGIIIb"!QUCNN2e,GGIIIb"!AquMNN2e,GGIIIb"!QUCNN2e,GGIIIb#1QNNN3u-GGIIIc3AquENN3u-GGIIIc3AquENN3u-GGIJJsOIIc3AE:NN3u-1
4 	D--.\5::c3ekk+RSVU[[EKK%HI #ii@@lASbgbnbnotbu@vO   >		r;   mc                 ,   [        U [        R                  5      (       au  [        R                  R	                  U R
                  R                  SS9  U R                  b5  [        R                  R                  U R                  R                  S5        g g g )Ng333333?)gaing{Gz?)	
isinstancer   r*   initorthogonal_weightdatar   	constant_)r{   s    r9   rv   HardNet8.weights_init   sb    a##GGC8vv!!!!&&++t4 " $r;   r<   r=   c                     [        U 5      (       d  [        R                  " U SSS9u  p#O,[        R                  " U SSS9n[        R                  " U SSS9nXR                  5       -
  UR                  5       U-   -  $ r?   rE   rJ   s       r9   rM   HardNet8._normalize_input   rO   r;   rP   c                    [        U/ SQ5        U R                  U5      nU R                  U5      n[        R                  R                  [        R                  U R                  5      n[        R                  R                  [        R                  U R                  5      n[        R                  " UR                  UR                  S5      S5      5      n[        R                  " Xd-
  U5      n[        R                  " USS9$ rR   )r   rM   r.   r/   jitannotateri   rG   rs   rX   rY   rV   rW   mm)r6   rP   rZ   r[   rG   rs   x_prePCApcas           r9   r]   HardNet8.forward   s    5"89#44U;#'==#8
"YY//diiH#(99#5#5ellDOO#T
;;zzq/A2FGhhx
3{{3A&&r;   r_   r`   )gHz>)ra   rb   rc   rd   re   rf   rg   r(   rh   objectrv   r/   ri   rj   rM   r]   rk   rl   rm   s   @r9   ro   ro   q   s    , J$4 $D $ $L 5 54 5 5 
7ELL 
7u 
7 
7 
7'U\\ 'ell ' 'r;   ro   )typingr   r/   torch.nn.functionalr   
functionalrX   kornia.core.checkr   kornia.core.utilsr   r   str__annotations__Moduler   ro    r;   r9   <module>r      sw   $      0 0d38n s[ t ]  G\ K)bii K)\['ryy ['r;   