
    Yh                        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 d6dZddgddgdg dfdZ G d d          Z G d d          Zd Zd7dZd7dZd Zdg fdZ  G d de!          Z"d Z#d Z$d8d$Z%d% Z&d& Z'd9d(Z(d:d)Z)d* Z*d+ Z+d;d-Z,d<d1Z-d2 Z.d=d3Z/d4 Z0d5 Z1dS )>    )print_functionN)ImageJpegImagePlugin)ndimage)ZipFile   )	loadImage   )urlretrievefirstc                     t          j        | t          j        t          j        |           |k              d         dz             }d |D             }|dk    rd |D             }n|dk    rd |D             }|S )Nr   r   c                 8    g | ]}t          |          d k    |S r   len.0items     _/var/www/tools.fuzzalab.pt/emblema-extractor/venv/lib/python3.11/site-packages/easyocr/utils.py
<listcomp>zconsecutive.<locals>.<listcomp>   s#    333ds4yy{{T{{{    r   c                     g | ]
}|d          S r    r   ls     r   r   zconsecutive.<locals>.<listcomp>   s    !6!6!61!A$!6!6!6r   lastc                     g | ]
}|d          S )r   r   s     r   r   zconsecutive.<locals>.<listcomp>   s    "8"8"8Q1R5"8"8"8r   )npsplitwherediff)datamodestepsizegroupresults        r   consecutiver(      s    HT28BGDMMX$=>>qA!CDDE33e333Ew!6!6!6!6!6	"8"8%"8"8"8Mr         )then)r   r
   r)   r*   c                    g }g }d}d}|D ][dz  dk    rd}nd}t          t          j        | k                                              |          }fd|D             }	||	z  }\t	          |d           }|D ]}
|                                D ]}|
d	         ||         d         k    r|}|
d         }%|
d	         ||         d	         k    r\||k    rT||d	z   |
d         d	z
  gg}||k    r|                    d||d	z
  gg           |
d         d	z   }|                    |           d}|t          |           d	z
  k    r)|                    d|t          |           d	z
  gg           |S )
Nr    r
   r   r   c                     g | ]}|gS r   r   )r   r   sep_idxs     r   r   z%word_segmentation.<locals>.<listcomp>%   s    222T7O222r   c                     | d         S Nr   r   xs    r   <lambda>z#word_segmentation.<locals>.<lambda>'   s
    ad r   keyr   )r(   r   argwhereflattensortedkeysappendr   )matseparator_idxseparator_idx_listr'   sep_list	start_idxsep_langr$   anew_sepseplangsep_start_idxnew_sep_pairr0   s                 @r   word_segmentationrI      s   FHIH%  Q;!7TTdSG^44<<>>EE2222222GhNN333H  !&&(( 	 	D1vt,Q/// #AQ=.q111t##$(=?CF1H*E#FL$y00Ya,H'JLLL #AqIMM,///	 CHHQJYC
35777Mr   c                       e Zd ZdZd ZdS )	BeamEntryz7information about one single beam at specific time-stepc                 h    d| _         d| _        d| _        d| _        d| _        d| _        d| _        d S )Nr   r   Fr   T)prTotal
prNonBlankprBlankprText	lmAppliedlabeling
simplifiedselfs    r   __init__zBeamEntry.__init__>   s7    r   N)__name__
__module____qualname____doc__rV   r   r   r   rK   rK   <   s)        ==    r   rK   c                   *    e Zd ZdZd Zd Zd Zd ZdS )	BeamStatez1information about the beams at specific time-stepc                     i | _         d S N)entriesrT   s    r   rV   zBeamState.__init__I   s    r   c                     | j                                         D ]P\  }}t          | j         |         j                  }| j         |         j        d|r|ndz  z  | j         |         _        QdS )zlength-normalise LM score      ?N)r_   itemsr   rR   rP   )rU   k_labelingLens       r   normzBeamState.normL   sv    l((** 	m 	mFQdl1o677K%)\!_%;VaGj{{gj@k%lDLO""	m 	mr   c                     d | j                                         D             }t          |dd           }d |D             S )z,return beam-labelings, sorted by probabilityc                     g | ]\  }}|S r   r   r   rd   vs      r   r   z"BeamState.sort.<locals>.<listcomp>T       666v1666r   Tc                      | j         | j        z  S r^   rM   rP   r3   s    r   r5   z BeamState.sort.<locals>.<lambda>U       	!(@R r   reverser7   c                     g | ]	}|j         
S r   )rR   )r   r4   s     r   r   z"BeamState.sort.<locals>.<listcomp>V   s    000q
000r   )r_   rb   r:   )rU   beamssortedBeamss      r   sortzBeamState.sortR   sO    66!3!3!5!5666UD6R6RSSS00K0000r   c                    d | j                                         D             }t          |dd           }t          |          |k    r
|d |         }t	          |          D ]]\  }}|j        }	d}
t	          |	          D ]/\  }}||vr&|dk    r|	|dz
           |	|         k    s|
