o
    'j                     @   s8  d dl Zd dlZd dlmZ d dlZG dd deZG dd deZ	G dd de	Z
G d	d
 d
eZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd  d eZG d!d" d"eZG d#d$ d$eZdS )%    N)
functionalc                   @   s<   e Zd ZdZdddZdd Zdd	 Zdd
dZdd ZdS )BaseRecLabelDecode+ Convert between text-label and text-index NFc           	      C   s   d| _ d| _d| _g | _|d u rd| _t| j}nCt|d"}| }|D ]}|ddd}| j	| q%W d    n1 sCw   Y  |rP| j	d	 t| j}d
|v r\d| _| 
|}i | _t|D ]	\}}|| j|< qh|| _d S )NsoseosFZ$0123456789abcdefghijklmnopqrstuvwxyzrbzutf-8
z
 arabicT)beg_strend_strreversecharacter_strlistopen	readlinesdecodestripappendadd_special_chardict	enumerate	character)	selfcharacter_dict_pathuse_space_chardict_characterZfinlineslineichar r!   l/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/paddleocr/ppocr/postprocess/rec_postprocess.py__init__   s0   


zBaseRecLabelDecode.__init__c                 C   sr   g }d}|D ]}t td|s!|dkr|| || d}q||7 }q|dkr/|| d|d d d S )N z[a-zA-Z0-9 :*./%+-])boolresearchr   join)r   predZpred_reZ	c_currentcr!   r!   r"   pred_reverse3   s   



zBaseRecLabelDecode.pred_reversec                 C   s   |S Nr!   r   r   r!   r!   r"   r   C   s   z#BaseRecLabelDecode.add_special_charc                    s  g }   }t|}t|D ]q}tjt|| td}|r1|| dd || dd k|dd< |D ]
}	||| |	kM }q3 fdd|| | D }
|durV|| | }ndgt| }t|dkrfdg}d|
} jrs |}|	|t
| f q|S )	% convert text-index into text-label. dtype   Nr%   c                       g | ]} j | qS r!   r   .0Ztext_idr   r!   r"   
<listcomp>S   s    z-BaseRecLabelDecode.decode.<locals>.<listcomp>r   r$   )get_ignored_tokenslenrangenponesr&   r)   r   r,   r   meantolistr   
text_index	text_probis_remove_duplicateresult_listignored_tokens
batch_size	batch_idxZ	selectionZignored_token	char_list	conf_listtextr!   r7   r"   r   F   s4   



zBaseRecLabelDecode.decodec                 C   s   dgS )Nr   r!   r7   r!   r!   r"   r9   f   s   z%BaseRecLabelDecode.get_ignored_tokensNF)	__name__
__module____qualname____doc__r#   r,   r   r   r9   r!   r!   r!   r"   r      s    

 r   c                       4   e Zd ZdZd
 fdd	ZdddZdd	 Z  ZS )CTCLabelDecoder   NFc                       t t| || d S r-   )superrQ   r#   r   r   r   kwargs	__class__r!   r"   r#   m      zCTCLabelDecode.__init__c                 O   sv   t |ts
t |tr|d }t |tjr| }|jdd}|jdd}| j||dd}|d u r2|S | |}||fS )Nr%      ZaxisTrC   )	
isinstancetupler   paddleTensornumpyargmaxmaxr   r   predslabelargsrU   	preds_idx
preds_probrJ   r!   r!   r"   __call__r   s   
zCTCLabelDecode.__call__c                 C      dg| }|S )Nblankr!   r.   r!   r!   r"   r         
zCTCLabelDecode.add_special_charrK   r-   rL   rM   rN   rO   r#   ri   r   __classcell__r!   r!   rV   r"   rQ   j   
    
rQ   c                       <   e Zd ZdZdddgddf fdd	Zd	 fdd	Z  ZS )
DistillationCTCLabelDecode@
    Convert 
    Convert between text-label and text-index
    NFstudentc                    8   t t| || t|ts|g}|| _|| _|| _d S r-   )rS   rq   r#   r\   r   
