
    y h                        d dl mZ d dlZd dlZd dlZd dlZd dlZd dlm	Z	m
Z
 d dlmZ d dlZd dlZd dlZd dlmZ ddlmZ ej(                  d    dk(  rd d	lmZ nd d	lmZ d+d
Zddgddgdg dfdZ G d d      Z G d d      Zd Zd,dZd,dZd Zdg fdZ  G d de!      Z"d Z#d Z$d-dZ%d Z&d  Z'd.d!Z(d/d"Z)d# Z*d$ Z+d0d%Z,d1d&Z-d' Z.d2d(Z/d) Z0d* Z1y)3    )print_functionN)ImageJpegImagePlugin)ndimage)ZipFile   )	loadImage   )urlretrievec                 J   t        j                  | t        j                  t        j                  |       |k7        d   dz         }|D cg c]  }t	        |      dkD  s| }}|dk(  r|D cg c]  }|d   	 }}|S |dk(  r|D cg c]  }|d   	 }}S c c}w c c}w c c}w )Nr   r   firstlast)npsplitwheredifflen)datamodestepsizegroupitemlresults          i/home/developers/rajanand/mypropertyqr-fmb-refixing-v2/venv/lib/python3.12/site-packages/easyocr/utils.pyconsecutiver      s    HHT288BGGDMX$=>qA!CDE#3ds4y{T3E3w!61!A$!6!6M 
%"8Q1R5"8"8M	 4!6"8s   
BB-BB       )then)r   r
   r   r   c                 n   g }g }d}d}|D ]U  }|dz  dk(  rd}nd}t        t        j                  | |k(        j                         |      }	|	D 
cg c]  }
|
|g }}
||z  }W t	        |d       }|D ]  }|j                         D ]s  }|d   ||   d   k(  r|}|d   }|d   ||   d   k(  s(||k(  rE|dz   |d   dz
  gg}||kD  r|j                  d||dz
  gg       |d   dz   }|j                  |       d}u  |t        |       dz
  k  r!|j                  d|t        |       dz
  gg       |S c c}
w )	Nr    r
   r   r   c                     | d   S Nr    xs    r   <lambda>z#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?      s   FHIH% Q;!7TdSG^4<<>E012T7O22G hN3H !&&( 	D1vt,Q// #AQ=.q11t#$(=?CF1H*E#FL$y0Ya,H'JL #AqIMM,/	 CHQJYC
357M) 3s   D2c                       e Zd ZdZd Zy)	BeamEntryz7information about one single beam at specific time-stepc                 f    d| _         d| _        d| _        d| _        d| _        d| _        d| _        y )Nr   r   Fr&   T)prTotal
prNonBlankprBlankprText	lmAppliedlabeling
simplifiedselfs    r   __init__zBeamEntry.__init__>   s3    r*   N)__name__
__module____qualname____doc__rL   r&   r*   r   rA   rA   <   s
    =r*   rA   c                   (    e Zd ZdZd Zd Zd Zd Zy)	BeamStatez1information about the beams at specific time-stepc                     i | _         y N)entriesrJ   s    r   rL   zBeamState.__init__I   s	    r*   c                     | j                   j                         D ]\  \  }}t        | j                   |   j                        }| j                   |   j                  d|r|ndz  z  | j                   |   _        ^ y)zlength-normalise LM score      ?N)rU   itemsr   rH   rF   )rK   k_labelingLens       r   normzBeamState.normL   sj    ll((* 	mFQdll1o667K%)\\!_%;%;Va{gj@k%lDLLO"	mr*   c                     | j                   j                         D cg c]  \  }}|	 }}}t        |dd       }|D cg c]  }|j                   c}S c c}}w c c}w )z,return beam-labelings, sorted by probabilityTc                 4    | j                   | j                  z  S rT   rC   rF   r'   s    r   r)   z BeamState.sort.<locals>.<lambda>U       		!((@R r*   reverser,   )rU   rX   r/   rH   )rK   rZ   vbeamssortedBeamsr(   s         r   sortzBeamState.sortR   sR    !%!3!3!56v166UD6RS$/0q

00 70s   A Ac                 x   | j                   j                         D cg c]  \  }}|	 }}}t        |dd       }t        |      |kD  r|d | }t	        |      D ]W  \  }	}
|
j
                  }d}t	        |      D ]&  \  }}||vs|dkD  r||dz
     ||   k(  r|||   z  }( |	dk(  r|}||v r|} |S Y S c c}}w )NTc                 4    | j                   | j                  z  S rT   r_   r'   s    r   r)   z&BeamState.wordsearch.<locals>.<lambda>Z   r`   r*   ra   r#   r   r   )rU   rX   r/   r   	enumeraterH   )rK   classes
