a
    Df                     @   s  d Z ddlZddlZddlZddlZ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 ddlmZmZ ddlmZ ddlmZ ddlZddlmZ ddlmZ ddlmZ ddlZddlZddlZddl m!  m"Z# ddl$Z$ddl%Z%dd	l&m'Z'm(Z(m)Z) dd
l*m+Z+m,Z,m-Z-m.Z. ddl/m/Z/ ddl0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8 ddl9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJ ddlKmLZL dZMdZNdZOePeQddZRePeQddZSeTeQddU dkZVe'jWX D ]ZYe'jWeY dkr q
qdd ZZdd Z[dd Z\dd  Z]dJd%d&Z^G d'd( d(e-j+Z_G d)d* d*Z`G d+d, d,ZaG d-d. d.ZbG d/d0 d0ZcG d1d2 d2Zdd3d4 ZeG d5d6 d6e,Zfe:d7 fd8d9Zge:d7 fd:d;Zhe:d< d=d!fd>d?Zid@dA ZjG dBdC dCZkG dDdE dEe$jljmZndKdHdIZodS )Lz
Dataloaders and dataset utils
    N)repeat)Pool
ThreadPool)Path)Thread)urlparse)signal)ExifTagsImageImageOps)
DataLoaderDataset
dataloaderdistributed)tqdm)Albumentationsaugment_hsvclassify_albumentationsclassify_transforms
copy_paste	letterboxmixuprandom_perspective)DATASETS_DIRLOGGERNUM_THREADSTQDM_BAR_FORMATcheck_datasetcheck_requirements
check_yaml	clean_strcv2is_colab	is_kagglesegments2boxes
unzip_filexyn2xy	xywh2xyxy
xywhn2xyxy
xyxy2xywhn)torch_distributed_zero_firstz@See https://github.com/ultralytics/yolov5/wiki/Train-Custom-Data)
ZbmpZdngjpegjpgZmpopngZtifZtiffZwebpZpfm)ZasfZaviZgifZm4vZmkvZmovmp4ZmpegZmpgtsZwmv
LOCAL_RANKRANK
PIN_MEMORYTtrueOrientationc                 C   s@   t dd | D }tt| }|d|   | S )Nc                 s   s&   | ]}t j|rt j|V  qd S N)ospathexistsgetsize).0p r=   G/data/NAS7/SABIOD/METHODE/ermites/yolo-dyni/yolov5/utils/dataloaders.py	<genexpr>8       zget_hash.<locals>.<genexpr> )sumhashlibsha256strencodeupdatejoin	hexdigest)pathssizehr=   r=   r>   get_hash6   s    rM   c                 C   s`   | j }tt< t|   t }|dv r>|d |d f}W d    n1 sR0    Y  |S )N)         r   )rK   
contextlibsuppress	ExceptiondictZ_getexifitemsorientation)imgsrotationr=   r=   r>   	exif_size>   s    .rZ   c                 C   sn   |   }|dd}|dkrjtjtjtjtjtjtjtj	d|}|durj| 
|} |d= | | jd< | S )a   
    Transpose a PIL image accordingly if it has an EXIF Orientation tag.
    Inplace version of https://github.com/python-pillow/Pillow/blob/master/src/PIL/ImageOps.py exif_transpose()

    :param image: The image to transpose.
    :return: An image.
    i  rP   )            rN      rO   Nexif)getexifgetr
   FLIP_LEFT_RIGHT
ROTATE_180FLIP_TOP_BOTTOM	TRANSPOSE
ROTATE_270
TRANSVERSE	ROTATE_90	transposetobytesinfo)imager`   rV   methodr=   r=   r>   exif_transposeH   s$    
ro   c                 C   s&   t  d }tj| t| d S )Nl        )torchinitial_seednprandomseed)	worker_idZworker_seedr=   r=   r>   seed_workerb   s    rv   F        rO   rA   c                 C   s  |	r|rt d d}t|
4 t| |||||	||t||||d}W d    n1 sX0    Y  t|t|}tj	 }tt
 t|d |dkr|nd|g}|
dkrd ntj||d}|rtnt}t }|d| t  ||||o|d u ||t|rtjntjt|d		|fS )
NuT   WARNING ⚠️ --rect is incompatible with DataLoader shuffle, setting shuffle=FalseF)	augmenthyprectcache_images
single_clsstridepadimage_weightsprefixrP   r   r1   shuffle   UU*UU* )
batch_sizer   num_workerssampler
pin_memory
collate_fnworker_init_fn	generator)r   warningr*   LoadImagesAndLabelsintminlenrp   cudadevice_countr7   	cpu_countmaxr   DistributedSamplerr   InfiniteDataLoader	Generatormanual_seedr2   r3   collate_fn4r   rv   )r8   imgszr   r}   r|   ry   rx   cacher~   rz   rankworkersr   quadr   r   rt   datasetndnwr   loaderr   r=   r=   r>   create_dataloaderi   sJ    

$
(
r   c                       s0   e Zd ZdZ fddZdd Zdd Z  ZS )r   zP Dataloader that reuses workers

    Uses same syntax as vanilla DataLoader
    c                    s6   t  j|i | t| dt| j t   | _d S )Nbatch_sampler)super__init__object__setattr___RepeatSamplerr   __iter__iterator)selfargskwargs	__class__r=   r>   r      s    zInfiniteDataLoader.__init__c                 C   s   t | jjS r6   )r   r   r   r   r=   r=   r>   __len__   s    zInfiniteDataLoader.__len__c                 c   s"   t t| D ]}t| jV  qd S r6   )ranger   nextr   )r   _r=   r=   r>   r      s    zInfiniteDataLoader.__iter__)__name__