||         z  }
0|dk    r|
}|
|v r|
} n^|S )Nc                     g | ]\  }}|S r   r   ri   s      r   r   z(BeamState.wordsearch.<locals>.<listcomp>Y   rk   r   Tc                      | j         | j        z  S r^   rm   r3   s    r   r5   z&BeamState.wordsearch.<locals>.<lambda>Z   rn   r   ro   r.   r   r   )r_   rb   r:   r   	enumeraterR   )rU   classes
ignore_idxmaxCandidate	dict_listrr   rs   j	candidateidx_listtextir   	best_texts                 r   
wordsearchzBeamState.wordsearchX   s   66!3!3!5!5666UD6R6RSSS{|++;}};U[%k22 	 	LAy )HD ** ' '!J&&Q8AE?hWXk;Y;YGAJ&DAvv4yy   	r   N)rW   rX   rY   rZ   rV   rf   rt   r   r   r   r   r\   r\   G   sY        77  m m m1 1 1    r   r\   c                    |r||j         sw|| j        r| j        d         n|                    d                   }||j        d                  }d}|                    ||          |z  }| j        |z  |_        d|_         dS dS dS )zjcalculate LM score of child beam by taking score from parent beam and bigram probability of last two charsr    g{Gz?TN)rQ   rR   indexgetCharBigramrP   )
parentBeam	childBeamry   lmc1c2lmFactor
bigramProbs           r   applyLMr   n   s    	 #)% #
0C[Z(,,WZI[I[\Y'+,%%b"--9
%,z9	"	# # # #r   c                    t          j        |           } t          j        t          j        | d          | k    | |k    z             d         }| |         } t          j        t          j        | d          t          j        | d          k    | |k    z             d         }t	          |           dk    r,t	          |           dz
  }||vrt          j        ||g          }| |         } t          |           S )Nr   r   r   )r   arrayr!   rollr   r<   tuple)rR   blankIdxidxlast_idxs       r   simplify_labelr   x   s    x!!H (bghq))X5(h:NOP
Q
QRS
TC}H (rwx**bghr.B.BBxS[G[\]
_
_`a
bC
8}}qx==?3bihZ&@&@}H??r   c                 T   | r||k    r| d         |k    r| |fz   }n| r4||k    r.| d         |k    r"| d         |k    r| |fz   }ne| d d         |fz   }nV| r||k    r| d         |k    r| }n?| s	||k    r| }n4| s||k    r| |fz   }n%| r||k    r| |fz   }n| |fz   }t          ||          }|S )Nr   )r   )rR   cr   newLabelings       r   fast_simplify_labelr      s#      <AMMhrlh&>&>!o 
 <a8mm(@(@ B<1"aT/KK #3B3-1$.KK 
 <a8mm(@(@  <!x--  	<!x--!o	 <a8mm!o !o$[(;;r   c                 H    || j         vrt                      | j         |<   dS dS )z!add beam if it does not yet existN)r_   rK   )	beamStaterR   s     r   addBeamr      s/    y(((&/kk	(### )(r      c                     d}| j         \  }}t                      }	d}
t                      |	j        |
<   d|	j        |
         _        d|	j        |
         _        t          |          D ]}t                      }|	                                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_        |}	|	                                 |g k    r\|	                                d         }d}t%          |          D ]/\  }}||vr&|dk    r||dz
           ||         k    s|||         z  }0n|	                    ||d|          }|S )Nr   r   r   r         ?r.      )shaper\   rK   r_   rO   rM   rangert   rN   rS   r   r   rR   rP   r   r!   r   rf   rx   r   )r=   ry   rz   r   	beamWidthr|   r   maxTmaxCr   rR   tcurrbestLabelingsrN   rO   prev_labelingchar_highscorer   r   bestLabelingresr   r   s                           r   ctcBeamSearchr      sT   HJD$ ;;DH&[[DL%&DL"%&DL" 4[[ ? ?{{		AiK0% 3	@ 3	@HJ V!\(3>QQS_AUU
 |H-5Q[9IIG %M<)4 >)(H== D(### /7DL"+L"--;--L"**g5**L"**g
.BB**,0L,G,NDL")  Xc!QQQ$i3t8&;<<Q?N# @ @
 2(AxHH  Q 1 1!$QTT\--H-P!PJJ!$QTT\--H-P!PJ k*** 6A[)2[)44
B44[)11Z?111'@4  	IIKKKByy{{1~\** 	" 	"CAa
""QUU|AE7Jl[\o7]7]wqz!	"
 oogz2yA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d	S )CTCLabelConverterz+ Convert between text-label and text-index c                 *   t          |          }i | _        t          |          D ]\  }}|dz   | j        |<   dg|z   | _        || _        g }|                                D ]
\  }}	||	z  }dgd t          |          D             z   | _        t          |          dk    rzg }
|                                D ]b\  }}	 t          |dd          5 }|	                                
                                }d d d            n# 1 swxY w Y   |
|z  }
\#  Y `xY wnqi }
|                                D ]Z\  }}t          |dd          5 }|	                                
                                }d d d            n# 1 swxY w Y   ||
