
    9i                        S SK Jr  S SKrS SKrS SKrS SKrS SKrS SKJ	r	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Jr  \R(                  S    S:X  a  S S	KJr  OS S	KJr  S+S
 jrSS/SS/S./ SQ4S jr " S S5      r " S S5      rS rS,S jrS,S jrS rS/ 4S jr  " S S\!5      r"S r#S r$S-S jr%S r&S  r'S.S! jr(S/S" jr)S# r*S$ r+S0S% jr,S1S& jr-S' r.S2S( jr/S) r0S* r1g)3    )print_functionN)ImageJpegImagePlugin)ndimage)ZipFile   )	loadImage   )urlretrievec                 f   [         R                  " U [         R                  " [         R                  " U 5      U:g  5      S   S-   5      nU Vs/ s H  n[	        U5      S:  d  M  UPM     nnUS:X  a  U Vs/ s H  oUS   PM	     nnU$ US:X  a  U Vs/ s H  oUS   PM	     nnW$ s  snf s  snf s  snf )Nr   r   firstlast)npsplitwheredifflen)datamodestepsizegroupitemlresults          M/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/easyocr/utils.pyconsecutiver      s    HHT288BGGDMX$=>qA!CDE#3eds4y{TeE3w!61A$!6M 
%"8%QR5%"8M	 4!6"8s   B$$B$6B)B.      )then)r   r
   r   r   c                 |   / n/ nSnSnU HX  nUS-  S:X  a  SnOSn[        [        R                  " X:H  5      R                  5       U5      n	U	 V
s/ s H  oU/PM     nn
XK-  nMZ     [	        US S9nU H  nUR                  5        Hu  nUS   X   S   :X  a	  UnUS   nM  US   X   S   :X  d  M*  Xm:X  aD  UWS-   US   S-
  //nX:  a  UR                  SX^S-
  //5        US   S-   nUR                  U5        SnMw     M     U[        U 5      S-
  ::  a!  UR                  SU[        U 5      S-
  //5        U$ s  sn
f )	Nr    r
   r   r   c                     U S   $ Nr    xs    r   <lambda>#word_segmentation.<locals>.<lambda>'   s    ad    keyr   )r   r   argwhereflattensortedkeysappendr   )matseparator_idxseparator_idx_listr   sep_list	start_idxsep_langsep_idxr   ar   new_sepseplangsep_start_idxnew_sep_pairs                   r   word_segmentationr@      sk   FHIH%Q;!7TdS^4<<>E0127O2 & hN3H!&&(D1v,Q// #AQ=.q11#$(=?CF1H*E#FL$0Ya,H'JL #AqIMM,/ )  CHQJYC
357M) 3s   D9c                       \ rS rSrSrS rSrg)	BeamEntry<   z7information about one single beam at specific time-stepc                 f    SU l         SU l        SU l        SU l        SU l        SU l        SU l        g )Nr   r   Fr&   T)prTotal
prNonBlankprBlankprText	lmAppliedlabeling
simplifiedselfs    r   __init__BeamEntry.__init__>   s3    r+   )rJ   rI   rG   rF   rH   rE   rK   N)__name__
__module____qualname____firstlineno____doc__rN   __static_attributes__r&   r+   r   rB   rB   <   s
    =r+   rB   c                   0    \ rS rSrSrS rS rS rS rSr	g)		BeamStateG   z1information about the beams at specific time-stepc                     0 U l         g NentriesrL   s    r   rN   BeamState.__init__I   s	    r+   c                    U R                   R                  5        Ha  u  p[        U R                   U   R                  5      nU R                   U   R                  SU(       a  UOS-  -  U R                   U   l        Mc     g)zlength-normalise LM score      ?N)r\   itemsr   rJ   rH   )rM   k_labelingLens       r   normBeamState.normL   sa    ll((*FQdll1o667K%)\\!_%;%;Va{gj@k%lDLLO" +r+   c                     U R                   R                  5        VVs/ s H  u  pUPM	     nnn[        USS S9nU Vs/ s H  oUR                  PM     sn$ s  snnf s  snf )z,return beam-labelings, sorted by probabilityTc                 4    U R                   U R                  -  $ rZ   rE   rH   r'   s    r   r)    BeamState.sort.<locals>.<lambda>U       		!((@Rr+   reverser-   )r\   r`   r0   rJ   )rM   rb   vbeamssortedBeamsr(   s         r   sortBeamState.sortR   sU    !%!3!3!56!5v!56UD6RS$/0Kq

K00 70s
   AAc                    U R                   R                  5        VVs/ s H  u  pVUPM	     nnn[        USS S9n[        U5      U:  a  US U n[	        U5       H\  u  pU
R
                  nSn[	        U5       H(  u  pX;  d  M  US:  a  XS-
     X   :X  a  M!  XU   -  nM*     U	S:X  a  UnX;   a  Un  U$ M^     W$ s  snnf )NTc                 4    U R                   U R                  -  $ rZ   rh   r'   s    r   r)   &BeamState.wordsearch.<locals>.<lambda>Z   rj   r+   rk   r#   r   r   )r\   r`   r0   r   	enumeraterJ   )rM   classes
ignore_idxmaxCandidate	dict_listrb   rm   rn   ro   j	candidateidx_listtextir   	best_texts                   r   
wordsearchBeamState.wordsearchX   s    !%!3!3!56!5v!56UD6RS{|+;};U[%k2LA ))HD *&Q8E?hk;YAJ&D + Av4y  	   3 ' 7s   B<r[   N)
rP   rQ   rR   rS   rT   rN   rd   rp   r   rU   r&   r+   r   rW   rW   G   s    7m1r+   rW   c                 "   U(       a  UR                   (       dv  X R                  (       a  U R                  S   OUR                  S5         nX!R                  S      nSnUR                  XE5      U-  nU R                  U-  Ul        SUl         ggg)zjcalculate LM score of child beam by taking score from parent beam and bigram probability of last two charsr    g{Gz?TN)rI   rJ   indexgetCharBigramrH   )
parentBeam	childBeamrv   lmc1c2lmFactor
bigramProbs           r   applyLMr   n   s    	)%%0C0CZ((,WZI[\''+,%%b-9
%,,z9	"	 &rr+   c                    [         R                  " U 5      n [         R                  " [         R                  " U S5      U :H  X:H  -  ) 5      S   nX   n [         R                  " [         R                  " U S5      [         R                  " U S5      :g  X:H  -  ) 5      S   n[	        U 5      S:  a*  [	        U 5      S-
  nX2;  a  [         R
                  " X#/5      nX   n [        U 5      $ )Nr   r   r   )r   arrayr   rollr   r2   tuple)rJ   blankIdxidxlast_idxs       r   simplify_labelr   x   s    xx!H ((bgghq)X5(:NOP
QRS
TC}H ((rwwx*bgghr.BBxG[\]
_`a
bC
8}qx=?biiZ&@}H?r+   c                 ^   U (       a  X:X  a  U S   U:w  a  X4-   nU$ U (       a*  X:w  a%  U S   U:X  a  U S   U:X  a  X4-   nU$ U S S U4-   n U$ U (       a  X:X  a  U S   U:X  a  U nU$ U (       d	  X:X  a  U nU$ U (       d  X:w  a  X4-   nU$ U (       a  X:w  a  X4-   nU$ X4-   n[        X25      nU$ )Nr   )r   )rJ   cr   newLabelings       r   fast_simplify_labelr      s     AMhrlh&>oB = 
am(@ B<1"T/K4 - #3B-1$.K, ' 
am(@$  !-  !-o  
amo  o$[;r+   c                 R    XR                   ;  a  [        5       U R                   U'   gg)z!add beam if it does not yet existN)r\   rB   )	beamStaterJ   s     r   addBeamr      s%    (((&/k	(# )r+      c                 `   SnU R                   u  px[        5       n	Sn
[        5       U	R                  U
'   SU	R                  U
   l        SU	R                  U
   l        [        U5       GHF  n[        5       nU	R                  5       SU nU GH  n
SnU
(       a#  U	R                  U
   R                  XU
S   4   -  nU	R                  U
   R
                  XU4   -  nU
nU	R                  U
   R                  (       d  [        X5      n
[        X5        XR                  U
   l        UR                  U
   =R                  U-  sl        UR                  U
   =R                  U-  sl        UR                  U
   =R
                  X-   -  sl        U	R                  U   R                  UR                  U
   l        [        R                  " XS S 24   SU-  :  5      S   nU H  n[!        U
UU5      nU
(       a*  U
S   U:X  a!  XU4   U	R                  U   R                  -  nO XU4   U	R                  U   R
                  -  n[        UU5        UUR                  U   l        UR                  U   =R                  U-  sl        UR                  U   =R
                  U-  sl        M     GM     Un	GMI     U	R#                  5         U/ :X  aS  U	R                  5       S   nSn[%        U5       H-  u  nnUU;  d  M  US:  a  UUS-
     UU   :X  a  M%  UUU   -  nM/     U$ U	R'                  XSU5      nU$ )Nr   r&   r   r         ?r#      )shaperW   rB   r\   rG   rE   rangerp   rF   rK   r   r   rJ   rH   r   r   r   rd   ru   r   )r3   rv   rw   r   	beamWidthry   r   maxTmaxCr   rJ   tcurrbestLabelingsrF   rG   prev_labelingchar_highscorer   r   bestLabelingresr~   r   s                           r   ctcBeamSearchr      s   HJD ;DH&[DLL%&DLL"%&DLL" 4[{		Ai0%HJ!\\(3>>QS_AUU
 ||H-55[9IIG %M<<)44)(= D# /7LL"+LL"--;-LL"**g5*LL"**g.BB*,0LL,G,N,NDLL")  XXcQ$i3t8&;<Q?N#
 2(AxH  1!$TT\\--H-P-P!PJ!$TT\\--H-P-P!PJ k* 6A[)2[)44
B4[)11Z?1' $A &t  D 	IIKByy{1~\*CAa
"QU|AE7Jl[\o7]wqz! + J oog2yAJr+   c                   J    \ rS rSrSr0 0 4S jrS
S jrS rSS jrSS jr	Sr
g	)CTCLabelConverteri  z*Convert between text-label and text-index c                     [        U5      n0 U l        [        U5       H  u  pVUS-   U R                  U'   M     S/U-   U l        X l        / nUR                  5        H	  u  pXy-  nM     S/[        U5       VV
s/ s H
  u  pZUS-   PM     sn
n-   U l        [        U5      S:X  aT  / nUR                  5        H=  u  p [        USSS9 nUR                  5       R                  5       nS S S 5        UW-  nM?     OQ0 nUR                  5        H;  u  p[        USSS9 nUR                  5       R                  5       nS S S 5        WX'   M=     Xl        g s  sn
nf ! , (       d  f       Nv= f!    M  = f! , (       d  f       N<= f)Nr   z[blank]r   rz	utf-8-sig)encoding)listdictru   	characterseparator_listr`   rw   r   openread
splitlinesry   )rM   r   r   dict_pathlistdict_characterr~   charseparator_charr=   r<   r   ry   	dict_path
input_file
word_counts                  r   rN   CTCLabelConverter.__init__  sm   i	 0GA!eDIIdO 1 $~5,'--/ID!N 0#9^3L M3L13L MM ~!#I#0#6#6#8iE&0oo&7&B&B&D
 F+I	 $9 I#0#6#6#8)S[AZ",//"3">">"@J B",	 $9
 #' !N FE BAs6   9E<E'E&E'E/
E$	 E''E,/
E=	c                    U Vs/ s H  n[        U5      PM     nnSR                  U5      nU Vs/ s H  oPR                  U   PM     nn[        R                  " U5      [        R                  " U5      4$ s  snf s  snf )a  convert text-label into text-index.
input:
    text: text labels of each image. [batch_size]

output:
    text: concatenated text index for CTCLoss.
            [sum(text_lengths)] = [text_index_0 + text_index_1 + ... + text_index_(n - 1)]
    length: length of each text. [batch_size]
r#   )r   joinr   torch	IntTensor)rM   r}   batch_max_lengthslengthr   s         r   encodeCTCLabelConverter.encode7  sh     #''$Q#a&$'wwt},01DD		$D1%uv'>??	 (1s
   A7A<c                    / nSnU H  nXXE-    n[         R                  " USS USS :H  ) SS5      n[         R                  " U[         R                  " U R                  5      5      ) nXx-  n	SR                  [         R                  " U R                  5      XiR                  5             5      n
UR                  U
5        XE-  nM     U$ )z$convert text-index into text-label. r   r   Nr   Tr#   )	r   insertisinr   rw   r   r   nonzeror2   )rM   
text_indexr   textsr   r   r   r:   br   r}   s              r   decode_greedyCTCLabelConverter.decode_greedyG  s    A+A		QqrUAcrF],Qt4A288DOO455AA77288DNN3AiikNCDDLLJE  r+   c           	          / n[        UR                  S   5       H7  n[        X   U R                  U R                  S US9nUR                  U5        M9     U$ )Nr   )r   )r   r   r   r   rw   r2   )rM   r3   r   r   r~   r   s         r   decode_beamsearch#CTCLabelConverter.decode_beamsearchY  sM    syy|$AcfdnndootW`aALLO % r+   c                    / n[         R                  " USS9n[        UR                  S   5       GH  nSn[	        U R
                  5      S:X  Ga  U R                  S   n[         R                  " XE   U:g  5      R                  5       n[         R                  " U[         R                  " [         R                  " U5      S:g  5      S   S-   5      n	U	 V
s/ s H  n
[	        U
5      S:  d  M  [        U
5      PM!     n	n
[        U	5       HL  u  pXUS S 24   n[        XR                  U R                   S X R"                  S9nUS:X  a  Xn-  nMD  USU-   -  nMN     Os[%        XE   5      nU H`  nXUS   S   US   S   S-   2S S 24   nUS   S:X  a  / nOU R"                  US      n[        XR                  U R                   S UUS9nXn-  nMb     UR'                  U5        GM     U$ s  sn
f )Nr
   )axisr   r#   r   r   )r   ry   )r   argmaxr   r   r   r   r   r.   r/   r   r   r   r   ru   r   r   rw   ry   r@   r2   )rM   r3   r   r   r   r~   string	space_idxr   r   r   rz   list_idxmatrixr   wordswordry   s                     r   decode_wordbeamsearch'CTCLabelConverter.decode_wordbeamsearch`  s   3q)syy|$AF4&&'1, IIcN	{{69i#78@@Brxx0B'CA'Fq'HI16F#d)A+*$t*F#,U#3KA HQ/F%fnndoot09^^UAAvv{v CE/& $4 *&)4!D DGAJtAwqz!|$;A!=>FAw"}"i&*nnT!W&=)%fnndoot_ht}~AKF " LL 7 %8 ) Gs   G#+G#)r   r   ry   rw   r   N)r   )   )rP   rQ   rR   rS   rT   rN   r   r   r   r   rU   r&   r+   r   r   r     s%    535r !#F@ $ r+   r   c                    / / p2U(       d  U $ U [        U5      * S  nU S [        U5      *  n [        U 5       H  u  pVU[        U 5      S-
  :X  a&  UR                  U5        UR                  U5        / nM=  U/ :X  d  US   S   US   :  a  UR                  U5        Me  UR                  U5        / nUR                  U5        M     U H  n[        U5      n[        X(S-
     5      n	[        USS  5       H$  u  pUS   S   S   US   S   S   S   :  d  M"  U
n  O   [        X(   5       H!  u  pUS   S   S   US   S   S   :  d  M  U
n	  O   X(   R                  X5        M     / n U Vs/ s H  o`R	                  U5      PM       nU $ s  snf )Nr   r   r   )r   ru   r2   r   extend)merge_result	free_listmerge_result_bufmr_buffree_list_bufr   r   free_posy_posx_posr~   
result_poss               r   merge_to_freer     s   !2f #i.!12M 0#i.1LL)#l#A%%MM!##F+FbLfRjmad2MM!##F+FMM! * "$%$1W-.&'7';<MA{1~a :a=#3A#6q#99 =
 ''7'>?MA{1~a :a=#3A#66 @
 	&&u7 " L%56%5%56 7s   (Fc                    Uu  p#pE[         R                  " US   US   -
  S-  US   US   -
  S-  -   5      n[         R                  " US   US   -
  S-  US   US   -
  S-  -   5      n[        [        U5      [        U5      5      n[         R                  " US   US   -
  S-  US   US   -
  S-  -   5      n	[         R                  " US   US   -
  S-  US   US   -
  S-  -   5      n
[        [        U	5      [        U
5      5      n[         R                  " SS/US-
  S/US-
  US-
  /SUS-
  //SS9n[
        R                  " X5      n[
        R                  " XX45      nU$ )Nr   r
   r   float32dtype)r   sqrtmaxintr   cv2getPerspectiveTransformwarpPerspective)imagerecttltrbrblwidthAwidthBmaxWidthheightAheightB	maxHeightdstMwarpeds                  r   four_point_transformr	    st   RRWWr!ur!u}*11!/CDEFWWr!ur!u}*11!/CDEF3v;F,H
 gg11!+AA10DEFGgg11!+AA10DEFGCL#g,/I
((QFHqL!,hlIM-JAy[\}K]^hq
rC 	##D.A  H+@AFMr+   c                 Z   / / / / 4u  pxpU  GH4  nUS   US   -
  [         R                  " SUS   US   -
  5      -  nUS   US   -
  [         R                  " SUS   US	   -
  5      -  n[        [        U5      [        U5      5      U:  a  [        US   US   US   US	   /5      n[	        US   US   US   US	   /5      n[        US   US   US   US   /5      n[	        US   US   US   US   /5      nUR                  XUUS
UU-   -  UU-
  /5        GM  [         R                  R                  US	   US   -
  US   US   -
  /5      n[         R                  R                  US   US   -
  US   US   -
  /5      n[        SU-  [	        UU5      -  5      n[        [         R                  " US   US   -
  [         R                  " SUS   US   -
  5      -  5      5      n[        [         R                  " US   US   -
  [         R                  " SUS   US	   -
  5      -  5      5      nUS   [         R                  " U5      U-  -
  nUS   [         R                  " U5      U-  -
  nUS   [         R                  " U5      U-  -   nUS   [         R                  " U5      U-  -
  nUS   [         R                  " U5      U-  -   nUS   [         R                  " U5      U-  -   nUS	   [         R                  " U5      U-  -
  nUS   [         R                  " U5      U-  -   nUR                  UU/UU/UU/UU//5        GM7     U(       a  [        US S9n/ nU H  n[        U5      S:X  a  US   /n US   /n!UR                  U5        M1  [        [         R                  " W!5      US   -
  5      U[         R                  " W 5      -  :  a;  U R                  US   5        U!R                  US   5        UR                  U5        M  US   /n US   /n!U	R                  U5        U/nM     U	R                  U5        U	 GHg  n"[        U"5      S:X  aX  U"S   n#[        U[	        U#S   U#S   -
  U#S   5      -  5      nU
R                  U#S   U-
  U#S   U-   U#S   U-
  U#S   U-   /5        Mk  [        U"S S9n"/ / nn$U" H  n#[        U5      S:X  a  U#S   /n U#S   nUR                  U#5        M0  [        [         R                  " W 5      U#S   -
  5      U[         R                  " U 5      -  :  aD  U#S   W-
  UU#S   U#S   -
  -  :  a,  U R                  U#S   5        U#S   nUR                  U#5        M  U#S   /n U#S   nU$R                  U5        U#/nM     [        U5      S:  a  U$R                  U5        U$ H  n%[        U%5      S:w  a|  [	        U%S S9S   n[        U%S S9S   n[	        U%S S9S   n[        U%S S9S   nX-
  n&UU-
  n'[        U[	        U&U'5      -  5      nU
R                  UU-
  UU-   UU-
  UU-   /5        M  U%S   n#U#S   U#S   -
  n&U#S   U#S   -
  n'[        U[	        U&U'5      -  5      nU
R                  U#S   U-
  U#S   U-   U#S   U-
  U#S   U-   /5        M     GMj     X4$ )Nr   r   
   r
   r   r      r      r   g
ףp=
?c                     U S   $ )Nr   r&   r   s    r   r)    group_text_box.<locals>.<lambda>  s    47r+   r,   c                     U S   $ r%   r&   r  s    r   r)   r    s    47r+   c                     U S   $ r%   r&   r'   s    r   r)   r        AaDr+   c                     U S   $ Nr   r&   r'   s    r   r)   r    r  r+   c                     U S   $ )Nr
   r&   r'   s    r   r)   r    r  r+   c                     U S   $ )Nr   r&   r'   s    r   r)   r    r  r+   )r   maximumr   absminr2   linalgrd   r   arctancossinr0   r   mean)(polys	slope_thsycenter_ths
height_ths	width_ths
add_marginsort_outputhorizontal_listr   combined_listmerged_listpolyslope_up
slope_downx_maxx_miny_maxy_minheightwidthmargintheta13theta24x1y1x2y2x3y3x4y4new_boxb_height	b_ycenterboxesbox
merged_boxmbox	box_width
box_heights(                                           r   group_text_boxrG    s   <>r"RK9O}GDGORZZT!WT!W_%FF1gd1gorzz"tAwtAw'HH
s8}c*o.:aaaa9:Eaaaa9:Eaaaa9:Eaaaa9:E""E%U5[@QSXY^S^#_`YY^^T!WT!W_T!WT!W_$EFFIINNDGDGODGDGO#DEEjUF);;<F"))d1gd1gorzz"tAwtTUw7X%XYZG"))d1gd1gorzz"tAwtTUw7X%XYZGa266'?611Ba266'?611Ba266'?611Ba266'?611Ba266'?611Ba266'?611Ba266'?611Ba266'?611Br"gr"gr"gr"g>?7 8  6JK Gw<1QyHa	INN4  2779%Q/0;rwwx?P3PPQ(  a)t$ G9!!WI	$$W-&!  " ! u:?(CCAs1vc!f$==>FAvc!fVmCF6M#a&QW-XY5&:;E"$RJw<1$ #AxHFENN3'BGGH-A67*RWWXEV:VV^abc^dej^jnwz}~  {A  BE  FG  BH  {H  oI  ^I A/ #As+$'F8 #A"))'2#&%  7|Q
 1 1' :"t9>.9!<E.9!<E.9!<E.9!<E %I!&J s9j/I!JKF&&feFlE&LRWX^R^'_`q'C #AQI!$Q#a&J s9j/I!JKF&&Avc!fVmCF6MRUVWRXY_R_'`a) #5 ` !!r+   c                 $    X-  nUS:  a  SU-  nU$ )zJ
Calculate aspect ratio for normal use case (w>h) and vertical text (h>w)
r_   r&   )r2  r1  ratios      r   calculate_ratiorJ  -  s      LESy5Lr+   c                 "   X-  nUS:  aH  [        X5      n[        R                  " X[        X4-  5      4[        R
                  R                  S9n X4$ [        R                  " U [        X4-  5      U4[        R
                  R                  S9n X4$ )zQ
Calculate ratio and resize correctly for both horizontal text
and vertical case
r_   )interpolation)rJ  r   resizer   r   
ResamplingLANCZOS)imgr2  r1  model_heightrI  s        r   compute_ratio_and_resizerR  6  s    
 LESy-jj3|/A+BCSXScScSkSkl 9 jjc,"45lCRWRbRbRjRjk9r+   c                    / nUR                   u  pgSu  pU H  n
[        R                  " U
SS9n[        X+5      n[	        UR                   S   UR                   S   5      n[        X=-  5      nUS:X  a  M^  [        XR                   S   UR                   S   U5      u  pUR                  X45        [        X5      n	M     [        R                  " U	5      n	U  H  n
[        SU
S   5      n[        U
S   U5      n[        SU
S   5      n[        U
S   U5      nUUU2UU24   nUU-
  nUU-
  n[	        UU5      n[        X=-  5      nUS:X  a  Mu  [        UUUU5      u  pUR                  UU/UU/UU/UU//U45        [        X5      nM     [        R                  " U5      n[        X5      n[        R                  " U5      U-  nU(       a  [        US S	9nUU4$ )
N)r   r   r   r   r   r   r
   r   c                     U S   S   S   $ )Nr   r   r&   r  s    r   r)    get_image_list.<locals>.<lambda>n  s    aAr+   r,   )r   r   r   r	  rJ  r   rR  r2   r   mathceilr  r0   )r'  r   rP  rQ  r&  
image_list	maximum_y	maximum_xmax_ratio_horimax_ratio_freerB  r   transformed_imgrI  	new_widthcrop_imgr.  r-  r0  r/  r2  r1  	max_ratio	max_widths                           r   get_image_listrb  D  s   J))I%("NxxY/.s9 5 5a 89N9Nq9QR*+	>5oF[F[\]F^_n_t_tuv_w  yE  FNH~/ 7N  YY~.NAc!fCF9%Ac!fCF9%uu}eEk12f-*+	>5huVLYNH5-uuUmUSXM!Z\deg 7N " YY~.NN3I		)$\1IJ,FG
y  r+   c                    [         R                  R                  US5      nU(       a  [        SSSS9OS n[	        XUS9  [        US5       nUR                  X5        S S S 5        [         R                  " U5        g ! , (       d  f       N%= f)Nztemp.zip	Progress:Complete2   prefixsuffixr   
reporthookr   )ospathr   printProgressBarr   r   extractremove)urlfilenamemodel_storage_directoryverbosezip_pathrk  zipObjs          r   download_and_unziprw  q  sh    ww||3Z@HW^!ZPRSdhJ*5	3	6x9 
 IIh 
 	s   A<<
B
c                   ^ [         R                  " 5       n[        U S5       m[        U4S jS5       H  nUR	                  U5        M     S S S 5        UR                  5       $ ! , (       d  f       UR                  5       $ = f)Nrbc                  &   > T R                  S5      $ )Ni   )r   )fs   r   r)   calculate_md5.<locals>.<lambda>|  s    !&&,r+   r+   )hashlibmd5r   iterupdate	hexdigest)fnamehash_md5chunkr{  s      @r   calculate_md5r  y  sh    {{}H	eT	a.4EOOE" 5 
  
	 s   )A$$
Bc                 0    [        U 5      [        U 5      -
  $ rZ   )r   r  )
input_lists    r   r   r     s    z?3z?**r+   c                 ,
   / nU  H  nUS    Vs/ s H  n[        US   5      PM     nnUS    Vs/ s H  n[        US   5      PM     nn[        U5      n	[        U5      n
[        U5      n[        U5      nX-
  nUR                  US   XXUSX-   -  S/5        M     Sn[	        U Vs/ s H  oUS   S:X  d  M  UPM     sn5      S:  Ga  U Vs/ s H  oUS   S:X  d  M  UPM     nn[	        U Vs/ s H  oUS   U:X  d  M  UPM     sn5      S:X  a	  XS   S'   GOqU Vs/ s H  oUS   U:X  d  M  UPM     nn[
        R                  " U Vs/ s H  oUS   PM	     sn5      n[        U Vs/ s H  oUS   PM	     sn5      UU-  -
  n[        U Vs/ s H  oUS   PM	     sn5      UU-  -   n[        U Vs/ s H  oUS   PM	     sn5      UU-  -
  n[        U Vs/ s H  oUS   PM	     sn5      UU-  -   nS	nU H  nUUS   s=:*  =(       a    U:*  Os  =(       d    UUS   s=:*  =(       a    U:*  Os  nUUS   s=:*  =(       a    U:*  Os  =(       d    UUS   s=:*  =(       a    U:*  Os  nU(       d  Mz  U(       d  M  XS'   S
n  O   US	:X  a  US-  n[	        U Vs/ s H  oUS   S:X  d  M  UPM     sn5      S:  a  GM  / n[        S U 5       5       GH  nU Vs/ s H  oUS   U:X  d  M  UPM     nn[
        R                  " U Vs/ s H  oUS   PM	     sn5      n[        U Vs/ s H  oUS   PM	     sn5      n[        U Vs/ s H  oUS   PM	     sn5      n[        U Vs/ s H  oUS   PM	     sn5      n[        U Vs/ s H  oUS   PM	     sn5      nSn[	        U5      S:  a  [        U Vs/ s H  oUS   PM	     sn5      nU Vs/ s H  oUS   USU-  -   :  d  M  UPM     nnUS:X  a5  [        U Vs/ s H  oUS   PM	     sn5      nU H  nUS   U:X  d  M  UnM     O:US:X  a4  [        U Vs/ s H  oUS   PM	     sn5      n U H  nUS   U :X  d  M  UnM     USWS   -   -  nUR                  U5        [	        U5      S:  a  M  UR                  UU/UU/UU/UU//USS  /5        GM     U$ s  snf s  snf s  snf s  snf s  snf s  snf s  snf s  snf s  snf s  snf s  snf s  snf s  snf s  snf s  snf s  snf s  snf s  snf s  snf s  snf s  snf s  snf )Nr   r   r   r  r   r
   r   r   FTc              3   *   #    U  H	  oS    v   M     g7f)r  Nr&   ).0rB  s     r   	<genexpr> get_paragraph.<locals>.<genexpr>  s     -9CQ9s   r#   r  g?ltrrtlr   )	r   r  r   r2   r   r   r  setrp  )!
raw_resultx_thsy_thsr   	box_grouprB  coordall_xall_ymin_xmax_xmin_ymax_yr1  current_group
box_group0current_box_groupmean_heightmin_gxmax_gxmin_gymax_gyadd_boxsame_horizontal_levelsame_vertical_levelr   r~   r}   highest
candidates	most_leftbest_box
most_rights!                                    r   get_paragraphr    s'   I,/F3F5U1XF3,/F3F5U1XF3E
E
E
E
#a&%fc5;FWYZ[\  M
i5isq619si5
6
:%.<Yca&!)cY
<yByFM,AyBCqH,qM! 1: S	V]=R	 S''5F"G5Fcq65F"GHK,=>,=Sa&,=>?%BSSF,=>,=Sa&,=>?%BSSF,=>,=Sa&,=>?%BSSF,=>,=Sa&,=>?%BSSFG!)/Q)?)?)?(\VSQRVE[E[U[E[%'-s1v'='=v'=&Z63q6CYCYSYCY#((-@-@*F"G " ~"/ i5isq619si5
6
:2 F-9--,5CISQSICgg1BC1B#1v1BCD(9:(9!f(9:;(9:(9!f(9:;(9:(9!f(9:;(9:(9!f(9:;#$q(->?->cq6->?@G):]):#!fWSQ\_E\>\#):J]u}: >:CQ: >?	%C1v*sH & J!?JSa&J!?@
%C1v+X &CO#D$$X. #$q( 	&&&&QWY[_`a`b[cde1 .4 M} 43 6<B !T"G>>>> 66 DC:::: @] !? "@s   R(R-(R28R2R7R7/R<?R<S-S	S'SS/SSS#SS$#S$?S)
S.
;S3
S8
7S=
&T
?TT,T
'T
c                 $   ^ ^^^^ UUUU U4S jnU$ )a  
    Call in a loop to create terminal progress bar
    @params:
        prefix      - Optional  : prefix string (Str)
        suffix      - Optional  : suffix string (Str)
        decimals    - Optional  : positive number of decimals in percent complete (Int)
        length      - Optional  : character length of bar (Int)
        fill        - Optional  : bar fill character (Str)
        printEnd    - Optional  : end character (e.g. "", "
") (Str)
    c           
         > X-  U-  nS[        T5      -   S-   R                  US-  5      n[        T	U-  5      nTU-  ST	U-
  -  -   n[        ST
 SU SU ST 3S	S
9  g )Nz{0:.zf}d   -z |z| z% r#   )end)strformatr   print)count	blockSize	totalSizeprogresspercentfilledLengthbardecimalsfillr   rh  ri  s          r   progress_hook'printProgressBar.<locals>.progress_hook  s}    $y0CM)D088CH6H,-\!C6L+@$AA6("SEG9Bvh7R@r+   r&   )rh  ri  r  r   r  r  s   ````` r   rn  rn    s    A A r+   c           	         [        U 5      [        :X  a  U R                  S5      (       d  U R                  S5      (       aQ  [        U [	        SSSS9S9u  p[
        R                  " U[
        R                  5      n[        R                  " U5        OD[
        R                  " U [
        R                  5      n[        R                  R                  U 5      n [        U 5      nXC4$ [        U 5      [        :X  a  [        R                  " U [        R                   5      n[
        R"                  " U[
        R$                  5      n[
        R&                  " U[
        R(                  5      n[
        R&                  " U[
        R*                  5      nXC4$ [        U 5      [        R,                  :X  Ga  [/        U R0                  5      S:X  a*  U n[
        R&                  " U [
        R2                  5      nXC4$ [/        U R0                  5      S	:X  aQ  U R0                  S   S
:X  a>  [        R4                  " U 5      n[
        R&                  " U[
        R2                  5      nXC4$ [/        U R0                  5      S	:X  a=  U R0                  S   S	:X  a*  U n[
        R&                  " U [
        R*                  5      nXC4$ [/        U R0                  5      S	:X  ak  U R0                  S   S:X  aX  U S S 2S S 2S S	24   n[
        R&                  " U[
        R6                  5      n[
        R&                  " U[
        R*                  5      nWW4$ [        U 5      [8        R:                  :X  ac  [        R<                  " U 5      n[
        R&                  " U[
        R6                  5      n[
        R&                  " U[
        R*                  5      nXC4$ [?        S5      e)Nzhttp://zhttps://rd  re  rf  rg  rj  r
   r   r   r   zTInvalid input type. Supporting format = string(file path or url), bytes, numpy array) typer  
startswithr   rn  r   imreadIMREAD_GRAYSCALErl  rp  rm  
expanduserr	   bytesr   
frombufferuint8imdecodeIMREAD_COLORcvtColorCOLOR_BGR2RGBCOLOR_BGR2GRAYndarrayr   r   COLOR_GRAY2BGRsqueezeCOLOR_RGB2BGRr   JpegImageFiler   
ValueError)r   tmprb   img_cv_greyrP  nparrimage_arrays          r   reformat_inputr    s   E{cI&&%*:*::*F*F 4Dkdny{4|}FC**S#*>*>?KIIcN**UC,@,@AKGG&&u-E8 7 
e	eRXX.ll5#"2"23ll3 1 12ll3(:(:;. + 
e

	"u{{q K,,uc&8&89C$ # "u{{1~':**U+K,,{C,>,>?C  "u{{1~':C,,uc.@.@AK  "u{{1~':!BQB-C,,sC$5$56C,,sC,>,>?K  
e55	5hhuoll;(9(9:ll3(:(:;  oppr+   c                 t   [        U [        R                  5      (       a  [        U R                  5      S:X  d  [        U [
        5      (       a  / / pCU  Hh  n[        U5      u  pgUb3  Ub0  [        R                  " XaU45      n[        R                  " XqU45      nUR                  U5        UR                  U5        Mj     [        R                  " U5      [        R                  " U5      pC[        UR                  5      S:X  a$  [        UR                  5      S:X  a  [        S5      eX44$ [        U 5      u  p4X44$ )a  
reformats an image or list of images or a 4D numpy image array &
returns a list of corresponding img, img_cv_grey nd.arrays
image:
    [file path, numpy-array, byte stream object,
    list of file paths, list of numpy-array, 4D numpy array,
    list of byte stream objects]
r   r   zThe input image array contains images of different sizes. Please resize all images to same shape or pass n_width, n_height to auto-resize)
isinstancer   r  r   r   r   r  r   rM  r2   r   r  )r   n_widthn_heightrP  r  
single_imgclrgrys           r   reformat_input_batchedr    s    
E2::	&	&3u{{+;q+@ZPUW[E\E\r[J%j1HC"x';jj&9:jj&9:JJsOs#   88C="((;*?[syy>Q3{'8'8#9Q#> o p p  *%0r+   c                     US S  nSnU  H_  nU HV  n[         R                  " US   USS9nUR                  u  px[        X5      n	[	        X95      nUR                  US   U45        MX     Ma     U$ )Nr   T)reshaper   )r   rotater   rJ  r   r2   )
rotationInfoimg_listresult_img_listr`  angleimg_inforotatedr1  r2  rI  s
             r   make_rotated_img_listr  "  sz    qkO I HnnXa[%FG"==LF#E1EI,I""HQK#9: !  r+   c           	          / n[        [        U S   5      5       HS  n[        [        [        U 5      5       Vs/ s H  o3X   U   S   4PM     snS S9S   nUR                  X   U   5        MU     U$ s  snf )ab  Select highest confidence augmentation for TTA
Given a list of lists of results (outer list has one list per augmentation,
inner lists index the images being recognized), choose the best result 
according to confidence level.
Each "result" is of the form (box coords, text, confidence)
A final_result is returned which contains one result for each image
r   r
   c                     U S   $ r  r&   r'   s    r   r)   ,set_result_with_confidence.<locals>.<lambda>@  s    !A$r+   r,   )r   r   r   r2   )resultsfinal_resultcol_ixrow_ixbest_rows        r   set_result_with_confidencer  3  s     LGAJ(@Ec'l@ST@Sfgof-a01@ST  !# 	G-f56 ) 	 Us   A3
)r   r   )r   )g?r   r   r_   g?T)@   T)T)r   r   r  )r#   r#   r   r  u   █)NN)2
__future__r   r   picklenumpyr   rV  r   PILr   r   scipyr   r}  sysrl  zipfiler   imgprocr	   version_infosix.moves.urllib.requestr   urllib.requestr   r@   rB   rW   r   r   r   r   r   objectr   r   r	  rG  rJ  rR  rb  rw  r  r   r  rn  r  r  r  r  r&   r+   r   <module>r     s    %     
 &     A!4* 56a5!u,E\e @	 	% %N#"%N2
 ;=" Yxo ob(T,i"V+!Z +BJ(%P<"r+   