
    "f@                     `   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                  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 dZefd	Zd
 Zd Zd Zd Z G d d      Zy# e$ r dZY 'w xY w)    N)Path)tqdm)LoadImagesAndLabels)img2label_paths)colorstr	xywh2xyxycheck_dataset)initfinishzwandb-artifact://c                     | t        |      d  S N)len)from_stringprefixs     CC:\work2\python\work_new2\yolov7\utils\wandb_logging\wandb_utils.pyremove_prefixr      s    s6{|$$    c                 ~    dj                  | j                  dd            }t        |      j                         r|S | S )N_wandb..   )joinrsplitr   is_file)data_config_filewandb_configs     r   check_wandb_config_filer      s;    >>"2"9"9#q"A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(   "   sI    M(,ABCH]]Foo""G 6/H47///r   c                    | j                   dvrt        |       nd  t        | j                  t              r| j                  j                  t              r| j                   dvrst        | j                        \  }}}t        j                         }|j                  |dz   |z   dz         }|j                         }t	        t        |      dz        | _        yy )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!#&d#**c"::  !67g-7CCJJ7O4!4iik<<#8K(Ki(WX#,,.!$x.9"<=r   c                    t        | j                        5 }t        j                  |t        j                        }d d d        d\  }}t        d   t              r|d   j                  t              rmt        j                         }|j                  t        |d         dz   | j                  z         }|j                         }t        |      dz  }t        |      |d<   t        |d   t              r|d   j                  t              rmt        j                         }|j                  t        |d         dz   | j                  z         }|j                         }t        |      dz  }	t        |	      |d<   |s|rJt        t        |      dz        }
t        |
d      5 }t        j                   ||       d d d        |
| _        y y # 1 sw Y   xY w# 1 sw Y   xY w)	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   s   	chh1IIa8	 
#Iw)G$c*y/A/L/LMb/ciikmIg4F&G#&MPSPbPb&bc"++-	)_~5
 _	')E"C(Yu-=-H-HI^-_iik||M)E2B$Cc$ICL^L^$^_'')=>1x=	%GDM,CCD-%IIi# & 	 ! 
$ &%s   &G GGGc                   d    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y)WandbLoggerc                 8   || _         t        t        sd nt        j                  |c| _        | _        | _        t        |j                  t              rs|j                  j                  t              rt        |j                        \  }}}t        |z   }t        sJ d       t        j                  ||d      | _        ||_        nz| j                  rnt        j                  sIt        j                  |d|j                  dk(  rdnt        |j                        j                  |||      nt        j                  | _        | j                  r| j                   dk(  r|j                  s^|j                  r| j!                  |      n|}t#        |      | j                  j$                  _        || j                  j$                  _        | j)                  ||      | _        | j                   dk(  r| j!                  |      | _        y y t+        d	      }	t-        |	 d
       y )Nz"install wandb to resume wandb runsallow)idr&   r1   
runs/trainYOLOR)configr1   r&   namejob_typerZ   Trainingz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:DSXS\S\^g2
DNDNcjj#&zz$$%:;7CCJJ7O4!4&;>Q&Q#BBBu!&vww!W0
ZZ ;@)) #ZZs/6;>;;,;V\`adalal\m\r\r-119+13
 JO N >>}}
*zzLOL^L^d&C&CC&HdmO04S	DNN))-6EDNN))3!%!4!4S)!D}} 22!%!>!>s!C 3 i(FVHmnor   c                    t         sJ d       t        | j                         | j                  |j                  |j
                  |j                  dk(  rdnt        |j                        j                        }t        d|       t        |      5 }t        j                  |t        j                        }d d d        |S # 1 sw Y   S xY w)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7udnn%//03;>;;,;V\`adalal\m\r\rt 	,k:+!"ii$//BO  s   &B??C	c                    i ddc| _         | _        | _        |j                  | _        t	        |j
                  t              r| j                  |      \  }}|rt        |      dz  | _	        | j                  j                  }t        | j                        |j                  |j                  |j                  |j                  |j                  d   f\  |_	        |_        |_        |_        |_        |_        t%        | j                  j                  j&                        }d| j(                  vr| j+                  |j-                  d      |j.                        \  | _        | _        | j+                  |j-                  d      |j.                        \  | _        | _        d\  | _        | _        | _        | _	        | j0                  &t        | j0                        d	z  }t        |      |d<   | j4                  Vt        | j4                        d	z  }t        |      |d<   | j6                  j-                  d      | _        | j?                          | j6                  UtA        jB                  d