|<   [|
| _        d S )Nr   z[blank]r   c                     g | ]
\  }}|d z   S r   r   )r   r   r   s      r   r   z.CTCLabelConverter.__init__.<locals>.<listcomp>"  s      M M M41 M M Mr   rz	utf-8-sig)encoding)listdictrx   	characterseparator_listrb   rz   r   openread
splitlinesr|   )rU   r   r   dict_pathlistdict_characterr   charseparator_charrF   rE   r|   	dict_path
input_file
word_counts                 r   rV   zCTCLabelConverter.__init__  sh   i	 00 	$ 	$GAt!eDIdOO#~5,'--// 	" 	"ID#c!NN# M M9^3L3L M M MM ~!##I#0#6#6#8#8  iiEEE E&0oo&7&7&B&B&D&D
E E E E E E E E E E E E E E E+IID I#0#6#6#8#8 - -i)S[AAA AZ",//"3"3">">"@"@JA A A A A A A A A A A A A A A",	$"sB   =D'D6DD	D	D	
DD'E;;E?	E?	r   c                      d |D             }d                     |          } fd|D             }t          j        |          t          j        |          fS )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]
        c                 ,    g | ]}t          |          S r   r   )r   ss     r   r   z,CTCLabelConverter.encode.<locals>.<listcomp>A  s    '''Q#a&&'''r   r.   c                 *    g | ]}j         |         S r   )r   )r   r   rU   s     r   r   z,CTCLabelConverter.encode.<locals>.<listcomp>C  s    111D	$111r   )jointorch	IntTensor)rU   r   batch_max_lengthlengths   `   r   encodezCTCLabelConverter.encode7  s_     ('$'''wwt}}1111D111%%uv'>'>??r   c                    g }d}|D ]}||||z            }t          j        |dd         |dd         k     dd          }t          j        |t          j        | j                             }||z  }	d                    t          j        | j                  ||	                                                            }
|                    |
           ||z  }|S )z% convert text-index into text-label. r   r   Nr   Tr.   )	r   insertisinr   rz   r   r   nonzeror<   )rU   
text_indexr   textsr   r   r   rC   br   r   s              r   decode_greedyzCTCLabelConverter.decode_greedyG  s     	 	A5?+A	QqrrUAcrcF],Qt44A28DO44555AAA7728DN33AaiikkNCDDDLLQJEEr      c                     g }t          |j        d                   D ];}t          ||         | j        | j        d |          }|                    |           <|S )Nr   )r   )r   r   r   r   rz   r<   )rU   r=   r   r   r   r   s         r   decode_beamsearchz#CTCLabelConverter.decode_beamsearchY  s[    sy|$$ 	 	Ac!fdndotW`aaaALLOOOOr   c           
         g }t          j        |d          }t          |j        d                   D ]}d}t	          | j                  dk    r| j        d         }t          j        ||         |k                                              }t          j	        |t          j
        t          j        |          dk              d         dz             }	d |	D             }	t          |	          D ]J\  }
}|||d d f         }t          || j        | j        d || j                  }|
dk    r||z  }B|d|z   z  }Knt#          ||                   }|D ]r}|||d         d         |d         d         dz   d d f         }|d         dk    rg }n| j        |d                  }t          || j        | j        d ||          }||z  }s|                    |           |S )	Nr
   )axisr   r.   r   r   c                 R    g | ]$}t          |          d k    t          |          %S r   )r   r   r   s     r   r   z;CTCLabelConverter.decode_wordbeamsearch.<locals>.<listcomp>l  s)    FFF#d))A++$t**+++r   )r   r|   )r   argmaxr   r   r   r   r   r8   r9   r    r!   r"   rx   r   r   rz   r|   rI   r<   )rU   r=   r   r   r   r   string	space_idxr#   r&   r}   list_idxmatrixr   wordswordr|   s                    r   decode_wordbeamsearchz'CTCLabelConverter.decode_wordbeamsearch`  s   3q)))sy|$$ 	! 	!AF4&''1,, IcN	{6!9i#788@@BBrx0B'C'CA'Fq'HIIFFFFF#,U#3#3 * *KAx HQQQ/F%fdndot09T^U U UAAvvv{vv CE/&&* *&)44!    D DGAJtAwqz!|$;AAA!=>FAw"}}"ii&*nT!W&=)%fdndot_ht}~~~AaKFFLL    r   N)r   r   )	rW   rX   rY   rZ   rV   r   r   r   r   r   r   r   r   r     s        5535r !# !# !# !#F@ @ @ @   $              r   r   c                     g g }}|s S  t          |           d          } d t          |                     t                     D ]\  }}|t                     dz
  k    r-|                    |           |                    |           g }H|g k    s|d         d         |d         k     r|                    |           ||                    |           g }|                    |           |D ]}t          |          }t          ||dz
                     }	t          |dd                    D ]9\  }
}|d         d         d         |d         d         d         d         k     r|
} n:t          ||                   D ]3\  }
}|d         d         d         |d         d         d         k     r|
}	 n4||                             |	|           g   fd|D               S )Nr   r   r   c                 :    g | ]}                     |          S r   )extend)r   r   merge_results     r   r   z!merge_to_free.<locals>.<listcomp>  s'    666\666r   )r   rx   r<   r   )r   	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!12M 0#i.. 01LL))  Q#l##A%%%MM!##F+++FbLLfRjmad22MM!##F+++FMM!! 8 8$%%$U1W-..&'7';<< 	 	MAz{1~a :a=#3A#6q#999 : ''7'>?? 	 	MAz{1~a :a=#3A#666 7 	&&uh7777L6666%56666r   c                 J   |\  }}}}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Wr!ur!u}*11!/CDEEFWr!ur!u}*11!/CDEEF3v;;F,,H
 g11!+AA10DEFFGg11!+AA10DEFFGCLL#g,,//I
(QFHqL!,hlIM-JAy[\}K]^hq
r
r
rC 	#D#..A Hi+@AAFMr   皙?r   ra   皙?Tc                 |   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          }|                    ||||d
||z   z  ||z
  g           ot           j                            |d	         |d         z
  |d         |d         z
  g          }t           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   }|                    ||g||g||g||gg           |rt          |d           }g }|D ]}t          |          dk    r(|d         g} |d         g}!|                    |           =t          t          j        |!          |d         z
            |t          j        |           z  k     rL|                     |d                    |!                    |d                    |                    |           |d         g} |d         g}!|	                    |           |g}|	                    |           |	D ]'}"t          |"          dk    r{|"d         }#t          |t	          |#d         |#d         z
  |#d                   z            }|
                    |#d         |z
  |#d         |z   |#d         |z
  |#d         |z   g           t          |"d           }"g g }}$|"D ]}#t          |          dk    r'|#d         g} |#d         }|                    |#           =t          t          j        |           |#d         z
            |t          j        |           z  k     rZ|#d         |z
  ||#d         |#d         z
  z  k     r9|                     |#d                    |#d         }|                    |#           |#d         g} |#d         }|$                    |           |#g}t          |          dk    r|$                    |           |$D ]M}%t          |%          dk    rt	          |%d           d         }t          |%d           d         }t	          |%d           d         }t          |%d           d         }||z
  }&||z
  }'t          |t	          |&|'          z            }|
                    ||z
  ||z   ||z
  ||z   g           |%d         }#|#d         |#d         z
  }&|#d         |#d         z
  }'t          |t	          |&|'          z            }|
                    |#d         |z
  |#d         |z   |#d         |z
  |#d         |z   g           O)|