model_namekey
multi_headr   r   r   ru   rv   rw   rU   rV   r!   r"   r#         

z#DistillationCTCLabelDecode.__init__c                    l   t  }| jD ]-}|| }| jd ur|| j }| jr"t|t r"|d }t j|g|R d|i|||< q|S )NZctcre   r   ru   rv   rw   r\   rS   ri   r   rd   re   rf   rU   outputnamer*   rV   r!   r"   ri         


$z#DistillationCTCLabelDecode.__call__r-   rL   rM   rN   rO   r#   ri   rn   r!   r!   rV   r"   rq          rq   c                       N   e Zd ZdZd fdd	Zdd Zddd	Zdd
dZdd Zdd Z	  Z
S )AttnLabelDecoder   NFc                    rR   r-   )rS   r   r#   rT   rV   r!   r"   r#      rX   zAttnLabelDecode.__init__c                 C   (   d| _ d| _|}| j g| | jg }|S Nr   r   r   r   r.   r!   r!   r"   r      
   z AttnLabelDecode.add_special_charc                 C     g }|   }|   \}}t|}t|D ]o}	g }
g }tt||	 D ]O}||	 | |v r-q"t||	 | t|kr; n7|rP|dkrP||	 |d  ||	 | krPq"|
| jt||	 |   |durl|||	 |  q"|d q"d|
}||t|	 f q|S r/   r   r2   Nr$   
r9   r:   r;   intr   r   r)   r<   r>   r?   r   rA   rB   rC   rD   rE   beg_idxend_idxrF   rG   rH   rI   idxrJ   r!   r!   r"   r      8   

zAttnLabelDecode.decodec                 O   s^   t |tjr
| }|jdd}|jdd}| j||dd}|du r$|S | j|dd}||fS )
        text = self.decode(text)
        if label is None:
            return text
        else:
            label = self.decode(label, is_remove_duplicate=False)
            return text, label
        rY   rZ   Fr[   Nr\   r^   r_   r`   ra   rb   r   rc   r!   r!   r"   ri      s   	zAttnLabelDecode.__call__c                 C      |  d}|  d}||gS Nbegendget_beg_end_flag_idxr   r   r   r!   r!   r"   r9         

z"AttnLabelDecode.get_ignored_tokensc                 C   H   |dkrt | j| j }|S |dkrt | j| j }|S J d| Nr   r   F)unsupport type %s in get_beg_end_flag_idxr<   arrayr   r   r   r   Z
beg_or_endr   r!   r!   r"   r         z$AttnLabelDecode.get_beg_end_flag_idxrK   r-   rL   rM   rN   rO   r#   r   r   ri   r9   r   rn   r!   r!   rV   r"   r      s    

r   c                       r   )RFLLabelDecoder   NFc                    rR   r-   )rS   r   r#   rT   rV   r!   r"   r#      rX   zRFLLabelDecode.__init__c                 C   r   r   r   r.   r!   r!   r"   r      r   zRFLLabelDecode.add_special_charc                 C   r   r   r   r   r!   r!   r"   r     r   zRFLLabelDecode.decodec                 O   s   t |ts
t |tr=|\}}t |tjr| }|jdd}|jdd}| j||dd}	|d u r2|	S | j|dd}|	|fS |}t |tjrI| }g }
|D ]}t	t
|}|
| qM|d u rb|
S | j|dd}dd |D }|
|fS )NrY   rZ   Fr[   c                 S   s   g | ]}t |d  qS )r   )r:   )r6   resr!   r!   r"   r8   <  s    z+RFLLabelDecode.__call__.<locals>.<listcomp>)r\   r]   r   r^   r_   r`   ra   rb   r   roundr<   sumr   )r   rd   re   rf   rU   Zcnt_outputsZseq_outputsrg   rh   rJ   Z
cnt_lengthZlenslengthr!   r!   r"   ri   "  s.   zRFLLabelDecode.__call__c                 C   r   r   r   r   r!   r!   r"   r9   ?  r   z!RFLLabelDecode.get_ignored_tokensc                 C   r   r   r   r   r!   r!   r"   r   D  r   z#RFLLabelDecode.get_beg_end_flag_idxrK   r-   r   r!   r!   rV   r"   r      s    