ignore_idxmaxCandidate	dict_listrZ   rc   rd   re   j	candidateidx_listtextir   	best_texts                   r   
wordsearchzBeamState.wordsearchX   s    !%!3!3!56v166UD6RS{|+;};U[%k2 	LAy ))HD * '!J&Q8AE?hWXk;YGAJ&D' Av4yy  	  	 ' 7s   B6N)rM   rN   rO   rP   rL   r\   rf   rt   r&   r*   r   rR   rR   G   s    7m1r*   rR   c                 
   |r|j                   st|| j                  r| j                  d   n|j                  d         }||j                  d      }d}|j                  ||      |z  }| j                  |z  |_        d|_         yyy)zjcalculate LM score of child beam by taking score from parent beam and bigram probability of last two charsr    g{Gz?TN)rG   rH   indexgetCharBigramrF   )
parentBeam	childBeamrj   lmc1c2lmFactor
bigramProbs           r   applyLMr   n   s    	)%%
0C0CZ((,WZI[\Y''+,%%b"-9
%,,z9	"	 &rr*   c                    t        j                  |       } t        j                  t        j                  | d      | k(  | |k(  z         d   }| |   } t        j                  t        j                  | d      t        j                  | d      k7  | |k(  z         d   }t	        |       dkD  r)t	        |       dz
  }||vrt        j
                  ||g      }| |   } t        |       S )Nr   r   r   )r   arrayr   rollr   r1   tuple)rH   blankIdxidxlast_idxs       r   simplify_labelr   x   s    xx!H ((bgghq)X5(h:NOP
QRS
TC}H ((rwwx*bgghr.BBxS[G[\]
_`a
bC
8}qx=?3biihZ&@}H?r*   c                 $   | r||k(  r| d   |k7  r| |fz   }|S | r(||k7  r#| d   |k(  r| d   |k(  r| |fz   }|S | d d |fz   }|S | r||k(  r| d   |k(  r| }|S | s	||k(  r| }|S | s||k7  r| |fz   }|S | r||k7  r| |fz   }|S | |fz   }t        ||      }|S )Nr   )r   )rH   cr   newLabelings       r   fast_simplify_labelr      s    AMhrlh&>!oB = 
a8m(@ B<1"aT/K4 - #3B-1$.K, ' 
a8m(@$  !x-  !x-!o  
a8m!o  !o$[(;r*   c                 P    || j                   vrt               | j                   |<   yy)z!add beam if it does not yet existN)rU   rA   )	beamStaterH   s     r   addBeamr      s'    y(((&/k	(# )r*      c                 6   d}| j                   \  }}t               }	d}
t               |	j                  |
<   d|	j                  |
   _        d|	j                  |
   _        t        |      D ]9  }t               }|	j                         d| }|D ]  }
d}|
r$|	j                  |
   j                  | ||
d   f   z  }|	j                  |
   j
                  | ||f   z  }|
}|	j                  |
   j                  st        |
|      }
t        ||
       |
|j                  |
   _        |j                  |
   xj                  |z  c_        |j                  |
   xj                  |z  c_        |j                  |
   xj
                  ||z   z  c_        |	j                  |   j                  |j                  |
   _        t        j                  | |d d f   d|z  k\        d   }|D ]  }t!        |
||      }|
r*|
d   |k(  r"| ||f   |	j                  |   j                  z  }n!| ||f   |	j                  |   j
                  z  }t        ||       ||j                  |   _        |j                  |   xj                  |z  c_        |j                  |   xj
                  |z  c_          |}	< |	j#                          |g k(  rK|	j                         d   }d}t%        |      D ]&  \  }}||vs|dkD  r||dz
     ||   k(  r|||   z  }( |S |	j'                  ||d|      }|S )Nr   r&   r   r         ?r#      )shaperR   rA   rU   rE   rC   rangerf   rD   rI   r   r   rH   rF   r   r   r   r\   ri   rt   )r2   rj   rk   r{   	beamWidthrm   r   maxTmaxCr   rH   tcurrbestLabelingsrD   rE   prev_labelingchar_highscorer   r   bestLabelingresrr   r   s                           r   ctcBeamSearchr      s&   HJD$ ;DH&[DLL%&DLL"%&DLL" 4[ ?{		Ai0% 3	@HJ!\\(3>>QQS_AUU
 ||H-55Q[9IIG %M<<)44)(H= D(# /7DLL"+LL"--;-LL"**g5*LL"**g
.BB*,0LL,G,N,NDLL")  XXc!Q$i3t8&;<Q?N# @
 2(AxH  1!$QTT\\--H-P-P!PJ!$QTT\\--H-P-P!PJ k* 6A[)2[)44
B4[)11Z?1'@A3	@t ?D 	IIKByy{1~\* 	"CAa
"QU|AE7Jl[\o7]wqz!	" J oogz2yAJr*   c                   :    e Zd ZdZi i fdZddZd Zd	dZd	dZy)
CTCLabelConverterz+ Convert between text-label and text-index c                    t        |      }i | _        t        |      D ]  \  }}|dz   | j                  |<    dg|z   | _        || _        g }|j                         D ]
  \  }}	||	z  } dgt        |      D 
cg c]
  \  }}
|dz    c}
}z   | _        t        |      dk(  r]g }|j                         D ]@  \  }}	 t        |dd      5 }|j                         j                         }d d d        |z  }B || _        y i }|j                         D ]?  \  }}t        |dd      5 }|j                         j                         }d d d        ||<   A || _        y c c}
}w # 1 sw Y   zxY w#  Y xY w# 1 sw Y   1xY w)Nr   z[blank]r   rz	utf-8-sig)encoding)listdictri   	characterseparator_listrX   rk   r   openread
splitlinesrm   )rK   r   r   dict_pathlistdict_characterrr   charseparator_charr<   r;   r   rm   	dict_path
input_file
word_counts                  r   rL   zCTCLabelConverter.__init__  s   i	 0 	$GAt!eDIIdO	$ $~5,'--/ 	"ID#c!N	"#9^3L M41 MM ~!#I#0#6#6#8 iiE E&0oo&7&B&B&D
E+I	 # I#0#6#6#8 -i)S[A AZ",//"3">">"@JA",	$-
 #' !NE EA As6   9E:E,E 'E,$E3 E)	%E,,E03E<	c                     |D cg c]  }t        |       }}dj                  |      }|D cg c]  }| j                  |    }}t        j                  |      t        j                  |      fS c c}w c c}w )aV  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)rK   rq   batch_max_lengthslengthr   s         r   encodezCTCLabelConverter.encode7  sh     #''Q#a&''wwt},01D		$11%uv'>??	 (1s
   A0A5c                    g }d}|D ]  }||||z    }t        j                  |dd |dd k(   dd      }t        j                  |t        j                  | j                               }||z  }	dj                  t        j                  | j                        ||	j                                     }
|j                  |
       ||z  } |S )z% convert text-index into text-label. r   r   Nr   Tr#   )	r   insertisinr   rk   r   r   nonzeror1   )rK   
text_indexr   textsrw   r   r   r9   br   rq   s              r   decode_greedyzCTCLabelConverter.decode_greedyG  s     	A5+A		QqrUAcrF],Qt4A288DOO455AAA77288DNN3AaiikNCDDLLQJE	 r*   c                     g }t        |j                  d         D ]:  }t        ||   | j                  | j                  d |      }|j                  |       < |S )Nr   )r   )r   r   r   r   rk   r1   )rK   r2   r   r   rr   r   s         r   decode_beamsearchz#CTCLabelConverter.decode_beamsearchY  sT    syy|$ 	Ac!fdnndootW`aALLO	 r*   c           
         g }t        j                  |d      }t        |j                  d         D ]  }d}t	        | j
                        dk(  r| j                  d   }t        j                  ||   |k7        j                         }t        j                  |t        j                  t        j                  |      dk7        d   dz         }	|	D 
