o
    'jtq                  	   @   s
  d dl Z d dlZd dlmZ e je jeZej	e ej
d e je jed de jd< d dl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  mZ d dlmZ d dlmZ d dlmZmZ e ZG d	d
 d
eZ dd Z!e"dkre!e#  dS dS )    N)Imagez../..Zauto_growthZFLAGS_allocator_strategy)build_post_process)
get_logger)get_image_file_listcheck_and_readc                   @   sp   e Z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 Z
dd Zdd Zdd Zdd ZdS )TextRecognizerc                 C   s>  dd |j dD | _ |j| _|j| _d|j|jd}| jdkr*d|j|jd}n| jdkr8d	|j|jd}n| jd
krFd|j|jd}n| jdkrTd|j|jd}n~| jdkrbd|j|jd}np| jdkrpd|j|jd}nb| jdkr~d|j|jd}nT| jdkrd|j|jd}nF| jdkrd|j|jdd}n7| jdkrdd |jd}n*| jdkrd|j|jdd}n| jdkrddi}n| jd kr|j| _d!|j|jd}t|| _	t
|d"t\| _| _| _| _|j| _|j| _|jrd#d l}t }t
 }|jd"|j|jd$d | j|d |jr|nd g d%d#td&| _d S d S )'Nc                 S   s   g | ]}t |qS  )int).0vr   r   b/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/paddleocr/tools/infer/predict_rec.py
<listcomp>(   s    z+TextRecognizer.__init__.<locals>.<listcomp>,ZCTCLabelDecode)namecharacter_dict_pathuse_space_charSRNZSRNLabelDecodeRAREZAttnLabelDecodeNRTRZNRTRLabelDecodeSARZSARLabelDecode	VisionLANZVLLabelDecodeViTSTRZViTSTRLabelDecodeABINetZABINetLabelDecodeSPINZSPINLabelDecodeRobustScannerT)r   r   r   Z	rm_symbolRFLZRFLLabelDecodeSATRNZSATRNLabelDecodePRENr   ZPRENLabelDecodeCANZCANLabelDecodeZrecr   Zdynamic)Zpreprocess_timeZinference_timeZpostprocess_time)Z
model_nameZmodel_precisionZ
batch_sizeZ
data_shapeZ	save_pathZinference_configZpidsZprocess_nameZgpu_idsZ	time_keyswarmuplogger)rec_image_shapesplitrec_batch_numrec_algorithmZrec_char_dict_pathr   Zrec_image_inverseinverser   postprocess_oputilityZcreate_predictorr    	predictorinput_tensoroutput_tensorsconfig	benchmarkuse_onnxauto_logosgetpidZget_infer_gpuidZ
AutoLogger	precisionZuse_gpuautolog)selfargsZpostprocess_paramsr.   pidZgpu_idr   r   r   __init__'   s   














