
    f@                     V   d dl Z d dlZd dlmZ d dlZd dlZd dlmZ ej                             e	 ee
          j        j        j                             d dlmZ d dlmZ d dlmZmZmZ 	 d dlZd dlmZmZ n# e$ r dZY nw xY wdZefd	Zd
 Zd Zd Zd Z G d d          ZdS )    N)Path)tqdm)LoadImagesAndLabels)img2label_paths)colorstr	xywh2xyxycheck_dataset)initfinishzwandb-artifact://c                 0    | t          |          d          S N)len)from_stringprefixs     7/var/www/html/yolov7/utils/wandb_logging/wandb_utils.pyremove_prefixr      s    s6{{||$$    c                     d                     |                     dd                    }t          |                                          r|S | S )N_wandb..   )joinrsplitr   is_file)data_config_filewandb_configs     r   check_wandb_config_filer      sL    >>"2"9"9#q"A"ABBLL!!## r   c                     t          t          | t                              } | j        }| j        j        }d|z   dz   }|||fS )Nrun__model)r   r   WANDB_ARTIFACT_PREFIXstemparent)run_pathrun_idprojectmodel_artifact_names       r   get_run_infor(   "   sH    M(,ABBCCH]Fo"G 6/H47///r   c                    | j         dvrt          |           nd  t          | j        t                    r| j                            t                    r| j         dvrt          | j                  \  }}}t          j	                    }|
                    |dz   |z   dz             }|                                }t	          t          |          dz            | _        dS d S )N)r   /:latestlast.ptT)global_rankprocess_wandb_config_ddp_mode
isinstanceresumestr
startswithr!   r(   wandbApiartifactdownloadr   weights)optr%   r&   r'   apir6   modeldirs          r   check_wandb_resumer<   *   s    *-/*H*H!#&&&d#*c"" :  !677 	g--7CCJ7O7O4!4ikk<<#8K(Ki(WXX#,,..!$x..9"<==44r   c                 ^   t          | j                  5 }t          j        |t          j                  }d d d            n# 1 swxY w Y   d\  }}t          |d         t                    r|d                             t                    r~t          j
                    }|                    t          |d                   dz   | j        z             }|                                }t          |          dz  }t          |          |d<   t          |d         t                    r|d                             t                    r~t          j
                    }|                    t          |d                   dz   | j        z             }|                                }t          |          dz  }	t          |	          |d<   |s|ret          t          |          dz            }
t          |
d          5 }t          j        ||           d d d            n# 1 swxY w Y   |
| _        d S d S )	NLoaderNNtrain:data/images/valzwandb_local_data.yamlw)opendatayamlload
SafeLoaderr0   r2   r3   r!   r4   r5   r6   r   artifact_aliasr7   r   dump)r9   f	data_dict	train_dirval_dirr:   train_artifact
train_pathval_artifactval_pathddp_data_paths              r   r/   r/   8   sf   	ch 91Ia888	9 9 9 9 9 9 9 9 9 9 9 9 9 9 9#Iw)G$c** -y/A/L/LMb/c/c -ikkmIg4F&G&G#&MPSPb&bcc"++--	)__~5
 __	')E"C(( )Yu-=-H-HI^-_-_ )ikk||M)E2B$C$Cc$ICL^$^__''))==>1x==	% !G !DMM,CCDD-%% 	$Ii###	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	! !s#   !AA	A7HH Hc                   f    e Zd ZddZd Zd Zd Zd ZddZdd	Z	d
 Z
ddZd Zd ZddZd ZdS )WandbLoggerTrainingc                    || _         t          t          sd nt          j        |c| _        | _        | _        t          |j        t                    rv|j                            t                    rVt          |j                  \  }}}t          |z   }t          s
J d            t          j        ||d          | _        ||_        nb| j        r[t          j        s>t          j        |d|j        dk    rdnt          |j                  j        |||          nt          j        | _        | j        r| j         dk    ro|j        sM|j        r|                     |          n|}t#          |          | j        j        _        || j        j        _        |                     ||          | _        | j         dk    r|                     |          | _        d S d S t+          d	          }	t-          |	 d
           d S )Nz"install wandb to resume wandb runsallow)idr&   r1   
runs/trainYOLOR)configr1   r&   namejob_typer[   rX   zDataset Creationzwandb: zQInstall Weights & Biases for YOLOR logging with 'pip install wandb' (recommended))r`   r4   run	wandb_runrN   r0   r1   r2   r3   r!   r(   r
   r&   r   r"   upload_datasetcheck_and_upload_datasetvarsr^   r9   setup_trainingr   print)
selfr9   r_   r%   rN   r`   r&   r'   wandb_data_dictr   s
             r   __init__zWandbLogger.__init__Q   s    5:<\DDSXS\^g2
