o
    ,h|                     @   s  d dl mZmZ d dlmZmZmZmZmZm	Z	m
Z
mZmZmZmZmZ d dlT 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 ddlmZ ddlZddlZejd d	krpdd
l m!Z! ddl"m#Z# ddl$m%Z% nddl&m#Z# ddl'm%Z% ee(Z)G dd de*Z+dS )   )get_recognizerget_text)group_text_boxget_image_listcalculate_md5get_paragraphdownload_and_unzipprintProgressBardiffreformat_inputmake_rotated_img_listset_result_with_confidencereformat_input_batchedmerge_to_free)*    )get_displayN)Image)	getLogger   )open)urlretrieve)Pathc                   @   s   e Zd Z					d,ddZdd	 Zd
d Zdd Zdd Zdd Zdd Z						d-ddZ
		"	"		#	d.d$d%Z	"	"		#						d/d&d'Z	"	"		#						d/d(d)Z		"	"		#						d0d*d+ZdS )1ReaderTNcraftstandardFc              
   C   s  |
| _ || _td | _|r|| _t| jjddd td | _|r$|| _t| jjddd tj	| j |du rDd| _
|
rCtd n%|du rftj rQd| _
ntjj r[d	| _
nd| _
|
retd
 n|| _
t| _t| _ddg| _|f| _|| _|r| |}i }|dgdd td D  dd td D  v r|dd td D v rtd | }d}|d | _n|dd td D v rtd | }d}|d | _nkt|tt }|t krt|d|dgkr| d|dgd td d }d}nAd|v r| d|ddgd td d }d}n(d |v r,| d!|d dgd" td d# }d}nd$|v rD| d%|d$dgd& td d' }d}nd(|v r\| d)|d(dgd* td d+ }d}nd,|v rt| d-|d,dgd. td d/ }d}nd0|v r| d1|d0dgd2 td d3 }d}nd4|v r| d5|d4dgd6 td d7 }d}nd8|v r| d9|d8dgd: td d; }d}nt|tt@ r| d<|tdg d= td d> }d}nbt|tt@ r| d?|tdg d@ td dA }d}nEt|tt@ r| dB|tdg dC td dD }d}n(t|tt @ r0| dE|t dg dF td dG }d}ndH| _td dI }d}|dJ | _!t"j#| j|dK }|	rt"j$|dkr| js`t%dL| tdM t&|dN |dK | j|
 t'||dO ks~J t(t)dP n@t'||dO kr| jst%dQ| tt( t"*| tdR t&|dN |dK | j|
 t'||dO ksJ t(t)dS | +|| nUt,t"j#| j|dT dUdV}t-j.|t-j/dW}W dX   n	1 sw   Y  |dY r|dY a0|dZ }| |||t1| |d[ | _!|d\ }t"j#| j|}| +|| i }|D ]}t"j#t2d]|d^ ||< q$|r=| 3|| _4|	rp|dkrLd_d`d`da}n|dkrXd_dbdbda}n|dc }t5||| j!|||| j
|dd\| _6| _7dXS dXS )eaD  Create an EasyOCR Reader

        Parameters:
            lang_list (list): Language codes (ISO 639) for languages to be recognized during analysis.

            gpu (bool): Enable GPU support (default)

            model_storage_directory (string): Path to directory for model data. If not specified,
            models will be read from a directory as defined by the environment variable
            EASYOCR_MODULE_PATH (preferred), MODULE_PATH (if defined), or ~/.EasyOCR/.

            user_network_directory (string): Path to directory for custom network architecture.
            If not specified, it is as defined by the environment variable
            EASYOCR_MODULE_PATH (preferred), MODULE_PATH (if defined), or ~/.EasyOCR/.

            download_enabled (bool): Enabled downloading of model data via HTTP (default).
        z/modelT)parentsexist_okz/user_networkFcpuz7Using CPU. Note: This module is much faster with a GPU.cudampszdNeither CUDA nor MPS are available - defaulting to CPU. Note: This module is much faster with a GPU.r   dbnet18r   c                 S      g | ]}|qS  r#   .0modelr#   r#   J/var/www/html/scripts/venv/lib/python3.10/site-packages/easyocr/easyocr.py
