o
    *jB                     @   s   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 d dlmZ d dlmZmZ d dlmZ dd	lmZ dd
lmZ ddlmZ e Zdd ZG dd dZejejejdG dd de	ZdS )    N)Models)
TorchModel)MODELS)Config)	ModelFileTasks)
get_logger   )ConvNextViT)CRNN)LightweightEdgec                 C   s   g }g }g }t d|  d D ]!}| |  }|d |d }||7 }|| |t| qt|}t|}|||fS )Nr   )	rangesizetolistindexappendlentorchZ
LongTensor	IntTensor)targetlabel_flattenlabel_length
label_dictiZ	cur_labelZ
temp_label r   k/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/models/cv/ocr_recognition/model.pyflatten_label   s   



r   c                   @   s   e Zd ZdddZdd ZdS )
cha_encdecTc                 C   s   || _ d| _|| _d S )N   )case_sensitivetext_seq_lencharMapping)selfr!   r   r   r   r   __init__%   s   
zcha_encdec.__init__c           	   	      s   t dd |D }tt||d  }tdt|D ]0} js2t fdd|| D d }nt fdd|| D d }||| dt|< qtj|t|	d j
|	d f|fdd}t|\}}}|||fS )Nc                 S   s   g | ]}t |qS r   )r   ).0sr   r   r   
<listcomp>+   s    z%cha_encdec.encode.<locals>.<listcomp>r	   r   c                    s6   g | ]}|   jv r j|   d  nt jqS r	   )lowerr!   r   r$   charr"   r   r   r&   /   s    c                    s.   g | ]}| j v r j | d  nt j qS r'   )r!   r   r)   r+   r   r   r&   5   s    
dim)maxr   Zzerosr   longr   r   Ztensorcatr   r    Ztype_asr   )	r"   Zlabel_batchmax_lenoutr   Zcur_encodedr   r   r   r   r+   r   encode*   s2   
zcha_encdec.encodeN)T)__name__
__module____qualname__r#   r3   r   r   r   r   r   #   s    
r   )module_namec                       s:   e Zd Zdef fddZdd Zdd Zdd	 Z  ZS )
OCRRecognition	model_dirc                    s  t  j|fi | tj|tj}ttj|tj	}|j
jj| _|j
jj| _|j
jj| _d| _|j
jdkr=t | _n|j
jdkrHt | _n|j
jdkrSt | _n	td|j
j |dkrtj|dd}| j }d	d
 | D }|| | j| tj|tj}t | _t | _t |ddd6}	|	! }
d}|j
jdks|j
jdkr|d7 }|
D ]}|"d}|| j|< || j|< |d7 }qW d   n1 sw   Y  t#| j| _$tj%j&dd| _'dS )zinitialize the ocr recognition model from the `model_dir` path.

        Args:
            model_dir (str): the model path.
        Nr
   r   r   z7recognizer should be either ConvNextViT, CRNN, but got  cpu)Zmap_locationc                 S   s&   i | ]\}}| d d dd|qS )zrecognizer.r:   zmodule.)replace)r$   kvr   r   r   
<dictcomp>c   s    z+OCRRecognition.__init__.<locals>.<dictcomp>rzutf-8)encodingr	   
T)Zzero_infinity)(superr#   ospathjoinr   ZTORCH_MODEL_FILEr   	from_fileZCONFIGURATIONmodelZinference_kwargsdo_chunkingZ
img_heighttarget_heightZ	img_widthtarget_width
recognizerr
   r   r   	TypeErrorr   loadZ
state_dictitemsupdateZload_state_dictZ
VOCAB_FILEdictlabelMappingr!   open	readlinesstripr   encdecnnZCTCLosscriterion_CTC)r"   r9   kwargsZ
model_pathZcfgsZparams_pretrainedZ
model_dictZcheck_pointZ	dict_pathflinesZcntline	__class__r   r   r#   G   sV   








zOCRRecognition.__init__c                 C   s
   |  |S )z
        Args:
            img (`torch.Tensor`): batched image tensor,
                shape of each tensor is [N, 1, H, W].

        Return:
            `probs [T, N, Classes] of the sequence feature`
        )rL   )r"   inputsr   r   r   forward|   s   
	zOCRRecognition.forwardc                 C   s   |d }|d }|j d }| jr||d d| jd}n
||d| j| j}| |}|d ddd}| j|\}}}	t	|
dg|
d }
| |d|	|
|}t||d	 d
}|S )NZimageslabelsr      i,  probsr	      preds)lossre   )shaperI   viewrJ   rK   ZpermuterV   r3   r   r   r   rX   Zlog_softmaxrQ   )r"   batchr_   ra   bsoutputrc   _r   r   Zprobs_sizesrf   r   r   r   do_step   s   
zOCRRecognition.do_stepc                 C   s   |}t j|dd}t|d}|j\}}g }t|D ]0}||  j }d}	g }
|D ]}||	kr=|dkr=|
	| j
|  |}	q+d|
}|	| q||dS )Nr,   r   r:   )re   rc   )FZsoftmaxr   Zargmaxrg   r   r;   datar   r   rR   rF   )r"   r_   Zoutprobsre   Z	batchSizelengthZfinal_str_listr   Zpred_idxZlast_pZstr_predpZ	final_strr   r   r   postprocess   s    


zOCRRecognition.postprocess)	r4   r5   r6   strr#   r`   rm   rs   __classcell__r   r   r]   r   r8   C   s
    5r8   )rD   r   Ztorch.nn.functionalrW   Z
functionalro   Zmodelscope.metainfor   Z'modelscope.models.base.base_torch_modelr   Zmodelscope.models.builderr   Zmodelscope.utils.configr   Zmodelscope.utils.constantr   r   Zmodelscope.utils.loggerr   Zmodules.ConvNextViT.main_modelr
   Zmodules.CRNN.main_modelr   Z"modules.LightweightEdge.main_modelr   ZLOGGERr   r   Zregister_moduleZocr_recognitionr8   r   r   r   r   <module>   s&    