a
    Df+I                  	   @   s   d dl Z d dlZd dlZd dlZd dlZd dlmZ eeZ	ee
 Zejd Zeeejvrrejee z,d dlZej ZejeddddZW n eefy   dZdZY n0 d dlZd dlZd dlmZ d dlZd dl m!Z! d d	l"m#Z#m$Z$m%Z% d d
l&m'Z' dZ(eddZ)eddZ*edd+ dkZ,edd+ dkZ-edd+ dkZ.e/eddZ0e1eddZ2e1eddZ3edd+ dkZ4eddZ5eddZ6edd+ dkZ7e/edd Z8e9 Z:G d!d" d"Z;dS )#    N)Path   COMET_PROJECT_NAMEzcomet.project_nameyolov5)default)img2label_paths)check_datasetscale_boxes	xywh2xyxy)box_iouzcomet://
COMET_MODEonlineCOMET_MODEL_NAMECOMET_UPLOAD_DATASETfalsetrueCOMET_LOG_CONFUSION_MATRIXCOMET_LOG_PREDICTIONSCOMET_MAX_IMAGE_UPLOADSd   
CONF_THRESgMbP?	IOU_THRESg333333?COMET_LOG_BATCH_METRICSCOMET_BATCH_LOGGING_INTERVAL   !COMET_PREDICTION_LOGGING_INTERVALCOMET_LOG_PER_CLASS_METRICSRANKc                   @   s  e Zd ZdZdBddddZdCddZd	d
 Zdd Zdd Zdd Z	dd Z
dDddZdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zd:d; Zd<d= Zd>d? Z d@dA Z!dS )ECometLoggerzNLog metrics, parameters, source code, models and much more
    with Comet
    NTraining)returnc           	   	   K   s  || _ || _|| _t| _|jdk| _t| _t	| _
t| _| jjrF| jjnt| _| jj| _dddtd| _| j| | | j|| _| | jj| _| jd | _| jd | _d| _t| _|d u rh| jdd	 t| jtj s| jj!"d
dd  \}}}| jd| d
| d
|  | #t$| | #| jj | j%| jjdddid | j&| jj' dddid t(| _)t*| jdr| jj+| _+nt,| _+t*| jdr| jj-| _-nt.| _-| #| j-| j+d t/| _0| jj1dkr| jj2dk rdn
| jj2d | _3n
| jj1| _3| j0ri | _4g | _5t6| _7| j8ttt6t	t(td t*| jdr| jd| jj9 | jd| jj: | jd| jj; | jdt<=| j d S )Nr   FT)Zlog_codeZlog_env_gpuZlog_env_cpuproject_namenamesncr   zCreated fromYOLOv5/zRun Pathzhyperparameters.jsontypezhyp-config-file)namemetadataz	/opt.yamlzopt-config-filer*   
conf_thres	iou_thres)Zval_iou_thresholdZval_conf_threshold
   r   )
comet_modeZcomet_max_image_uploadscomet_log_per_class_metricsZcomet_log_batch_metricscomet_log_confusion_matrixZcomet_model_namecomet_optimizer_idZoptimizer_idZoptimizer_objectiveZoptimizer_metricZoptimizer_parameters)>job_typeopthypr   r/   save_period
save_modelr   
model_namer   log_batch_metricsr   comet_log_batch_intervalupload_datasetr   resumer   default_experiment_kwargsupdate_get_experiment
experimentr   data	data_dictclass_namesnum_classeslogged_images_countr   
max_images	log_other
isinstancecomet_mlOfflineExperimenturlsplitlog_parametersvarslog_asset_data	log_assetsave_dirr   r1   hasattrr,   r   r-   r   r   comet_log_predictionsbbox_intervalepochscomet_log_prediction_intervalmetadata_dictlogged_image_namesr   r0   Z
log_othersr2   Zcomet_optimizer_objectivecomet_optimizer_metricjsondumps)	selfr4   r5   run_idr3   Zexperiment_kwargs	workspacer"   experiment_id r`   R/data/NAS7/SABIOD/METHODE/ermites/yolo-dyni/yolov5/utils/loggers/comet/__init__.py__init__E   s    

