o
    èe!!  ã                   @   sŠ   d dl mZ d dl mZ d dl m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
Z
 dgZdd„ Zdd
d„Zdd„ Z		ddd„ZdS )é    )Úabsolute_import)Údivision)Úprint_functionN)Ú
get_loggerÚ
load_modelc              
   C   s€   t j | ¡s>zt  | ¡ W dS  ty= } z#|jtjkr+t j | ¡r+| d 	| ¡¡ ntd 	| ¡ƒ‚W Y d}~dS d}~ww dS )zT
    mkdir if not exists, ignore the exception when multiprocess mkdir together
    z/be happy if some process has already created {}zFailed to mkdir {}N)
ÚosÚpathÚexistsÚmakedirsÚOSErrorÚerrnoÚEEXISTÚisdirÚwarningÚformat)r   ÚloggerÚe© r   úOD:\Projects\ConvertPro\env\Lib\site-packages\paddleocr/ppocr/utils/save_load.pyÚ_mkdir_if_not_exist   s   ÿÿü€þýr   Údetc                 C   s‚  t ƒ }| d }| d¡}| d¡}i }d}	|dko | d d dv}
|
d	u r·| d d d
v r/|S | d d d }|rµtj tj |d¡¡rttj |d¡dƒ}tjrWt	 
|¡nt	j
|dd}W d  ƒ n1 shw   Y  | di ¡}d|v r|d d |d< | d |¡¡ |durµ|d dv r—|dd… }tj |d ¡r­t 
|d ¡}| |¡ |S | d |¡¡ |S |r­| d¡rÅ| dd¡}tj |d ¡sÔJ d |¡ƒ‚t 
|d ¡}| ¡ }i }| ¡ D ]J\}}||vrù| d || ¡ ¡¡ qå|| }|jtjkrd	}	|j|jkr| |j¡}t|jƒt|jƒkr#|||< qå| d ||j|j¡¡ qå| |¡ |	r=| d¡ |dur`tj |d ¡rXt 
|d ¡}| |¡ n| d |¡¡ tj |d  ¡r¤t|d  dƒ}tjrzt	 
|¡nt	j
|dd}W d  ƒ n	1 sŒw   Y  | di ¡}d|v r¤|d d |d< | d |¡¡ n|r¶t||ƒ}	n| d!¡ |	|d"< |S )#z8
    load model from checkpoint or pretrained_model
    ÚGlobalÚcheckpointsÚpretrained_modelFÚkieÚArchitectureÚ	algorithm©ZSDMGRT©ZDistillationZBackbonezmetric.statesÚrbÚlatin1)ÚencodingNÚbest_model_dictÚepoché   Zstart_epochzresume from {}éÿÿÿÿ)ú/ú\ú.pdoptz9{}.pdopt is not exists, params of optimizer is not loadedú	.pdparamsÚ ú The {}.pdparams does not exists!z{} not in loaded params {} !zIThe shape of model params {} {} not matched with loaded params shape {} !úIThe parameter type is float16, which is converted to float32 when loadingú.statesztrain from scratchÚ
is_float16)r   Úgetr   r   r	   ÚjoinÚopenÚsixÚPY2ÚpickleÚloadÚinfor   ÚpaddleÚset_state_dictr   ÚendswithÚreplaceÚ
state_dictÚitemsÚkeysÚdtypeÚfloat16ÚastypeÚlistÚshapeÚload_pretrained_params)ÚconfigÚmodelÚ	optimizerÚ
model_typer   Zglobal_configr   r   r"   r.   Úis_nlp_modelÚfZstates_dictZ
optim_dictÚparamsr;   Únew_state_dictÚkeyÚvalueZ	pre_valuer   r   r   r   /   s¾   

ÿÿÿÿþ
üþ
ÿÿ
þ
ÿ
þÿÿ

c              
   C   s<  t ƒ }| d¡r| dd¡}tj |d ¡sJ d |¡ƒ‚t |d ¡}|  	¡ }i }d}| 
¡ D ]W}|| 
¡ vrA| d |¡¡ q0|| jtjkrKd}|| j|| jkra||  || j¡||< t|| jƒt|| jƒkrv|| ||< q0| d ||| j||| j¡¡ q0|  |¡ |r”| d¡ | d	 |¡¡ |S )
Nr)   r*   r+   Fz%The pretrained params {} not in modelTzFThe shape of model params {} {} not matched with loaded params {} {} !r,   z load pretrain successful from {})r   r9   r:   r   r   r	   r   r7   r5   r;   r=   r   r>   r?   r@   rA   rB   r8   r6   )rE   r   r   rJ   r;   rK   r.   Zk1r   r   r   rC   ’   s<   
ÿþ
ÿrC   FÚppocrc                 K   s"  t ||ƒ tj ||¡}t | ¡ |d ¡ |d d dko%|d d dv}	|	dur7t |  ¡ |d ¡ |}
n%|d	 d
 rA| j}n| }|d d dv rN|j}|j	j
 |¡ tj |d¡}
t|
d dƒ}tj||dd W d  ƒ n1 svw   Y  |r‡| d |¡¡ dS | d |¡¡ dS )z'
    save model to the target path
    r(   r   rG   r   r   r   Tr)   r   Údistributedr   Zmetricr-   Úwbé   )ÚprotocolNzsave best model is to {}zsave model in {})r   r   r   r0   r7   Úsaver;   Z_layersZStudentZbackbonerE   Zsave_pretrainedr1   r4   Údumpr6   r   )rE   rF   Z
model_pathr   rD   Zis_bestÚprefixÚkwargsZmodel_prefixrH   Zmetric_prefixÚarchrI   r   r   r   Ú
save_model¹   s4   
ÿÿÿÿrX   )Nr   )FrN   )Ú
__future__r   r   r   r   r   r4   r2   r7   Zppocr.utils.loggingr   Ú__all__r   r   rC   rX   r   r   r   r   Ú<module>   s    
c,ú