
    9iB                     $   S SK r S SKrS SKJs  Jr  S SKJr  S SKJ	r	  S SK
Jr  S SKJr  S SKJrJr  S SKJr  SS	KJr  SS
KJr  SSKJr  \" 5       rS r " S S5      r\R8                  " \R:                  \R:                  S9 " S S\	5      5       rg)    N)Models)
TorchModel)MODELS)Config)	ModelFileTasks)
get_logger   )ConvNextViT)CRNN)LightweightEdgec                 `   / n/ n/ n[        SU R                  5       S   5       HX  nX   R                  5       nUS UR                  S5       nX-  nUR	                  U5        UR	                  [        U5      5        MZ     [        R                  " U5      n[        R                  " U5      nX2U4$ )Nr   )	rangesizetolistindexappendlentorch
LongTensor	IntTensor)targetlabel_flattenlabel_length
label_dicti	cur_label
temp_labels          j/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/modelscope/models/cv/ocr_recognition/model.pyflatten_labelr       s    MLJ1fkkmA&'I$$&	2	 23
#*%C
O, ( $$]3M??<0Lm44    c                   $    \ rS rSrSS jrS rSrg)
cha_encdec#   c                 *    X l         SU l        Xl        g )N   )case_sensitivetext_seq_lencharMapping)selfr)   r'   s      r   __init__cha_encdec.__init__%   s    ,&r!   c           
         [        U Vs/ s H  n[        U5      PM     sn5      n[        R                  " [        U5      US-   5      R	                  5       n[        S[        U5      5       GH  nU R                  (       d~  [        R                  " X    Vs/ s HV  nUR                  5       U R                  ;   a   U R                  UR                  5          S-
  O[        U R                  5      PMX     sn5      S-   nO`[        R                  " X    Vs/ s H9  nX`R                  ;   a  U R                  U   S-
  O[        U R                  5      PM;     sn5      S-   nXtU   S[        U5      & GM     [        R                  " U[        R                  " UR                  S5      U R                  UR                  S5      -
  45      R                  U5      4SS9n[        U5      u  pn
XU
4$ s  snf s  snf s  snf )Nr
   r   dim)maxr   r   zeroslongr   r'   tensorlowerr)   catr   r(   type_asr    )r*   label_batchsmax_lenoutr   charcur_encodedr   r   r   s              r   encodecha_encdec.encode*   s   {3{!s1v{34kk#k*GaK8==?q#k*+A&&#ll !,, !/ ;?**,'';(D$$TZZ\2Q6-01A1A-BC .,  	 $ll !,, !/  #3#33 $$T*9<T=M=M9NO .,  	
 *5F1S%& , ii%++!d//#((1+=>@@GN 3@2D/
-66+ 4,,s   G-AG2
A G7
)r'   r)   r(   N)T)__name__
__module____qualname____firstlineno__r+   r=   __static_attributes__ r!   r   r#   r#   #   s    '
7r!   r#   )module_namec                   B   ^  \ rS rSrS\4U 4S jjrS rS rS rSr	U =r
$ )OCRRecognitionC   	model_dirc                   > [         TU ]  " U40 UD6  [        R                  R	                  U[
        R                  5      n[        R                  " [        R                  R	                  U[
        R                  5      5      nUR                  R                  R                  U l        UR                  R                  R                  U l        UR                  R                  R                  U l        SU l        UR                  R"                  S:X  a  [%        5       U l        OvUR                  R"                  S:X  a  ['        5       U l        OLUR                  R"                  S:X  a  [)        5       U l        O"[+        SUR                  R"                   35      eUS:w  a  [,        R.                  " USS9nU R"                  R1                  5       nUR3                  5        VVs0 s H(  u  pxUR5                  S	S5      R5                  S
S5      U_M*     n	nnUR7                  U	5        U R"                  R9                  U5        [        R                  R	                  U[
        R:                  5      n
[=        5       U l        [=        5       U l         [C        U
SSS9 nURE                  5       nSnUR                  R"                  S:X  d  UR                  R"                  S:X  a  US-  nU H5  nURG                  S5      nXR>                  U'   XR@                  U'   US-  nM7     SSS5        [I        U R@                  5      U l%        [,        RL                  RO                  SS9U l(        gs  snnf ! , (       d  f       NQ= f)zlinitialize 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_locationzrecognizer.zmodule.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replaceupdateload_state_dict
VOCAB_FILEdictlabelMappingr)   open	readlinesstripr#   encdecnnCTCLosscriterion_CTC)r*   rI   kwargs
model_pathcfgsparams_pretrained
model_dictkvcheck_point	dict_pathflinescntline	__class__s                  r   r+   OCRRecognition.__init__G   s    	-f-WW\\)Y-G-GH
GGLLI$;$;<>::66BB!ZZ88CC JJ77AA::  M1)mDOZZ""f,"fDOZZ""&77-/DOI$**J_J_I`a   %

:E J335J .3355DA 		-,44YCQF5   k*OO++J7GGLLI,@,@A	 F6)S73qKKMECzz$$59N9NRc9cqzz$')-!!#&),  &q	  4 !!1!12"XX--D-A/ 43s   !/M"BM((
M6c                 $    U R                  U5      $ )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*   inputss     r   forwardOCRRecognition.forward|   s     v&&r!   c                 2   US   nUS   nUR                   S   nU R                  (       a"  UR                  US-  SU R                  S5      nO(UR                  USU R                  U R                  5      nU " U5      nUS   R                  SSS5      nU R                  R                  U5      u  pxn	[        R                  " UR                  S5      /UR                  S5      -  5      n
U R                  UR                  S5      XU5      n[        XS	   S
9nU$ )Nimageslabelsr      i,  probsr
      preds)lossr   )shaper[   viewr]   r_   permutern   r=   r   r   r   rq   log_softmaxri   )r*   batchr   r   bsoutputr   _r   r   probs_sizesr   s               r   do_stepOCRRecognition.do_step   s    xx\\!_[[aD,>,>DF[[Q(:(:D<M<MNFfw''1a0)-););F)C&oouzz!}o

1&EF!!a -lL4g7r!   c                    Un[         R                  " USS9n[        R                  " US5      nUR                  u  pE/ n[        U5       H  nX7   R                  5       R                  R                  5       nSn	/ n
U H.  nX:w  a$  US:w  a  U
R                  U R                  U   5        Un	M0     SR                  U
5      nUR                  U5        M     XaS.$ )Nr.   r   rK   )r   r   )Fsoftmaxr   argmaxr   r   rL   datar   r   rj   rU   )r*   r   outprobsr   	batchSizelengthfinal_str_listr   pred_idxlast_pstr_predp	final_strs                r   postprocessOCRRecognition.postprocess   s    99X2.Xr*!KK	y!Ax||~**113HFH;16OOD$5$5a$89  )I!!), " (99r!   )r)   rq   r[   rn   rj   r`   r]   r_   )r?   r@   rA   rB   strr+   r   r   r   rC   __classcell__)r   s   @r   rG   rG   C   s&    3B# 3Bj	'": :r!   rG   )rS   r   torch.nn.functionalro   
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_recognitionrG   rD   r!   r   <module>r      s}    	    & > , * 6 . 7 ) ?	57 7@ 	v'='=?c:Z c:?c:r!   