
    i|&                         S r SSKJr  SSKJr  SSKJr  SSKrSSKrSSKrSSK	J
r
  SSKr " S S\5      r " S	 S
\5      rg)z
This code is referred from:
https://github.com/WenmuZhou/DBNet.pytorch/blob/master/post_processing/seg_detector_representer.py
    )absolute_import)division)print_functionN)Polygonc                   Z    \ rS rSrSr       SS jrS rS rS rS r	S r
S	 rS
 rSrg)DBPostProcess   z8
The post process for Differentiable Binarization (DB).
c                     Xl         X l        X0l        X@l        SU l        X`l        Xpl        US;   d   SR                  U5      5       eU(       d  S U l
        g [        R                  " SS/SS//5      U l
        g )N   )slowfastz.Score mode must be in [slow, fast] but got: {}   )thresh
box_threshmax_candidatesunclip_ratiomin_size
score_modebox_typeformatnparraydilation_kernel)	selfr   r   r   r   use_dilationr   r   kwargss	            j/var/www/html/banglarbhumi/venv/lib/python3.13/site-packages/paddleocr/ppocr/postprocess/db_postprocess.py__init__DBPostProcess.__init__"   s     $,($  
 
 	O <BB:N	O 

 ,8tRXX1vPQSTvFV=W    c                    UnUR                   u  pg/ n/ n	[        R                  " US-  R                  [        R
                  5      [        R                  [        R                  5      u  pU
SU R                    GH  nS[        R                  " US5      -  n[        R                  " XS5      nUR                  S5      nUR                   S   S:  a  M[  U R                  XR                  SS	5      5      nU R                  U:  a  M  UR                   S   S	:  a-  U R                  XR                  5      n[!        U5      S
:  a  M  OM  [        R"                  " U5      R                  SS	5      n[!        U5      S:X  a  GM  U R%                  UR                  S5      5      u  nnUU R&                  S	-   :  a  GMA  [        R"                  " U5      n[        R(                  " [        R*                  " USS2S4   U-  U-  5      SU5      USS2S4'   [        R(                  " [        R*                  " USS2S
4   U-  U-  5      SU5      USS2S
4'   UR-                  UR/                  5       5        U	R-                  U5        GM
     X4$ )zT
_bitmap: single map with shape (1, H, W),
    whose values are binarized as {0, 1}
   NgMb`?T   r      r$   r%   r   )r$   r   r%   )shapecv2findContoursastyper   uint8	RETR_LISTCHAIN_APPROX_SIMPLEr   	arcLengthapproxPolyDPreshapebox_score_fastr   unclipr   lenr   get_mini_boxesr   cliproundappendtolist)r   pred_bitmap