r   c                       sN   e Zd ZdZd fdd	Zdd Zdd	 Zd
d ZdddZdddZ	  Z
S )SEEDLabelDecoder   NFc                    rR   r-   )rS   r   r#   rT   rV   r!   r"   r#   R  rX   zSEEDLabelDecode.__init__c                 C   s*   d| _ d| _d| _|| j| j | jg }|S )Npaddingr   unknown)padding_strr   r   r.   r!   r!   r"   r   W  s   z SEEDLabelDecode.add_special_charc                 C   s   |  d}|gS )Nr   r   )r   r   r!   r!   r"   r9   `  s   
z"SEEDLabelDecode.get_ignored_tokensc                 C   r   )Nr   r   Fr   r   r   r!   r!   r"   r   d  s   z$SEEDLabelDecode.get_beg_end_flag_idxc                 C   s   g }|   \}t|}t|D ]f}g }g }	tt|| D ]F}
t|| |
 t|kr- n7|rB|
dkrB|| |
d  || |
 krBq|| jt|| |
   |dur^|	|| |
  q|	d qd|}||t|		 f q|S r   r   )r   rA   rB   rC   rD   r   rF   rG   rH   rI   r   rJ   r!   r!   r"   r   m  s2   


zSEEDLabelDecode.decodec                 O   s   |d }t |tjr| }d|v r|d }|d }n|d jdd}|d jdd}| j||dd}|du r9|S | j|dd}||fS )r   Zrec_predZrec_pred_scoresrY   rZ   Fr[   Nr   rc   r!   r!   r"   ri     s   	
zSEEDLabelDecode.__call__rK   r-   )rL   rM   rN   rO   r#   r   r9   r   r   ri   rn   r!   r!   rV   r"   r   O  s    	
	r   c                       sN   e Zd ZdZd fdd	ZdddZddd	Zd
d Zdd Zdd Z	  Z
S )SRNLabelDecoder   NFc                    $   t t| || |dd| _d S )Nmax_text_length   )rS   r   r#   getr   rT   rV   r!   r"   r#     s   zSRNLabelDecode.__init__c           
      O   s   |d }t | jd }t|tjr| }t|d|g}tj|dd}tj	|dd}t|d| j