|fS )Nr)   r   
   r
   r   r      r*      r   g
ףp=
?c                     | d         S )Nr*   r   r   s    r   r5   z group_text_box.<locals>.<lambda>  s
    47 r   r6   c                     | d         S r2   r   r  s    r   r5   z group_text_box.<locals>.<lambda>  s
    47 r   c                     | d         S r2   r   r3   s    r   r5   z group_text_box.<locals>.<lambda>  
    AaD r   c                     | d         S Nr   r   r3   s    r   r5   z group_text_box.<locals>.<lambda>  r  r   c                     | d         S )Nr
   r   r3   s    r   r5   z group_text_box.<locals>.<lambda>  r  r   c                     | d         S )Nr)   r   r3   s    r   r5   z group_text_box.<locals>.<lambda>  r  r   )r   maximumr   absminr<   linalgrf   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_boxrL    s>   <>r"RK9OY}k @ @GDGORZT!WT!W_%F%FF1gd1gorz"tAwtAw'H'HH
s8}}c*oo..::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^#_````Y^^T!WT!W_T!WT!W_$EFFFINNDGDGODGDGO#DEEEjUF););;<<F")d1gd1gorz"tAwtTUw7X7X%XYYZZG")d1gd1gorz"tAwtTUw7X7X%XYYZZGa26'??611Ba26'??611Ba26'??611Ba26'??611Ba26'??611Ba26'??611Ba26'??611Ba26'??611Br"gr"gr"gr"g>???? L 6J6JKKK G ! !w<<1QyHa	INN4     279%%Q/00;rwx?P?P3PPPQ(((  a)))t$$$$ G9!!WI	$$W---&!!!  .b .bu::??(CCAs1vc!f$=$==>>FAvc!fVmCF6M#a&QW-XYYYY5&:&:;;;E"$RJ ( (w<<1$$ #AxHFENN3''''BGH--A677*RWXEVEV:VVV^abc^dej^jnwz}~  {A  BE  FG  BH  {H  oI  ^I  ^I A/// #As++++$'F8 #A"))'222#&%7||Q
 1 1' : : :" b bt99>>..999!<E..999!<E..999!<E..999!<E %I!&J s9j/I/I!JKKF&&feFlE&LRWX^R^'_````q'C #AQI!$Q#a&J s9j/I/I!JKKF&&Avc!fVmCF6MRUVWRXY_R_'`aaaa)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)
    ra   r   )r7  r6  ratios      r   calculate_ratiorO  -  s$     &LESyy5Lr   c                 "   ||z  }|dk     rIt          ||          }t          j        | |t          ||z            ft          j        j                  } n8t          j        | t          ||z            |ft          j        j                  } | |fS )z]
    Calculate ratio and resize correctly for both horizontal text
    and vertical case
    ra   )interpolation)rO  r   resizer   r   
ResamplingLANCZOS)imgr7  r6  model_heightrN  s        r   compute_ratio_and_resizerW  6  s    
 &LESyyf--jl3|E/A+B+BCSXScSkllljc,u"455lCRWRbRjkkku9r   @   c                 6   g }|j         \  }}d\  }}	|D ]}
t          j        |
d          }t          ||          }t	          |j         d         |j         d                   }t          ||z            }|dk    rgt          ||j         d         |j         d         |          \  }}|                    |
|f           t          ||	          }	t          j
        |	          }	| D ]}
t          d|
d                   }t          |
d         |          }t          d|
d                   }t          |
d         |          }|||||f         }||z
  }||z
  }t	          ||          }t          ||z            }|dk    rt          ||||          \  }}|                    ||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   r5   z get_image_list.<locals>.<lambda>n  s    aA r   r6   )r   r   r   r  rO  r   rW  r<   r   mathceilr  r:   )r,  r   rU  rV  r+  
image_list	maximum_y	maximum_xmax_ratio_horimax_ratio_freerG  r   transformed_imgrN  	new_widthcrop_imgr3  r2  r5  r4  r7  r6  	max_ratio	max_widths                           r   get_image_listrg  D  s`   J)Ii%("NN 
8 
8xY///.sD99 5a 89Nq9QRRU*++	>>5ooF[\]F^_n_tuv_w  yE  F  FNHUH~/// 77NN Y~..N 8 8Ac!fCF9%%Ac!fCF9%%uu}eEk12f--U*++	>>5huVLYYNHU5-uuUmUSXM!Z\deggg 77NNY~..NNN33I	)$$\1I HJ,F,FGGG
y  r   c                 :   t           j                            |d          }|rt          ddd          nd }t	          | ||           t          |d          5 }|                    ||           d d d            n# 1 swxY w Y   t          j        |           d S )Nztemp.zip	Progress:Complete2   prefixsuffixr   
reporthookr   )ospathr   printProgressBarr   r   extractremove)urlfilenamemodel_storage_directoryverbosezip_pathrp  zipObjs          r   download_and_unzipr|  q  s    w||3Z@@HW^h!ZPRSSSSdhJX*5555	3		 :6x!8999: : : : : : : : : : : : : : :Ihs   A<<B B c                     t          j                    }t          | d          5 t          fdd          D ]}|                    |           	 d d d            n# 1 swxY w Y   |                                S )Nrbc                  .                          d          S )Ni   )r   )fs   r   r5   zcalculate_md5.<locals>.<lambda>|  s    !&&,, r   r   )hashlibmd5r   iterupdate	hexdigest)fnamehash_md5chunkr  s      @r   calculate_md5r  y  s    {}}H	eT		 #a....44 	# 	#EOOE""""	## # # # # # # # # # # # # # # s   ,AA"%A"c                 @    t          |           t          |           z
  S r^   )r   r  )
