o
    *jcO                     @   s  d dl Z d dlZd dlmZ d dlZd dlmZmZm	Z	m
Z
mZ d dlZd dl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 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"m#Z# d dl$m%Z% 					dddZ&ej'ej(dG dd deZ)dS )    N)CallableDictOptionalTupleUnion)nn)Dataset)snapshot_download)Trainers)
TorchModel)	MsDataset)Preprocessor)BaseTrainer)TRAINERS)DEFAULT_MODEL_REVISIONInvoke	ModelFile
get_loggerFc           "   
      s$  dd l }dd l}	ddlm}
m}m}m}m} ddlm	}m
}m} ddlm  ddlm}m} ddlm}m} t }t|ttfrB|n|g}jdd  fdd	|D }rod
d}||  |j gd|d} n*|dkr}|d |  } n|| jd} | jsddl m!}m"} ||dksJ d|| jj#}jdd u rdjj$dj_%|dt& |jj%t'| d |j(||dd}||_)dd }|d ur|d(i jj*|di}nrdjj*vr|d(i jj*}njj*}|j+jj,|jj-jj.jdd jdd d r(jj%d dkr(|/|
  |d urb |j0j1j2j0j1j3ddd }jd!i } jj%d d"k| d#< rS|n|}!|j/|!|fi | d$d% jj4rq|j5jj4dd& njj6r}|7jj6 d'd	 jj8D j_8|9|jj8 d S ))Nr   )DistSamplerSeedHookFp16OptimizerHookbuild_optimizerbuild_runnerget_dist_info)DistEvalHookDistOptimizerHookEvalHookbuild_dataloader)wrap_distributed_modelwrap_non_distributed_modelMMDataParallelMMDistributedDataParallelZsamplerc                    s8   g | ]} |j jjj jjtjd jdqS )T)Znum_gpusdistround_upseedsampler_cfg)train
dataloaderbatch_size_per_gpuworkers_per_gpulengpu_idsr&   ).0Zdsr   cfgdistributedr'    r/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/trainers/cv/image_classifition_trainer.py
<listcomp>1   s    
ztrain_model.<locals>.<listcomp>find_unused_parametersF)
device_idsbroadcast_buffersr5   cpuzThe argument `device` is deprecated. To use cpu to train, please refers to https://mmclassification.readthedocs.io/en/latest/getting_started.html#train-a-modelr6   )__version__digit_version      r>   zLTo train with CPU, please confirm your mmcv version is not lower than v1.4.4runnerZEpochBasedRunner)type
max_epochszVconfig is now expected to have a `runner` section, please set `runner` in your config.)modelZbatch_processor	optimizerwork_dirloggermeta)Zdefault_argsfp16r1   r@   Zmomentum_configZcustom_hooks)Zcustom_hooks_configTZsamples_per_gpur+   r$   shuffler%   
evaluationZIterBasedRunnerZby_epochZLOW)priorityZmap_locationc                 S   s   g | ]}t |qS r2   )tuple)r.   Zflowr2   r2   r3   r4      s    r2   ):torchwarningsmmcv.runnerr   r   r   r   r   Z
mmcls.corer   r   r   mmcls.datasetsr   mmcls.utilsr   r    mmcv.parallelr"   r#   r   
isinstancelistrM   r(   getcudacurrent_devicewarningr8   r-   r6   mmcvr:   r;   rC   rA   r?   UserWarningdictrD   	timestampoptimizer_configZregister_training_hooksZ	lr_configZcheckpoint_configZ
log_configregister_hookrJ   r)   r*   r+   resume_fromresume	load_fromload_checkpointworkflowrun)"rB   datasetr0   r1   val_datasetr]   devicerF   rN   rO   r   r   r   r   r   r   r   r   r   r    r"   r#   rE   Zdata_loadersr5   r:   r;   rC   r?   fp16_cfgr^   Zval_dataloaderZeval_cfgZ	eval_hookr2   r/   r3   train_model   s   







rj   )module_namec                       s   e Zd Zddddddddeddfdeeeeje	f  dee	 dee
 deee
ee	e
f f  deeeef  d	eeeef  d
eeeee	ef f  deejjejjjf dee	 dedee
 f fddZdd Z	dde	dee	ef fddZ  ZS )ImageClassifitionTrainerN)NNr   rB   cfg_filearg_parse_fndata_collatortrain_dataseteval_datasetpreprocessor