dest_widthdest_heightbitmapheightwidthboxesscorescontours_contourepsilonapproxpointsscoreboxssides                      r   polygons_from_bitmap"DBPostProcess.polygons_from_bitmap;   s    &&c\!!"((+S]]C<S<S
   5$"5"56GcmmGT::G%%g=F^^G,F||A"''nnR.CDE&||A"kk&*;*;<s8a<   ((3-''A.C3x1}**3;;z+BCHAut}}q((((3-CQTU):Z)G H!ZXC1IQTV+k9:A{C1I LL&MM% ? 7@ }r    c                    UnUR                   u  pg[        R                  " US-  R                  [        R
                  5      [        R                  [        R                  5      n[        U5      S:X  a  US   US   US   pn	O[        U5      S:X  a	  US   US   p[        [        W
5      U R                  5      n/ n/ n[        U5       GH  nX   nU R                  U5      u  nnUU R                  :  a  M.  [        R                  " U5      nU R                  S:X  a#  U R!                  UUR#                  SS5      5      nOU R%                  UU5      nU R&                  U:  a  M  U R)                  UU R*                  5      n[        U5      S:  a  M  [        R                  " U5      R#                  SSS5      nU R                  U5      u  nnUU R                  S-   :  a  GM  [        R                  " U5      n[        R,                  " [        R.                  " USS2S4   U-  U-  5      SU5      USS2S4'   [        R,                  " [        R.                  " USS2S4   U-  U-  5      SU5      USS2S4'   UR1                  UR                  S	5      5        UR1                  U5        GM     [        R                  " US	S
9U4$ )zX
_bitmap: single map with shape (1, H, W),
        whose values are binarized as {0, 1}
r"   r   r   r   r%   r   r$   Nint32dtype)r'   r(   r)   r*   r   r+   r,   r-   r3   minr   ranger4   r   r   r   r1   r0   box_score_slowr   r2   r   r5   r6   r7   )r   r9   r:   r;   r<   r=   r>   r?   outsimgrB   rC   num_contoursr@   rA   indexrD   rG   rJ   rH   rI   s                        r   boxes_from_bitmapDBPostProcess.boxes_from_bitmapm   sV    c\!!"((+S]]C<S<S
 t9>#AwQa1C1Y!^q'47a3x=$*=*=><(EoG //8MFEt}}$XXf%F&(++D&..Q2GH++D':&++fd&7&78C3x!|((3-''Aq1C,,S1JCt}}q((((3-CQTU):Z)G H!ZXC1IQTV+k9:A{C1I LLG,-MM% 7 )8 xxW-v55r    c                     [        U5      nUR                  U-  UR                  -  n[        R                  " 5       nUR                  U[        R                  [        R                  5        UR                  U5      nU$ )N)	r   arealength	pyclipperPyclipperOffsetAddPathJT_ROUNDET_CLOSEDPOLYGONExecute)r   rI   r   polydistanceoffsetexpandeds          r   r2   DBPostProcess.unclip   s_    s|99|+dkk9**,sI..	0J0JK>>(+r    c                 0   [         R                  " U5      n[        [        [         R                  " U5      5      S S9nSu  pEpgUS   S   US   S   :  a  SnSnOSnSnUS   S   US   S   :  a  SnSnOSnSnX4   X5   X6   X7   /nU[        US   5      4$ )Nc                     U S   $ )Nr    )xs    r   <lambda>.DBPostProcess.get_mini_boxes.<locals>.<lambda>   s    1r    )key)r   r   r%   r   r   r   r   r%   )r(   minAreaRectsortedlist	boxPointsrQ   )	r   rD   bounding_boxrG   index_1index_2index_3index_4rI   s	            r   r4   DBPostProcess.get_mini_boxes   s    w/S]]<89~N-7*'!9Q<&)A,&GGGG!9Q<&)A,&GGGG&/RCQ(((r    c                 B   UR                   SS u  p4UR                  5       n[        R                  " [        R                  " USS2S4   R                  5       5      R                  S5      SUS-
  5      n[        R                  " [        R                  " USS2S4   R                  5       5      R                  S5      SUS-
  5      n[        R                  " [        R                  " USS2S4   R                  5       5      R                  S5      SUS-
  5      n[        R                  " [        R                  " USS2S4   R                  5       5      R                  S5      SUS-
  5      n	[        R                  " X-
  S-   Xv-
  S-   4[        R                  S9n
USS2S4   U-
  USS2S4'   USS2S4   U-
  USS2S4'   [        R                  " XR                  SSS5      R                  S5      S5        [        R                  " XU	S-   2XgS-   24   U
5      S   $ )z7
box_score_fast: use bbox mean score as the mean score
Nr%   r   rN   r   rO   r$   )r'   copyr   r5   floorrQ   r*   ceilmaxzerosr+   r(   fillPolyr0   mean)r   r=   _boxhwrI   xminxmaxyminymaxmasks              r   r1   DBPostProcess.box_score_fast   s    ||BQiikwwrxxAqD	077@!QUKwwrwws1a4y}}/66w?AEJwwrxxAqD	077@!QUKwwrwws1a4y}}/66w?AEJxxq$+/:"((K1I$AqD	1I$AqD	T;;q"a077@!DxxdQhax?@$GJJr    c                    UR                   SS u  p4UR                  5       n[        R                  " US5      n[        R                  " [        R
                  " USS2S4   5      SUS-
  5      n[        R                  " [        R                  " USS2S4   5      SUS-
  5      n[        R                  " [        R
                  " USS2S4   5      SUS-
  5      n[        R                  " [        R                  " USS2S4   5      SUS-
  5      n[        R                  " X-
  S-   Xe-
  S-   4[        R                  S9n	USS2S4   U-
  USS2S4'   USS2S4   U-
  USS2S4'   [        R                  " XR                  SSS5      R                  S5      S5        [        R                  " XUS-   2XVS-   24   U	5      S   $ )	z9
box_score_slow: use polyon mean score as the mean score
Nr%   r#   r   r   rO   r$   rN   )r'   rz   r   r0   r5   rQ   r}   r~   r+   r(   r   r*   r   )
r   r=   rD   r   r   r   r   r   r   r   s
             r   rS   DBPostProcess.box_score_slow   sx    ||BQ,,.**Wg.wwrvvgadm,aQ7wwrvvgadm,aQ7wwrvvgadm,aQ7wwrvvgadm,aQ7xxq$+/:"((K1,11,1T??1b!4;;GDaHxxdQhax?@$GJJr    c                    US   n[        U[        R                  5      (       a  UR                  5       nUS S 2SS S 2S S 24   nX0R                  :  n/ n[        UR                  S   5       H  nX&   u  pxpU R                  bU  [        R                  " [        R                  " XF   5      R                  [        R                  5      U R                  5      nOXF   nU R                  S:X  a  U R                  X6   XU5      u  pO3U R                  S:X  a  U R!                  X6   XU5      u  pO[#        S5      eUR%                  SU05        M     U$ )Nmapsr   rc   quadz,box_type can only be one of ['quad', 'poly']rG   )
isinstancepaddleTensornumpyr   rR   r'   r   r(   dilater   r   r*   r+   r   rK   rX   
ValueErrorr7   )r   	outs_dict
shape_listr9   segmentationboxes_batchbatch_indexsrc_hsrc_wratio_hratio_wr   r@   rA   s                 r   __call__DBPostProcess.__call__   s9    dFMM**::<DAq!QJkk) A/K-7-D*E'##/zzHH\67>>rxxH((
 $0}}& $ 9 9%tE!v &( $ 6 6%tE!v !!OPP%01) 0* r    )r   r   r   r   r   r   r   r   N)333333?gffffff?  g       @Fr   r   )__name__
__module____qualname____firstlineno____doc__r   rK   rX   r2   r4   r1   rS   r   __static_attributes__rj   r    r   r   r      sK     X20d16f)*K"K*r    r   c            	       8    \ rS rSrS/SSSSSSS	S
4	S jrS rSrg)DistillationDBPostProcessi  studentNr   g333333?r   g      ?Fr   r   c
           
      D    Xl         X l        [        UUUUUUU	S9U l        g )N)r   r   r   r   r   r   r   )
model_namern   r   post_process)r   r   rn   r   r   r   r   r   r   r   r   s              r   r   "DistillationDBPostProcess.__init__  s0     %)!)%%!
r    c                 X    0 nU R                    H  nU R                  X   US9X4'   M     U$ )N)r   )r   r   )r   predictsr   resultsks        r   r   "DistillationDBPostProcess.__call__  s3    A**8;:*NGJ !r    )rn   r   r   )r   r   r   r   r   r   r   rj   r    r   r   r     s+     ;
2r    r   )r   
__future__r   r   r   r   r   r(   r   shapely.geometryr   r]   objectr   r   rj   r    r   <module>r      s?    '  %  
  $ cF cL r    