__module____qualname____doc__r   r   r   __classcell__r=   r=   r   r>   r      s   r   c                   @   s    e Zd ZdZdd Zdd ZdS )r   zG Sampler that repeats forever

    Args:
        sampler (Sampler)
    c                 C   s
   || _ d S r6   )r   )r   r   r=   r=   r>   r      s    z_RepeatSampler.__init__c                 c   s   t | jE d H  q d S r6   )iterr   r   r=   r=   r>   r      s    z_RepeatSampler.__iter__N)r   r   r   r   r   r   r=   r=   r=   r>   r      s   r   c                   @   s&   e Zd ZdddZdd Zd	d
 ZdS )LoadScreenshots      TNc                 C   sF  t d dd l}| ^}}d\| _}}	}
}t|dkrHt|d | _nJt|dkrldd |D \}}	}
}n&t|dkrd	d |D \| _}}	}
}|| _|| _|| _|| _	d
| _
d| _| | _| jj| j }|	d u r|d n
|d |	 | _|d u r|d n
|d | | _|
p|d | _|p&|d | _| j| j| j| jd| _d S )Nmssr   )r   NNNNrP   r]   c                 s   s   | ]}t |V  qd S r6   r   r;   xr=   r=   r>   r?      r@   z+LoadScreenshots.__init__.<locals>.<genexpr>r^   c                 s   s   | ]}t |V  qd S r6   r   r   r=   r=   r>   r?      r@   streamtopleftwidthheight)r   r   r   r   )r   r   splitscreenr   r   img_sizer}   
transformsautomodeframesctZmonitorsr   r   r   r   monitor)r   sourcer   r}   r   r   r   paramsr   r   r   r   r   r=   r=   r>   r      s.    
zLoadScreenshots.__init__c                 C   s   | S r6   r=   r   r=   r=   r>   r      s    zLoadScreenshots.__iter__c                 C   s   t | j| jd d d d d df }d| j d| j d| j d| j d| j	 d}| j
rj| 
|}n8t|| j| j| jdd }|dd d d	 }t |}|  jd
7  _t| j||d |fS )Nr\   zscreen z	 (LTWH): ,: r}   r   r   r[   r   rP   r1   rP   )rr   arrayr   grabr   r   r   r   r   r   r   r   r   r}   r   rj   ascontiguousarrayr   rE   )r   im0rX   imr=   r=   r>   __next__   s    *.
zLoadScreenshots.__next__)r   r   TN)r   r   r   r   r   r   r=   r=   r=   r>   r      s   
r   c                   @   s.   e Zd ZdddZdd Zdd Zd	d
 ZdS )LoadSpectrosr   Tc	              	      s   ||||||||f\| _ | _| _| _| _| _| _| _t	|| _
d| _g | _tt	|dddD ]v zTttj| }	|	j|	j }
| j fddtd|
d | |D  W q`   td	   Y q`Y q`0 q`t| j| _d S )
Nrm   zDataset initializationF)descleavec                    s   g | ]} |d qS ))fnoffsetfsr=   )r;   r   r   r   r=   r>   
<listcomp>   r@   z)LoadSpectros.__init__.<locals>.<listcomp>r   g{Gz?zfailed with )folder	sampleDursrwindowhopr   r}   r   r7   listdirfilesr   samplesr   sfrl   r8   rH   durationZ
samplerateextendrr   arangeprintr   nf)r   r   r   r   r   r   r   r}   r   rl   r   r=   r   r>   r      s    42zLoadSpectros.__init__c                 C   s
   t | jS r6   )r   r   r   r=   r=   r>   r      s    zLoadSpectros.__len__c                 C   s
   d| _ | S Nr   countr   r=   r=   r>   r     s    zLoadSpectros.__iter__c                 C   s  | j t| krt| j| j  }|d  d|d  d}|  j d7  _ tjtj| j	|d t
|d |d  t
|d | j |d  dd\}}|d d d	f }|| jkrt|t
t|| j | }t }tj|| j| jd
\}}}tt|}tj|dd dt|d}	tjdd	d	dd |	|jd	 d d d d d df d d d d d d df }
t||
 t|}
td|  t   t!|
| j"| j#| j$dd	 }|%dd d d }t&|}d| j  d| j' d| d}|||
d |fS )Nr   r   r   .jpgrP   r   T)startstopZ	always_2dr   )ZnpersegZnoverlapr   Zjet)aspectinterpolationZcmapZvmin)r   bottomr   rightr1   zrm r   r   image / r   )(r   r   StopIterationr   r   readr7   r8   rH   r   r   r   r   r   resamplepltfigureZspectrogramr   r   rr   log10absimshowmeanZsubplots_adjustZ
make_imagecanvasr!   imwriteimreadsystemcloser   r   r}   r   rj   r   r   )r   rowr8   sigr   figftstftZaximr   r   rX   r=   r=   r>   r     s0    L
>

zLoadSpectros.__next__N)r   T)r   r   r   r   r   r   r   r=   r=   r=   r>   r      s   
r   c                   @   s>   e Zd ZdddZdd	 Zd
d Zdd Zdd Zdd ZdS )
LoadImagesr   r   TNrP   c              
   C   s  t |tr(t|jdkr(t|  }g }t |ttfrBt|n|gD ]}tt|	 }d|v r~|
ttj|dd qHtj|r|
tttj|d qHtj|r|| qHt| dqHdd |D }	d	d |D }
t|	t|
 }}|| _|| _|	|
 | _|| | _d
g| dg|  | _d| _|| _|| _|| _t|
rh| |
d  nd | _| jdksJ d| dt  dt! d S )N.txt*T	recursive*.* does not existc                 S   s&   g | ]}| d d  tv r|qS .r1   )r   lowerIMG_FORMATSr   r=   r=   r>   r   2  r@   z'LoadImages.__init__.<locals>.<listcomp>c                 S   s&   g | ]}| d d  tv r|qS r  )r   r  VID_FORMATSr   r=   r=   r>   r   3  r@   Frm   r   zNo images or videos found in z!. Supported formats are:
images: z	
videos: )"
isinstancerE   r   suffix	read_textrsplitlisttuplesortedresolver   globr7   r8   isdirrH   isfileappendFileNotFoundErrorr   r   r}   r   r   
video_flagr   r   r   
vid_strideany
_new_videocapr  r  )r   r8   r   r}   r   r   r-  r   r<   imagesZvideosninvr=   r=   r>   r   #  s@      