g}t|d| j
g}| ||}	|d u rQ| j||dd}	|	S | |}|	|fS )NZpredictrY   r%   r2   rZ   Fr[   )r:   r   r\   r^   r_   r`   r<   Zreshapera   rb   r   r   )
r   rd   re   rf   rU   r*   Zchar_numrg   rh   rJ   r!   r!   r"   ri     s   
zSRNLabelDecode.__call__c                 C   s   g }|   }t|}t|D ]a}g }g }	tt|| D ]A}
|| |
 |v r'q|r<|
dkr<|| |
d  || |
 kr<q|| jt|| |
   |durX|	|| |
  q|	d qd|}||t|		 f q|S r   )
r9   r:   r;   r   r   r   r)   r<   r>   r?   )r   rA   rB   rC   rD   rE   rF   rG   rH   rI   r   rJ   r!   r!   r"   r     s2   

zSRNLabelDecode.decodec                 C   s   || j | jg }|S r-   r   r.   r!   r!   r"   r     s   zSRNLabelDecode.add_special_charc                 C   r   r   r   r   r!   r!   r"   r9     r   z!SRNLabelDecode.get_ignored_tokensc                 C   r   r   r   r   r!   r!   r"   r     r   z#SRNLabelDecode.get_beg_end_flag_idxrK   r-   )rL   rM   rN   rO   r#   ri   r   r   r9   r   rn   r!   r!   rV   r"   r     s    

r   c                       F   e Zd ZdZd fdd	Zdd Zddd	Zdd
dZdd Z  Z	S )SARLabelDecoder   NFc                    r   N	rm_symbolF)rS   r   r#   r   r   rT   rV   r!   r"   r#        zSARLabelDecode.__init__c                 C   f   d}d}d}||g }t |d | _||g }t |d | _t |d | _||g }t |d | _|S Nz	<BOS/EOS>z<UKN><PAD>r2   r:   unknown_idx	start_idxr   padding_idxr   r   Zbeg_end_strunknown_strr   r!   r!   r"   r        


zSARLabelDecode.add_special_charc                 C   8  g }|   }t|}t|D ]}g }g }	tt|| D ]Y}
|| |
 |v r'qt|| |
 t| jkr?|du r=|
dkr=q n7|rT|
dkrT|| |
d  || |
 krTq|| jt|| |
   |durp|	|| |
  q|	d qd|}| jrt	
d}| }|d|}||t|	 f q|S r/   Nr   r2   r$   u   [^A-Z^a-z^0-9^一-龥]r9   r:   r;   r   r   r   r   r)   r   r'   compilelowersubr<   r>   r?   r   rA   rB   rC   rD   rE   rF   rG   rH   rI   r   rJ   compr!   r!   r"   r     B   


zSARLabelDecode.decodec                 O   ^   t |tjr
| }|jdd}|jdd}| j||dd}|d u r$|S | j|dd}||fS NrY   rZ   Fr[   r   rc   r!   r!   r"   ri   *     zSARLabelDecode.__call__c                 C      | j gS r-   r   r7   r!   r!   r"   r9   7     z!SARLabelDecode.get_ignored_tokensrK   r-   
rL   rM   rN   rO   r#   r   r   ri   r9   rn   r!   r!   rV   r"   r         

$r   c                       r   )SATRNLabelDecoder   NFc                    r   r   )rS   r   r#   r   r   rT   rV   r!   r"   r#   >  r   zSATRNLabelDecode.__init__c                 C   r   r   r   r   r!   r!   r"   r   E  r   z!SATRNLabelDecode.add_special_charc                 C   r   r   r   r   r!   r!   r"   r   R  r   zSATRNLabelDecode.decodec                 O   r   r   r   rc   r!   r!   r"   ri   v  r   zSATRNLabelDecode.__call__c                 C   r   r-   r   r7   r!   r!   r"   r9     r   z#SATRNLabelDecode.get_ignored_tokensrK   r-   r   r!   r!   rV   r"   r   ;  r   r   c                       rp   )
DistillationSARLabelDecoderr   NFrs   c                    rt   r-   )rS   r   r#   r\   r   ru   rv   rw   rx   rV   r!   r"   r#     ry   z#DistillationSARLabelDecode.__init__c                    rz   )NZsarre   r{   r|   rV   r!   r"   ri     r   z#DistillationSARLabelDecode.__call__r-   r   r!   r!   rV   r"   r     r   r   c                       s>   e Zd ZdZd fdd	Zdd Zddd	Zdd
dZ  ZS )PRENLabelDecoder   NFc                    rR   r-   )rS   r   r#   rT   rV   r!   r"   r#     rX   zPRENLabelDecode.__init__c                 C   s0   d}d}d}|||g| }d| _ d| _d| _|S )Nr   z<EOS>z<UNK>r   r2   rY   )r   r   r   )r   r   r   r   r   r!   r!   r"   r     s   z PRENLabelDecode.add_special_charc           
      C   s   g }t |}t|D ]g}g }g }tt || D ];}|| | | jkr% n/|| | | j| jfv r2q|| jt|| |   |durN||| |  q|d qd|}	t |	dkrl||	t	
| f q
|d q
|S )r/   Nr2   r$   r   )r$   r2   )r:   r;   r   r   r   r   r   r   r)   r<   r>   r?   )
r   rA   rB   rD   rF   rG   rH   rI   r   rJ   r!   r!   r"   r     s.   



zPRENLabelDecode.decodec                 O   sV   t |tjr
| }|jdd}|jdd}| ||}|d u r"|S | |}||fS NrY   rZ   r   rc   r!   r!   r"   ri     s   
zPRENLabelDecode.__call__rK   r-   )	rL   rM   rN   rO   r#   r   r   ri   rn   r!   r!   rV   r"   r     s    
r   c                       s>   e Zd ZdZd fdd	ZdddZdd	 ZdddZ  ZS )NRTRLabelDecoder   NTc                    rR   r-   )rS   r   r#   rT   rV   r!   r"   r#     s   zNRTRLabelDecode.__init__c           	      O   s*  t |dkr`|d }|d }t|tjr| }t|tjr"| }|d d dkr?|d d dd f }|d d dd f }n|}| j||dd}|d u rO|S | |d d dd f }||fS t|tjrj| }|jdd}|jdd}| j||dd}|d u r|S | |d d dd f }||fS )NrY   r   r2   Fr[   rZ   )r:   r\   r^   r_   r`   r   ra   rb   )	r   rd   re   rf   rU   Zpreds_idrh   rg   rJ   r!   r!   r"   ri     s2   
zNRTRLabelDecode.__call__c                 C   s   g d| }|S )N)rk   z<unk><s></s>r!   r.   r!   r!   r"   r   
     z NRTRLabelDecode.add_special_charFc                 C   s   g }t |}t|D ]S}g }g }tt || D ]3}	z| jt|| |	  }