"
	zCometLogger.__init__c                 C   s   |dkr8|d ur&t jf d|i| jS t jf i | jS z4|d urZt jf d|i| jW S t jf i | jW S  ty   td | 	d| Y S 0 d S )NZofflineZprevious_experimentzCOMET WARNING: Comet credentials have not been set. Comet will default to offline logging. Please set your credentials to enable online logging.)
rI   ZExistingOfflineExperimentr=   rJ   ZExistingExperiment
Experiment
ValueErrorloggerwarningr?   )r\   moder_   r`   r`   ra   r?      s(    
zCometLogger._get_experimentc                 K   s   | j j|fi | d S N)r@   log_metricsr\   log_dictkwargsr`   r`   ra   ri      s    zCometLogger.log_metricsc                 K   s   | j j|fi | d S rh   )r@   rM   rj   r`   r`   ra   rM      s    zCometLogger.log_parametersc                 K   s   | j j|fi | d S rh   )r@   rP   )r\   
asset_pathrl   r`   r`   ra   rP      s    zCometLogger.log_assetc                 K   s   | j j|fi | d S rh   )r@   rO   )r\   Zassetrl   r`   r`   ra   rO      s    zCometLogger.log_asset_datac                 K   s   | j j|fi | d S rh   )r@   	log_image)r\   imgrl   r`   r`   ra   rn      s    zCometLogger.log_imageFc           
      C   sd   | j s