cg c]  }
t	        |
      dkD  st        |
       }	}
t        |	      D ]Q  \  }}|||d d f   }t        || j                  | j                   d || j"                        }|dk(  r||z  }J|d|z   z  }S nwt%        ||         }|D ]d  }|||d   d   |d   d   dz   d d f   }|d   dk(  rg }n| j"                  |d      }t        || j                  | j                   d ||      }||z  }f |j'                  |        |S c c}
w )Nr
   )axisr   r#   rv   r   )r   rm   )r   argmaxr   r   r   r   r   r-   r.   r   r   r   r   ri   r   r   rk   rm   r?   r1   )rK   r2   r   r   r   rr   string	space_idxr   r   r   rn   list_idxmatrixr   wordswordrm   s                     r   decode_wordbeamsearchz'CTCLabelConverter.decode_wordbeamsearch`  s   3q)syy|$ 	!AF4&&'1, IIcN	{{6!9i#78@@Brxx0B'CA'Fq'HI16F#d)A+$t*FF#,U#3 *KAx HQ/F%fdnndoot09T^^UAAvv{v CE/&* *&)4!  D DGAJtAwqz!|$;A!=>FAw"}"i&*nnT!W&=)%fdnndoot_ht}~AaKF  LL 7	!8 ) Gs   G"&G"N)r   )   )	rM   rN   rO   rP   rL   r   r   r   r   r&   r*   r   r   r     s%    535r !#F@ $ r*   r   c                    g g }}|s| S | t        |       d  }| d t        |        } t        |       D ]  \  }}|t        |       dz
  k(  r%|j                  |       |j                  |       g }<|g k(  s|d   d   |d   k  r|j                  |       a|j                  |       g }|j                  |        |D ]  }t        |      }t        ||dz
           }	t        |dd        D ]#  \  }
}|d   d   d   |d   d   d   d   k  s!|
} n t        ||         D ]   \  }
}|d   d   d   |d   d   d   k  s|
}	 n ||   j                  |	|        g } |D cg c]  }| j	                  |       c} | S c c}w )Nr   r   r   )r   ri   r1   r   extend)merge_result	free_listmerge_result_bufmr_buffree_list_bufr   r   free_posy_posx_posrr   
result_poss               r   merge_to_freer     s   !2f #i.!12M 0#i.1LL) Q#l#A%%MM!##F+FbLfRjmad2MM!##F+FMM! " 8$%$U1W-.&'7';< 	MAz{1~a :a=#3A#6q#99	
 ''7'>? 	MAz{1~a :a=#3A#66	
 	&&uh78 L%56\6 7s   E9c                    |\  }}}}t        j                  |d   |d   z
  dz  |d   |d   z
  dz  z         }t        j                  |d   |d   z
  dz  |d   |d   z
  dz  z         }t        t        |      t        |            }t        j                  |d   |d   z
  dz  |d   |d   z
  dz  z         }	t        j                  |d   |d   z
  dz  |d   |d   z
  dz  z         }