<listcomp>a       z#Reader.__init__.<locals>.<listcomp>gen1gen2c                 S   r"   r#   r#   r$   r#   r#   r'   r(   b   r)   generation1model_scriptc                 S   r"   r#   r#   r$   r#   r#   r'   r(   f   r)   generation2zis not supportedenenglishz["en"]
english_g2ththaiz["th","en"]thai_g1ch_trachinese_traz["ch_tra","en"]	zh_tra_g1ch_simchinese_simz["ch_sim","en"]	zh_sim_g2jajapanesez["ja","en"]japanese_g2kokoreanz["ko","en"]	korean_g2tatamilz["ta","en"]tamil_g1teteluguz["te","en"]	telugu_g2knkannadaz["kn","en"]
kannada_g2bengaliz["bn","as","en"]
bengali_g1arabicz["ar","fa","ur","ug","en"]	arabic_g1
devanagariz["hi","mr","ne","en"]devanagari_g1cyrillicz-["ru","rs_cyrillic","be","bg","uk","mn","en"]cyrillic_g2latinlatin_g2
charactersfilename!Missing %s and downloads disabledzqDownloading recognition model, please wait. This may take several minutes depending upon your network connection.urlmd5sumzDownload complete.*MD5 mismatch for %s and downloads disabledzxRe-downloading the recognition model, please wait. This may take several minutes depending upon your network connection.Download completez.yamlutf8encoding)LoaderNimgH	lang_listcharacter_listz.pthdict.txtr   i   )input_channeloutput_channelhidden_size   network_params)devicequantize)8verbosedownload_enabledMODULE_PATHmodel_storage_directoryr   mkdiruser_network_directorysyspathappendri   LOGGERwarningtorchr   is_availablebackendsr    detection_modelsrecognition_modelssupport_detection_networkrj   cudnn_benchmarkgetDetectorPath
model_langsetall_lang_list
ValueErrorsetModelLanguagebengali_lang_listarabic_lang_listdevanagari_lang_listcyrillic_lang_list	characterosjoinisfileFileNotFoundErrorr   r   corrupt_msginforemovesetLanguageListr   yamlload
FullLoaderr_   str	BASE_PATHinitDetectordetectorr   
recognizer	converter)selfr`   gpurn   rp   detect_networkrecog_networkrl   r   r   rk   rj   r|   detector_pathseparator_listr&   unknown_lang
model_pathfilerecog_configavailable_lang
model_file	dict_listlangrh   r#   r#   r'   __init__    s8  






0





















zReader.__init__c                 C   s  || j v r|| _| jdkrddlm}m} n| jdv r$ddlm}m} ntd|| _|| _d}tj	| j
| j| j d }tj|dkr| jsOtd	| td
 t| j| j d | j| j d | j
| j t|| j| j d ksyJ |td |S t|| j| j d kr| jstd| t| t| td t| j| j d | j| j d | j
| j t|| j| j d ksJ ||S tdd	| j )Nr   r   )get_detectorget_textbox)r!   zCUnsupport detector network. Support networks are craft and dbnet18.z+MD5 hash mismatch, possible file corruptionrU   FrV   zoDownloading detection model, please wait. This may take several minutes depending upon your network connection.rW   rX   rZ   rY   zvRe-downloading the detection model, please wait. This may take several minutes depending upon your network connection.z4Unsupport detector network. Support networks are {}.z, )r{   r   	detectionr   r   detection_dbRuntimeErrorr   rr   r   rn   ry   r   rl   r   rt   ru   r   rk   r   r   r   format)r   r   r   r   r   r   r#   r#   r'   r}      s:   



* 



* zReader.getDetectorPathc                 C   s   | j || j| j| jdS )N)ri   rj   r|   )r   ri   rj   r|   )r   r   r#   r#   r'   r     s
   zReader.initDetectorc                 C   s   |  |}| || _d S )N)r}   r   r   )r   r   r   r#   r#   r'   setDetector  s   
zReader.setDetectorc                 C   sH   || _ t|t| t kr"|dks|dkrd}t| d | d S )Nr5   r8   chinesez0 is only compatible with English, try lang_list=)r~   r   r   
capitalize)r   languager`   	list_langlist_lang_stringr#   r#   r'   r     s   zReader.setModelLanguagec                 C   sZ   t jtd|}t|ddd}|  }d|}W d    |S 1 s&w   Y  |S )Nr   r	utf-8-sigr\    )r   rr   r   r   r   read
splitlines)r   fileName	char_file
input_filelistcharr#   r#   r'   getChar   s   
zReader.getCharc              	   C   s   g | _ |D ]0}tjtd|d }t|ddd}|  }W d    n1 s)w   Y  |  j |7  _ q|dr@|d }n|drJ|d }nd}t	| j 
t	|| _ d	| j | _ d S )
Nr   z	_char.txtr   r   r\   symbolsra   z+0123456789!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ r   )	lang_charr   rr   r   r   r   r   r   getr   union)r   r`   r&   r   r   r   	char_listsymbolr#   r#   r'   r   '  s   



zReader.setLanguageList   ffffff?皙? 
        ?皙?      ?皙?   r   c                    s   |rt |\}}| j| j||||||d| j|||||d}g g }}|D ].}t|||	|
|||d u \}} rH fdd|D } fdd|D }|| || q$||fS )NF)canvas_size	mag_ratiotext_thresholdlink_thresholdlow_textpolyri   optimal_num_chars	thresholdbbox_min_scorebbox_min_sizemax_candidatesc                    s6   g | ]}t |d  |d  |d |d   kr|qS )r   r   r   r   )maxr%   imin_sizer#   r'   r(   X  s
   
 z!Reader.detect.<locals>.<listcomp>c                    s:   g | ]}t td d |D tdd |D  kr|qS )c                 S      g | ]}|d  qS )r   r#   r%   cr#   r#   r'   r(   [      z,Reader.detect.<locals>.<listcomp>.<listcomp>c                 S   r   r   r#   r   r#   r#   r'   r(   [  r   )r   r
   r   r   r#   r'   r(   Z  s
   
  )r   r   r   ri   r   rs   )r   imgr   r   r   r   r   r   	slope_thsycenter_ths
height_ths	width_ths
add_marginreformatr   r   r   r   r   img_cv_greytext_box_listhorizontal_list_aggfree_list_aggtext_boxhorizontal_list	free_listr#   r   r'   detect7  s<   

zReader.detectgreedy   r   ~jth?c                     s  |rt |\}}|rdt| jt| }n|	r!dt|	}ndt| jt| j }| jdv r5d}|d krK|d krK|j\}}d|d|gg}g }|dksT| jdkr|sg |D ]-}|g}g }t|||t	d\}}t
| jt	t|| j| j|||||||||| j}|7 qZ|D ]-}g }|g}t|||t	d\}}t
| jt	t|| j| j|||||||||| j}|7 qnNt|||t	d\}}t| |r|rt||}t|t	}t
| jt	t|| j| j|||||||||| j|r|| rt fdd	tt|d D | jd
kr%d}dd	 D D ]}t|d |d< qnd}|r2t|||d|
dkr>dd	 D S |dkrT|rMdd	 D S dd	 D S |dkrj|rcdd	 D S dd	 D S |dkrtt|S S )Nr   )r6   r9   r   r   r   r   )model_heightc                    s$   g | ]} |  |d    qS r   r#   r   	image_lenresultr#   r'   r(        $ z$Reader.recognize.<locals>.<listcomp>rL   rtlc                 S   s   g | ]}t |qS r#   )r   r%   itemr#   r#   r'   r(     r   ltr)x_thsy_thsmodec                 S   r   r   r#   r   r#   r#   r'   r(     r   rb   c                 S   s   g | ]}|d  |d dqS )r   r   boxestextr#   r   r#   r#   r'   r(     s    c                 S   s$   g | ]}|d  |d |d dqS )r   r   r   r  r  	confidentr#   r   r#   r#   r'   r(     r   jsonc                 S   s2   g | ]}t jd d |d D |d dddqS )c                 S      g | ]	}t tt|qS r#   r   mapintr%   lstr#   r#   r'   r(         /Reader.recognize.<locals>.<listcomp>.<listcomp>r   r   r  Fensure_asciir  dumpsr   r#   r#   r'   r(     s   2 c                 S   s8   g | ]}t jd d |d D |d |d dddqS )c                 S   r  r#   r  r  r#   r#   r'   r(     r  r  r   r   r   r  Fr  r  r   r#   r#   r'   r(     s   8 
free_merge)r   r   r   r   r   r~   shaperi   r   r_   r   r
  r   r   lenr   r   r   ranger   r   r   ) r   r   r   r   decoder	beamWidth
batch_sizeworkers	allowlist	blocklistdetailrotation_info	paragraphcontrast_thsadjust_contrast
filter_thsr   r   r   output_formatr   ignore_chary_maxx_maxbboxh_listf_list
image_list	max_widthresult0direction_moder   r#   r   r'   	recognizea  s   










zReader.recognizec            %      C   s   t |\} }!| j| fi d|d|d|d|d|d|d|d|d	|d
|d|ddd|d|d|d|\}"}#|"d |#d }"}#| |!|"|#||||||||	|
|||||d|}$|$S )]
        Parameters:
        image: file path or numpy-array or a byte stream object
        r   r   r   r   r   r   r   r   r   r   r   r   Fr   r   r   r   r   )r   r   r.  )%r   imager  r  r  r  r  r  r  r  r  r   r   r!  r"  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r#  r   r   r   r   r   r#   r#   r'   readtext  sT   


zReader.readtextc            ,         s  t |\} }!| j| fi d|d|d|d|d|d|d|d|d	|d
|d|ddd|d|d|d|\}"}#|"d |#d }"}#| |!|"|#||||||||	|
|||||d|g }$d}%ttD ]}&|$|& d  qidd }' fdd}(t|%D ]V  drt	d  ddd>})t
|)  dd}*tt|$D ]#}&|'|*|$|& }+|+dkrˈ dd  d!ksň dd  d"krt|(|& qW d#   n1 sw   Y  qd#S )$r/  r   r   r   r   r   r   r   r   r   r   r   r   Fr   r   r   r   r   zcharacters/r   c                 S   s<   d}t t| D ]}| | |krd} dS q|dkrdS d S )NFTr   )r  r  )arrxgr   r#   r#   r'   search  s   z#Reader.readtextlang.<locals>.searchc                    s   |  }| dd f }|S )Nr   r   r#   )r   abrU   r   r#   r'   tupleadd  s   z%Reader.readtextlang.<locals>.tupleaddrc   rtr[   r\   
r   r2  r   r/   chN)r   r   r.  r  r  rs   r   listdirendswithr   r   r   r   replaceprint),r   r0  r  r  r  r  r  r  r  r  r  r   r   r!  r"  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r#  r   r   r   r   r   	directoryr   r6  r:  myfilechartrsresr#   r9  r'   readtextlang  sz   



 zReader.readtextlangc"           *      C   s   t |||\}"}#| j|"fi d|d|d|d|d|d|d|d|d	|d
|d|ddd|d|d|d| \}$}%g }&t|#jdkrM|#gn|#}#t|#|$|%D ]\}'}(})|&| |'|(|)||||||	|
|||||||d|! qU|&S )a6  
        Parameters:
        image: file path or numpy-array or a byte stream object
        When sending a list of images, they all must of the same size,
        the following parameters will automatically resize if they are not None
        n_width: int, new width
        n_height: int, new height
        r   r   r   r   r   r   r   r   r   r   r   r   Fr   r   r   r   r   )r   r   r  r  ziprs   r.  )*r   r0  n_widthn_heightr  r  r  r  r  r  r  r  r  r   r   r!  r"  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r#  r   r   r   r   
result_agggrey_imgr   r   r#   r#   r'   readtext_batched  sX   


zReader.readtext_batched)TNNr   r   TTTTTF)r   r   r   r   r   r   r   r   r   r   r   TNr   r   r   r   )NNr   r   r   r   NNr   NFr   r   r   r   r   Tr   )r   r   r   r   NNr   NFr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   ) NNr   r   r   r   NNr   NFr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )__name__
__module____qualname__r   r}   r   r   r   r   r   r   r.  r1  rF  rL  r#   r#   r#   r'   r      sz    
 L#
*
W
$
>r   ),recognitionr   r   utilsr   r   r   r   r   r	   r
   r   r   r   r   r   configbidir   numpynpcv2rv   r   rq   PILr   loggingr   r   r  version_infoior   six.moves.urllib.requestr   pathlib2r   urllib.requestpathlibrM  rt   objectr   r#   r#   r#   r'   <module>   s*   8