DNDNcj#&& 	Sz$$%:;; 17CCJ7O7O4!4&;>Q&Q#BBBBBB!&vww!W!W!W0
Z 	S ;@)SUZs/6;>;,;V;V\`adal\m\m\r-119+13 3 3 3
 JO N > 	p}
**z FLOL^&md&C&CC&H&H&HdmO04S		DN)-6EDN)3!%!4!4S)!D!D} 222!%!>!>s!C!C 32 i((FVnnnooooor   c                    t           s
J d            t          | j                   |                     |j        |j        |j        dk    rdnt          |j                  j                  }t          d|           t          |          5 }t          j        |t          j                  }d d d            n# 1 swxY w Y   |S )NzInstall wandb to upload datasetr\   r]   zCreated dataset config file r>   )r4   r	   rN   log_dataset_artifactrG   
single_clsr&   r   r"   rg   rF   rH   rI   rJ   )rh   r9   config_pathrM   ri   s        r   rd   z$WandbLogger.check_and_upload_datasets   s	   777777dn%%%//03;>;,;V;V\`adal\m\m\rt t 	,k:::+ 	C!"i$/BBBO	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	Cs   
!B77B;>B;c                 J   i ddc| _         | _        | _        |j        | _        t	          |j        t                    r|                     |          \  }}|rt          |          dz  | _	        | j
        j        }t          | j	                  |j        |j        |j        |j        |j        d         f\  |_	        |_        |_        |_        |_        |_        t%          | j
        j        j                  }d| j        vr$|                     |                    d          |j                  \  | _        | _        |                     |                    d          |j                  \  | _        | _        d\  | _        | _        | _        | _	        | j        )t          | j                  d	z  }t          |          |d<   | j        \t          | j                  d	z  }t          |          |d<   | j                            d          | _        |                                  | j        JtA          j!        d
t@          j"        j#        z   dz   d          | _        tA          j$        g d          | _        |j        dk    r#|j        dk    r
|j        dz  ndx| _        |_        |S )Nr      r-   hyprS   rA   rD   )NNNNrC   r   	_progress
evaluationepochr[   
predictionavg_confidencer*   
   r   )%log_dictcurrent_epochlog_imgsbbox_intervalr0   r1   r2   download_model_artifactr   r8   rb   r^   save_periodtotal_batch_sizeepochsr9   
batch_sizerq   dictrN   __dict__download_dataset_artifactgetrK   train_artifact_pathrQ   val_artifact_pathrS   result_artifactresult_table	val_tablemap_val_table_pathr4   Artifactra   r[   Table)rh   r9   rN   r;   _r^   rR   rT   s           r   rf   zWandbLogger.setup_training~   s   ;=q"8t)4= .cj#&& 	>66s;;KHa y#H~~	9.gjLh" h"#)#5v7NPVPdflfsgmgqrwgxhydS_cnc>OQTQ[]`]d T^2<==I..<@<Z<Z[d[h[hip[q[q[^[m=o =o9D$d&98<8V8VW`WdWdejWkWkWZWi9k 9k5D"D$5TjQD $"3T^T\'3!$":;;nL
%(__	'"%1 677.H#&x==	% !%!2!6!6u!=!='')))(#(>&59<2G+2UWc#d#dD  %,[,[,[ \ \D""KN:XZ??cjB6F6F`aaD!2r   c                    t          |t                    rk|                    t                    rQt	          j        t          |t                    dz   |z             }|
J d            |                                }||fS dS )NrB   z+'Error: W&B dataset artifact doesn't exist'r@   )r0   r2   r3   r!   r4   use_artifactr   r7   )rh   pathaliasdataset_artifactdatadirs        r   r   z%WandbLogger.download_dataset_artifact   s    dC   	-T__5J%K%K 	-$1-F[2\2\_b2bej2jkk#//1_///&//11G,,,zr   c                 x   |j                             t                    rt          j        t          |j         t                    dz             }|
J d            |                                }|j                            d          }|j                            d          }||k     sJ d|z              ||fS dS )Nr,   z'Error: W&B model artifact doesn't existepochs_trainedtotal_epochsz5training to %g epochs is finished, nothing to resume.r@   )	r1   r3   r!   r4   r   r   r7   metadatar   )rh   r9   model_artifactr;   r   r   s         r   r}   z#WandbLogger.download_model_artifact   s    :  !677 	,"/cjJ_0`0`cl0lmmN!--/Y---%..00H+4889IJJN)266~FFL!L0002i3000^++zr   Fc                    t          j        dt           j        j        z   dz   dt	          |          |dz   |j        |j        |j        |d          }|                    t	          |dz            d           t          j	        |d	d
t	          | j
                  z   |rdndg           t          d|dz              d S )Nr   r    modelr   )original_urlr   zsave periodr&   r   fitness_score)typer   r-   r_   latestepoch best aliaseszSaving model artifact on epoch )r4   r   ra   r[   r2   r~   r&   r   add_filelog_artifactrz   rg   )rh   r   r9   ru   r   