t        t        |	      t        |
            }t        j                  ddg|dz
  dg|dz
  |dz
  gd|dz
  ggd      }t        j                  ||      }t        j                  | |||f      }|S )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     s~   RR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  Hi+@AFMr*   c                 &   g g g g f\  }}}	}
| D ]$  }|d   |d   z
  t        j                  d|d   |d   z
        z  }|d   |d   z
  t        j                  d|d   |d	   z
        z  }t        t        |      t        |            |k  rt        |d   |d   |d   |d	   g      }t	        |d   |d   |d   |d	   g      }t        |d   |d   |d   |d   g      }t	        |d   |d   |d   |d   g      }|j                  ||||d
||z   z  ||z
  g       	t         j                  j                  |d	   |d   z
  |d   |d   z
  g      }t         j                  j                  |d   |d   z
  |d   |d   z
  g      }t        d|z  t	        ||      z        }t        t        j                  |d   |d   z
  t        j                  d|d   |d   z
        z              }t        t        j                  |d   |d   z
  t        j                  d|d   |d	   z
        z              }|d   t        j                  |      |z  z
  }|d   t        j                  |      |z  z
  }|d   t        j                  |      |z  z   }|d   t        j                  |      |z  z
  }|d   t        j                  |      |z  z   }|d   t        j                  |      |z  z   }|d	   t        j                  |      |z  z
  }|d   t        j                  |      |z  z   }|j                  ||g||g||g||gg       ' |rt        |d       }g }|D ]  }t        |      dk(  r|d   g} |d   g}!|j                  |       /t        t        j                  !      |d   z
        |t        j                         z  k  r:| j                  |d          |!j                  |d          |j                  |       |d   g} |d   g}!|	j                  |       |g} |	j                  |       |	D ]f  }"t        |"      dk(  rW|"d   }#t        |t	        |#d   |#d   z
  |#d         z        }|
j                  |#d   |z
  |#d   |z   |#d   |z
  |#d   |z   g       it        |"d       }"g g }}$|"D ]  }#t        |      dk(  r|#d   g} |#d   }|j                  |#       .t        t        j                         |#d   z
        |t        j                  |       z  k  rB|#d   z
  ||#d   |#d   z
  z  k  r+| j                  |#d          |#d   }|j                  |#       |#d   g} |#d   }|$j                  |       |#g} t        |      dkD  r|$j                  |       |$D ]  }%t        |%      dk7  rt	        |%d       d   }t        |%d       d   }t	        |%d       d   }t        |%d       d   }||z
  }&||z
  }'t        |t	        |&|'      z        }|