d S |d |d |j|jd}t| d}|D ]&}t|j}	| jj| j||	|dd q8d S )Nr   r   )fitness_scoreepochs_trainedr6   total_epochsz/*.ptT)file_or_folder	file_namer*   	overwrite)	r7   r6   rU   globr   r)   r@   	log_modelr8   )
r\   pathr4   epochrp   
best_modelZmodel_metadataZmodel_files
model_pathr)   r`   r`   ra   rw      s"    
zCometLogger.log_modelc                 C   s|   t |}t|}W d    n1 s(0    Y  |d tr^|d td}| |}|S | j| jj	ddid t
|S )Nrx    r(   zdata-config-filer+   )openyaml	safe_load
startswithCOMET_PREFIXreplacedownload_dataset_artifactrP   r4   rA   r   )r\   	data_filefZdata_configrx   rB   r`   r`   ra   r      s    
(
zCometLogger.check_datasetc              
   C   s  | j | jkrd S ||d d df | jk }t|d d dd f |d d d df }t|| jk\}}	t|dkrxd S || }
|| }|dd dd }| d| j	j
 }|| jvrtj|}| j||d | j| g }| D ]D^}}|| jt|  d	d
|d |d |d |d dd q|
 D ]J^ }}}|| jt|  |d
 |d |d |d |d dd q<|| j|< |  j d7  _ d S )N   r   r   r&   r   .Z_curr_epoch_)r)   z-gtr      r   )xyx2y2)labelscorebox)rE   rF   r,   r   torchwherer-   lenrL   r@   
curr_epochrX   PILImager}   rn   appendtolistrC   intrW   )r\   imagelabelsnrx   shapepredn
detectionsioumask_Zfiltered_detectionsZfiltered_labelsimage_id
image_nameZnative_scale_imager*   clsxyxyconfr`   r`   ra   log_predictions   sN    *

	
zCometLogger.log_predictionsc           
      C   s   |j d |j d  }}| jjr.d|d d df< | }t|j dd  |d d d df |d |d  d }|rt|d d ddf }	t|j dd  |	|d |d  t|d d ddf |	fd}t|j dd  |d d d df |d |d  ||fS )Nr      r   r   )r   r4   
single_clscloner	   r
   r   cat)
r\   r   labelsr   prednlr   r   r   tboxr`   r`   ra   preprocess_prediction   s    0  0z!CometLogger.preprocess_predictionc                    s   t t| d}t|}t||D ]\}}t fdd||g\}	}
z,|j||	d|id |j||
d|id W q& ty } z2td td|  W Y d }~q&W Y d }~q&d }~0 0 q&|S )Nz/*c                    s   t j|  S rh   )osrx   relpath)r   rx   r`   ra   <lambda>8      z4CometLogger.add_assets_to_artifact.<locals>.<lambda>rL   )Zlogical_pathr*   z:COMET ERROR: Error adding file to Artifact. Skipping file.zCOMET ERROR: )	sortedrv   r   zipmapaddrd   re   error)r\   artifactrx   rm   rL   	img_pathsZlabel_paths
image_file
label_fileZimage_logical_pathZlabel_logical_pather`   r   ra   add_assets_to_artifact3  s    
$z"CometLogger.add_assets_to_artifactc                 C   s   | j dd}ttt| j d   }| j  }dD ]&}||}|d ur6||d||< q6tj	|d|d}|
 D ]H}|dv rvt| jtr|| jkrqv| j |}|d urv| ||||}qv| j| d S )Ndataset_namezyolov5-datasetrx   trainvaltestr|   dataset)r)   Zartifact_typer*   )rB   getstrROOTr   resolvecopyr   rI   ArtifactkeysrH   r;   r   r@   log_artifact)r\   r   rx   r*   key
split_pathr   rm   r`   r`   ra   upload_dataset_artifactD  s"    

z#CometLogger.upload_dataset_artifactc                 C   s   | j |}tt| jj|j }|| |j}|	 }||d< |
d}t|tkrvdd |
d D |d< n2t|tkrdd ttt||D |d< nd| |}|S )Nrx   r#   c                 S   s   i | ]\}}t ||qS r`   r   .0kvr`   r`   ra   
<dictcomp>g  r   z9CometLogger.download_dataset_artifact.<locals>.<dictcomp>c                 S   s   i | ]\}}t ||qS r`   r   r   r`   r`   ra   r   i  r   zKInvalid 'names' field in dataset yaml file. Please use a list or dictionary)r@   Zget_artifactr   r   r4   rQ   r)   downloadr*   r   r   r(   dictitemslistr   ranger   update_data_paths)r\   Zartifact_pathZlogged_artifactZartifact_save_dirr*   rB   Zmetadata_namesr`   r`   ra   r   \  s    

"
z%CometLogger.download_dataset_artifactc                    s\   | dd dD ]F}| |r| |}t|tr@  d| n fdd|D ||< q|S )Nrx   r|   r   r&   c                    s   g | ]}  d | qS )r&   r`   )r   r   r   r`   ra   
<listcomp>v  s   z1CometLogger.update_data_paths.<locals>.<listcomp>)r   rH   r   )r\   rB   rL   r   r`   r   ra   r   p  s    

"zCometLogger.update_data_pathsc                 C   s<   | j jrd S |D ]}| t| q| jr8| js8|   d S rh   )r4   r<   rP   r   r;   r   )r\   pathsrx   r`   r`   ra   on_pretrain_routine_end{  s    z#CometLogger.on_pretrain_routine_endc                 C   s   |  | j d S rh   )rM   r5   r\   r`   r`   ra   on_train_start  s    zCometLogger.on_train_startc                 C   s   d S rh   r`   r   r`   r`   ra   on_train_epoch_start  s    z CometLogger.on_train_epoch_startc                 C   s   || j _d S rh   )r@   r   )r\   ry   r`   r`   ra   on_train_epoch_end  s    zCometLogger.on_train_epoch_endc                 C   s   d S rh   r`   r   r`   r`   ra   on_train_batch_start  s    z CometLogger.on_train_batch_startc                 C   s.   || j _| jr*|| j dkr*| j||d d S )Nr   )step)r@   Z	curr_stepr9   r:   ri   )r\   rk   r   r`   r`   ra   on_train_batch_end  s    zCometLogger.on_train_batch_endc                 C   s   | j r"| jj}| jj| jd|d |D ]}| j|d|id q&| j| dd|id | jjst|	 rl|n|}	t
|	j}
| jr| jj| j|	|
dd t| jdr|| jj}| jd	| |   d S )
Nzimage-metadata.jsonry   ry   r+   z/results.csvT)rs   rt   ru   r2   Zoptimizer_metric_value)rS   r@   r   rO   rW   rP   r4   evolver   existsr   r)   r7   rw   r8   rR   r   rY   rG   
finish_run)r\   filesrQ   lastbestry   resultsr   r   r{   r)   metricr`   r`   ra   on_train_end  s(    
zCometLogger.on_train_endc                 C   s   d S rh   r`   r   r`   r`   ra   on_val_start  s    zCometLogger.on_val_startc                 C   s   d S rh   r`   r   r`   r`   ra   on_val_batch_start  s    zCometLogger.on_val_batch_startc                 C   s   | j r|d | j dksd S t|D ]|\}}t|dkr:q$|| }	||d d df |kdd f }
|| }|| }| |	|
||\}}|d ur$| |	|||| q$d S )Nr   r   )rS   rV   	enumerater   r   r   )r\   batch_iimagestargetsr   shapesoutputssir   r   r   r   rx   r   r   r`   r`   ra   on_val_batch_end  s     zCometLogger.on_val_batch_endc                 C   s   | j rn| jdkrnt|	D ]T\}}| j| }| jj|| || || || || || || || d|d q| jr| jj}t| j	 }|
d t|}| jj|
j|||ddd| dd	 d S )
Nr   )zmAP@.5z
mAP@.5:.95	precisionrecallf1Ztrue_positivesZfalse_positivessupport)prefix
backgroundzActual CategoryzPredicted Categoryzconfusion-matrix-epoch-z.json)matrixmax_categoriesr   ry   Zcolumn_labelZ	row_labelrt   )r0   rD   r   rC   r@   ri   r1   r   r   valuesr   r   Zlog_confusion_matrixr  )r\   nttpfpprr   apap50ap_classconfusion_matrixic
class_namery   rC   rD   r`   r`   ra   
on_val_end  s<    

	

zCometLogger.on_val_endc                 C   s   | j ||d d S )Nr   )ri   )r\   resultry   r`   r`   ra   on_fit_epoch_end  s    zCometLogger.on_fit_epoch_endc                 C   sD   |d | j j dkr@|s@| j jdkr@| j|j| j ||||kd d S )Nr   r   r   )rz   )r4   r6   rw   parent)r\   r   ry   final_epochbest_fitnessfir`   r`   ra   on_model_save  s    $zCometLogger.on_model_savec                 C   s   |  | d S rh   )rM   )r\   paramsr`   r`   ra   on_params_update  s    zCometLogger.on_params_updatec                 C   s   | j   d S rh   )r@   endr   r`   r`   ra   r     s    zCometLogger.finish_run)Nr    )N)F)"__name__
__module____qualname____doc__rb   r?   ri   rM   rP   rO   rn   rw   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r   r`   r`   r`   ra   r   @   s>   _

,!r   )<rv   rZ   loggingr   syspathlibr   	getLoggerr  re   __file__r   FILEparentsr   r   rx   r   rI   configZ
get_configZ
get_stringgetenvr   ModuleNotFoundErrorImportErrorr   r   Ztorchvision.transforms
transformsTr~   utils.dataloadersr   utils.generalr   r	   r
   utils.metricsr   r   r   r   lowerr   r   r   r   r   floatr   r   r   r   r   r   r   
ToPILImageZto_pilr   r`   r`   r`   ra   <module>   sP   