zTextRecognizer.__init__c                 C   sb  | j \}}}| jdks| jdkrbt|tj}tt|}| jdkr.|	||gtj
}n	|	||gtj}t|}t|d}|d}| jdkrV|tjd }|S |tjd d }|S | jdkrt|tj}tj	|||ftjd	}|d
}|d }|tjd d f }|d8 }|d }|S ||jd ksJ t|| }| jr| jjdd  d }	t|	trn
|	d ur|	dkr|	}|jd d \}
}	|	t|
 }t|| |kr|}n	tt|| }| jdkr|| j d kr| j d }| j d }t	|||f}|d
}|dd }|d8 }|d }tj|||ftjd}||d d d d d|f< |S )Nr   r      r           o@g      `@      ?r   interpolationfloat32         ?r9      r   r   Zdtype)r!   r$   cv2cvtColorCOLOR_BGR2GRAYr   Z	fromarraynpuint8resizeZBICUBICZLANCZOSarrayexpand_dims	transposeastyper?   INTER_CUBICnewaxisshaper	   r-   r)   
isinstancestrfloatmathceilzeros)r3   imgmax_wh_ratioimgCimgHimgWZ	image_pilnorm_imgresized_imagewhratioZ	resized_w
padding_imr   r   r   resize_norm_img   sf   










zTextRecognizer.resize_norm_imgc                 C   sX   |\}}}|d d d d d d df }t j|||ft jd}|d}|dd }|S )Nr7   r=   r?   r8   r@   rD   rI   INTER_LINEARrM   rL   r3   rW   image_shaperY   rZ   r[   r]   r   r   r   resize_norm_img_vl   s   

z!TextRecognizer.resize_norm_img_vlc                 C   s  |\}}}t ||f}|jd }|jd }||d kr't||d |f}	n*||d kr8t||d |f}	n||d krIt||d |f}	nt|||f}	t |	}
t|
tj}
|
|d d d|
jd f< |d d d d t jf }|j\}}}d}t 	||||f
t jS )Nr   r:   r9   rB   )rG   rV   rP   rD   rI   ZasarrayrE   rF   rO   reshaperM   r?   )r3   rW   rf   rY   rZ   r[   Z	img_blackZim_heiZim_widZimg_newZimg_nprowcolcr   r   r   resize_norm_img_srn   s$   



z"TextRecognizer.resize_norm_img_srnc                 C   s  |\}}}t |d |d  }ttd||dfd}ttd||dfd}	td||f}
t|
ddd||g}t|d|ddgddg }t	|
ddd||g}t|d|ddgddg }|tj
d d f }|	tj
d d f }	||	||gS )N   r   r:   int64r7   r?   g    e)r	   rG   rJ   rangerh   rM   onesZtriuZtileZtrilrO   )r3   rf   	num_headsmax_text_lengthrY   rZ   r[   Zfeature_dimencoder_word_posgsrm_word_posZgsrm_attn_bias_datagsrm_slf_attn_bias1gsrm_slf_attn_bias2r   r   r   srn_other_inputs   sH   






zTextRecognizer.srn_other_inputsc           
      C   sr   |  ||}|tjd d f }| |||\}}}}	|tj}|	tj}	|tj}|tj}|||||	fS )N)rl   rG   rO   rw   rM   r?   rn   )
r3   rW   rf   rq   rr   r\   rs   rt   ru   rv   r   r   r   process_image_srn  s   
z TextRecognizer.process_image_srn      ?c                 C   sH  |\}}}}|j d }|j d }	d}
td| }|	t| }t|| }|| dkr3t|| | }|d ur<t||}|d urNtdd| | }
t||}t	|||f}|
d}|d dkro|d }|tjd d f }n|dd }|d8 }|d }|j }dtj|||ftjd	 }||d d d d d|f< |j }||||
fS )
Nr   r:   r<   r?   r@   r8   rA   g      rC   )rP   r	   rS   rT   rU   roundmaxminrD   rI   rM   rG   rO   rL   rp   r?   )r3   rW   rf   width_downsample_ratiorY   rZ   ZimgW_minZimgW_maxr_   r^   valid_ratioZwidth_divisorr`   Zresize_wr]   Zresize_shapera   Z	pad_shaper   r   r   resize_norm_img_sar   s6   




z"TextRecognizer.resize_norm_img_sarc                 C   s   t |t j}t |tddgt j}t|tj}t	|d}|
d}dg}dg}tj|tjd}tj|tjd}t|dd}dt|dd }||8 }||9 }|S )Nd       r7   r8   g     _@rC   r:   )rD   rE   rF   rI   tuplerN   rG   rJ   r?   rK   rL   rh   )r3   rW   meanstdZstdinvr   r   r   resize_norm_img_spinC  s   
z#TextRecognizer.resize_norm_img_spinc                 C   sL   |\}}}t j|||ft jd}|d}|dd }|d8 }|d }|S )Nr=   r?   r8   r@   rA   rc   re   r   r   r   resize_norm_img_svtrT  s   

z#TextRecognizer.resize_norm_img_svtrc           	      C   sz   |\}}}t j|||ft jd}|d}|d }tg d}tg d}||d  |d  }|d}|d}|S )Nr=   r?   r;   )g
ףp=
?gv/?gCl?)gZd;O?gy&1?g?)NN.r8   )rD   rI   rd   rM   rG   rJ   rL   )	r3   rW   rf   rY   rZ   r[   r]   r   r   r   r   r   resize_norm_img_abinet_  s   