j                  ||z
  ||z   ||z
  ||z   g       |%d   }#|#d   |#d   z
  }&|#d   |#d   z
  }'t        |t	        |&|'      z        }|
j                  |#d   |z
  |#d   |z   |#d   |z
  |#d   |z   g        i |
|fS )Nr   r   
   r
   r   r      r      r   g
ףp=
?c                     | d   S )Nr   r&   r   s    r   r)   z group_text_box.<locals>.<lambda>  s
    47 r*   r+   c                     | d   S r%   r&   r   s    r   r)   z group_text_box.<locals>.<lambda>  s
    47 r*   c                     | d   S r%   r&   r'   s    r   r)   z group_text_box.<locals>.<lambda>  
    AaD r*   c                     | d   S Nr   r&   r'   s    r   r)   z group_text_box.<locals>.<lambda>  r   r*   c                     | d   S )Nr
   r&   r'   s    r   r)   z group_text_box.<locals>.<lambda>  r   r*   c                     | d   S )Nr   r&   r'   s    r   r)   z group_text_box.<locals>.<lambda>  r   r*   )r   maximumr   absminr1   linalgr\   r   arctancossinr/   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_boxr4    s   <>r"RK9OY}k @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""E5%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-&!!" !  .b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' :" b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)b5.b` 	!!r*   c                 $    | |z  }|dk  rd|z  }|S )zR
    Calculate aspect ratio for normal use case (w>h) and vertical text (h>w)
    rW   r&   )r  r  ratios      r   calculate_ratior7  -  s"     &LESy5Lr*   c                 6   ||z  }|dk  rNt        ||      }t        j                  | |t        ||z        ft        j
                  j                        } | |fS t        j                  | t        ||z        |ft        j
                  j                        } | |fS )z]
    Calculate ratio and resize correctly for both horizontal text
    and vertical case
    rW   )interpolation)r7  r   resizer   r   