t@        jD                  jF                  z   dz   d      | _        tA        jH                  g d      | _        |j                  dk(  r,|j                  dkD  r|j                  dz  ndx| _        |_        |S )Nr      r-   hyprS   rA   rD   )NNNNrC   r   	_progress
evaluationepochrZ   
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   rZ   Table)rh   r9   rN   r;   _r]   rR   rT   s           r   rf   zWandbLogger.setup_training~   s}   ;=q"8t)4= ..cjj#&66s;KHa#H~	9..gjLLh"#)#5#5v7N7NPVPdPdflfsfsgmgqgqrwgxhydS_cnc>OQTQ[]`]d T^^22<<=I.<@<Z<Z[d[h[hip[q[^[m[m=o9D$d&98<8V8VW`WdWdejWkWZWiWi9k5D"D$5TjQD $"3T^T\''3!$":":;nL
%(_	'"%%1 6 67.H#&x=	% !%!2!2!6!6u!='')(#(>>&599<<2G+2UWc#dD  %,[ \D"KN::XZ?cjjB6F`aaD!2r   c                     t        |t              r[|j                  t              rFt	        j
                  t        |t              dz   |z         }|J d       |j                         }||fS y)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   sl    dC T__5J%K$11-F[2\_b2bej2jk#/_1__/&//1G,,,r   c                 f   |j                   j                  t              rt        j                  t        |j                   t              dz         }|J d       |j                         }|j                  j                  d      }|j                  j                  d      }||k  s
J d|z         ||fS y)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"//cjjJ_0`cl0lmN!-Y/YY-%..0H+44889IJN)2266~FL!L0 2i3 0^++r   c                    t        j                  dt         j                  j                  z   dz   dt	        |      |dz   |j
                  |j                  |j                  |d      }|j                  t	        |dz        d       t        j                  |d	d
t	        | j                        z   |rdndg       t        d|dz          y )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   rZ   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I#ai??{{JJ*b
  	D9$4 5IF>$,hT=O=O9P.P\fRXln#o	q/;r   c                 x   t        |      5 }t        j                  |t        j                        }d d d        |rddgfnt	        d         |d   f\  }}t        |      D 	
ci c]  \  }	}
|	|

 }}	}
j                  d      r | j                  t        |d         |d      nd | _	        |j                  d      r | j                  t        |d         |d      nd | _
        |j                  d      r!t        t        t        |      dz        z   |d<   |j                  d      r!t        t        t        |      dz        z   |d<   |r|n d	j                  |j                  d
d            }|j!                  dd        t        |d      5 }t        j"                  ||       d d d        | j$                  dk(  r| j&                  j)                  | j                         | j&                  j)                  | j                         | j                  j+                          | j                  j                  d      | _        | j/                          |S | j&                  j1                  | j                         | j&                  j1                  | j                         |S # 1 sw Y   lxY wc c}
}	w # 1 sw Y   xY w)Nr>   r   itemncnamesrA   r   rD   r   r   r7   rE   r`   )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   kvr   s               r   rl   z WandbLogger.log_dataset_artifact   sN   )_99Qt7D %/QMc$t*otG}5U	E"+E"23"2$!QA"2348HHW4E #778KM9! 8 1KO 	 15 !556IK7e 6 -EI 	88G1CW8O4PPDM88E?/#d7me6K2LLDK,y)..AQAQRUWXAY2ZT"$_IIdA  ==J&NN''(9(9:NN''(;(;<""$!..2259DN##%  NN''(;(;<NN''(9(9:5 _ 4 _s   &J%J)J/J&/J9c                     i | _         t        d       t        t        | j                  j
                              D ]  \  }}|d   | j                   |d   <    y )NzMapping datasetr      )val_table_maprg   r   r   r   rG   )rh   irG   s      r   r   zWandbLogger.map_val_table_path   sM      dnn&9&9!:;GAt*.q'DtAw' <r   c           
         t        j                  |d      }t        |j                  t              r9t        |j                        j                         rt        |j                  g      nd }|st        |j                        n|}|D ]  }t        |      j                         rR|j                  |d       dj                  |j                  j                  dd            }|j                  |d       n|j                  |d	t        |      j                  z          t        t        |g      d
         }|j                         r)|j                  t	        |      d|j                  z         nd   t        j                   g d      }	t        j"                  |j%                         D 