z%TextRecognizer.resize_norm_img_abinetc                 C   s   t |t j}| jrd| }| jd dkrG|j\}}| j\}}}||k s(||k rGt|| d}t|| d}	tj|d|fd|	ffddd}
|
}t	|dd }|
d}|S )Nr@   r   r:   Zconstant)Zconstant_valuesr;   r?   )rD   rE   rF   r%   r!   rP   r{   rG   padrK   rM   )r3   rW   rf   r_   r^   _rZ   r[   Z	padding_hZ	padding_wZ
img_paddedr   r   r   norm_img_canq  s&   

zTextRecognizer.norm_img_canc           .      C   s(	  t |}g }|D ]}||jd t|jd   qtt|}ddgg| }| j}t }| j	r9| j
j  td||D ]K}	t||	| }
g }| jdkrXg }g }g }g }| jdkr_g }| jd d \}}}|| }t|	|
D ]}|||  jdd \}}|d	 | }t||}qrt|	|
D ]}| jdkr| |||  | j\}}}}|tjd d f }tj|dd
}|| || q| jdkr| |||  | jdd}||d  ||d  ||d  ||d  ||d  q| jdv r| |||  | j}|tjd d f }|| q| jdv r:| |||  | j}|tjd d f }|| q| jdkrX| |||  }|tjd d f }|| q| jdkrx| |||  | j}|tjd d f }|| q| jdkr| j|||  | jdd\}}}}|tjd d f }tj|dd
}g }|| || g }ttddd}tj|dd
}|| q| jdkr| |||  |}|tjd d f }|| tj|jdd}tjddgdd}g } g }!| | |!| q| |||  |}|tjd d f }|| qt|}| }| j	r/| j
j   | jdkrt|}t|}t|}t|}|||||g}"| j!rli }#||#| j"j#< | j$%| j&|#}$d|$d i}%n| j$' }&tt |&D ]}'| j$(|&|' }(|()|"|'  qw| j$%  g }$| j&D ]})|)* }*|$|* q| j	r| j
j   d|$d i}%n| jdkr(t|}|tj|gtj+dg}"| j!ri }#||#| j"j#< | j$%| j&|#}$|$d }%n| j$' }&tt |&D ]}'| j$(|&|' }(|()|"|'  q| j$%  g }$| j&D ]})|)* }*|$|* q| j	r"| j
j   |$d }%n>| jdkrt|}t|}|||g}"| j!rWi }#||#| j"j#< | j$%| j&|#}$|$d }%n| j$' }&tt |&D ]}'| j$(|&|' }(|()|"|'  qb| j$%  g }$| j&D ]})|)* }*|$|* q| j	r| j
j   |$d }%n| jdkrt| } t|!}!|| |!g}"| j!ri }#||#| j"j#< | j$%| j&|#}$|$}%n| j$' }&g }(tt |&D ]}'| j$(|&|' }+|+)|"|'  |(|+ q|(| _"| j$%  g }$| j&D ]})|)* }*|$|* q| j	r| j
j   |$}%nS| j!r,i }#||#| j"j#< | j$%| j&|#}$|$d }%n:| j")| | j$%  g }$| j&D ]})|)* }*|$|* q<| j	rS| j
j   t |$dkr]|$}%n|$d }%| j$,  | -|%},tt |,D ]}-|,|- |||	|-  < qq| j	r| j
jj.dd q?|t | fS )Nr:   r    g        r   r   rB   r9   r<   )Zaxisrm         )ZSVTRr   )r   r   r   r   r   ry   )r}   (   rn   r   r?   rC   $   ZpredictT)stamp)/lenappendrP   rS   rG   ZargsortrJ   r#   timer,   r2   timesstartro   r|   r$   r!   r{   r   rO   rK   rx   r   rg   r   r   rM   r   rp   rb   Zconcatenatecopyr   r-   r)   r   r(   runr*   Zget_input_namesZget_input_handleZcopy_from_cpuZcopy_to_cpur?   Ztry_shrink_memoryr&   end).r3   img_listZimg_numZ
width_listrW   indicesrec_resZ	batch_numstZ
beg_img_noZ
end_img_noZnorm_img_batchZencoder_word_pos_listZgsrm_word_pos_listZgsrm_slf_attn_bias1_listZgsrm_slf_attn_bias2_listZvalid_ratiosrY   rZ   r[   rX   inor_   r^   Zwh_ratior\   r   r~   Zword_positions_listZword_positionsZnorm_image_maskZ
word_labelZnorm_img_mask_batchZword_label_listZinputsZ
input_dictZoutputspredsZinput_namesir)   Zoutput_tensoroutputZinput_tensor_iZ
rec_resultZrnor   r   r   __call__  s   










































zTextRecognizer.__call__N)ry   )__name__
__module____qualname__r6   rb   rg   rl   rw   rx   r   r   r   r   r   r   r   r   r   r   r   &   s    o8

#r   c              
   C   sT  t | j}t| }g }g }td | jr4tjddg d	tj
}tdD ]}||gt| j }q'|D ]'}t|\}}	}
|	sFt|}|d u rStd| q6|| || q6z||\}}
W n! ty } ztt  t| t  W Y d }~nd }~ww tt|D ]}td|| ||  q| jr|j  d S d S )NzIn PP-OCRv3, rec_image_shape parameter defaults to '3, 48, 320', if you are using recognition model with PP-OCRv2 or an older version, please set --rec_image_shape='3,32,320r   r@   )0   i@  rB   r9   zerror in loading image:{}zPredicts of {}:{})r   Z	image_dirr   r    infor   rG   randomuniformrM   rH   ro   r	   r#   r   rD   Zimreadformatr   	Exception	traceback
format_excexitr   r,   r2   report)r4   Zimage_file_listZtext_recognizerZvalid_image_file_listr   rW   r   resZ
image_fileflagr   r   Er   r   r   r   main|  sF   



r   __main__)$r/   sysZPILr   pathdirnameabspath__file____dir__r   insertjoinenvironrD   numpyrG   rT   r   r   ZpaddleZtools.infer.utilityZinferr'   Zppocr.postprocessr   Zppocr.utils.loggingr   Zppocr.utils.utilityr   r   r    objectr   r   r   
parse_argsr   r   r   r   <module>   s6    
    Z'