input_lists    r   r"   r"     s    z??3z??**r   ltrc                    g }| D ]}d |d         D             }d |d         D             }t          |          }t          |          }	t          |          }
t          |          }||
z
  }|                    |d         ||	|
||d|
|z   z  dg           dt          d |D                       dk    rud |D             }t          fd|D                       dk    r|d         d	<   nfd
|D             }t	          j        d |D                       t          d |D                       |z  z
  }t          d |D                       |z  z   }t          d |D                       |z  z
  }t          d |D                       |z  z   }d}|D ]g}||d         cxk    o|k    nc p||d         cxk    o|k    nc }||d         cxk    o|k    nc p||d         cxk    o|k    nc }|r|r	|d	<   d} nh|dk    rdz  t          d |D                       dk    ug }t          d |D                       D ]fd|D             }t	          j        d |D                       t          d |D                       }t          d |D                       }t          d |D                       }t          d |D                       }d}t          |          dk    rt          d |D                       fd|D             }|dk    r-t          d  |D                       }|D ]}|d         |k    r|}n2|d!k    r,t          d" |D                       }|D ]}|d         |k    r|}|d#|d         z   z  }|                    |           t          |          dk    |                    ||g||g||g||gg|dd          g           |S )$Nc                 8    g | ]}t          |d                    S r   r   r   coords     r   r   z!get_paragraph.<locals>.<listcomp>  "    3335U1X333r   r   c                 8    g | ]}t          |d                    S r   r  r  s     r   r   z!get_paragraph.<locals>.<listcomp>  r  r   r   r   c                 *    g | ]}|d          dk    |S r  r   r   r   rG  s     r   r   z!get_paragraph.<locals>.<listcomp>  s!    555s3q6199s999r   c                 *    g | ]}|d          dk    |S r  r   r  s     r   r   z!get_paragraph.<locals>.<listcomp>  s!    <<<c#a&!))c)))r   c                 ,    g | ]}|d          k    |S r  r   r   rG  current_groups     r   r   z!get_paragraph.<locals>.<listcomp>  s'    BBBCFM,A,A,A,A,Ar   r  c                 ,    g | ]}|d          k    |S r  r   r  s     r   r   z!get_paragraph.<locals>.<listcomp>  s'     S S SSV]=R=R=R=R=Rr   c                     g | ]
}|d          S r   r   r  s     r   r   z!get_paragraph.<locals>.<listcomp>  s    "G"G"Gc3q6"G"G"Gr   c                     g | ]
}|d          S r   r   r  s     r   r   z!get_paragraph.<locals>.<listcomp>      >>>S#a&>>>r   c                     g | ]
}|d          S r
   r   r  s     r   r   z!get_paragraph.<locals>.<listcomp>  r  r   c                     g | ]
}|d          S r)   r   r  s     r   r   z!get_paragraph.<locals>.<listcomp>  r  r   c                     g | ]
}|d          S r*   r   r  s     r   r   z!get_paragraph.<locals>.<listcomp>  r  r   Fr
   r)   r*   Tc              3   &   K   | ]}|d          V  dS )r  Nr   r  s     r   	<genexpr>z get_paragraph.<locals>.<genexpr>  s&      --CQ------r   c                 ,    g | ]}|d          k    |S r  r   )r   rG  r   s     r   r   z!get_paragraph.<locals>.<listcomp>  s"    CCCSQSr   c                     g | ]
}|d          S r   r   r  s     r   r   z!get_paragraph.<locals>.<listcomp>  s    CCC#s1vCCCr   c                     g | ]
}|d          S r   r   r  s     r   r   z!get_paragraph.<locals>.<listcomp>      :::c!f:::r   c                     g | ]
}|d          S r  r   r  s     r   r   z!get_paragraph.<locals>.<listcomp>  r  r   c                     g | ]
}|d          S r  r   r  s     r   r   z!get_paragraph.<locals>.<listcomp>  r  r   c                     g | ]
}|d          S r  r   r  s     r   r   z!get_paragraph.<locals>.<listcomp>  r  r   r.   c                     g | ]
}|d          S )r  r   r  s     r   r   z!get_paragraph.<locals>.<listcomp>  s    ???c3q6???r   c                 8    g | ]}|d          dz  z   k     |S )r  g?r   )r   rG  highestmean_heights     r   r   z!get_paragraph.<locals>.<listcomp>  s1    ]]]#c!fWSQ\_E\>\>\#>\>\>\r   r  c                     g | ]
}|d          S r   r   r  s     r   r   z!get_paragraph.<locals>.<listcomp>  s     > > >CQ > > >r   rtlc                     g | ]
}|d          S r  r   r  s     r   r   z!get_paragraph.<locals>.<listcomp>  s    !?!?!?S#a&!?!?!?r   r   )r  r   r<   r   r   r$  setru  ) 
raw_resultx_thsy_thsr$   	box_grouprG  all_xall_ymin_xmax_xmin_ymax_yr6  
box_group0current_box_groupmin_gxmax_gxmin_gymax_gyadd_boxsame_horizontal_levelsame_vertical_levelr'   r   
candidates	most_leftbest_box
most_rightr  r  r   r  s                                @@@@r   get_paragraphr    sQ   I ] ]33CF33333CF333E