zLoadImages.__init__c                 C   s
   d| _ | S r   r   r   r=   r=   r>   r   F  s    zLoadImages.__iter__c                 C   s  | j | jkrt| j| j  }| j| j  rd| _t| jD ]}| j	  q8| j
 \}}|s|  j d7  _ | j  | j | jkrt| j| j  }| | | j \}}qV|  jd7  _d| j d  d| j d| j d| j d| d}nL|  j d7  _ t|}|d usJ d| d	| j  d| j d
| d}| jrH| |}n8t|| j| j| jdd }|dd d d }t|}|||| j|fS )NvideorP   zvideo r   z (z) r   Image Not Found r   r   r   r   r   r1   )r   r   r   r   r,  r   r   r-  r0  r   retrievereleaser/  r   r   framesr!   r
  r   r   r   r}   r   rj   rr   r   )r   r8   r   ret_valr   rX   r   r=   r=   r>   r   J  s8    

2

zLoadImages.__next__c                 C   sD   d| _ t|| _t| jtj| j | _t| jtj	| _
d S r   )r   r!   VideoCapturer0  r   rb   CAP_PROP_FRAME_COUNTr-  r8  CAP_PROP_ORIENTATION_METArV   )r   r8   r=   r=   r>   r/  r  s    zLoadImages._new_videoc                 C   sL   | j dkrt|tjS | j dkr0t|tjS | j dkrHt|tjS |S )Nr      Z   )rV   r!   rotateROTATE_90_CLOCKWISEROTATE_90_COUNTERCLOCKWISErd   )r   r   r=   r=   r>   _cv2_rotatez  s    


zLoadImages._cv2_rotatec                 C   s   | j S r6   )r   r   r=   r=   r>   r     s    zLoadImages.__len__)r   r   TNrP   )	r   r   r   r   r   r   r/  rB  r   r=   r=   r=   r>   r  !  s   
#(
r  c                   @   s6   e Zd ZdddZd	d
 Zdd Zdd Zdd ZdS )LoadStreamsfile.streamsr   r   TNrP   c                    s  dt jj_d| _| _| _|| _tj	
|r>t|  n|g}t|}dd |D | _d g| dg| dg| d g| f\| _| _| _| _t|D ]\}}	|d  d| d|	 d	}
t|	jd
v rtd dd l}||	jddj}	|	 rt|	n|	}	|	dkr,t rJ dt r,J dt !|	}|" sRJ |
 d|	 t#|$t j%}t#|$t j&}|$t j'}t(t#|$t j)dpt*d| j|< t(t+,|r|ndd dpd| j|< |- \}| j|< t.| j/|||	gdd| j|< t01|
 d| j|  d| d| d| j| dd
 | j| 2  qt01d t34 fdd| jD }	t3j5|	ddj6d dk| _7 o| j7| _8|| _9| j7st0:d d S )NTr   c                 S   s   g | ]}t |qS r=   )r    r   r=   r=   r>   r     r@   z(LoadStreams.__init__.<locals>.<listcomp>r   rP   r   r   ... )zwww.youtube.comzyoutube.comzyoutu.be)pafyzyoutube_dl==2020.12.2r.   )ZpreftypezM--source 0 webcam unsupported on Colab. Rerun command in a local environment.zN--source 0 webcam unsupported on Kaggle. Rerun command in a local environment.zFailed to open infd      )targetr   daemonz
 Success (z frames r   z at z.2fz FPS)rA   c                    s"   g | ]}t | d d jqS r   r   )r   shaper   r   r   r}   r=   r>   r     r@   )axisu]   WARNING ⚠️ Stream shapes differ. For optimal performance supply similarly-shaped streams.);rp   backendscudnn	benchmarkr   r   r}   r-  r7   r8   r)  r   r!  r"  r   sourcesimgsfpsr8  threads	enumerater   hostnamer   rF  newZgetbesturl	isnumericevalr"   r#   r!   r:  isOpenedr   rb   CAP_PROP_FRAME_WIDTHCAP_PROP_FRAME_HEIGHTCAP_PROP_FPSr   r;  floatmathisfiniter   r   rG   r   rl   r   rr   stackuniquerM  rz   r   r   r   )r   rS  r   r}   r   r   r-  nirX   strF  r0  wrL   rU  r   r=   rN  r>   r     sJ    
"4

&*6
zLoadStreams.__init__c                 C   s   d| j |  }}| r||k r|d7 }|  || j dkr| \}}|rZ|| j|< n*td t	| j| | j|< |
| td qd S )Nr   rP   uQ   WARNING ⚠️ Video stream unresponsive, please check your IP camera connection.rw   )r8  r]  r   r-  r6  rT  r   r   rr   
zeros_likeopentimesleep)r   rg  r0  r   rf  r  successr   r=   r=   r>   rG     s    

zLoadStreams.updatec                 C   s
   d| _ | S )Nr1   r   r   r=   r=   r>   r     s    zLoadStreams.__iter__c                    s     j d7  _ tdd  jD r4tdtdkr@t  t j	 } j
rjt fdd|D }n:t fdd|D }|dd d d	f d
}t|} j||d dfS )NrP   c                 s   s   | ]}|  V  qd S r6   )is_aliver   r=   r=   r>   r?     r@   z'LoadStreams.__next__.<locals>.<genexpr>qc                    s   g | ]}  |qS r=   )r   r   r   r=   r>   r     r@   z(LoadStreams.__next__.<locals>.<listcomp>c                    s&   g | ]}t | j j jd d qS rL  )r   r   r}   r   r   r   r=   r>   r     r@   .r1   )r   r\   rP   r[   rA   )r   allrV  r!   waitKeyorddestroyAllWindowsr   rT  copyr   rr   rd  rj   r   rS  )r   r   r   r=   r   r>   r     s    &