W n   Y q|
dkr3 n||
 |durF||| |	  q|d qd|}||t| f q
|S )r/   r   Nr2   r$   )	r:   r;   r   r   r   r)   r<   r>   r?   )r   rA   rB   rC   rD   rF   rG   rH   rI   r   Zchar_idxrJ   r!   r!   r"   r     s&   

zNRTRLabelDecode.decode)NTr-   rK   )	rL   rM   rN   rO   r#   ri   r   r   rn   r!   r!   rV   r"   r     s    
r   c                       rP   )ViTSTRLabelDecoder   NFc                    rR   r-   )rS   r   r#   rT   rV   r!   r"   r#   )  rX   zViTSTRLabelDecode.__init__c                 O   s   t |tjr|d d dd f  }n
|d d dd f }|jdd}|jdd}| j||dd}|d u r7|S | |d d dd f }||fS )Nr2   rY   rZ   Fr[   r   rc   r!   r!   r"   ri   .  s   zViTSTRLabelDecode.__call__c                 C   s   ddg| }|S )Nr   r   r!   r.   r!   r!   r"   r   ;  r   z"ViTSTRLabelDecode.add_special_charrK   r-   rm   r!   r!   rV   r"   r   &  ro   r   c                       rP   )ABINetLabelDecoder   NFc                    rR   r-   )rS   r   r#   rT   rV   r!   r"   r#   C  rX   zABINetLabelDecode.__init__c                 O   s|   t |tr|d d  }nt |tjr| }n|}|jdd}|jdd}| j||dd}|d u r5|S | |}||fS )Nalignr%   rY   rZ   Fr[   )r\   r   r`   r^   r_   ra   rb   r   rc   r!   r!   r"   ri   H  s   


zABINetLabelDecode.__call__c                 C   rj   )Nr   r!   r.   r!   r!   r"   r   X  rl   z"ABINetLabelDecode.add_special_charrK   r-   rm   r!   r!   rV   r"   r   @  s
    
r   c                       s*   e Zd ZdZd fdd	Zdd Z  ZS )	SPINLabelDecoder   NFc                    rR   r-   )rS   r   r#   rT   rV   r!   r"   r#   `  rX   zSPINLabelDecode.__init__c                 C   s(   d| _ d| _|}| j g| jg | }|S r   r   r.   r!   r!   r"   r   e  r   z SPINLabelDecode.add_special_charrK   )rL   rM   rN   rO   r#   r   rn   r!   r!   rV   r"   r   ]  s    r   c                       s6   e Zd ZdZd
 fdd	Zd