E

E

E

#a&%ufc5QV;FWYZ[\\\\M
55i555
6
6
:
:<<Y<<<
BBBByBBBCCqHH,JqM! !T S S S	 S S S'"G"G5F"G"G"GHHK>>,=>>>??%BSSF>>,=>>>??%BSSF>>,=>>>??%BSSF>>,=>>>??%BSSFG!  )/Q)?)?)?)?)?)?)?)?(\VSQRVE[E[E[E[U[E[E[E[E[%'-s1v'='='='=v'='='='=&Z63q6CYCYCYCYSYCYCYCYCY#( -@ *CF"GE~~"/ 55i555
6
6
:
:2 F--9----- f fCCCCICCCgCC1BCCCDD::(9:::;;::(9:::;;::(9:::;;::(9:::;;#$$q((??->???@@G]]]]]):]]]Ju}} > >: > > >??	% ; ;C1v**sH; !?!?J!?!?!?@@
% < <C1v++XCO#D$$X... #$$q(( 	&&&&QWY[_`a`b`b[cdeeeeMr   r.   d      █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                       |dz            }t          	|z            }|z  d	|z
  z  z   }t          d
 d| d| d d	
           d S )Nz{0:.zf}r  -z |z| z% r.   )end)strformatr   print)count	blockSize	totalSizeprogresspercentfilledLengthbardecimalsfillr   rm  rn  s          r   progress_hookz'printProgressBar.<locals>.progress_hook  s    9$y0CMM)D088CHH6H,--\!C6L+@$AA7677S77G77v77R@@@@@@r   r   )rm  rn  r  r   r  r  s   ````` r   rs  rs    sE    A A A A A A A A A r   c                    t          |           t          k    r|                     d          s|                     d          rXt          | t	          ddd                    \  }}t          j        |t
          j                  }t          j	        |           n>t          j        | t
          j                  }t          j
                            |           } t          |           }nt          |           t          k    r~t          j        | t          j                  }t          j        |t
          j                  }t          j        |t
          j                  }t          j        |t
          j                  }nt          |           t          j        k    r]t/          | j                  dk    r#| }t          j        | t
          j                  }nt/          | j                  d	k    rF| j        d         d