best_modelr   s          r   	log_modelzWandbLogger.log_model   s    (=(HwII#ai?{J*b
 b
    	D9$4 5 5IFFF>$,hT=O9P9P.P\fRnRXRXln#o	q 	q 	q 	q/;;;;;r   c                    t          |          5 }t          j        |t          j                  }d d d            n# 1 swxY w Y   |rddgfnt	          |d                   |d         f\  }}d t          |          D             }|                    d          r+|                     t          |d                   |d          nd | _	        |                    d	          r+|                     t          |d	                   |d	          nd | _
        |                    d          r*t          t          t          |          dz            z   |d<   |                    d	          r*t          t          t          |          d	z            z   |d	<   |r|n(d
                    |                    dd                    }	|                    dd            t          |	d          5 }t          j        ||           d d d            n# 1 swxY w Y   | j        dk    r| j                            | j
                   | j                            | j	                   | j
                                         | j
                            d	          | _        |                                  n>| j                            | j	                   | j                            | j
                   |	S )Nr>   r   itemncnamesc                     i | ]\  }}||	S  r   ).0kvs      r   
<dictcomp>z4WandbLogger.log_dataset_artifact.<locals>.<dictcomp>   s    333$!QA333r   rA   r   rD   r   r   r7   rE   rX   )rF   rH   rI   rJ   int	enumerater   create_dataset_tabler   rQ   rS   r!   r2   r   r   r   poprL   r`   rb   r   waitr   r   r   )
rh   	data_filerm   r&   overwrite_configrM   rG   r   r   r   s
             r   rl   z WandbLogger.log_dataset_artifact   s<   )__ 	89Qt777D	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8%/UQMMc$t*ootG}5U	E33)E"2"233348HHW4E4EPd778KM9 9! 8 1 1 1KO 	 15JD556IK7 7e 6 - - -EI 	88G 	Q1CW8O4P4PPDM88E?? 	M/#d7mme6K2L2LLDK,Zyy)..AQAQRUWXAYAY2Z2ZT"""$__ 	IdA	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 =J&&N''(9:::N''(;<<<""$$$!.22599DN##%%%%N''(;<<<N''(9:::s!   !=AA'H		HHc                     i | _         t          d           t          t          | j        j                            D ]\  }}|d         | j         |d         <   d S )NzMapping datasetr      )val_table_maprg   r   r   r   rG   )rh   irG   s      r   r   zWandbLogger.map_val_table_path   sc        dn&9!:!:;; 	2 	2GAt*.q'DtAw''	2 	2r   datasetc           
         t          j        |d          }t          |j        t                    r;t          |j                                                  rt          |j        g          nd }|st          |j                  n|}|D ]}t          |                                          r]|	                    |d           d
                    |j                            dd                    }|	                    |d           |                    |d	t          |          j        z              t          t          |g          d
                   }|                                r,|                    t	          |          d|j        z             nd  t          j        g d          }	t          j        d |                                D                       }
t'          t          |                    D ]E\  }\  }}}}|d
         \  }}t)          |d d dd f                             dd                    t-          j        ||||g          z  |d d dd f<   g i }}|d d dd f                                         D ]a^}}t3          |          }|                    |d
         |d         |d         |d         d|d||         z  ddidd           ||         ||<   bd||di}|	                    |t          j        ||
|          t;          j        |          t          |          j                   G|                    |	|           |S )Nr   )r_   r   zdata/imagesr   labelsimagesr   zdata/labelsrC   r   zdata/labels/)r[   train_imageClassesr_   )columnsc                     g | ]
\  }}||d S )r[   r_   r   r   r[   r_   s      r   
<listcomp>z4WandbLogger.create_dataset_table.<locals>.<listcomp>   s$    "`"`"`D"d#;#;"`"`"`r      r*      r   minXminYmaxXmaxYz%saccpixelpositionclass_idbox_captionscoresdomainground_truthbox_dataclass_labels)classesboxes) r4   r   r0   r   r2   r   is_dirr   	img_filesadd_dirr   r   r   r_   r   existsr   r   itemsr   r   viewtorchTensortolistr   appendadd_dataImagejsondumpsadd)rh   r   class_to_idr_   r6   r   img_filelabels_path
label_filetable	class_setsiimgr   pathsshapesheightwidthr   img_classesclsxyxyr   s                          r   r   z WandbLogger.create_dataset_table   s   >t)<<<,6w|S,I,IsdSZS_N`N`NgNgNiNisD',(((os	3<KD*+++)	! 		j 		jHH~~$$&& j   >>>&mmGL,?,?!,L,LMM  = AAAA!!($x..BU1U!VVV!/8*"="=a"@AA
LVL]L]L_L_j!!#j//'5
'G " I I Iei$L$L$LMMMM"`"`KL]L]L_L_"`"`"`aa	09$w--0H0H 	- 	-,B,feV"1IMFE&vaaae}'9'9"a'@'@AAU\SXZ`bgioRpEqEqqF111abb5M$&kH$QQQUm2244 4 4
d#hhd1gtAwX\]^X_imnoip-q-q-004C8H0I,11:+2	!4 !4 5 5 5
 $/s#3C  #(K%X%XYENN2u{5)5QQQSWS]^iSjSj;;+- - - -UD!!!r   c                    | j         rG| j        rAt          j        d |                                D                       }g }d}|                                D ]c^ }}}	|dk    rW|                    |d         |d         |d         |d         dt          |	          d||	         |fz  d	|id