ddZddd	Z  ZS )VLLabelDecoder   NFc                    s4   t t| || |dd| _t| jd | _d S )Nr   r   r2   )rS   r   r#   r   r   r:   r   nclassrT   rV   r!   r"   r#   p  s   zVLLabelDecode.__init__c                    s   g }   }t|}t|D ]i}tjt|| td}|r1|| dd || dd k|dd< |D ]
}	||| |	kM }q3 fdd|| | D }
|durV|| | }ndgt| }t|dkrfdg}d|
}||t|	 f q|S )	r/   r0   r2   Nr%   c                    s   g | ]	} j |d   qS )r2   r4   r5   r7   r!   r"   r8     s    z(VLLabelDecode.decode.<locals>.<listcomp>r   r$   )
r9   r:   r;   r<   r=   r&   r)   r   r>   r?   r@   r!   r7   r"   r   v  s0   


zVLLabelDecode.decodec                    s   t |dkr|\}}|jd } j}	 j}
t|tjs"tj|dd}tj|	| jg|j	d}tj|g|j	d}d}t
|
D ]A}d|v r~||
k r~||d d d d f }|||< |dd jdd}t
|D ]}|| dkry|| dkry|d ||< qe|d7 }q=t
d|D ]}t|| dkr|
||< qd}tjt|  jg|j	d}t
d|D ]}t|| }|d||d d f |||| < ||7 }q|}|}n|d }|}tdd	 t||D }g }t|tjstj|dd}tj|dd}t
d|jd D ]r}|dkrd}t|| }nt|d |  }t|d |  ||  }||| dd d d df  }d
 fdd	|D }||| dd d d df }tt| |jd d  }||t|f q|d u rw|S  |}||fS )NrY   r2   Zfloat32r0   )shaper1   r   rZ   c                 S   s   g | ]
\}}|d | qS r-   r!   )r6   tlr!   r!   r"   r8     s    z*VLLabelDecode.__call__.<locals>.<listcomp>r$   c                    s4   g | ]}|d kr|t  jkr j|d  ndqS )r   r2   r$   )r:   r   r6   r   r7   r!   r"   r8     s    gư>)r:   r   r   r\   r^   r_   Z	to_tensorZzerosr   r1   r;   ZtopkZsqueezer   r   concatzipFZsoftmaxr?   r)   explogr   floatr   )r   rd   re   r   rf   rU   Ztext_prexbZlenTextZnstepsZout_resZ
out_lengthZnow_step_Z
tmp_resultjstartr}   r   Z
cur_lengthZnet_outrJ   r   r   rg   Z
preds_textrh   r!   r7   r"   ri     s~   
"

&"

zVLLabelDecode.__call__rK   )NNrL   rM   rN   rO   r#   r   ri   rn   r!   r!   rV   r"   r   m  s
    
r   c                       s6   e Zd ZdZd
 fdd	ZdddZddd	Z  ZS )CANLabelDecodez/ Convert between latex-symbol and symbol-index NFc                    rR   r-   )rS   r   r#   rT   rV   r!   r"   r#     rX   zCANLabelDecode.__init__c           
         s   g }t |}t|D ]8}|| d}|| d |  } fdd|D }g }	|d ur8|| d t |  }	|d||	g q
|S )Nr   c                    r3   r!   r4   r   r7   r!   r"   r8     s    z)CANLabelDecode.decode.<locals>.<listcomp>r	   )r:   r;   Zargminr?   r   r)   )
r   rA   rh   rD   rF   rG   Zseq_endZidx_listZsymbol_listZprobsr!   r7   r"   r     s   zCANLabelDecode.decodec           	      O   s@   |\}}}}|j dd}| |}|d u r|S | |}||fS r   )ra   r   )	r   rd   re   rf   rU   Z	pred_probr   rg   rJ   r!   r!   r"   ri     s   

zCANLabelDecode.__call__rK   r-   r   r!   r!   rV   r"   r     s
    
r   )r`   r<   r^   Z	paddle.nnr   r   r'   objectr   rQ   rq   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r!   r!   r!   r"   <module>   s*   U"PYQOLL"=@h