optimizersmodel_revisionr&   cfg_modify_fnc           %         sf  ddl }ddl}ddlm}m} ddlm} ddlm}m	} ddl
m} ddlm} ddlm} ddl}|
| _|| j t|trW| j||	d	| _|du rVtj| jtj}n|dus_J d
tj|| _t || | j}d|v rz|d | _n	| jj !dd| _|"t#$| j | j|_tj| jtj%| _&d|v r|d |j _'n	|j !dd|j _'d|v r|d |j _(n|j !dddu rtj| jtj%|j _(d|v r|d |_)n|!dd|_)d|v r|d dd |_*ndg|_*d|v r|d du rdn|d |_+nd|_+|!dd|_,|dur||}d|vr.t-| jj ds'J d| jj j.| _.n|d | _.| j.|j _.|j !dddurH| j.|j j/_.d|v rsd}d|v rX|d nddi}||d fi | | \}}t0t1||_*nd}|d t23dt24 }t#| j| d }t|d!}t5 } | }!d"d#d$ |!6 D }"d%}#|7d&|# |" d" |#  |"| d'< |j8| d(< |7d)|  |7d*|j8  | j|_9|!d+d}$|7d,|j9 d-|$  ||j9|$d. |j9| d/< t#:|| d0< || _;|| _<|j=!d1ddu rd2| _>n|j=j>| _>|| jj?j@}|A  || _|j)| _)|| _B|| _?|| _C|| _D| | _E|| _FdS )3z High-level finetune api for Image Classifition.

        Args:
            model: model id
            model_version: model version, default is None.
            cfg_modify_fn: An input fn which is used to modify the cfg read out of the file.
        r   N)get_ms_dataset_rootget_classes)build_classifier)r   	init_dist)set_random_seed)collect_envr   )rt   z?Config file should not be None if model is not from pretrained!rD   z
./work_dirr`   rb   rh   rW   r-   r=   rG   no_validateFrA   z+max_epochs is missing in configuration filer?   launcherTdist_paramsbackendZnccl
modelscopez%Y%m%d_%H%M%Sz.log)log_file
c                 S   s   g | ]\}}| d | qS )z: r2   )r.   kvr2   r2   r3   r4   #  s    z5ImageClassifitionTrainer.__init__.<locals>.<listcomp>z=------------------------------------------------------------
zEnvironment info:
env_infoconfigzDistributed training: zConfig:
deterministiczSet random seed to z, deterministic: )r   r&   Zexp_namedata_prefix )GrN   rZ   /modelscope.models.cv.image_classification.utilsrv   rw   Zmmcls.modelsrx   rP   r   ry   
mmcls.apisrz   rR   r{   Z
mmcv.utilsr   Z3modelscope.models.cv.image_classification.backbonesZ_seedrT   strZget_or_download_model_dirZ	model_dirospathjoinr   ZCONFIGURATIONdirnamesuper__init__r0   rD   r(   rV   Zmkdir_or_existospabspathZTORCH_MODEL_FILEeval_checkpoint_pathr`   rb   rh   r-   rG   r|   hasattrrA   r?   rU   rangetimestrftime	localtimer\   itemsinfopretty_textr&   basenamerp   rq   rf   r   rB   mm_modelZinit_weightsrm   r1   r]   rF   rE   )%selfrB   rm   rn   ro   rp   rq   rr   rs   rt   r&   ru   kwargsrN   rZ   rv   rw   rx   r   ry   rz   r{   Zmmcv_get_loggerr   r0   r1   r~   _Z
world_sizer]   r   rE   rF   Zenv_info_dictr   Z	dash_lineZ_deterministic	__class__r2   r3   r      s   

















z!ImageClassifitionTrainer.__init__c              
   O   s  ddl m} ddlm}m}m} ddlm} | jd u rt	dd | j
jj_| j
t| jt| j | j
jjd u rP|| j}t|d}	t|	rM|	nd }
n| j
jj}
|| j| j
jj|
| jdg}t| j
jjdkr| jd u rut	d	| j
jj}|| j||
| jd}|| | jt || j
j!|d j"d
 d }| j
