o
    ॵiF                     @   sb  d dl Z d dlmZ d dlmZmZmZ d dlZd dl	m
Z
 d dlmZmZ d dlmZmZmZ d dlmZmZ d dlmZ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" 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/m0Z0 d dl1m2Z2 d dl3m4Z4 d dl5m6Z6m7Z7m8Z8 e4j9e*j:dG dd de2Z;dS )    N)CallableDictOptional)DetectionCheckpointer)build_detection_test_loaderbuild_detection_train_loader)SimpleTrainerhookslaunch)create_ddp_modeldefault_writers)inference_on_datasetprint_csv_format)LRMultiplierWarmupParamScheduler)get_default_optimizer_params)comm)PathManager)setup_logger)CosineParamScheduler)check_local_model_is_latest)snapshot_download)Trainers)DetEvaluator)build_action_detection_model)VideoDetMapper)BaseTrainer)TRAINERS)Invoke	ModelFileTasks)module_namec                       sz   e Zd Z		ddedee f fddZdd Zdd	 Zd
ede	ee
f fddZ		dddZdd ZdddZ  ZS )ActionDetectionTrainerNcfg_filecfg_modify_fnc           	         s   |  |}|d u rtj|tj}t | |d ur!|| j| _| jj	j
| _| jj	jd | _| jj	jj| _td| jj	j| jj	jd  | _t| jj	j| _|dd| _|| _|| _|dt|tj| _d S )Nwarmup_step   batch_size_per_gpuresumeFpretrained_model)get_or_download_model_dirospathjoinr   CONFIGURATIONsuper__init__cfgtrainmax_iter
total_steplr_schedulerr%   	optimizerlrmaxnum_gpus
dataloadertotal_batch_sizelenclasses_id_mapnum_classesgetr(   train_datasettest_datasetospTORCH_MODEL_FILEr)   )	selfmodel_idr@   rA   r#   r$   argskwargsmodel_cache_dir	__class__ c/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/trainers/cv/action_detection_trainer.pyr0   $   s,   


zActionDetectionTrainer.__init__c                 C   sf   t  r|rt| | jt|d t  }t	||dd t	||d}|
d|t   d S )Nz	config.pyfvcore)distributed_rankname)rN   z+Rank of current process: {}. World size: {})r   is_main_processr   mkdirsr1   dumprB   r-   get_rankr   infoformatget_world_size)rD   
output_dirrankloggerrK   rK   rL   startA   s   

zActionDetectionTrainer.startc                 O   s:   | j jjdkr|   d S t| j| j jjddddd d S )Nr&   r   autorK   machine_rankdist_urlrF   r1   r2   r9   do_trainr
   )rD   rF   rG   rK   rK   rL   r2   K   s   
zActionDetectionTrainer.traincheckpoint_pathreturnc                 O   sD   | j jjdkr| jd|d d S t| j| j jjdddd|fd d S )Nr&   T)	just_evalra   r   r[   r\   r_   )rD   ra   rF   rG   rK   rK   rL   evaluateW   s   
zActionDetectionTrainer.evaluateFc              
      s   jjj tjd jjjdkr   t dd |r1t	 }|
|  }|S tjjt jdjdd}t|ttdd	djj d
jd}tjtjjjddjjjjjd}t ||}t	 jjj|d}	|t  tj!|dt"# rtj$|	jjj%dnd tj&jj'j( fdddt"# rtj)t*|	j+jddnd g |	j,j-dd j.r|	j,j.d |j/d }
nd}
||
j d S )N)r>   r   F)broadcast_buffers)base_lrg?)paramsr7   weight_decayr&   gMbP?)warmup_factorwarmup_length)r3   Tis_train)mapperr;   num_workers)trainer)	scheduler)periodc                      s
     S N)do_testrK   modelrD   rK   rL   <lambda>   s   
 z1ActionDetectionTrainer.do_train.<locals>.<lambda>)eval_periodeval_function   )r(   )0rZ   r1   r2   work_dirr   r>   r9   cudar   r   loadrs   torchoptimAdamWr   r7   r   r   r   r%   r4   r   r@   r   r=   r;   r:   workers_per_gpur   register_hooksr	   IterationTimerLRSchedulerr   rP   PeriodicCheckpointercheckpoint_intervalEvalHook
evaluationintervalPeriodicWriterr   save_dirresume_or_loadr)   r(   iter)rD   rc   ra   
checkpointresultr~   r5   train_loaderro   checkpointer
start_iterrK   rt   rL   r`   d   sz   






zActionDetectionTrainer.do_trainc                 C   sj   t t| jjj | jjj| jjjdkd}t| j	t
| jjjdd| jjjjd}t|||}t| |S )Nr&   )distributedFrk   )rm   rn   )r   listr1   r2   r=   keysrz   r9   r   rA   r   r   r:   r   r   r   )rD   ru   	evaluatortest_loaderr   rK   rK   rL   rs      s   

zActionDetectionTrainer.do_testc                 C   sZ   t j|r t j|r|nt j|}t|tjtjid |S t	||tjtj
id}|S )N)
user_agent)revisionr   )r+   r,   existsisdirdirnamer   r   KEYLOCAL_TRAINERr   TRAINER)rD   ru   model_revisionrH   rK   rK   rL   r*      s    

z0ActionDetectionTrainer.get_or_download_model_dir)NN)FNrr   )__name__
__module____qualname__strr   r   r0   rZ   r2   r   floatrd   r`   rs   r*   __classcell__rK   rK   rI   rL   r"   !   s$    



:r"   )<r+   os.pathr,   rB   typingr   r   r   r}   detectron2.checkpointr   detectron2.datar   r   detectron2.enginer   r	   r
   detectron2.engine.defaultsr   r   detectron2.evaluationr   r   detectron2.solverr   r   detectron2.solver.buildr   detectron2.utilsr   detectron2.utils.file_ior   detectron2.utils.loggerr   fvcore.common.param_schedulerr   modelscope.hub.check_modelr    modelscope.hub.snapshot_downloadr   modelscope.metainfor   -modelscope.metrics.action_detection_evaluatorr   Fmodelscope.models.cv.action_detection.modules.action_detection_pytorchr   3modelscope.preprocessors.cv.action_detection_mapperr   modelscope.trainers.baser   modelscope.trainers.builderr   modelscope.utils.constantr   r   r    register_moduleaction_detectionr"   rK   rK   rK   rL   <module>   s4   