o
    ॵi                     @   sv   d dl 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 ejejdG d	d
 d
eZdS )    N)Hooks)HOOKS)LogKeys)master_only   )
LoggerHook)module_namec                       sx   e Zd ZdZdddddejejgf fdd	Ze  fdd	Z	e d
d Z
dd Z fddZe dd Z  ZS )TensorboardHooka  
    TensorBoard hook for visualization.

    Args:
        out_dir: output directory to save tensorboard files
        interval (int): Logging interval (every k iterations).
        ignore_last (bool): Ignore the log of last iterations in each epoch
            if less than `interval`.
        reset_flag (bool): Whether to clear the output buffer after logging.
        by_epoch (bool): Whether EpochBasedtrainer is used.
        skip_keys (list): list of keys which will not add to tensorboard
    N
   TFc                    s(   t t| j||||d || _|| _d S )N)intervalignore_last
reset_flagby_epoch)superr	   __init__out_dir	skip_keys)selfr   r   r   r   r   r   	__class__ e/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/trainers/hooks/logger/tensorboard_hook.pyr      s   

zTensorboardHook.__init__c              
      s   t t| | zddlm} W n ty# } zt|jd d }~ww | jd u r2tj	
|jd| _|jd| j  || j| _d S )Nr   )SummaryWriterz Please pip install tensorboard by ``pip install future tensorboard`` or upgrade version by ``pip install future tensorboard --upgrade``.tensorboard_outputz#tensorboard files will be saved to )r   r	   
before_runtorch.utils.tensorboardr   ImportErrormsgr   ospathjoinwork_dirloggerinfowriter)r   trainerr   er   r   r   r   ,   s   

zTensorboardHook.before_runc                 C   s   t |jjdkr| | |jj D ]-\}}|| jv rqt|tr.| j	
||| | q| |r?| j	||| | q	 q| j	  d S )Nr   )lenvisualization_bufferoutputvisualization_log
log_bufferitemsr   
isinstancestrr$   add_textget_iter	is_scalar
add_scalarflush)r   r%   keyvalr   r   r   log>   s   



zTensorboardHook.logc                 C   s   |j j}| D ]i\}}|dg }|dd}|dur(t|t|ks(J dt|D ]D\}}t|tjr<t	
|}nt|t	jsPJ dt| d||  d| }	|dur\|| n|	}
| jj| d|
 || |d	d
 q,qdS )z Images Visulization.
        `visualization_buffer` is a dictionary containing:
            images (list): list of visulaized images.
            filenames (list of str, optional): image filenames.
        images	filenamesNz:Output `images` and `filenames` must keep the same length!z3Only support np.ndarray and torch.Tensor type! Got z	 for img zimage_%i/HWC)dataformats)r(   r)   r,   getr'   	enumerater-   npndarraytorch
from_numpyTensortyper$   	add_imager0   )r   r%   visual_resultsvis_key
vis_resultr7   r8   iimgdefault_namefilenamer   r   r   r*   M   sB   z!TensorboardHook.visualization_logc                    s   t t| | |j  d S N)r   r	   after_train_iterr(   clear_outputr   r%   r   r   r   rM   m   s   z TensorboardHook.after_train_iterc                 C   s   | j   d S rL   )r$   closerO   r   r   r   	after_runs   s   zTensorboardHook.after_run)__name__
__module____qualname____doc__r   	ITER_TIMEDATA_LOAD_TIMEr   r   r   r6   r*   rM   rQ   __classcell__r   r   r   r   r	      s"    

 r	   )r   numpyr>   r@   modelscope.metainfor   !modelscope.trainers.hooks.builderr   modelscope.utils.constantr   modelscope.utils.torch_utilsr   baser   register_moduler	   r   r   r   r   <module>   s   