
    j.                        d dl Z d dlZd dlZd dlmZ d dlmZ d dlm	Z	 d dl
mZ d dl
mZ ddlmZ g d	Z G d
 dej                  Z G d dej        j                  Z G d dej        j                  Z G d dej        j                  Z G d dej                  Z G d dej        j                  Z G d dej        j                  ZdS )    N)Image)gaussian_filter)pad)
functional)
transforms   )random_shadow)ResizeGaussianNoiseChannelShuffleRandomHorizontalFlipRandomShadowRandomResizeGaussianBlurc            
            e Zd ZdZej        j        ddfdeeeef         z  de	de	ddf fdZ
	 dd	ej        d
ej        dz  dej        eej        ej        f         z  f fdZdefdZ xZS )r
   a(  Resize the input image to the given size

    >>> import torch
    >>> from doctr.transforms import Resize
    >>> transfo = Resize((64, 64), preserve_aspect_ratio=True, symmetric_pad=True)
    >>> out = transfo(torch.rand((3, 64, 64)))

    Args:
        size: output size in pixels, either a tuple (height, width) or a single integer for square images
        interpolation: interpolation mode to use for resizing, default is bilinear
        preserve_aspect_ratio: whether to preserve the aspect ratio of the image,
            if True, the image will be resized to fit within the target size while maintaining its aspect ratio
        symmetric_pad: whether to symmetrically pad the image to the target size,
            if True, the image will be padded equally on both sides to fit the target size
    Fsizepreserve_aspect_ratiosymmetric_padreturnNc                     t                                          t          |t          t          f          r|n||f|d           || _        || _        d S )NT	antialias)super__init__
isinstancelisttupler   r   )selfr   interpolationr   r   	__class__s        c/var/www/html/Carbon-Document/venv/lib/python3.11/site-packages/doctr/transforms/modules/pytorch.pyr   zResize.__init__.   sW     	D4-!@!@RtTlTamqrrr%:"*    imgtargetc                    | j         d         | j         d         z  }|j        d         |j        d         z  }| j        r||k    rF|#t                                          |          |fS t                                          |          S ||k    r9| j         d         t          t          | j         d         |z            d          f}n8t          t          | j         d         |z            d          | j         d         f}t          j        ||| j	        d          }|j        dd          }t          | j         t          t          f          rd| j         d         |j        d         z
  d| j         d         |j        d         z
  f}| j        rjt          j        |d         dz            t          j        |d         dz            f}|d         |d         |d         z
  |d         |d         |d         z
  f}t!          ||          }|| j        r,|d         |j        d         z  |d         |j        d         z  f}	| j        r|j        dd          d	k    r| j        rp|	d         |d d ddgf         |d         z  |j        d         z  z   |d d ddgf<   |	d         |d d ddgf         |d         z  |j        d         z  z   |d d ddgf<   n|d d ddgfxx         |d         |j        d         z  z  cc<   |d d ddgfxx         |d         |j        d         z  z  cc<   n|j        dd          d