ResamplingLANCZOS)imgr  r  model_heightr6  s        r   compute_ratio_and_resizer?  6  s    
 &LESyf-jjl3|E/A+BCSXScScSkSkl u9 jjc,u"45lCRWRbRbRjRjku9r*   c                    g }|j                   \  }}d\  }}	|D ]  }
t        j                  |
d      }t        ||      }t	        |j                   d   |j                   d         }t        ||z        }|dk(  r`t        ||j                   d   |j                   d   |      \  }}|j                  |
|f       t        ||	      }	 t        j                  |	      }	| D ]  }
t        d|
d         }t        |
d   |      }t        d|
d         }t        |
d   |      }|||||f   }||z
  }||z
  }t	        ||      }t        ||z        }|dk(  rtt        ||||      \  }}|j                  ||g||g||g||gg|f       t        ||      } t        j                  |      }t        ||	      }t        j                  |      |z  }|rt        |d 	      }||fS )
N)r   r   r   r   r   r   r
   r   c                     | d   d   d   S )Nr   r   r&   r   s    r   r)   z get_image_list.<locals>.<lambda>n  s    aA r*   r+   )r   r   r   r   r7  r   r?  r1   r   mathceilr  r/   )r  r   r=  r>  r  
image_list	maximum_y	maximum_xmax_ratio_horimax_ratio_freer/  r   transformed_imgr6  	new_widthcrop_imgr  r  r  r  r  r  	max_ratio	max_widths                           r   get_image_listrN  D  s   J))Ii%("NN 
8xxY/.sD9 5 5a 89N9Nq9QRU*+	>5ooF[F[\]F^_n_t_tuv_w  yE  FNHUH~/ 7N
8 YY~.N 8Ac!fCF9%Ac!fCF9%uu}eEk12f-U*+	>5huVLYNHU5-uuUmUSXM!Z\deg 7N8" YY~.NNN3I		)$\1IJ,FG
y  r*   c                    t         j                  j                  |d      }|rt        ddd      nd }t	        | ||       t        |d      5 }|j                  ||       d d d        t        j                  |       y # 1 sw Y   xY w)Nztemp.zip	Progress:Complete2   prefixsuffixr   
reporthookr   )ospathr   printProgressBarr   r   extractremove)urlfilenamemodel_storage_directoryverbosezip_pathrW  zipObjs          r   download_and_unziprc  q  st    ww||3Z@HW^!ZPRSdhJX*5	3	 :6x!89:IIh: :s   A>>Bc                     t        j                         }t        | d      5 t        fdd      D ]  }|j	                  |        	 d d d        |j                         S # 1 sw Y   |j                         S xY w)Nrbc                  &     j                  d      S )Ni   )r   )fs   r   r)   zcalculate_md5.<locals>.<lambda>|  s    !&&, r*   r*   )hashlibmd5r   iterupdate	hexdigest)fnamehash_md5chunkrg  s      @r   calculate_md5rp  y  so    {{}H	eT	 #a.4 	#EOOE"	## # s   &A!!A9c                 0    t        |       t        |       z
  S rT   )r   r  )
input_lists    r   r   r     s    z?3z?**r*   c                 :	   g }| D ]  }|d   D cg c]  }t        |d          }}|d   D cg c]  }t        |d          }}t        |      }	t        |      }
t        |      }t        |      }||z
  }|j                  |d   |	|
|||d||z   z  dg        d}t	        |D cg c]  }|d   dk(  s| c}      dkD  r|D cg c]  }|d   dk(  s| }}t	        |D cg c]  }|d   |k(  s| c}      dk(  r
||d   d<   n7|D cg c]  }|d   |k(  s| }}t        j                  |D cg c]  }|d   	 c}      }t        |D cg c]  }|d   	 c}      ||z  z
  }t        |D cg c]  }|d   	 c}      ||z  z   }t        |D cg c]  }|d   	 c}      ||z  z
  }t        |D cg c]  }|d   	 c}      ||z  z   }d	}|D ]`  }||d   cxk  xr |k  nc xs ||d   cxk  xr |k  nc }||d   cxk  xr |k  nc xs ||d   cxk  xr |k  nc }|sV|sY||d<   d
} n |d	k(  r|dz  }t	        |D cg c]  }|d   dk(  s| c}      dkD  rg }t        d |D              D ]  }|D cg c]  }|d   |k(  s| }}t        j                  |D cg c]  }|d   	 c}      }t        |D cg c]  }|d   	 c}      }t        |D cg c]  }|d   	 c}      }t        |D cg c]  }|d   	 c}      }t        |D cg c]  }|d   	 c}      }d}t	        |      dkD  rt        |D cg c]  }|d   	 c}      }|D cg c]  }|d   |d|z  z   k  s| }}|dk(  r/t        |D cg c]  }|d   	 c}      }|D ]  }|d   |k(  s|} n3|dk(  r.t        |D cg c]  }|d   	 c}      } |D ]  }|d   | k(  s|} |dd   z   z  }|j                  |       t	        |      dkD  r|j                  ||g||g||g||gg|dd  g        |S c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w )Nr   r   r   r   r   r
   r   r   FTc              3   &   K   | ]	  }|d      yw)r   Nr&   ).0r/  s     r   	<genexpr>z get_paragraph.<locals>.<genexpr>  s     -CQ-s   r#   r   g?ltrrtlrv   )	r   r  r   r1   r   r   r  setr\  )!