zLoadStreams.__next__c                 C   s
   t | jS r6   )r   rS  r   r=   r=   r>   r     s    zLoadStreams.__len__)rD  r   r   TNrP   )r   r   r   r   rG   r   r   r   r=   r=   r=   r>   rC    s
   
,rC  c                    s:   t j dt j t j dt j    fdd| D S )Nr1  labelsc                    s.   g | ]&} | d dd d d qS )rP   r  r   r  )rH   r"  r   sasbr=   r>   r     r@   z#img2label_paths.<locals>.<listcomp>)r7   sep)Z	img_pathsr=   rw  r>   img2label_paths  s    &r{  c                   @   s   e Zd ZdZejejejejej	gZ
d"d
dZd#ddZedd	fddZdd Zdd Zdd Zdd Zdd Zdd Zedd Zed d! ZdS )$r   g333333?r      FNr   rw   r   rA   c           2         sz  |_ |_|_|_|r dn|_jo2j _| d | d g_|
_|_|rvt	jd jd |dnd _
zg }t|tr|n|gD ]}t|}| r|tjt|d d dd	7 }q| r6t|F}|   }t|jtj |fd
d|D 7 }W d    n1 s*0    Y  qt| | dqtdd |D _jstJ | dW nF ty } z,t| d| d| dt |W Y d }~n
d }~0 0 tj_| r|ntjd j d}zNt!j"|dd# d  } d j$ksJ  d t%jj ks:J W n& tyb   &||d  }Y n0  'd\}}}}}|rt(dv rd| d| d||  d| d	}t)d || ||t*d  d  rt+,d- d   |dks|rJ | d!| d"t  fd#dd$D  t. /  \}}_0t1t!2|d}|dksd|rdJ | d%| d"t t|_3t!4|_5t 6 _t 6 _rBt!4fd&dj3D 7 d 8t9}t+,| |t1|  d'| d( fd)d|D _fd*d|D _fd+d|D _3fd,d|D _0j5| _5t1j5}t!:t!;|| 8t9}|d- d. }|_<|_=t>|_?g } t!4| @d.d-}!tAt.j3j0D ]p\}"\}#}$| r|#d d dd.f |!kBd.}%|#|% j3|"< |$r|$|% j0|"< |	rdj3|" d d df< qjrPj5}&|&d d d.f |&d d df  }'|'C }(fd/d|(D _fd0d|(D _fd1d|(D _3fd2d|(D _0|&|( _5|'|( }'d.d.gg| }t>|D ]V}"|'||"k })|)D |)E  }*}+|+d.k r
|+d.g||"< n|*d.krd.d.|* g||"< qt!Ft!4|| |
 | 8t9|
 _G|d3krljH|d4sld}d g| _Id5d jD _J|rvd6\},}-d g| d g|  _K_L|d7krjMnjN}.tOtPQ|.t>|}/t)tA|/|t*t(dkd8}0|0D ]t\}"}1|d7kr |,jJ|" R jS7 },n,|1\jI|"< jK|"< jL|"< |,jI|" jT7 },| d9|,|- d:d;| d<|0_Uq|0V  d S )=NFr[   ZToGrayZ
GaussNoise)ZpToGrayZpGaussNoiserK   z**r  Tr  c                    s(   g | ] }| d r |d  dn|qS )./rP   )
startswithreplacer   )parentr=   r>   r     r@   z0LoadImagesAndLabels.__init__.<locals>.<listcomp>r  c                 s   s2   | ]*}| d d  tv r|dtjV  qdS )r  r1   r   N)r   r  r  r  r7   rz  r   r=   r=   r>   r?     r@   z/LoadImagesAndLabels.__init__.<locals>.<genexpr>zNo images foundzError loading data from r   
r   z.cache)allow_pickleversionhashresults>   r   r1   	Scanning rE  	 images,  backgrounds,  corrupt)r   totalinitial
bar_formatmsgszNo labels found in z, can not start training. c                    s   g | ]}  |qS r=   )pop)r;   k)r   r=   r>   r   +  r@   )r  r  r  zAll labels empty in c                    s   g | ]}t | kqS r=   r   r   )	min_itemsr=   r>   r   6  r@   r   z images filtered from datasetc                    s   g | ]} j | qS r=   im_filesr;   rg  r   r=   r>   r   8  r@   c                    s   g | ]} j | qS r=   label_filesr  r   r=   r>   r   9  r@   c                    s   g | ]} j | qS r=   rv  r  r   r=   r>   r   :  r@   c                    s   g | ]} j | qS r=   segmentsr  r   r=   r>   r   ;  r@   r1   rP   c                    s   g | ]} j | qS r=   r  r  r   r=   r>   r   X  r@   c                    s   g | ]} j | qS r=   r  r  r   r=   r>   r   Y  r@   c                    s   g | ]} j | qS r=   r  r  r   r=   r>   r   Z  r@   c                    s   g | ]} j | qS r=   r  r  r   r=   r>   r   [  r@   ram)r   c                 S   s   g | ]}t |d qS ).npy)r   with_suffixr;   r  r=   r=   r>   r   o  r@   r   i   @disk)r  r  disablezCaching images (.1fzGB ))Wr   rx   ry   r   rz   mosaicmosaic_borderr}   r8   r   albumentationsr  r#  r   is_dirr'  rE   is_filerk  r   strip
splitlinesr  r7   rz  r+  r%  r  rS   HELP_URLr{  r  r  rr   loaditemcache_versionrM   cache_labelsr  r0   r   r   r   rl   rH   zipvaluesr  r   concatenaterv  r   shapeskeysnonzeroastyper   floorr   batchrf  r   indicesreshaperW  r.  argsortr   r   ceilbatch_shapescheck_cache_ramims	npy_filesim_hw0im_hwcache_images_to_disk
load_imager   r   imapstatst_sizenbytesr   r  )2r   r8   r   r   rx   ry   rz   r   r{   r|   r}   r~   r  r   r  r<   r  e
cache_pathr9   r   nmnencrf  drv  r  nlincludebinbZinclude_classZinclude_class_arrayrg  labelsegmentjrX   arZirectZariZminiZmaxibgbZfcnr  pbarr   r=   )r   r  r  r   r>   r     s    $ 