j#s|| j|| j
jj$|
| jd}t%| j|| j
| j&|| j'| j(dkrdnd| jd d S )Nr   )r:   )rv   	MmDatasetpreprocess_transformsetup_multi_processeszBNot found train dataset, please set the 'train_dataset' parameter!classname.txtZpipelineclassesr      DNot found evaluate dataset, please set the 'eval_dataset' parameter!)Zmmcls_versionr   CLASSESr8   rW   )r1   rg   r]   rh   rF   ))Zmmclsr:   r   rv   r   r   rR   r   rp   
ValueErrorr0   rB   r   
pretraineddumpr   r   rD   r   rm   rf   r   existsrr   r(   r   r,   rd   rq   appendrF   updater\   r   r   r|   valrj   r1   r]   rh   )r   argsr   r:   rv   r   r   r   	data_rootclassname_pathr   ZdatasetsZval_data_pipelinerg   r2   r2   r3   r(   M  sv   






zImageClassifitionTrainer.traincheckpoint_pathreturnc           &      O   s  dd l }dd l}ddlm}m}m}m}	 ddlm}
 ddl	m
}m}m} ddlm}m} ddlm}m} ddlm} | jd u rCtdd | jjj_| jjjd u re|| j}t|d	}t|rb|nd }n| jjj}|| j|| jj j!|| j"d
}|
|| jj#j$j%| jj#j$j&| j'ddd}t()| j}| j*dd }|d ur|| |d u r|	| j+}|d ur||t,j-| j+|dd}n||| j.dd}n|||dd}d|*di v r|d d }nddlm/} | j01d |j2}| j's"| j3dkr|4 }n||| jj5d}|j6st78t7j9dksJ d||_2i }|||dd fi |}n||: |j:; gdd}|||d d}| \} }!| dkri }"t< }#| jj#*di }$d|$= v r]t>|$d |$d< nt?|dk rhd|$d< | jj#j@r|jA|| jj#j@|$|#d}%|"B|% |"S d S )Nr   )rv   r   r   get_trained_checkpoints_namer   )r   rc   wrap_fp16_modelr!   )multi_gpu_testsingle_gpu_testr   r   r   r   FTrH   rG   r8   rL   r   rF   )ImageNetzQClass names are not saved in the checkpoint's meta data, use imagenet by default.r9   r<   zKTo test with CPU, please confirm your mmcv version is not lower than v1.4.4)r6   r7   metric_optionsZtopk   )r=   )resultsZmetricr   rE   )CrO   rN   r   rv   r   r   r   rQ   r   rP   r   rc   r   rS   r"   r#   r   r   r   rR   r   rq   r   r0   rB   r   r   rf   r   r   r   r   rr   r   r   rJ   r)   r*   r+   r1   copydeepcopyrV   rD   r   r   r   r   rE   rY   r   rh   r8   r-   r6   rZ   r;   r:   rW   rX   r   keysrM   r,   Zmetricsevaluater   )&r   r   r   r   rO   rN   rv   r   r   r   r   r   rc   r   r"   r#   r   r   r   r   r   r   rf   Zdata_loaderrB   ri   Ztrained_checkpoints
checkpointr   r   Zshow_kwargsZoutputsrankr   r   rE   r   Zeval_resultsr2   r2   r3   r     s   











z!ImageClassifitionTrainer.evaluate)N)__name__
__module____qualname__r   r   r   r   r   Moduler   r   r   r   r   r   r   rN   ZoptimZ	OptimizerZlr_schedulerZ_LRSchedulerintr   r(   floatr   __classcell__r2   r2   r   r3   rl      sb    

	
 +H
rl   )FNNNN)*r   r   Zos.pathr   r   r   typingr   r   r   r   r   numpynprN   r   Ztorch.utils.datar   Z modelscope.hub.snapshot_downloadr	   Zmodelscope.metainfor
   Zmodelscope.models.baser   Z modelscope.msdatasets.ms_datasetr   Zmodelscope.preprocessors.baser   Zmodelscope.trainers.baser   Zmodelscope.trainers.builderr   Zmodelscope.utils.constantr   r   r   Zmodelscope.utils.loggerr   rj   Zregister_moduleZimage_classificationrl   r2   r2   r2   r3   <module>   s6   
 