k    r| j        rW|	d         |d         |d         z  |j        d         z  z   |d<   |	d         |d         |d         z  |j        d         z  z   |d<   nX|dxx         |d         |j        d         z  z  cc<   |dxx         |d         |j        d         z  z  cc<   nt#          d          |t%          j        |dd          fS |S )Nr      Tr   r         )r+   r   .r   ).r&   z=Boxes should be in the format (n_boxes, 4, 2) or (n_boxes, 4))r   shaper   r   forwardmaxintFresizer   r   r   r   r   mathceilr   AssertionErrornpclip)r   r#   r$   target_ratioactual_ratiotmp_size	raw_shape_padhalf_padoffsetr    s             r!   r.   zResize.forward9   sJ   
 y|dil2y}sy}4) 3	ll.J.J !wws++V3377??3''' l** IaL#c$)A,2M.N.NPQ*R*RSDIaL<$? @ @!DDdiPQlS (3$*<MMMC	"##I$)eT]33 %49Q<#)B-7DIaL39UW=<XY% d $	$q'A+ 6 6	$q'A+8N8NOH$QKa8A;)>TRSWW_`aWbMbcD#tnn !% V%a[39R=8(1+	RT:UUF- n|ABB'4//- O06q	F111q!f9<MPYZ\P]<]`c`ijl`m<m0mF111q!f9-06q	F111q!f9<MPYZ\P]<]`c`ijl`m<m0mF111q!f9--"111q!f9---221NN---"111q!f9---221NN----abb)V33- L-3AY)TV-9WZ]ZcdfZg9g-gF6N-3AY)TV-9WZ]ZcdfZg9g-gF6NN"6NNNimcim.KKNNN"6NNNimcim.KKNNNN,-lmmmBGFAq1111Jr"   c                     | j         j        }d| j         d| d}| j        r|d| j         d| j         z  }| j        j         d| dS )Nzoutput_size=z, interpolation='', preserve_aspect_ratio=, symmetric_pad=())r   valuer   r   r   r    __name__)r   interpolate_str_reprs      r!   __repr__zResize.__repr__v   sq    ,2MtyMM?MMM% 	qp0Jpp\`\npppE.)44E4444r"   N)rF   
__module____qualname____doc__r1   InterpolationModeBILINEARr0   r   boolr   torchTensorr6   ndarrayr.   strrI   __classcell__r    s   @r!   r
   r
      s        & )2&+#	+ 	+E#s(O#	+  $		+
 	+ 
	+ 	+ 	+ 	+ 	+ 	+ %); ;\; 
T!; 
elBJ67	7	; ; ; ; ; ;z5# 5 5 5 5 5 5 5 5r"   r
   c                   b     e Zd ZdZddededdf fdZd	ej        dej        fd
Zde	fdZ
 xZS )r   a9  Adds Gaussian Noise to the input tensor

    >>> import torch
    >>> from doctr.transforms import GaussianNoise
    >>> transfo = GaussianNoise(0., 1.)
    >>> out = transfo(torch.rand((3, 224, 224)))

    Args:
        mean : mean of the gaussian distribution
        std : std of the gaussian distribution
                  ?meanstdr   Nc                 d    t                                                       || _        || _        d S rJ   )r   r   r[   rZ   )r   rZ   r[   r    s      r!   r   zGaussianNoise.__init__   s+    			r"   xc                    | j         d| j        z  t          j        |j        |j                  z  z   | j        z
  }|j        t          j        k    rL|d|z  z                                   	                    dd          
                    t          j                  S ||
                    |j                  z   	                    dd          S )Nr   )device   r   dtyper&   )rZ   r[   rQ   randr-   r_   rb   uint8roundclampto)r   r]   noises      r!   r.   zGaussianNoise.forward   s    	AL5:agah+O+O+OOORVRZZ7ek!!eO**,,221c::==EK=PPPqw///66q!<<<r"   c                 &    d| j          d| j         S )Nzmean=z, std=)rZ   r[   r   s    r!   
extra_reprzGaussianNoise.extra_repr   s    2ty22222r"   )rX   rY   )rF   rK   rL   rM   floatr   rQ   rR   r.   rT   rk   rU   rV   s   @r!   r   r   ~   s        
 
 U u t      
= =%, = = = =3C 3 3 3 3 3 3 3 3r"   r   c                   `     e Zd ZdZdeeef         ddf fdZdej        dej        fdZ	 xZ
S )r   zApply Gaussian Blur to the input tensor

    >>> import torch
    >>> from doctr.transforms import GaussianBlur
    >>> transfo = GaussianBlur(sigma=(0.0, 1.0))

    Args:
        sigma : standard deviation range for the gaussian kernel
    sigmar   Nc                 V    t                                                       || _        d S rJ   )r   r   sigma_range)r   rn   r    s     r!   r   zGaussianBlur.__init__   s'     r"   r]   c                      t          j        d          j        | j                                         }t          j        t          |                                |dd          |j        |j	                  }|S )Nr&   reflectg      @)rn   modetruncate)rb   r_   )
rQ   emptyuniform_rp   itemtensorr   numpyrb   r_   )r   r]   rn   blurreds       r!   r.   zGaussianBlur.forward   sy    'A')9:??AA ,			   '8	
 	
 	
 r"   )rF   rK   rL   rM   r   rl   r   rQ   rR   r.   rU   rV   s   @r!   r   r      s         !eE5L1 !d ! ! ! ! ! ! %,        r"   r   c                   F     e Zd ZdZ fdZdej        dej        fdZ xZS )r   z/Randomly shuffle channel order of a given imagec                 H    t                                                       d S rJ   )r   r   )r   r    s    r!   r   zChannelShuffle.__init__   s    r"   r#   r   c                 t    t          j        |j        d                                                   }||         S )Nr   )rQ   rc   r-   argsort)r   r#   
chan_orders      r!   r.   zChannelShuffle.forward   s-    Z	!--5577
:r"   )	rF   rK   rL   rM   r   rQ   rR   r.   rU   rV   s   @r!   r   r      sd        99    5< EL        r"   r   c                   j    e Zd ZdZdej        ez  dej        de	ej        ez  ej        f         fdZ
dS )r   z*Randomly flip the input image horizontallyr#   r$   r   c                    t          j        d          | j        k     rit          j        |          }|                                }|j        dd          dk    rd|d d ddgf         z
  |d d d d df<   nd|d         z
  |d<   ||fS ||fS )Nr&   r*   r   r   r,   )rQ   rc   pr1   hflipcopyr-   )r   r#   r$   _img_targets        r!   r.   zRandomHorizontalFlip.forward   s    :a==46!!73<<DkkmmG|ABB4''"#fQQQAY&7"733Q3"#fVn"4= F{r"   N)rF   rK   rL   rM   rQ   rR   r   r6   rS   r   r.    r"   r!   r   r      sb        44
5<%/ 
 
el]bNbdfdnNnHo 
 
 
 
 
 
r"   r   c                   t     e Zd ZdZd	deeef         dz  ddf fdZdej        dej        fdZ	de
fdZ xZS )
r   a  Adds random shade to the input image

    >>> import torch
    >>> from doctr.transforms import RandomShadow
    >>> transfo = RandomShadow((0., 1.))
    >>> out = transfo(torch.rand((3, 64, 64)))

    Args:
        opacity_range : minimum and maximum opacity of the shade
    Nopacity_ranger   c                     t                                                       t          |t                    r|nd| _        d S )N)g?g?)r   r   r   r   r   )r   r   r    s     r!   r   zRandomShadow.__init__   s;    .8.N.N^]]T^r"   r]   c                    	 |j         t          j        k    r}dt          |                    t          j                  dz  | j                  z                                                      dd                              t          j                  S t          || j                                      dd          S # t          $ r |cY S w xY w)Nr`   ra   r   r&   )
rb   rQ   rd   r	   rg   float32r   re   r7   
ValueError)r   r]   s     r!   __call__zRandomShadow.__call__   s    	w%+%% 'DDu}D55; .  UWWT!S\\RekR** %Q(:;;@@AFFF 	 	 	HHH	s   BB= (B= =CCc                     d| j          S )Nzopacity_range=)r   rj   s    r!   rk   zRandomShadow.extra_repr   s    4 2444r"   rJ   )rF   rK   rL   rM   r   rl   r   rQ   rR   r   rT   rk   rU   rV   s   @r!   r   r      s        	 	_ _eE5L&9D&@ _D _ _ _ _ _ _%, 5<    *5C 5 5 5 5 5 5 5 5r"   r   c                        e Zd ZdZ	 	 	 	 ddeeef         deez  deez  ded	d
f
 fdZdej	        de
j        d	eej	        e
j        f         fdZd	efdZ xZS )r   a  Randomly resize the input image and align corresponding targets

    >>> import torch
    >>> from doctr.transforms import RandomResize
    >>> transfo = RandomResize((0.3, 0.9), preserve_aspect_ratio=True, symmetric_pad=True, p=0.5)
    >>> out = transfo(torch.rand((3, 64, 64)))

    Args:
        scale_range: range of the resizing factor for width and height (independently)
        preserve_aspect_ratio: whether to preserve the aspect ratio of the image,
        given a float value, the aspect ratio will be preserved with this probability
        symmetric_pad: whether to symmetrically pad the image,
        given a float value, the symmetric padding will be applied with this probability
        p: probability to apply the transformation
    g333333?g?F      ?scale_ranger   r   r   r   Nc                     t                                                       || _        || _        || _        || _        t          | _        d S rJ   )r   r   r   r   r   r   r
   _resize)r   r   r   r   r   r    s        r!   r   zRandomResize.__init__  sE     	&%:"*r"   r#   r$   c           
         t          j        d          | j        k     r%t          j        j        | j         }t          j        j        | j         }t          |j        d         |z            t          |j        d         |z            f} | 	                    |t          | j        t                    r| j        n)t          t          j        d          | j        k              t          | j        t                    r| j        n)t          t          j        d          | j        k                        ||          \  }}||fS ||fS )Nr&   r'   r(   )r   r   )rQ   rc   r   r6   randomuniformr   r0   r-   r   r   r   rP   r   )r   r#   r$   scale_hscale_wnew_sizer   r   s           r!   r.   zRandomResize.forward!  s%   :a==46!!i')9:Gi')9:GCIbMG344c#)B-':Q6R6RSHDLLd8$??'?d&@&@%*Q--4+==>>d0$77?d00%*Q--4+==>> )   6 MD' = F{r"   c                 F    d| j          d| j         d| j         d| j         S )Nzscale_range=rA   rB   z, p=)r   r   r   r   rj   s    r!   rk   zRandomResize.extra_repr4  s`     Ud.  U  UHb  U  Utx  uG  U  U  MQ  MS  U  U  	Ur"   )r   FFr   )rF   rK   rL   rM   r   rl   rP   r   rQ   rR   r6   rS   r.   rT   rk   rU   rV   s   @r!   r   r     s         $ ,6.3&+ 5%<(  $e| e|	
  
     5<  elTVT^F^@_    &UC U U U U U U U Ur"   r   )r3   ry   r6   rQ   	PIL.Imager   scipy.ndimager   torch.nn.functionalr   torchvision.transformsr   r1   r   Tr	   __all__r
   nnModuler   r   r   r   r   r   r   r"   r!   <module>r      s                ) ) ) ) ) ) # # # # # # 2 2 2 2 2 2 2 2 2 2 2 2 & & & & & &  ^5 ^5 ^5 ^5 ^5QX ^5 ^5 ^5B3 3 3 3 3EHO 3 3 3<    58?   B	 	 	 	 	UX_ 	 	 	    11    &5 &5 &5 &5 &558? &5 &5 &5R3U 3U 3U 3U 3U58? 3U 3U 3U 3U 3Ur"   