86$""
((
("

 


(
"zLoadImagesAndLabels.__init__皙?c              
   C   s   d\}}t | jd}t|D ]D}tt| j}| jt	|j
d |j
d  }||j|d  7 }q|| j | }	t }
|	d|  |
jk }|st| |	| dd|
j| dd|
j| dd	|rd
nd  |S )Nr  rI  r   rP   r[   r  zGB RAM required, r   zGB available, u   caching images ✅u   not caching images ⚠️)r   rf  r   r!   r
  rs   choicer  r   r   rM  r  psutilvirtual_memory	availabler   rl   r  )r   Zsafety_marginr   r  r  rf  r   r   ratioZmem_requiredmemr   r=   r=   r>   r    s$    


z#LoadImagesAndLabels.check_cache_ramz./labels.cachec                 C   s  i }ddddg f\}}}}}| d|j |j  d}	tt}
t|
tt| j| j	t
||	t| jtd}|D ]x\	}}}}}}}}}||7 }||7 }||7 }||7 }|r|||g||< |r|| |	 d| d||  d| d|_qpW d    n1 s0    Y  |  |r&td	| |dkrJt| d
| dt  t| j	| j |d< ||||t| jf|d< ||d< | j|d< z4t|| |d| t| d|  W nB ty } z(t| d|j  d|  W Y d }~n
d }~0 0 |S )Nr   r  ...)r   r  r  r   r  r  r  r  u"   WARNING ⚠️ No labels found in z. r  r  r  r  z
.cache.npyzNew cache created: u   WARNING ⚠️ Cache directory z is not writeable: )r  stemr   r   r   r  verify_image_labelr  r  r  r   r   r   r*  r   r  r   rl   rH   r   r  rM   r  rr   saver  renamerS   )r   r8   r   r   r  r   r  r  r  r   poolr  im_filelbrM  r  Znm_fZnf_fZne_fZnc_fmsgr  r=   r=   r>   r    sF    

B

2z LoadImagesAndLabels.cache_labelsc                 C   s
   t | jS r6   )r   r  r   r=   r=   r>   r     s    zLoadImagesAndLabels.__len__c              	   C   s  | j | }| j}| jo$t |d k }|rx| |\}}d }t |d k rvt||g| td| jd R  \}}n| |\}\}}\}	}
| j	r| j
| j|  n| j}t||d| jd\}}}||f|	| |
| f|ff}| j|  }|jr@t|d d dd f |d |
 |d |	 |d |d d|d d dd f< | jrvt|||d |d	 |d
 |d |d d\}}t|}|rt|d d ddf |jd |jd ddd|d d ddf< | jr| ||\}}t|}t||d |d |d d t |d k r@t|}|r@d|d d df  |d d df< t |d k rt|}|rd|d d df  |d d df< t|df}|rt||d d dd f< |dd d d }t |}t||| j!| |fS )Nr  r   r   rP   F)r   Zscaleup)padwpadhdegrees	translatescaleshearperspective)r  r  r  r  r  r^   TgMbP?)ri  rL   clipepshsv_hhsv_shsv_v)ZhgainZsgainZvgainflipudr[   fliplrrN   r   r1   )"r  ry   r  rs   load_mosaicr   randintrf  r  rz   r  r  r   r   rx   rv  ru  rK   r(   r   r   r)   rM  r  r   rr   r  r  rp   zeros
from_numpyrj   r   r  )r   indexry   r  rW   rv  r  h0w0rL   ri  rM  r  r~   r  Z
labels_outr=   r=   r>   __getitem__  sZ    
,J
>
 
 
zLoadImagesAndLabels.__getitem__c           	      C   s   | j | | j| | j|   }}}|d u r| r>t|}n t|}|d us^J d| |jd d \}}| j	t
|| }|dkr| js|dkrtjntj}tj|t|| t|| f|d}|||f|jd d fS | j | | j| | j| fS )Nr5  r[   rP   r   )r  r  r  r9   rr   r  r!   r
  rM  r   r   rx   INTER_LINEAR
INTER_AREAresizerb  r  r  r  )	r   rg  r   r  r   r  r  rinterpr=   r=   r>   r  	  s    "
(zLoadImagesAndLabels.load_imagec                 C   s2   | j | }| s.t| t| j|  d S r6   )r  r9   rr   r  as_posixr!   r
  r  )r   rg  r  r=   r=   r>   r    s    
z(LoadImagesAndLabels.cache_images_to_diskc                    sj  g g  }}| j fdd| jD \}}|gtj| jdd }t| t|D ]n\}}| |\}}	\ |dkrtj	d d |j
d fdtjd}
t| dt|  d||f\}}}}||   ||   f\}}}}n|d	krJ|t|  dt| d |f\}}}}d ||  t||  f\}}}}n|dkrt| d||td |  f\}}}}||  dt||  f\}}}}nb|dkr
||t| d td |  f\}}}}ddt|| t||  f\}}}}|||||f |
||||f< || || | j|  | j|   }}|jrt|d d d	d f  |d d d	d f<  fd
d|D }|| || qPt|d}|d d d	d f g|R D ]}tj|dd |d qt|
||| jd d\}
}}t|
||| jd | jd | jd | jd | jd | jd	\}
}|
|fS )Nc                 3   s(   | ] }t t| d   | V  qdS )r[   Nr   rs   uniformr   rX   r=   r>   r?   $  r@   z2LoadImagesAndLabels.load_mosaic.<locals>.<genexpr>r\   r  r   r[   r   dtyperP   c                    s   g | ]}t | qS r=   r&   r   )rL   r  r  ri  r=   r>   r   B  r@   z3LoadImagesAndLabels.load_mosaic.<locals>.<listcomp>outr   r<   r  r  r  r  r  r  r  r  r  r  border)r   r  rs   choicesr  r   rW  r  rr   fullrM  uint8r   r   rv  ru  r  rK   r(   r*  r   r  r  r   ry   r   )r   r  Zlabels4Z	segments4ycxcr  rg  rW   r   Zimg4Zx1aZy1aZx2aZy2aZx1bZy1bZx2bZy2brv  r  r   r=   )rL   r  r  rX   ri  r>   r     sX    