cg c]
  \  }
}|
|d c}}
      }t'        t        |            D ]  \  }\  }}}}|d
   \  }}t)        |d d dd f   j+                  dd            t-        j.                  ||||g      z  |d d dd f<   g i }}|d d dd f   j1                         D ]G  ^}}t3        |      }|j5                  |d
   |d   |d   |d   d|d||   z  ddidd       ||   ||<   I d||di}|	j7                  |t        j8                  |||      t;        j<                  |      t        |      j                          |j?                  |	       |S c c}}
w )Ndataset)r^   r   zdata/imagesr   labelsimagesr   zdata/labelsrC   r   zdata/labels/)rZ   train_imageClassesr^   )columnsrZ   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tablerZ   	class_setsiimgr   pathsshapesheightwidthr   img_classesclsxyxyr   s                           r   r   z WandbLogger.create_dataset_table   s   >>t)<,6w||S,IdSZS_S_N`NgNgNiD',,(os	3<D**+)	!HH~$$&   >&mmGLL,?,?!,LM  = A!!($x.BUBU1U!V!/8*"=a"@A
LVL]L]L_ !!#j/'5
'G " Iei " $LMMMKL]L]L_"`L_D"d#;L_"`a	09$w-0H,B,feV"1IMFE&vae}'9'9"a'@AU\\SXZ`bgioRpEqqF1ab5M$&kH$QUm224
d#hd1gtAwX\]^X_imnoip-q-004C8H0I,11:+2	!4 5
 $/s#3C  5 $(K%XYENN2u{{5)5QSWS]S]^iSj;++- 1I 	UD!# #as   .L	
c                    | j                   rB| j                  r4t        j                  |j	                         D cg c]
  \  }}||d c}}      }g }d}|j                         D ]L  ^ }	}
}|
dk\  s|j                  |	d   |	d   |	d   |	d   dt        |      d||   |
fz  d	|
id
d       ||
z   }N d||di}| j                  t        |      j                     }| j                  j                  | j                  |t        j                  | j                   j                  |   d   ||      |t        dt!        |            z         y y y c c}}w )Nr   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   rZ   r^   r   r   
total_confr   confr   r   s                r   log_training_progressz!WandbLogger.log_training_progress  sX   >>d//PUP[P[P]&^P]HBb$'?P]&^_IHJ$)LLN tS4<OO.21gtAwPTUVPWaefgah%i%(X(1U3Z4F(F$14#8#*	,- ",d!2J %3 #5$QRE##DJOO4B&&t'9'9')',{{4>>3F3Fr3J13MUZdm'n'1C3x=4I'I) 0>&^s   E
c                 l    | j                   r(|j                         D ]  \  }}|| j                  |<    y y r   )rb   r   ry   )rh   ry   keyvalues       r   logzWandbLogger.log  s1    >>&nn.
U%*c" / r   c                 :   | j                   rt        j                  | j                         i | _        | j                  rt        j
                  | j                  | j                  d      }| j                  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      | _        y y y )NrZ   resultr   r   r   r   r   rt   r   rr   rs   )rb   r4   r  ry   r   JoinedTabler   r   r   r   r2   rz   r   r   ra   rZ   )rh   best_resulttrain_resultss      r   	end_epochzWandbLogger.end_epoch"  s    >>IIdmm$DM## % 1 1$..$BSBSUY Z$$((A""4#7#7(HWZ[_[m[mWnLnMX6^`Bc d$)KK0_$`!',~~fuyy||6Kk6Y[g'h$ $ r   c                     | j                   rJ| j                  rt        j                  | j                         t        j                  j                          y y r   )rb   ry   r4   r  ra   r   )rh   s    r   
finish_runzWandbLogger.finish_run.  s5    >>}}		$--(II r   N)r`   )F)r   )__name__
__module____qualname__rj   rd   rf   r   r}   r   rl   r   r   r   r  r  r	   r   r   rW   rW   P   sH     pD	B
<:2!F),+

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     
     DN))00778 9 . * < <" ,  '< %0!0b b  Es   9B# #B-,B-