d           ||z   }dd||di}
| j        t          |          j
                 }| j                            | j        |t          j        | j         j        |         d         |
|          |t          dt!          |                    z             d S d S d S )Nc                     g | ]
\  }}||d S r   r   r   s      r   r   z5WandbLogger.log_training_progress.<locals>.<listcomp>	  s$    &^&^&^HBb$'?'?&^&^&^r   r   g      ?r   r   r   r   z%s %.3fclass_scorer   r   predictionsr   )r   r   )r   r   r4   r   r   r   r   r   r   r   r_   r   rz   r   rG   maxr   )rh   prednr   r   r   r   
total_confr   confr   r   r[   s               r   log_training_progressz!WandbLogger.log_training_progress  s   > 	)d/ 	)&^&^PUP[P[P]P]&^&^&^__IHJ$)LLNN 3 3 tS4<<OO.21gtAwPTUVPWaefgah%i%i%(XX(1U3Z4F(F$14#8#*	, ,- - - ",d!2J"5$Q$QRE#DJJO4B&&t'9')',{4>3Fr3J13MUZdm'n'n'n'1C3x==4I4I'I) ) ) ) )	) 	) 	) 	)r   c                 `    | j         r$|                                D ]\  }}|| j        |<   d S d S r   )rb   r   ry   )rh   ry   keyvalues       r   logzWandbLogger.log  sL    > 	+&nn.. + +
U%*c""	+ 	++ +r   c                    | j         rt          j        | j                   i | _        | j        rt          j        | j        | j        d          }| j                            |d           t          j	        | j        ddt          | j                  z   |rdndg           t          j        g d          | _        t          j        d	t          j        j        z   d
z   d          | _        d S d S d S )Nr[   resultr   r   r   r   r   rt   r   rr   rs   )rb   r4   r	  ry   r   JoinedTabler   r   r   r   r2   rz   r   r   ra   r[   )rh   best_resulttrain_resultss      r   	end_epochzWandbLogger.end_epoch"  s   > 		iIdm$$$DM# i % 1$.$BSUY Z Z$((AAA"4#7(HWZ[_[mWnWnLnMXC`66^`Bc d d d d$)K0_0_0_$`$`!',~fuy|6Kk6Y[g'h'h$$$		i 		ii ir   c                     | j         r@| j        rt          j        | j                   t          j                                         d S d S r   )rb   ry   r4   r	  ra   r   )rh   s    r   
finish_runzWandbLogger.finish_run.  sL    > 	} )	$-(((I	 	r   N)rX   )F)r   )__name__
__module____qualname__rj   rd   rf   r   r}   r   rl   r   r   r  r	  r  r  r   r   r   rW   rW   P   s         p  p  p  pD	 	 	  B  
 
 
< < < <   :2 2 2! ! ! !F) ) ),+ + +

i 
i 
i 
i    r   rW   )r   syspathlibr   r   rH   r   r   r   r2   __file__r#   utils.datasetsr   r   utils.generalr   r   r	   r4   r
   r   ImportErrorr!   r   r   r(   r<   r/   rW   r   r   r   <module>r     s    



               DDNN)0788 9 9 9 . . . . . . * * * * * * < < < < < < < < < <LLL"""""""""   EEE ,  '< % % % %  0 0 0  ! ! !0b b b b b b b b b bs   /A< <BB