k    r5t          j        |           }t          j        |t
          j                  }nCt/          | j                  d	k    r3| j        d         d	k    r"| }t          j        | t
          j                  }nt/          | j                  d	k    r`| j        d         dk    rO| d d d d d d	f         }t          j        |t
          j                  }t          j        |t
          j                  }nt          |           t8          j        k    rSt          j        |           }t          j        |t
          j                  }t          j        |t
          j                  }nt?          d          ||fS )Nzhttp://zhttps://ri  rj  rk  rl  ro  r
   r)   r   r*   zTInvalid input type. Supporting format = string(file path or url), bytes, numpy array) typer  
startswithr   rs  r   imreadIMREAD_GRAYSCALErq  ru  rr  
expanduserr	   bytesr   
frombufferuint8imdecodeIMREAD_COLORcvtColorCOLOR_BGR2RGBCOLOR_BGR2GRAYndarrayr   r   COLOR_GRAY2BGRsqueezeCOLOR_RGB2BGRr   JpegImageFiler   
ValueError)r   tmprd   img_cv_greyrU  nparrimage_arrays          r   reformat_inputr    s   E{{cI&& 	.%*:*::*F*F 	. 4Dkdny{4|4|4|}}}FC*S#*>??KIcNNNN*UC,@AAKG&&u--E	e		eRX..l5#"233l3 122l3(:;;	e
	"	"u{q  K,uc&899CC""u{1~':':*U++K,{C,>??CC""u{1~':':C,uc.@AAKK""u{1~':':!!!BQB-C,sC$566C,sC,>??K	e5	5	5huool;(9::l3(:;;opppr   c                 z   t          | t          j                  rt          | j                  dk    st          | t
                    rg g }}| D ]p}t          |          \  }}|0|.t          j        |||f          }t          j        |||f          }|	                    |           |	                    |           qt          j
        |          t          j
        |          }}t          |j                  dk    r't          |j                  dk    rt          d          n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*   Nr   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   rR  r<   r   r  )r   n_widthn_heightrU  r  
single_imgclrgrys           r   reformat_input_batchedr    sA    
E2:	&	& 13u{+;+;q+@+@ZPUW[E\E\+@r[ 	$ 	$J%j11HC"x';jw&9::jw&9::JJsOOOs####8C=="(;*?*?[sy>>Q3{'8#9#9Q#>#> o p p p *%00[r   c                     |d d          }d}| D ]k}|D ]f}t          j        |d         |d          }|j        \  }}t          ||          }	t	          ||	          }|                    |d         |f           gl|S )Nr   T)reshaper   )r   rotater   rO  r   r<   )
rotationInfoimg_listresult_img_listre  angleimg_inforotatedr6  r7  rN  s
             r   make_rotated_img_listr  "  s    qqqkO I ; ;  	; 	;HnXa[%FFFG"=LF5#E&11EIe,,I""HQK#9::::	; r   c           	          g }t          t           d                             D ]bt           fdt          t                               D             d           d         }|                     |                             c|S )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   c                 <    g | ]}||                  d          fS r  r   )r   row_ixcol_ixresultss     r   r   z.set_result_with_confidence.<locals>.<listcomp>?  s,    TTTffgfof-a01TTTr   c                     | d         S r  r   r3   s    r   r5   z,set_result_with_confidence.<locals>.<lambda>@  s
    !A$ r   r6   )r   r   r   r<   )r  final_resultbest_rowr  s   `  @r   set_result_with_confidencer  3  s     LGAJ(( 7 7TTTTTc'll@S@STTT      !# 	GH-f56666r   )r   r   r   )r  r   r   ra   r  T)rX  T)T)r   r   r  )r.   r.   r   r  r  )NN)2
__future__r   r   picklenumpyr   r[  r   PILr   r   scipyr   r  sysrq  zipfiler   imgprocr	   version_infosix.moves.urllib.requestr   urllib.requestr(   rI   rK   r\   r   r   r   r   r   objectr   r   r  rL  rO  rW  rg  r|  r  r"   r  rs  r  r  r  r  r   r   r   <module>r#     s1   % % % % % %        



 & & & & & & & &                    A!4444444******    56a5!u,E,E\e\e\e    @	 	 	 	 	 	 	 	% % % % % % % %N# # #   "% % % %N2 2 2
 ;=" Y Y Y Yxo o o o o o o ob( ( (T  ,i" i" i" i"V    +! +! +! +!Z        + + +B B B BJ   (% % %P   <  "    r   