raw_resultx_thsy_thsr   	box_groupr/  coordall_xall_ymin_xmax_xmin_ymax_yr  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   rr   rq   highest
candidates	most_leftbest_box
most_rights!                                    r   get_paragraphr    s	   I ],/F35U1X33,/F35U1X33E
E
E
E
#a&%ufc5QV;FWYZ[\] M
i5s3q619s5
6
:%.<c#a&!)c<
<yBCFM,ABCqH,JqM! 1: SSV]=R S S''5F"Gc3q6"GHK,=>S#a&>?%BSSF,=>S#a&>?%BSSF,=>S#a&>?%BSSF,=>S#a&>?%BSSFG! )/Q)?)?(\VSQRVE[U[E[%'-s1v'=v'=&Z63q6CYSYCY#(-@*CF"G ~"/ i5s3q619s5
6
:2 F-9-- f,5CSQSCCgg1BC#s1vCD(9:c!f:;(9:c!f:;(9:c!f:;(9:c!f:;#$q(->?c3q6?@G):]#c!fWSQ\_E\>\#]J]u}: >CQ >?	% ;C1v*sH; J!?S#a&!?@
% <C1v+X<CO#D$$X. #$q( 	&&&&QWY[_`a`b[cde1f4 M} 43 6<B !T"G>>>> 66 DC:::: @] !? "@s   P/P4$P92P9P>P>"Q0QQQ3QQ1QQ5Q!Q&Q&Q+Q+)Q0
Q5
!Q:
=Q?
R
R	
R0RR
8R
c                 "      fd}|S )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           
          | |z  |z  }dt              z   dz   j                  |dz        }t        	|z        }|z  d	|z
  z  z   }t        d
 d| d| d d	
       y )Nz{0:.zf}d   -z |z| z% r#   )end)strformatr   print)count	blockSize	totalSizeprogresspercentfilledLengthbardecimalsfillr   rT  rU  s          r   progress_hookz'printProgressBar.<locals>.progress_hook  s    9$y0CM)D088CH6H,-\!C6L+@$AA6("SEG9Bvh7R@r*   r&   )rT  rU  r  r   r  r  s   ````` r   rZ  rZ    s    A A r*   c                 R   t        |       t        k(  r| j                  d      s| j                  d      rVt        | t	        ddd            \  }}t        j                  |t
        j                        }t        j                  |       nCt        j                  | t
        j                        }t        j                  j                  |       } t        |       }||fS t        |       t        k(  rt        j                  | t        j                         }t        j"                  |t
        j$                        }t        j&                  |t
        j(                        }t        j&                  |t
        j*                        }||fS t        |       t        j,                  k(  rt/        | j0                        dk(  r*| }t        j&                  | t
        j2                        }||fS t/        | j0                        d	k(  rO| j0                  d   d
k(  r=t        j4                  |       }t        j&                  |t
        j2                        }||fS t/        | j0                        d	k(  r<| j0                  d   d	k(  r*| }t        j&                  | t
        j*                        }||fS t/        | j0                        d	k(  rh| j0                  d   dk(  rV| d d d d d d	f   }t        j&                  |t
        j6                        }t        j&                  |t
        j*                        }fS t        |       t8        j:                  k(  rat        j<                  |       }t        j&                  |t
        j6                        }t        j&                  |t
        j*                        }||fS t?        d      )Nzhttp://zhttps://rP  rQ  rR  rS  rV  r
   r   r   r   zTInvalid input type. Supporting format = string(file path or url), bytes, numpy array) typer  