&((
,(
,(
0($0
 

zLoadImagesAndLabels.load_mosaicc                    s(  g g  }}| j |gtj| jdd }t| d\}}t|D ]\}}| |\}}	\|dkrtjd d |j	d fdtj
d}
 }}  f n^|d	krΈ  f n>|dkr|  |  f n|dkr| |   f n|d
krN| | |  |  f n|dkr~|  | | |  f n|dkr| |  | | | |  f nV|dkrވ |  | f n.|dkr | |  | | f  d d \dd  D \}}}}| j|  | j|   }}|jrt|d d d	d f |d d d	d f< fdd|D }|| || || d | d f |
||||f<  }}q@fdd| jD \}}|
||d  ||d  f }
t|d}|d d d	dgf  |8  < |d d dd
gf  |8  < t||g  fdd|D }|d d d	d f g|R D ]}tj|dd |d qt|
||| jd d\}
}}t|
||| jd | jd | jd | jd | jd | jd	\}
}|
|fS )NrO   r	  )r1   r1   r   r\   r[   r
  r  rP   r]   r^   rN   r_   c                 s   s   | ]}t |d V  qdS r   N)r   r   r=   r=   r>   r?   |  r@   z3LoadImagesAndLabels.load_mosaic9.<locals>.<genexpr>c                    s   g | ]}t | qS r=   r  r   )rL   padxpadyri  r=   r>   r     r@   z4LoadImagesAndLabels.load_mosaic9.<locals>.<listcomp>c                 3   s   | ]}t td  V  qdS r  r  )r;   r   r  r=   r>   r?     r@   c                    s   g | ]}|  qS r=   r=   r   )cr=   r>   r     r@   r  r   r  r  r  r  r  r  r  )r   rs   r  r  r   rW  r  rr   r  rM  r  rv  ru  r  rK   r(   r*  r   r  r  r   r  r   ry   r   )r   r  Zlabels9Z	segments9r  hpZwprg  rW   r   Zimg9r  r  x1y1x2y2rv  r  r  r  r   r=   )r  rL   r  r  rX   ri  r>   load_mosaic9Z  st    

&
 

&
&
.

$0

,$ 

z LoadImagesAndLabels.load_mosaic9c                 C   sN   t |  \}}}}t|D ]\}}||d d df< qt|dt|d||fS r   )r  rW  rp   rd  cat)r  r   r  r8   r  rg  r  r=   r=   r>   r     s    zLoadImagesAndLabels.collate_fnc              
   C   s  t |  \}}}}t|d }g g |d | |d | f\}}}}	tg dg}
tg dg}tg dg}t|D ]}|d9 }t dk rtj|| d	 ddd	d
d 
|| 
 }|| }ntt|| ||d  fdt||d  ||d  fdfd}t|| ||d  |
 ||d  | ||d  |
 | fd| }|| || qxt|D ]\}}||d d df< qrt|dt|d||	fS )Nr]   )rw   r   r   rP   r   r   )rw   r   rP   r   r   r   )rP   rP         ?r#  r#  r#  r#  r   g       @bilinearF)scale_factorr   align_cornersrP   r[   r\   )r  r   rp   tensorr   rs   Finterpolate	unsqueezera  typer"  r*  rW  rd  )r  r   r  r8   r  rf  Zim4Zlabel4Zpath4Zshapes4ZhoZworX   rg  im1r  r=   r=   r>   r     s0    $

DD
zLoadImagesAndLabels.collate_fn4)r   r|  FNFFFFr   rw   r   rA   )r  rA   )r   r   r   r  r!   INTER_NEARESTr   INTER_CUBICr  INTER_LANCZOS4Zrand_interp_methodsr   r  r   r  r   r  r  r  r  r!  staticmethodr   r   r=   r=   r=   r>   r     s8               
 
&	J:M
r   Zcoco128c                 C   sr   t t|  d}tj|r(t| t| tt	j	tt |  dddD ]}t
||t |j  qRd S )NZ_flatz/**/*.*Tr  )r   rE   r7   r8   r9   shutilrmtreemakedirsr   r'  copyfilename)r8   new_pathfiler=   r=   r>   flatten_recursive  s    

$r8  c              
   C   s2  t | } | d  r"t| d nd  t| d}t|}t||dD ]}|jdd  t	v rHt
t|dd d df }|jd d \}}t tt|gd }t | rHt|6}tjd	d
 |   D tjd}	W d    n1 s0    Y  t|	D ]"\}
}t|d }| d |  | j d|j d|
 d }|j s^|jjdd |dd  ||||g }|dd  d d |dd < t|dd t}t |ddg d||ddg< t |ddg d||ddg< t
