o
    eo                  	   @   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}no| jdkrbd|j|jd}na| jdkrpd|j|jd}nS| jdkr~d|j|jd}nE| jdkrd|j|jd}n7| jdkrd|j|jdd}n(| jdkrdd |j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   QD:\Projects\ConvertPro\env\Lib\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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   sV  | 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 }	|	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         ?r8      r   r   Zdtype)r    r#   cv2cvtColorCOLOR_BGR2GRAYr   Z	fromarraynpuint8resizeZBICUBICZ	ANTIALIASarrayexpand_dims	transposeastyper>   INTER_CUBICnewaxisshaper	   r,   r(   floatmathceilzeros)r2   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   sb   









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 )Nr6   r<   r>   r7   r?   rC   rH   INTER_LINEARrL   rK   r2   rT   image_shaperV   rW   rX   rZ   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   r9   r8   rA   )rF   rS   rO   rC   rH   ZasarrayrD   rE   rN   reshaperL   r>   )r2   rT   rc   rV   rW   rX   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   r9   int64r6   r>   g    e)r	   rF   rI   rangere   rL   onesZtriuZtileZtrilrN   )r2   rc   	num_headsmax_text_lengthrV   rW   rX   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)ri   rF   rN   rt   rL   r>   rk   )
r2   rT   rc   rn   ro   rY   rp   rq   rr   rs   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   r9   r;   r>   r?   r7   r@   g      rB   )rO   r	   rP   rQ   rR   roundmaxminrC   rH   rL   rF   rN   rK   rm   r>   )r2   rT   rc   width_downsample_ratiorV   rW   ZimgW_minZimgW_maxr\   r[   valid_ratioZwidth_divisorr]   Zresize_wrZ   Zresize_shaper^   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       r6   r7   g     _@rB   r9   )rC   rD   rE   rH   tuplerM   rF   rI   r>   rJ   rK   re   )r2   rT   meanstdZstdinvr   r   r   resize_norm_img_spin;  s   
z#TextRecognizer.resize_norm_img_spinc                 C   sL   |\}}}t j|||ft jd}|d}|dd }|d8 }|d }|S )Nr<   r>   r7   r?   r@   r`   rb   r   r   r   resize_norm_img_svtrL  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.r7   )rC   rH   ra   rL   rF   rI   rK   )	r2   rT   rc   rV   rW   rX   rZ   r   r   r   r   r   resize_norm_img_abinetW  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   r9   Zconstant)Zconstant_valuesr:   r>   )rC   rD   rE   r$   r    rO   rx   rF   padrJ   rL   )r2   rT   rc   r\   r[   _rW   rX   Z	padding_hZ	padding_wZ
img_paddedr   r   r   norm_img_cani  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 ]F}	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k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 }%n9| 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   |$}%nN| j!r,i }#||#| j"j#< | j$%| j&|#}$|$d }%n5| j")| | j$%  g }$| j&D ]})|)* }*|$|* q<| j	rS| j
j   t |$dkr]|$}%n|$d }%| ,|%},tt |,D ]}-|,|- |||	|-  < ql| j	r| j
jj-dd q?|t | fS )Nr9   r    g        r   r   rA   r8   r;   )Zaxisrj         ZSVTR)r   r   r   r   r   rv   )rz   (   rk   r   r>   rB   $   ZpredictT)stamp).lenappendrO   rP   rF   ZargsortrI   r"   timer+   r1   timesstartrl   ry   r#   r    rx   r|   rN   rJ   ru   r   rd   r   r   rL   r   rm   r_   Zconcatenatecopyr   r,   r(   r   r'   runr)   Zget_input_namesZget_input_handleZcopy_from_cpuZcopy_to_cpur>   r%   end).r2   img_listZimg_numZ
width_listrT   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_ratiosrV   rW   rX   rU   inor\   r[   Zwh_ratiorY   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)rv   )__name__
__module____qualname__r5   r_   rd   ri   rt   ru   r|   r   r   r   r   r   r   r   r   r   r   &   s    h7

#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@  rA   r8   zerror in loading image:{}zPredicts of {}:{})r   Z	image_dirr   r   infor   rF   randomuniformrL   rG   rl   r	   r"   r   rC   Zimreadformatr   	Exception	traceback
format_excexitr   r+   r1   report)r3   Zimage_file_listZtext_recognizerZvalid_image_file_listr   rT   r   resZ
image_fileflagr   r   Er   r   r   r   mains  sF   



r   __main__)$r.   sysZPILr   pathdirnameabspath__file____dir__r   insertjoinenvironrC   numpyrF   rQ   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    
    Q'