o
    ߥiB                     @   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torch
LongTensor	IntTensor)targetlabel_flattenlabel_length
label_dicti	cur_label
temp_label r   ^/home/ubuntu/.local/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   zerosr   longr   r"   tensorcatr   r#   type_asr   )	r%   label_batchmax_lenoutr   cur_encodedr   r   r   r   r.   r   encode*   s2   
zcha_encdec.encodeN)T)__name__
__module____qualname__r&   r;   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)map_locationc                 S   s&   i | ]\}}| d d dd|qS )zrecognizer.rB   zmodule.)replace)r'   kvr   r   r   
<dictcomp>c   s    z+OCRRecognition.__init__.<locals>.<dictcomp>rzutf-8)encodingr	   
T)zero_infinity)(superr&   ospathjoinr   TORCH_MODEL_FILEr   	from_fileCONFIGURATIONmodelinference_kwargsdo_chunking
img_heighttarget_height	img_widthtarget_width
recognizerr
   r   r   	TypeErrorr   load
state_dictitemsupdateload_state_dict
VOCAB_FILEdictlabelMappingr$   open	readlinesstripr    encdecnnCTCLosscriterion_CTC)r%   rA   kwargs
model_pathcfgsparams_pretrained
model_dictcheck_point	dict_pathflines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`
        )r[   )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 )Nimageslabelsr      i,  probsr	      preds)lossr   )shaperV   viewrX   rZ   permuterh   r;   r   r   r   rk   log_softmaxrc   )r%   batchry   r|   bsoutputr~   _r   r   probs_sizesr   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   rB   )r   r~   )Fsoftmaxr   argmaxr   r   rC   datar   r   rd   rP   )r%   ry   outprobsr   	batchSizelengthfinal_str_listr   pred_idxlast_pstr_predp	final_strr   r   r   postprocess   s    


zOCRRecognition.postprocess)	r<   r=   r>   strr&   rz   r   r   __classcell__r   r   rw   r   r@   C   s
    5r@   )rN   r   torch.nn.functionalri   
functionalr   modelscope.metainfor   'modelscope.models.base.base_torch_modelr   modelscope.models.builderr   modelscope.utils.configr   modelscope.utils.constantr   r   modelscope.utils.loggerr   modules.ConvNextViT.main_modelr
   modules.CRNN.main_modelr   "modules.LightweightEdge.main_modelr   LOGGERr   r    register_moduleocr_recognitionr@   r   r   r   r   <module>   s&    