startswithr   rZ  r   imreadIMREAD_GRAYSCALErX  r\  rY  
expanduserr	   bytesr   
frombufferuint8imdecodeIMREAD_COLORcvtColorCOLOR_BGR2RGBCOLOR_BGR2GRAYndarrayr   r   COLOR_GRAY2BGRsqueezeCOLOR_RGB2BGRr   JpegImageFiler   
ValueError)r   tmprZ   img_cv_greyr=  nparrimage_arrays          r   reformat_inputr    s   E{cI&%*:*::*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                 Z   t        | t        j                        rt        | j                        dk(  st        | t
              rg g }}| D ]f  }t        |      \  }}|2|0t        j                  |||f      }t        j                  |||f      }|j                  |       |j                  |       h t        j                  |      t        j                  |      }}t        |j                        dk(  r#t        |j                        dk(  rt        d      ||fS t        |       \  }}||fS )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   r:  r1   r   r  )r   n_widthn_heightr=  r  
single_imgclrgrys           r   reformat_input_batchedr    s    
E2::	&3u{{+;q+@ZPUW[E\r[ 	$J%j1HC"x';jjw&9:jjw&9:JJsOs#	$ 88C="((;*?[syy>Q3{'8'8#9Q#> o p p  *%0[r*   c                     |d d  }d}| D ]a  }|D ]Z  }t        j                  |d   |d      }|j                  \  }}t        ||      }	t	        ||	      }|j                  |d   |f       \ c |S )Nr   T)reshaper   )r   rotater   r7  r   r1   )
rotationInfoimg_listresult_img_listrL  angleimg_inforotatedr  r  r6  s
             r   make_rotated_img_listr  "  s    qkO I ;  	;HnnXa[%FG"==LF5#E&1EIe,I""HQK#9:	;; r*   c           	          g }t        t        | d               D ]U  }t        t        t        |             D cg c]  }|| |   |   d   f c}d       d   }|j                  | |   |          W |S c c}w )a{   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                     | d   S r  r&   r'   s    r   r)   z,set_result_with_confidence.<locals>.<lambda>@  s
    !A$ r*   r+   )r   r   r   r1   )resultsfinal_resultcol_ixrow_ixbest_rows        r   set_result_with_confidencer  3  s     LGAJ( 7@Ec'l@STffgfof-a01T  !# 	GH-f567 	 Us   A4
)r   r   )r   )g?r   r   rW   g?T)@   T)T)r   r   rw  )r#   r#   r   r  u   █)NN)2
__future__r   r   picklenumpyr   rB  r   PILr   r   scipyr   rh  sysrX  zipfiler   imgprocr	   version_infosix.moves.urllib.requestr   urllib.requestr   r?   rA   rR   r   r   r   r   r   objectr   r   r   r4  r7  r?  rN  rc  rp  r   r  rZ  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*   