!t|||d |d |d |d f sJ d| qqHd S )Nclassificationr  r  rP   .r1   r[   r   c                 S   s   g | ]}|  qS r=   )r   r   r=   r=   r>   r     r@   z!extract_boxes.<locals>.<listcomp>r  Z
classifierr   r   T)parentsg333333?r\   r]   zbox failure in )"r   r  r1  r2  r#  rglobr   r   r   r  r!   r
  rE   rM  r{  r9   rk  rr   r   r   r  r  float32rW  r   r  r  mkdirr'   r  ravelr  r  r	  )r8   r   rf  r  r   rL   ri  lb_filer  r  r  r   r  r  r=   r=   r>   extract_boxes  s.    
D(rA  zcoco128/images)g?r  rw   c              	   C   s  t | } tdd | dD }t|}td tjg d||d}g d}|D ] }| j|  rR| j| 	  qRt
d|  d	|   tt|||d
D ]|\}}	|rt tt|	gd  rt| j||  d0}
|
d|	| j  d  W d   q1 s0    Y  qdS )aT   Autosplit a dataset into train/val/test splits and save path/autosplit_*.txt files
    Usage: from utils.dataloaders import *; autosplit()
    Arguments
        path:            Path to images directory
        weights:         Train, val, test weights (list, tuple)
        annotated_only:  Only use images with an annotated txt file
    c                 s   s(   | ] }|j d d  tv r|V  qdS )rP   N)r   r  r  r   r=   r=   r>   r?     r@   zautosplit.<locals>.<genexpr>r  r   )r   rP   r[   )weightsr  )zautosplit_train.txtzautosplit_val.txtzautosplit_test.txtzAutosplitting images from z!, using *.txt labeled images onlyr:  ar}  r  N)r   r%  r<  r   rs   rt   r  r  r9   unlinkr   r   r  r{  rE   rk  writerelative_tor  )r8   rB  Zannotated_onlyr   rf  r  txtr   rg  rW   r  r=   r=   r>   	autosplit  s    
rH  c                    sr  | \}}}dddddg f\}}}}} zt |}	|	  t|	}
|
d dk|
d dk@ slJ d|
 d|	j tv sJ d|	j |	j dv rt|d	V}|d
d | dkrt	
t |j|dddd | d| d}W d    n1 s0    Y  tj|rd}t|}dd |   D }tdd |D rtjdd |D tjd}dd |D  t|ddt fd}tj|tjd}W d    n1 s0    Y  t|}|r|jd dksJ d|jd  d|dk s"J d||dk   |d d dd f dk svJ d|d d dd f |d d dd f dk  tj|ddd \}}t||k r|| } r fd!d|D  | d| d"|t|  d#}nd}tjd$tjd}nd}tjd$tjd}|||
 |||||f	W S  tyl } z:d}| d| d%| }d d d d |||||g	W  Y d }~S d }~0 0 d S )&Nr   rA   	   rP   zimage size z <10 pixelszinvalid image format )r,   r+   rbr[   s   JPEGrH  )Zsubsamplingqualityu   WARNING ⚠️ z!: corrupt JPEG restored and savedc                 S   s   g | ]}t |r| qS r=   )r   r   r   r=   r=   r>   r   &  r@   z&verify_image_label.<locals>.<listcomp>c                 s   s   | ]}t |d kV  qdS )rN   Nr  r   r=   r=   r>   r?   '  r@   z%verify_image_label.<locals>.<genexpr>c                 S   s   g | ]}|d  qS )r   r=   r   r=   r=   r>   r   (  r@   r  c                 S   s,   g | ]$}t j|d d t jdddqS )rP   Nr  r1   r[   )rr   r   r=  r  r   r=   r=   r>   r   )  r@   r1   r^   zlabels require 5 columns, z columns detectedznegative label values z,non-normalized or out of bounds coordinates T)rO  return_indexc                    s   g | ]} | qS r=   r=   r   r  r=   r>   r   5  r@   r   z duplicate labels removed)r   r^   z : ignoring corrupt image/label: )r
   rk  verifyrZ   formatr  r  seekr   r   ro   r  r7   r8   r)  r  r  r.  rr   r   r=  r  r  r$   r   rM  rq  re  r  rS   )r   r  r@  r   r  r   r  r  r  r   rM  r  r  classesr  r   rg  r  r=   r  r>   r    sV    

(0
0&$T r  c                   @   sJ   e Zd ZdZdddZedd Zdd	 ZdddZdddZ	dd Z
dS )HUBDatasetStatsa
   Class for generating HUB dataset JSON and `-hub` dataset directory

    Arguments
        path:           Path to data.yaml or data.zip (with data.yaml inside data.zip)
        autodownload:   Attempt to download dataset if not found locally

    Usage
        from utils.dataloaders import HUBDatasetStats
        stats = HUBDatasetStats('coco128.yaml', autodownload=True)  # usage 1
        stats = HUBDatasetStats('path/to/coco128.zip')  # usage 2
        stats.get_json(save=False)
        stats.process_images()
    coco128.yamlFc           	   
   C   s   |  t|\}}}zJtt|dd&}t|}|r>||d< W d    n1 sR0    Y  W n. ty } ztd|W Y d }~n
d }~0 0 t|| t|d d | _| jd | _	| j	j
ddd |d	 t|d
  d| _|| _d S )Nignore)errorsr8   z!error/HUB/dataset_stats/yaml_loadz-hubr1  T)r;  exist_okr  names)r  rX  )_unzipr   rk  r   yaml	safe_loadrS   r   hub_dirim_dirr>  r#  r  statsdata)	r   r8   ZautodownloadzippedZdata_dirZ	yaml_pathr  r_  r  r=   r=   r>   r   S  s    
* 
zHUBDatasetStats.__init__c                    s   t  dpt  d}|s.J d  t|dkr` fdd|D }|s`J d  dt|dksJ d| d	  |d
 S )Nz*.yamlzNo *.yaml file found in rP   c                    s   g | ]}|j  j kr|qS r=   )r  r  dirr=   r>   r   k  r@   z.HUBDatasetStats._find_yaml.<locals>.<listcomp>zMultiple *.yaml files found in z, only 1 *.yaml file allowedzMultiple *.yaml files found: z , only 1 *.yaml file allowed in r   )r#  r'  r<  r   )rb  r   r=   ra  r>   
_find_yamle  s     zHUBDatasetStats._find_yamlc                 C   s~   t |dsdd |fS t| s4J d| dt||jd |d}| sjJ d| d| dd	t || |fS )
Nz.zipFzError unzipping z, file not found)r8   rA   z, z6 not found. path/to/abc.zip MUST unzip to path/to/abc/T)	rE   endswithr   r  r%   r  r  r  rc  )r   r8   rb  r=   r=   r>   rY  p  s    

