
    iQ                         S r SSKrSSKJrJr  SSKrSSKJr  SSK	r	SSK
Jr   " S S5      r " S S	5      r " S
 S5      r " S S5      r " S S5      rg)zo
This code is refer from:
https://github.com/open-mmlab/mmocr/blob/main/mmocr/datasets/pipelines/transforms.py
    N)Image	ImageDraw)Polygon)poly_intersectionc                   $    \ rS rSrSS jrS rSrg)RandomScaling   c                     [        U[        5      (       d   e[        U[        5      (       d  [        U[        5      (       d   eXl        [        U[        5      (       a  X l        gSU-
  SU-   4U l        g)zRandom scale the image while keeping aspect.

Args:
    size (int) : Base size before scaling.
    scale (tuple(float)) : The range of scaling.
   N)
isinstanceintfloattuplesizescale)selfr   r   kwargss       b/var/www/html/banglarbhumi/venv/lib/python3.13/site-packages/paddleocr/ppocr/data/imaug/fce_aug.py__init__RandomScaling.__init__   s_     $$$$$%'':eU+C+CCC	(66U
QYE	<R
    c                 >   US   nUS   nUR                   u  pEn[        R                  R                  [	        U R
                  5      [        U R
                  5      5      nU R                  S-  [        XE5      -  U-  n[        R                  " X/5      n[        XHS   -  5      [        XXS   -  5      4n	[        R                  " X)S S S2   5      nX!S'   US S 2S S 2SS S24   US   -  US S 2S S 2SS S24'   US S 2S S 2SS S24   US   -  US S 2S S 2SS S24'   X1S'   U$ )Nimagepolysg      ?r   r      )shapenprandomuniformminr   maxr   arrayr   cv2resize)
r   datar   
text_polyshw_aspect_ratioscalesout_sizes
             r   __call__RandomScaling.__call__'   s   W']
++ayy((TZZ#djj/JS3q9,|;6*+1I&Aq	M(:;

54R4.1W!+Aq!$Q$J!7&)!C
1aA:!+Aq!$Q$J!7&)!C
1aA:"Wr   )r   r   N)i   )g      ?g      @)__name__
__module____qualname____firstlineno__r   r.   __static_attributes__ r   r   r   r      s    
Sr   r   c                   2    \ rS rSr SS jrS rS rS rSrg)	RandomCropFlip:   c                     [        U[        5      (       d   e[        U[        5      (       d   e[        U[        5      (       d   eXl        SU l        X l        X0l        X@l        g)zRandom crop and flip a patch of the image.

Args:
    crop_ratio (float): The ratio of cropping.
    iter_num (int): Number of operations.
    min_area_ratio (float): Minimal area ratio between cropped patch
        and original image.
g{Gz?N)r   r   r   	pad_ratioepsilon
crop_ratioiter_nummin_area_ratio)r   r:   r<   r=   r>   r   s         r   r   RandomCropFlip.__init__;   sY     *e,,,,(C((((.%0000"$ ,r   c                 `    [        U R                  5       H  nU R                  U5      nM     U$ N)ranger=   random_crop_flip)r   resultsis      r   r.   RandomCropFlip.__call__P   s,    t}}%A++G4G & r   c                 
   US   nUS   nUS   n[        U5      S:X  a  U$ [        R                  R                  5       U R                  :  a  U$ UR                  u  pVnXV-  n[        XPR                  -  5      n	[        X`R                  -  5      n
U R                  X#X5      u  p[        U5      S:X  d  [        U5      S:X  a  U$ SnUS:  Ga  US-  n/ n/ n/ n/ n[        R                  R                  USS9n[        R                  " U5      U
-
  n[        R                  " U5      U
-
  n[        R                  " USUS-
  5      n[        R                  " USUS-
  5      n[        R                  R                  USS9n[        R                  " U5      U	-
  n[        R                  " U5      U	-
  n[        R                  " USUS-
  5      n[        R                  " USUS-
  5      nUU-
  UU-
  -  XR                  -  :  a  GM>  [        R                  " UUUU/UUUU//5      R                  R                  [        R                   5      n[#        U5      nS	n[%        X45       GH  u  nn[#        UR'                  S
S5      5      n[)        UUSS9u  nn[        R*                  " U[-        UR.                  5      -
  5      U R0                  :  a(  [        R*                  " U5      U R0                  :  a  Sn  O[        R*                  " U[-        UR.                  5      -
  5      U R0                  :  a$  UR3                  U5        UR3                  U5        M  UR3                  U5        UR3                  U5        GM     U(       a  GM   UWW2WW2S S 24   n[        R                  R5                  S5      n U S:X  a!  [        R6                  " US S 2S S S
24   5      n!OHU S:X  a!  [        R6                  " US S S
2S S 24   5      n!O![        R6                  " US S S
2S S S
24   5      n!U!UUU2UU2S S 24'   X!S'   [        W5      S:w  Ga-  UR                  u  n"n#nU S:X  aF  [9        U5       H6  u  n$nUR'                  S
S5      n%U#U%S S 2S4   -
  SU-  -   U%S S 2S4'   U%UU$'   M8     OU S:X  aF  [9        U5       H6  u  n$nUR'                  S
S5      n%U"U%S S 2S4   -
  SU-  -   U%S S 2S4'   U%UU$'   M8     O^[9        U5       HO  u  n$nUR'                  S
S5      n%U#U%S S 2S4   -
  SU-  -   U%S S 2S4'   U"U%S S 2S4   -
  SU-  -   U%S S 2S4'   U%UU$'   MQ     WU-   nWW-   n[        R:                  " U5      US'   XAS'   U$ )Nr   r   ignore_tagsr   2   r   r   )r   Fr   )bufferT   img)lenr   r   r<   r   r   r:   generate_crop_targetchoicer!   r"   clipr>   stackTastypeint32r   zipreshaper   absr   arear;   appendrandintascontiguousarray	enumerater#   )&r   rD   r   polygonsrH   r(   r)   r*   rX   pad_hpad_wh_axisw_axisattempt
polys_keep	polys_newignore_tags_keepignore_tags_newxxxminxmaxyyyminymaxptspp	fail_flagpolygon
ignore_tagppippioucroppedselect_typerL   heightwidthidxpolys&                                         r   rC   RandomCropFlip.random_crop_flipV   s,    7#m,x=AN990N++auA&'A&'225EQv;!s6{a/NlqLGJI! O!!&q!1B66":%D66":%D774AE*D774AE*D!!&q!1B66":%D66":%D774AE*D774AE*Dtt,t6I6I/II((dD)D$d+CDarxx   BI'*8'A#goob!45,S"Q?qFF55?23dllBu4 $IVVEE#((O34t||C$$W-#**:6%%g.$++J7 (B  T	49a/0ii''*!&&wq$B$w'78CA&&wttQw'78C&&wttTrTz':;C),d4idA%&y>Q&}}FE1a$-i$8LC"??2q1D!&ad!3a$h!>DAJ%)IcN %9 !$-i$8LC"??2q1D!'$q!t*!4q4x!?DAJ%)IcN %9
 %.i$8LC"??2q1D!&ad!3a$h!>DAJ!'$q!t*!4q4x!?DAJ%)IcN	 %9
 "I-H*_<K!xx1GG%0M"r   c                 >   UR                   u  pVn[        R                  " XSS-  -   [        R                  S9n[        R                  " XdS-  -   [        R                  S9n	/ n
U H  n[        R
                  " UR                  [        R                  5      R                  SS5      5      n[        R                  " U5      n[        R                  " U5      nU
R                  US   US   US   US   /5        M     [        R                  " U
[        R                  S9nU H  n[        R                  " USS9R                  [        R                  5      n[        R                  " USS2S4   5      n[        R                  " USS2S4   5      nSU	UU-   UU-   & [        R                  " USS2S4   5      n[        R                  " USS2S4   5      nSUUU-   UU-   & M     [        R                  " US:H  5      S   n[        R                  " U	S:H  5      S   nUU4$ )	a  Generate crop target and make sure not to crop the polygon
instances.

Args:
    image (ndarray): The image waited to be crop.
    all_polys (list[list[ndarray]]): All polygons including ground
        truth polygons and ground truth ignored polygons.
    pad_h (int): Padding length of height.
    pad_w (int): Padding length of width.
Returns:
    h_axis (ndarray): Vertical cropping range.
    w_axis (ndarray): Horizontal cropping range.
r   dtyper   r   r   rK   )decimalsN)r   r   zerosrT   r$   minAreaRectrS   rV   	boxPointsint64rY   r#   roundr!   r"   where)r   r   	all_polysr^   r_   r(   r)   r*   h_arrayw_arrayr'   rp   rectboxr   ry   minxmaxxminymaxyr`   ra   s                         r   rN   #RandomCropFlip.generate_crop_target   s    ++a((A	M"((;((A	M"((;
 G??7>>"((#;#C#CB#JKD--%C((3-Cs1vs1vs1vs1v>?	 ! 2884D88D1-44RXX>D66$q!t*%D66$q!t*%D34GD5L4%<066$q!t*%D66$q!t*%D34GD5L4%<0  'Q,'*'Q,'*v~r   )r<   r;   r=   r>   r:   N)g?      ?r   g?)	r0   r1   r2   r3   r   r.   rC   rN   r4   r5   r   r   r7   r7   :   s    HK-*cJ%r   r7   c                   N   ^  \ rS rSrSrS
U 4S jjrS rS rS rS r	S r
S	rU =r$ )RandomCropPolyInstances   zKRandomly crop images and make sure to contain at least one intact
instance.c                 :   > [         TU ]  5         Xl        X l        g rA   )superr   r<   min_side_ratio)r   r<   r   r   	__class__s       r   r    RandomCropPolyInstances.__init__   s    $,r   c                    [        U[        5      (       d   e[        U5      U:  d   eUR                  5       n[	        [        U5      U-
  U5      nSXSS & SUS'   [
        R                  " SU/5      [
        R                  " US/5      -
  n[
        R                  " US:  5      S   n[
        R                  " US:  5      S   n[
        R                  R                  S[        U5      5      n	[
        R                  R                  Xy   X   5      n
UR                  5       n[        X-   U5      nSUS U& SUS'   [
        R                  " SU/5      [
        R                  " US/5      -
  n[
        R                  " US:  5      S   n[
        R                  " US:  5      S   n[
        R                  R                  S[        U5      5      n	[
        R                  R                  Xy   X   5      nX4$ )Nr   r   r   )r   r   rM   copyr!   r   hstackr   r   rZ   r"   )r   valid_arraymin_len	max_startmin_endstart_array
diff_arrayregion_startsregion_ends
region_indstart	end_arrayends                r   sample_valid_start_end.RandomCropPolyInstances.sample_valid_start_end   s   '3'''';')))!&&(K(72I>	"#JAYY;/0299k1=M3NN
a03hhzA~.q1YY&&q#m*<=
		!!-";[=TU$$&	eow/	(7	"YY9~.Iq>1JJ
a03hhzA~.q1YY&&q#m*<=
ii 9;;RSzr   c                    [        U[        5      (       d   eUSS u  p4US   n[        R                  " U[        R                  S9n[        R                  " U[        R                  S9nU[        R
                  R                  S[        U5      5         nUR                  S5      R                  [        R                  5      n[        [        R                  " USS2S4   5      S-
  S5      n	[        [        R                  " USS2S4   5      S-   US-
  5      n
[        [        R                  " USS2S4   5      S-
  S5      n[        [        R                  " USS2S4   5      S-   US-
  5      nU H  nUR                  S5      R                  [        R                  5      n[        R                  " USS2S4   SUS-
  5      n[        R                  " USS2S4   SUS-
  5      n[        R                  " U5      [        R                  " U5      nn[        R                  " U5      [        R                  " U5      nnSUUS-
  US-   & SUUS-
  US-   & M     [        X@R                  -  5      n[        X0R                  -  5      nU R                  UUX5      u  nnU R                  UUX5      u  nn[        R                   " UUUU/5      $ )	zGenerate crop box and make sure not to crop the polygon instances.

Args:
    img_size (tuple(int)): The image size (h, w).
    results (dict): The results dict.
Nr   r   r|   r   )r   r   rK   r   )r   r   r   onesrT   r   rZ   rM   rV   rS   r"   r!   rP   r   r   r   r#   )r   img_sizerD   r(   r)   	key_masksx_valid_arrayy_valid_arrayselected_maskmax_x_start	min_x_endmax_y_start	min_y_endmaskclip_xclip_ymin_xmax_xmin_ymax_ymin_wmin_hx1x2y1y2s                             r   sample_crop_box'RandomCropPolyInstances.sample_crop_box  s_    (E****|G$	22!"))"3"3As9~"FG%--g6==bhhG"&&q!t!4591=}QT23a7Q?	"&&q!t!4591=}QT23a7Q?	D<<(//9DWWT!Q$ZAE2FWWT!Q$ZAE2F66&>266&>5E66&>266&>5E34M%!)eai034M%!)eai0  A+++,A+++,,,5+
B ,,5+
B xxRR())r   c                     UR                   S:X  d   eUR                  u  p4nSUS   s=::  a  US   s=:  a  U::  d   e   eSUS   s=::  a  US   s=:  a  U::  d   e   eXS   US   2US   US   24   $ )NrK   r   r   r   )ndimr   )r   rL   bboxr(   r)   r*   s         r   crop_img RandomCropPolyInstances.crop_img2  s    xx1}}))aDG*d1g******DG*d1g******7T!W$d1gQ&7788r   c                 T   US   nUS   nUS   n[        U5      S:  a  U$ [        R                  R                  5       U R                  :  Ga  U R                  UR                  U5      nU R                  X%5      nXaS'   Uu  pxp[        X-
  S5      n[        X-
  S5      nUS S 2S S 2SS S24   U-
  US S 2S S 2SS S24'   US S 2S S 2SS S24   U-
  US S 2S S 2SS S24'   / n/ n[        U5       GH  u  nnUS S 2S S S24   S:  R                  5       (       d  M+  US S 2S S S24   US-   :  R                  5       (       d  MR  US S 2SS S24   S:  R                  5       (       d  Mv  US S 2SS S24   US-   :  R                  5       (       d  M  [        R                  " US S 2S S S24   SU5      US S 2S S S24'   [        R                  " US S 2SS S24   SU5      US S 2SS S24'   UR                  U5        UR                  XO   5        GM     [        R                  " U5      US'   XS'   U$ )	Nr   r   rH   r   r   r      )rM   r   r   random_sampler<   r   r   r   r"   r\   allrP   rY   r#   )r   rD   r   r]   rH   crop_boxrL   r   r   r   r   r)   r(   valid_masks_listvalid_tags_listindrp   s                    r   r.    RandomCropPolyInstances.__call__9  s9    7#m,x=1N99""$t6++EKKAH--0C"G%NBBBGQABGQA#+Aq!$Q$J#7"#<HQ14a4Z #+Aq!$Q$J#7"#<HQ14a4Z ! O )( 3WQ!V_r)..00 CaC1q505577 ADqD)B.3355 ADqD)AE16688&(ggga1foq!&DGAssFO')wwwq!$Q$w/?A'FGAqt!tG$$++G4#**;+;< !4  "xx(89GG%4M"r   c                 2    U R                   R                  nU$ rA   r   r0   r   repr_strs     r   __repr__ RandomCropPolyInstances.__repr__^      >>**r   )r<   r   )g      ?g?)r0   r1   r2   r3   __doc__r   r   r   r   r.   r   r4   __classcell__)r   s   @r   r   r      s-    -
2+*Z9#J r   r   c                   N    \ rS rSr    SS jrSS jrS rS rS rS r	S r
S	rg
)RandomRotatePolyInstancesic  c                 4    Xl         X l        X0l        X@l        g)a  Randomly rotate images and polygon masks.

Args:
    rotate_ratio (float): The ratio of samples to operate rotation.
    max_angle (int): The maximum rotation angle.
    pad_with_fixed_color (bool): The flag for whether to pad rotated
       image with fixed value. If set to False, the rotated image will
       be padded onto cropped image.
    pad_value (tuple(int)): The color value for padding rotated image.
N)rotate_ratio	max_anglepad_with_fixed_color	pad_value)r   r   r   r   r   r   s         r   r   "RandomRotatePolyInstances.__init__d  s    $ )"$8!"r   c                 V   Uu  pVU* nUS S 2S S S24   US S 2SS S24   pU* nUS-  [         R                  -  n[         R                  " U5      n	[         R                  " U5      n
Xu-
  nX-
  nXWU	-  -   X-  -
  US   -   nXgU
-  -   X-  -   * US   -   nXsUS S 2S S S24'   US S 2SS S24'   U$ )Nr   r      r   )mathpicossin)r   centerpointsthetacenter_shiftcenter_xcenter_yxyr   r   _x_ys                r   rotate RandomRotatePolyInstances.rotate{  s    %9a1f~vaAg1Bdgg%hhuohhuoLLC!')LO;c'!AG+,|A>*,'q#A#vq!$Q$wr   c                    [        U[        5      (       d   eU[        R                  -  S-  nUS S u  pE[        R                  " U5      n[        R
                  " U5      n[        U[        R                  " U5      -  U[        R                  " U5      -  -   5      n[        U[        R                  " U5      -  U[        R                  " U5      -  -   5      n	X4n
U
$ )Ng     f@r   )r   r   r   r   r   r   r   fabs)r   ori_sizedegreeangler(   r)   r   r   canvas_hcanvas_wcanvas_sizes              r   cal_canvas_size)RandomRotatePolyInstances.cal_canvas_size  s    (E**** 5(|hhuohhuoq499S>)A		#,>>?q499S>)A		#,>>?*r   c                 T    [         R                  R                  5       S-  U-  U-
  nU$ )Nr   )r   r   r   )r   r   r   s      r   sample_angle&RandomRotatePolyInstances.sample_angle  s(    		'')A-	9IEr   c                 2   UR                   S S u  pE[        R                  " US-  US-  4US5      nUS==   [        US   U-
  S-  5      -  ss'   US==   [        US   U-
  S-  5      -  ss'   U R                  (       a:  [        R
                  " UUUS   US   4[        R                  U R                  S9nU$ [        R                  " U5      n[        R                  R                  SUS-  S-  5      [        R                  R                  SUS-  S-  5      pXXS	-  -   2XUS	-  -   24   n[        R                  " XS   US   45      n[        R
                  " UUUS   US   4/ S
QS9n[        R
                  " UUUS   US   4/ SQS9nX{U-  -   nU$ )Nr   r   )r   r   )r   r   r   )flagsborderValue      	   )r   r   r   )r  r   r   r   )r   r$   getRotationMatrix2Dr   r   
warpAffineINTER_NEARESTr   r   
zeros_liker   rZ   r%   )r   rL   r   r   r(   r)   rotation_matrix
target_imgr   h_indw_indimg_cuts               r   
rotate_img$RandomRotatePolyInstances.rotate_img  s   yy!}111q5!a%.%Kk!nq&8A%=!>>k!nq&8A%=!>>$$QQ0'' NNJ< - ==%D		!!!QUaZ0		!!!QUaZ0  56>2EQ!V^4LLMGjjq>;q>*JKG>>QQ0%	D QQ0%	J $n4Jr   c                    [         R                  R                  5       U R                  :  a  US   nUS   nUR                  S S u  pEU R                  U R                  5      nU R                  XE4U5      n[        US   U-
  S-  5      [        US   U-
  S-  5      4nU R                  X&U5      nX!S'   / n	U H/  n
U R                  US-  US-  4XU5      nU	R                  U5        M1     [         R                  " U	5      US'   U$ )Nr   r   r   r   r   )r   r   r   r   r   r   r   r   r   r  r   rY   r#   )r   rD   r   r]   r(   r)   r   r   r   rotated_masksr   rotated_masks               r   r.   "RandomRotatePolyInstances.__call__  s   99""$t'8'88G$Ew'H;;r?DA%%dnn5E..vu=K[^a'1,-[^a'1,-L OOE+>E$GM #{{AE1q5>4U$$\2 !  "xx6GGr   c                 2    U R                   R                  nU$ rA   r   r   s     r   r   "RandomRotatePolyInstances.__repr__  r   r   )r   r   r   r   N)r   
   Fr  )r   r   )r0   r1   r2   r3   r   r   r   r   r  r.   r   r4   r5   r   r   r   r   c  s4     "#.(%N.r   r   c                   F    \ rS rSr   S
S jrSS jrS rS rS rS r	Sr
g	)SquareResizePadi  c                     [        U[        5      (       d   e[        U[        5      (       d   e[        U[        5      (       d   e[        U[        5      (       d   eXl        X l        X0l        X@l        g)ah  Resize or pad images to be square shape.

Args:
    target_size (int): The target size of square shaped image.
    pad_with_fixed_color (bool): The flag for whether to pad rotated
       image with fixed value. If set to False, the rescales image will
       be padded onto cropped image.
    pad_value (tuple(int)): The color value for padding rotated image.
N)	r   r   r   boolr   target_sizer:   r   r   )r   r   r:   r   r   r   s         r   r   SquareResizePad.__init__  sg    " +s++++)U++++.5555)U++++&"$8!"r   c                 0   UR                   u  p4nU(       aW  X4:  a  U R                  O[        X0R                  -  U-  5      nX4::  a  U R                  O[        X@R                  -  U-  5      nOU R                  =pg[        R                  " XU45      nXU44$ rA   )r   r   r   r$   r%   )r   rL   
keep_ratior(   r)   r*   t_ht_ws           r   
resize_imgSquareResizePad.resize_img  s    ))a&'f$""#a:J:J6JQ6N2OC&'f$""#a:J:J6JQ6N2OC(((CjjCj)#Jr   c                    UR                   S S u  p#X#:X  a  US4$ [        X#5      nU R                  (       a5  [        R                  " XDS4[        R
                  S9nU R                  US S & Ow[        R                  R                  SUS-  S-  5      [        R                  R                  SUS-  S-  5      pvXXbS-  -   2XwUS-  -   24   n[        R                  " XU45      nX#:  a	  SX#-
  S-  pOX2-
  S-  SpXXU-   2XU-   24'   X4nX[4$ )	Nr   r  rK   r|   r   r  r  r  )r   r"   r   r   r   uint8r   r   rZ   r$   r%   )r   rL   r(   r)   pad_size
expand_imgr  r  r  y0x0offsets               r   
square_padSquareResizePad.square_pad	  s   yy!}6;q9$$(a!8IJ NNJqM 		!!!QUaZ0		!!!QUaZ0  56>2EQ!V^4LLMGG-ABJ51e\1/22Q;!V+,!!r   c                 r    Uu  p4UR                  5       nUS S S2   U-   US S S2'   USS S2   U-   USS S2'   U$ )Nr   r   )r   )r   r   r.  r-  r,  
pad_pointss         r   square_pad_maskSquareResizePad.square_pad_mask!  sT    [[]
$SqS/B.
3Q3%add+b0
14a4r   c                    US   nUS   nUR                   S S u  pE[        R                  R                  5       U R                  :  a&  U R                  USS9u  p&U R                  U5      u  p'OU R                  USS9u  p&SnX!S'    US S 2S S 2SS S24   US	   -  U-  US   -   US S 2S S 2SS S24'   US S 2S S 2S	S S24   US   -  U-  US	   -   US S 2S S 2S	S S24'   X1S'   U$ !    N
= f)
Nr   r   r   T)r#  Fr  r   r   )r   r   r   r   r:   r&  r/  )r   rD   r   r]   r(   r)   r-   r.  s           r   r.   SquareResizePad.__call__(  s#    7#{{2A99""$t~~5"ooeoEOE OOE2ME6"ooeoFOEF 	#+Aq!$Q$J#7(1+#E#IFSTI#UHQ14a4Z #+Aq!$Q$J#7(1+#E#IFSTI#UHQ14a4Z  $		s   AC# #C'c                 2    U R                   R                  nU$ rA   r   r   s     r   r   SquareResizePad.__repr__=  r   r   )r:   r   r   r   N)g333333?Fr  )T)r0   r1   r2   r3   r   r&  r/  r3  r.   r   r4   r5   r   r   r  r    s+     "#6"0*r   r  )r   numpyr   PILr   r   r$   shapely.geometryr   r   ppocr.utils.poly_nmsr   r   r7   r   r   r  r5   r   r   <module>r=     s\       
 $  2 @f fR} }@} }@\ \r   