zHUBDatasetStats._unzip  c           	   
   C   s  | j t|j }z\t|}|t|j|j }|dk rX|t	|j| t	|j| f}|j
|dddd W n ty } ztd| d|  t|}|jd d \}}|t|| }|dk rtj|t	|| t	|| ftjd	}tt|| W Y d }~n
d }~0 0 d S )
Ng      ?rL  2   T)rM  optimizeu#   WARNING ⚠️ HUB ops PIL failure r   r[   r  )r]  r   r5  r
   rk  r   r   r   r  r   r  rS   r   rl   r!   r
  rM  r  r	  rE   )	r   r  Zmax_dimf_newr   r  r  Z	im_heightZim_widthr=   r=   r>   _hub_opsz  s    
"
&zHUBDatasetStats._hub_opsc              	      sP  dd  dD ]}j |d u r,d j|< qtj | }tfddt|j|jddD }t	|
 |
d d	|jt	t|dkd

 |dk
d d fddt|j|jD dj|< q|r.jd }td|  d t|d}tj| W d    n1 s$0    Y  |rJttjjddd jS )Nc                 S   s   dd | D S )Nc                 S   s(   g | ] ^}}t |gd d |D qS )c                 s   s   | ]}t |d V  qdS )r]   N)roundr   r=   r=   r>   r?     r@   zFHUBDatasetStats.get_json.<locals>._round.<locals>.<listcomp>.<genexpr>r   )r;   r  pointsr=   r=   r>   r     r@   z<HUBDatasetStats.get_json.<locals>._round.<locals>.<listcomp>r=   r  r=   r=   r>   _round  s    z(HUBDatasetStats.get_json.<locals>._roundtrainvaltestc                    s2   g | ]*}t j|d d df t jd dqS )Nr   r  )	minlength)rr   bincountr  r   r_  )r;   r  r   r=   r>   r     s   z,HUBDatasetStats.get_json.<locals>.<listcomp>Z
Statisticsr  r   r   )r  	per_classrP   )r  Z
unlabelledrt  c                    s*   g | ]"\}}t t|j | iqS r=   )rE   r   r5  tolist)r;   r  v)rl  r=   r>   r     s   )Zinstance_statsZimage_statsrv  z
stats.jsonzSaving r  ri  r[   F)indent	sort_keys)r_  rb   r^  r   rr   r   r   rv  rf  r   rB   ru  rq  r  r  r\  r   r&  rk  jsondumpdumps)r   r  verboser   r   r   Z
stats_pathr  r=   )rl  r   r>   get_json  s8    



.zHUBDatasetStats.get_jsonc                 C   sp   dD ]T}| j |d u rqt| j | }| d}ttt| j|j|j	|dD ]}qRqt
d| j  | jS )Nrm  z imagesrs  zDone. All images saved to )r_  rb   r   r   r   r   r  ri  r  rf  r   r]  )r   r   r   r   r   r=   r=   r>   process_images  s    
$zHUBDatasetStats.process_imagesN)rT  F)re  )FF)r   r   r   r   r   r0  rc  rY  ri  r}  r~  r=   r=   r=   r>   rS  D  s   





#rS  c                       s*   e Zd ZdZd fdd	Zdd Z  ZS )ClassificationDatasetz
    YOLOv5 Classification Dataset.
    Arguments
        root:  Dataset path
        transform:  torchvision transforms, used by default
        album_transform: Albumentations transforms, used if installed
    Fc                    s^   t  j|d t|| _|r&t||nd | _|du p:|dk| _|dk| _dd | jD | _d S )N)rootTr  r  c                 S   s*   g | ]"}t |t|d  ddg qS )r   r  N)r#  r   r  r   r=   r=   r>   r     r@   z2ClassificationDataset.__init__.<locals>.<listcomp>)	r   r   r   torch_transformsr   album_transforms	cache_ram
cache_diskr   )r   r  rx   r   r   r   r=   r>   r     s    

zClassificationDataset.__init__c                 C   s   | j | \}}}}| jr:|d u r:t| }| j | d< n:| jrj| s^t| t| t	|}n
t|}| j
r| j
t|tjdd }n
| |}||fS )Nr\   )rm   rm   )r   r  r!   r
  r  r9   rr   r  r  r  r  cvtColorCOLOR_BGR2RGBr  )r   rg  r  r  r   r   sampler=   r=   r>   r    s    

z!ClassificationDataset.__getitem__)F)r   r   r   r   r   r  r   r=   r=   r   r>   r    s   r     r|  c              
   C   s   t |  t| |||d}W d    n1 s.0    Y  t|t|}tj }	tt t	|	d |dkrn|nd|g}
|dkrd nt
j||d}t }|dt  t|||o|d u |
|tt|dS )N)r  r   rx   r   rP   r   r1   r   r   )r   r   r   r   r   r   r   )r*   r  r   r   rp   r   r   r7   r   r   r   r   r   r   r2   r   r3   rv   )r8   r   r   rx   r   r   r   r   r   r   r   r   r   r=   r=   r>    create_classification_dataloader  s"    	
.
(
r  )FNFFrw   Fr1   rO   FFrA   Fr   )r  r|  TFr1   rO   T)pr   rQ   r'  rC   ry  rb  r7   rs   r1  rl  	itertoolsr   Zmultiprocessing.poolr   r   pathlibr   	threadingr   Z	soundfiler   urllib.parser   matplotlib.pyplotpyplotr  scipyr   numpyrr   r  rp   Ztorch.nn.functionalnn
functionalr(  torchvisionrZ  PILr	   r
   r   torch.utils.datar   r   r   r   r   Zutils.augmentationsr   r   r   r   r   r   r   r   utils.generalr   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   utils.torch_utilsr*   r  r  r  r   getenvr0   r2   rE   r  r3   TAGSr  rV   rM   rZ   ro   rv   r   r   r   r   r   r  rC  r{  r   r8  rA  rH  r  rS  datasetsZImageFolderr  r  r=   r=   r=   r>   <module>   s   (L

             
501gV   i
"4y#       