o
    Ďi?                     @   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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l)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1 ddl2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZC ddlDmEZE dZFdZGdZHeIeJddZKeIeJddZLeMeJddN dkZOe jPQ D ]ZRe jPeR dkr nqdd ZSdd ZTdd ZUdd ZV	 		 	 	!	 		"	 	 	#	 	dGd$d%ZWG d&d' d'e&j$ZXG d(d) d)ZYG d*d+ d+ZZG d,d- d-Z[G d.d/ d/Z\d0d1 Z]G d2d3 d3e%Z^e3d4 fd5d6Z_e3d4 fd7d8Z`e3d9 d:d fd;d<Zad=d> ZbG d?d@ d@ZcG dAdB dBejdjeZf	C	D		 		"	dHdEdFZgdS )Iz
Dataloaders and dataset utils
    N)repeat)Pool
ThreadPool)Path)Thread)urlparse)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)
bmpdngjpegjpgmpopngtiftiffwebppfm)asfavigifm4vmkvmovmp4mpegmpgts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 rL   T/home/jeff/fluffinator/venv/lib/python3.10/site-packages/yolov5/utils/dataloaders.py	<genexpr>6   s   & zget_hash.<locals>.<genexpr> )sumhashlibmd5strencodeupdatejoin	hexdigest)pathssizehrL   rL   rM   get_hash4   s   r[   c                 C   sr   | j }tt' t|   t }|dv r'|d |d f}W d    |S W d    |S 1 s2w   Y  |S )N)         r   )rY   
contextlibsuppress	Exceptiondict_getexifitemsorientation)imgsrotationrL   rL   rM   	exif_size<   s   

ri   c                 C   sn   |   }|dd}|dkr5tjtjtjtjtjtjtj	d|}|dur5| 
|} |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  r^   )            r\      r]   Nexif)getexifgetr	   FLIP_LEFT_RIGHT
ROTATE_180FLIP_TOP_BOTTOM	TRANSPOSE
ROTATE_270
TRANSVERSE	ROTATE_90	transposetobytesinfo)imagero   re   methodrL   rL   rM   exif_transposeF   s$   
r~   c                 C   s&   t  d }tj| t| d S )Nl        )torchinitial_seednprandomseed)	worker_idworker_seedrL   rL   rM   seed_worker`   s   r   F        r]   rO   c                 C   s  |	r|rt d d}t|
 t| |||||	||t|||||d}W d    n1 s-w   Y  t|t|}tj	 }tt
 t|d |dkrM|nd|g}|
dkrXd ntj||d}|rctnt}t }|d| t  ||||oz|d u ||t|rt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prefixworkersr^   r   r@   shuffle   UU*UU* )
batch_sizer   num_workerssampler
pin_memory
collate_fnworker_init_fn	generator)r   warningr)   LoadImagesAndLabelsintminlenr   cudadevice_countrF   	cpu_countmaxr   DistributedSamplerr   InfiniteDataLoader	Generatormanual_seedrA   rB   collate_fn4r   r   )rG   imgszr   r   r   r   r   cacher   r   rankr   r   quadr   r   r   datasetndnwr   loaderr   rL   rL   rM   create_dataloaderg   sN   


(
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__rL   rM   r      s   zInfiniteDataLoader.__init__c                 C   s   t | jjS rE   )r   r   r   r   rL   rL   rM   __len__   s   zInfiniteDataLoader.__len__c                 c   s$    t t| D ]}t| jV  qd S rE   )ranger   nextr   )r   _rL   rL   rM   r      s   zInfiniteDataLoader.__iter__)__name__
__module____qualname____doc__r   r   r   __classcell__rL   rL   r   rM   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 rE   )r   )r   r   rL   rL   rM   r         
z_RepeatSampler.__init__c                 c   s    	 t | jE d H  qrE   )iterr   r   rL   rL   rM   r      s   z_RepeatSampler.__iter__N)r   r   r   r   r   r   rL   rL   rL   rM   r      s    r   c                   @   s&   e Zd ZdddZdd Zd	d
 ZdS )LoadScreenshots      TNc                 C   sB  t d dd l}| ^}}d\| _}}	}
}t|dkr$t|d | _n%t|dkr6dd |D \}}	}
}nt|dkrId	d |D \| _}}	}
}|| _|| _|| _|| _	d
| _
d| _| | _| jj| j }|	d u ro|d n|d |	 | _|d u r~|d n|d | | _|
p|d | _|p|d | _| j| j| j| jd| _d S )Nmssr   )r   NNNNr^   rl   c                 s       | ]}t |V  qd S rE   r   rJ   xrL   rL   rM   rN          z+LoadScreenshots.__init__.<locals>.<genexpr>rm   c                 s   r   rE   r   r   rL   rL   rM   rN      r   streamtopleftwidthheight)r   r   r   r   )r   r   splitscreenr   r   img_sizer   
transformsautomodeframesctmonitorsr   r   r   r   monitor)r   sourcer   r   r   r   r   paramsr   r   r   r   r   rL   rL   rM   r      s.   
zLoadScreenshots.__init__c                 C   s   | S rE   rL   r   rL   rL   rM   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
r5| 
|}nt|| j| j| jdd }|dd d d	 }t |}|  jd
7  _t| j||d |fS )Nrk   zscreen z	 (LTWH): ,: r   r   r   rj   r   r^   r@   r^   )r   arrayr   grabr   r   r   r   r   r   r   r   r   r   r   ry   ascontiguousarrayr   rS   )r   im0rg   imrL   rL   rM   __next__   s   *.
zLoadScreenshots.__next__)r   r   TN)r   r   r   r   r   r   rL   rL   rL   rM   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   TNr^   c              
   C   s  t |trt|jdkrt|  }g }t |ttfr!t|n|gD ]C}tt|	 }d|v r?|
ttj|dd q$tj|rU|
tttj|d q$tj|ra|| q$t| ddd |D }	d	d |D }
t|	t|
}}|| _|| _|	|
 | _|| | _d
g| dg|  | _d| _|| _|| _|| _t|
r| |
d  nd | _| jdksJ d| dt  dt! d S )N.txt*T	recursive*.* does not existc                 S   &   g | ]}| d d  tv r|qS .r@   )r   lowerIMG_FORMATSr   rL   rL   rM   
<listcomp>     & z'LoadImages.__init__.<locals>.<listcomp>c                 S   r   r   )r   r   VID_FORMATSr   rL   rL   rM   r     r   Fr|   r   zNo images or videos found in z!. Supported formats are:
images: z	
videos: )"
isinstancerS   r   suffix	read_textrsplitlisttuplesortedresolveextendglobrF   rG   isdirrV   isfileappendFileNotFoundErrorr   r   r   filesnf
video_flagr   r   r   
vid_strideany
_new_videocapr   r   )r   rG   r   r   r   r   r  r  rK   imagesvideosninvrL   rL   rM   r      s@     

zLoadImages.__init__c                 C   
   d| _ | S Nr   countr   rL   rL   rM   r        zLoadImages.__iter__c                 C   s  | j | jkrt| j| j  }| j| j  rud| _t| jD ]}| j	  q| j
 \}}|sU|  j d7  _ | j  | j | jkrAt| j| j  }| | | j \}}|r-|  jd7  _d| j d  d| j d| j d| j d| d}n%|  j d7  _ t|}|d usJ d| d	| j  d| j d
| d}| jr| |}nt|| j| j| jdd }|dd d d }t|}|||| j|fS )Nvideor^   zvideo /z (z) r   Image Not Found zimage  r   r   r   r@   )r  r  StopIterationr  r  r   r   r  r  r   retrievereleaser  readr   framesr    imreadr   r   r   r   r   ry   r   r   )r   rG   r   ret_valr   rg   r   rL   rL   rM   r     s:   

	2

zLoadImages.__next__c                 C   sD   d| _ t|| _t| jtj| j | _t| jtj	| _
d S r  )r   r    VideoCapturer  r   rq   CAP_PROP_FRAME_COUNTr  r%  CAP_PROP_ORIENTATION_METAre   )r   rG   rL   rL   rM   r  A  s   zLoadImages._new_videoc                 C   sL   | j dkrt|tjS | j dkrt|tjS | j dkr$t|tjS |S )Nr      Z   )re   r    rotateROTATE_90_CLOCKWISEROTATE_90_COUNTERCLOCKWISErs   )r   r   rL   rL   rM   _cv2_rotateI  s   


zLoadImages._cv2_rotatec                 C   s   | j S rE   )r  r   rL   rL   rM   r   S  s   zLoadImages.__len__)r   r   TNr^   )	r   r   r   r   r   r   r  r0  r   rL   rL   rL   rM   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   TNr^   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 rvtd dd l}||	jddj}	|	 r~t|	n|	}	|	dkrt rJ dt rJ dt !|	}|" sJ |
 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  qLt01d t34 fdd| jD }	t3j5|	ddj6d dk| _7 o?| j7| _8|| _9| j7sOt0:d d S d S )NTr   c                 S   s   g | ]}t |qS rL   )r   r   rL   rL   rM   r   a      z(LoadStreams.__init__.<locals>.<listcomp>r   r^   r  r   ... )zwww.youtube.comzyoutube.comzyoutu.be)pafyzyoutube_dl==2020.12.2r:   )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)rO   c                    s"   g | ]}t | d d jqS r   r   )r   shaper   r   r   r   rL   rM   r   ~  s   " )axisu]   WARNING ⚠️ Stream shapes differ. For optimal performance supply similarly-shaped streams.);r   backendscudnn	benchmarkr   r   r   r  rF   rG   r
  r   r  r  r   sourcesimgsfpsr%  threads	enumerater   hostnamer   r5  newgetbesturl	isnumericevalr!   r"   r    r(  isOpenedr   rq   CAP_PROP_FRAME_WIDTHCAP_PROP_FRAME_HEIGHTCAP_PROP_FPSr   r)  floatmathisfiniter$  r   rU   r   r{   startr   stackuniquer=  r   r   r   r   )r   rC  r   r   r   r   r  nirg   str5  r  wrZ   rE  r   rL   r>  rM   r   Y  sL   
"4
$&6
zLoadStreams.__init__c                 C   s   d| j | }}| rQ||k rS|d7 }|  || j dkrB| \}}|r-|| j|< ntd t	| j| | j|< |
| td | rU||k sd S d S d S d S )Nr   r^   uQ   WARNING ⚠️ Video stream unresponsive, please check your IP camera connection.r   )r%  rN  r   r  r"  rD  r   r   r   
zeros_likeopentimesleep)r   rY  r  r   rX  fsuccessr   rL   rL   rM   rU     s   


 zLoadStreams.updatec                 C   r  )Nr@   r  r   rL   rL   rM   r     r  zLoadStreams.__iter__c                    s     j d7  _ tdd  jD rtdtdkr t  t j	 } j
r5t fdd|D }nt fdd|D }|dd d d	f d
}t|} j||d dfS )Nr^   c                 s   s    | ]}|  V  qd S rE   )is_aliver   rL   rL   rM   rN     r   z'LoadStreams.__next__.<locals>.<genexpr>qc                       g | ]}  |qS rL   )r   r   r   rL   rM   r         z(LoadStreams.__next__.<locals>.<listcomp>c                    s&   g | ]}t | j j jd d qS r<  )r   r   r   r   r   r   rL   rM   r     r   .r@   )r   rk   r^   rj   rO   )r  allrF  r    waitKeyorddestroyAllWindowsr!  rD  copyr   r   rV  ry   r   rC  )r   r   r   rL   r   rM   r     s   &

zLoadStreams.__next__c                 C   
   t | jS rE   )r   rC  r   rL   rL   rM   r     r   zLoadStreams.__len__)r2  r   r   TNr^   )r   r   r   r   rU   r   r   r   rL   rL   rL   rM   r1  W  s    
,r1  c                    s:   t j dt j t j dt j   fdd| D S )Nr  labelsc                    s.   g | ]} | d dd d d qS )r^   r   r   r   )rV   r  r   sasbrL   rM   r     s   . z#img2label_paths.<locals>.<listcomp>)rF   sep)	img_pathsrL   rm  rM   img2label_paths  s   &rr  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   r   r   rO   r]   c           3         s\  |_ |_|_|_|rdn|_joj _| d | d g_|
_|_|r3t	|dnd _
|_zyg }t|trC|n|gD ]V}t|}| r`|tjt|d d dd7 }qF| rt|#}|   }t|jtj |fdd	|D 7 }W d    n1 sw   Y  qFt| | d
tdd |D _jsJ | dW n ty } zt| d| d| dt |d }~ww tj_ | r|ntj d j!d}z&t"j#|dd$ d } d j%ksJ  d t&j j ksJ W n ty   '||d }Y nw  (d\}}}}}|r]t)dv r]d| d| d||  d| d	}t*d || ||t+d  d r]t,-d. d  |dksq|rqJ | d| d t  fd!d	d"D  t/ 0  \}}_1t2t"3|d}|dks|rJ | d#| d t t|_4t"5|_6t 7 _t 7 _ rt"5fd$d	j4D 8 d 9t:}t,-| |t2|  d%| d& fd'd	|D _fd(d	|D _ fd)d	|D _4fd*d	|D _1j6| _6t2j6}t";t"<|| 9t:}|d+ d, } |_=|_>t?|_@g }!t"5|!Ad,d+}"tBt/j4j1D ]8\}#\}$}%|!ro|$d d dd,f |"kCd,}&|$|& j4|#< |%ro|%|& j1|#< |	r}dj4|# d d df< qFjrj6}'|'d d d,f |'d d df  }(|(D })fd-d	|)D _fd.d	|)D _ fd/d	|)D _4fd0d	|)D _1|'|) _6|(|) }(d,d,gg|  }t?| D ],}#|(||#k }*|*E |*F }+},|,d,k r|,d,g||#< q|+d,krd,d,|+ g||#< qt"Gt"5|| |
 | 9t:|
 _H|d1kr%jI|d2s%d}d g| _Jd3d	 jD _K|rd4\}-}.d g| d g| _L_M|d5krPjNnjO}/tPtQR|/t?|}0t*tB|0|t+t)dkd6}1|1D ]:\}#}2|d5kr|-jK|# S jT7 }-n|2\jJ|#< jL|#< jM|#< |-jJ|# jU7 }-| d7|-|. d8d9| d:|1_Vqk|1W  d S d S );NFrj   )rY   z**r   Tr   c                    s(   g | ]}| d r|d  dn|qS )./r^   )
startswithreplacer   )parentrL   rM   r        ( z0LoadImagesAndLabels.__init__.<locals>.<listcomp>r   c                 s   s4    | ]}| d d  tv r|dtjV  qdS )r   r@   r  N)r   r   r   rv  rF   rp  r   rL   rL   rM   rN     s   2 z/LoadImagesAndLabels.__init__.<locals>.<genexpr>zNo images foundzError loading data from r   
r   z.cache)allow_pickleversionhashresults>   r   r@   	Scanning r4  	 images,  backgrounds,  corrupt)desctotalinitial
bar_formatmsgszNo labels found in z, can not start training. c                    rd  rL   )pop)rJ   k)r   rL   rM   r     re  )r|  r{  r  zAll labels empty in c                    s   g | ]}t | kqS rL   r   r   )	min_itemsrL   rM   r     s    r  z images filtered from datasetc                       g | ]} j | qS rL   im_filesrJ   rY  r   rL   rM   r   	  re  c                    r  rL   label_filesr  r   rL   rM   r   
  re  c                    r  rL   rl  r  r   rL   rM   r     re  c                    r  rL   segmentsr  r   rL   rM   r     re  r@   r^   c                    r  rL   r  r  r   rL   rM   r   )  re  c                    r  rL   r  r  r   rL   rM   r   *  re  c                    r  rL   r  r  r   rL   rM   r   +  re  c                    r  rL   r  r  r   rL   rM   r   ,  re  ram)r   c                 S   s   g | ]	}t |d qS ).npy)r   with_suffixrJ   r`  rL   rL   rM   r   @  s    r   i   @disk)r  r  disablezCaching images (.1fzGB ))Xr   r   r   r   r   mosaicmosaic_borderr   rG   r   albumentationsr   r   r  r   is_dirr  rS   is_filer]  r$  strip
splitlinesrw  rF   rp  r  r  r  ra   HELP_URLrr  r  r  r   loaditemcache_versionr[   cache_labelsr  r?   r   r   r   r{   rV   zipvaluesr  r   concatenaterl  r   shapeskeysnonzeroastyper   floorarangebatchrX  r   indicesreshaperG  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  close)3r   rG   r   r   r   r   r   r   r   r   r   r   r  r   r   r`  rK   te
cache_pathrH   r  nmnencrX  drl  r  nlincludebinbinclude_classinclude_class_arrayrY  labelsegmentjrg   arirectariminimaxibgbfcnr}  pbarr   rL   )r   r  rw  r   rM   r     s    
 """
((
("

 


(
"zLoadImagesAndLabels.__init__皙?c              
   C   s   d\}}t | jd}t|D ]"}tt| j}| jt	|j
d |j
d  }||j|d  7 }q|| j | }	t }
|	d|  |
jk }|sht| |	| dd|
j| dd|
j| dd	|rcd
nd  |S )Nr  r9  r   r^   rj   r  zGB RAM required, r  zGB available, u   caching images ✅u   not caching images ⚠️)r   rX  r   r    r&  r   choicer  r   r   r=  r  psutilvirtual_memory	availabler   r{   r  )r   safety_marginr   r  r  rX  r   r   ratiomem_requiredmemr   rL   rL   rM   r  P  s$   


z#LoadImagesAndLabels.check_cache_ramz./labels.cachec                 C   s  i }ddddg f\}}}}}| d|j |j  d}	| jdkrtt^}
t|
tt| j	| j
t||	t| j	td}|D ]<\	}}}}}}}}}||7 }||7 }||7 }||7 }|ra|||g||< |rh|| |	 d| d||  d| d|_q=W d    n1 sw   Y  nVtt| j	| j
t||	t| j	td}|D ]@}t|\	}}}}}}}}}||7 }||7 }||7 }||7 }|r|||g||< |r|| |	 d| d||  d| d|_q|  |rtd	| |dkrt| d
| dt  t| j
| j	 |d< ||||t| j	f|d< ||d< | j|d< zt|| |d| t| d|  W |S  ty[ } zt| d|j  d|  W Y d }~|S d }~ww )Nr   r~  ...)r  r  r  r   r  r  r  ry  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: )rw  stemr   r   r   r   r  verify_image_labelr  r  r  r   r   r   r  r  r  r   r{   rV   r   r  r[   r  r   saver  renamera   )r   rG   r   r   r  r  r  r  r  r  poolr  im_filelbr=  r  nm_fnf_fne_fnc_fmsgr   r  rL   rL   rM   r  a  st   


$
$
&z LoadImagesAndLabels.cache_labelsc                 C   rk  rE   )r   r  r   rL   rL   rM   r     r   zLoadImagesAndLabels.__len__c              	   C   s  | j | }| j}| jot |d k }|r<| |\}}d }t |d k r;t||g| td| jd R  \}}n}| |\}\}}\}	}
| j	rS| j
| j|  n| j}t||d| jd\}}}||f|	| |
| f|ff}| j|  }|jrt|d d dd f |d |
 |d |	 |d |d d|d d dd f< | jrt|||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 r>t|}|r>d|d d df  |d d df< t|df}|rUt||d d dd f< |dd d d }t |}t||| j!| |fS )Nr  r   r   r^   F)r   scaleup)padwpadhdegrees	translatescaleshearperspective)r  r  r  r  r  rm   TgMbP?)r[  rZ   clipepshsv_hhsv_shsv_v)hgainsgainvgainflipudrj   fliplrr\   r   r@   )"r  r   r  r   load_mosaicr   randintrX  r  r   r  r  r   r   r   rl  rj  rY   r'   r   r   r(   r=  r  r   r   r  r  r   zeros
from_numpyry   r   r  )r   indexr   r  rf   rl  r  h0w0rZ   r[  r=  r  r   r  
labels_outrL   rL   rM   __getitem__  s\   
*J
>
 
 
zLoadImagesAndLabels.__getitem__c           	      C   s   | j | | j| | j| }}}|d u rq| rt|}nt|}|d us/J d| |jd d \}}| j	t
|| }|dkre| jsK|dkrNtjntj}tj|t|| t|| f|d}|||f|jd d fS | j | | j| | j| fS )Nr  rj   r^   interpolation)r  r  r  rH   r   r  r    r&  r=  r   r   r   INTER_LINEAR
INTER_AREAresizerS  r  r  r  )	r   rY  r   r`  fnr
  r  rinterprL   rL   rM   r    s   "
(zLoadImagesAndLabels.load_imagec                 C   s6   | j | }| st| t| j|  d S d S rE   )r  rH   r   r  as_posixr    r&  r  )r   rY  r`  rL   rL   rM   r    s   
 z(LoadImagesAndLabels.cache_images_to_diskc                    sd  g g }}| j fdd| jD \}}|gtj| jdd }t| t|D ]4\}}| |\}}	\ |dkrutj	d d |j
d fdtjd}
t| dt|  d||f\}}}}||   ||   f\}}}}n|d	kr|t|  dt| d |f\}}}}d ||  t||  f\}}}}n_|dkrt| d||td |  f\}}}}||  dt||  f\}}}}n1|dkr||t| d td |  f\}}}}ddt|| t||  f\}}}}|||||f |
||||f< || || | j|  | j|  }}|jrSt|d d d	d f  |d d d	d f<  fd
d|D }|| || q(t|d}|d d d	d f g|R D ]}tj|dd |d qrt|
||| 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 )rj   Nr   r   uniformr   rg   rL   rM   rN        ( z2LoadImagesAndLabels.load_mosaic.<locals>.<genexpr>rk   r  r   rj   r   dtyper^   c                    s   g | ]
}t | qS rL   r%   r   )rZ   r  r  r[  rL   rM   r   $      z3LoadImagesAndLabels.load_mosaic.<locals>.<listcomp>outr   rK   r  r  r  r  r  r  r  r  r  r  border)r   r  r   choicesr  r   rG  r  r   fullr=  uint8r   r   rl  rj  r  rY   r'   r  r  r  r  r   r   r   )r   r	  labels4	segments4ycxcr  rY  rf   r   img4x1ay1ax2ay2ax1by1bx2by2brl  r  r   rL   )rZ   r  r  rg   r[  rM   r    sX   

&(&,(,(
0($0
 

zLoadImagesAndLabels.load_mosaicc                    s  g g }}| j |gtj| jdd }t| d\}}t|D ]K\}}| |\}}	\|dkrVtjd d |j	d fdtj
d}
}}  f n|d	kre  f n|dkrx|  |  f n|dkr| |   f nr|d
kr| | |  |  f n[|dkr|  | | |  f nD|dkrԈ| |  | | | |  f n)|dkr |  | f n|dkr | |  | | f  d d \dd  D \}}}}| j|  | j|  }}|jrGt|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 )Nr]   r  )r@   r@   r   rk   rj   r  r  r^   rl   rm   r\   rn   c                 s       | ]}t |d V  qdS r   N)r   r   rL   rL   rM   rN   ^      z3LoadImagesAndLabels.load_mosaic9.<locals>.<genexpr>c                    s   g | ]
}t | qS rL   r  r   )rZ   padxpadyr[  rL   rM   r   d  r   z4LoadImagesAndLabels.load_mosaic9.<locals>.<listcomp>c                 3   s     | ]}t td  V  qdS r7  r  )rJ   r   r  rL   rM   rN   m  s    c                    s   g | ]}|  qS rL   rL   r   )crL   rM   r   u  r3  r!  r   r#  r  r  r  r  r  r$  )r   r   r&  r  r   rG  r  r   r'  r=  r(  rl  rj  r  rY   r'   r  r  r  r  r   r  r   r   r   )r   r	  labels9	segments9r  hpwprY  rf   r   img9r
  r  x1y1x2y2rl  r  r+  r,  r   rL   )r;  rZ   r9  r:  rg   r[  rM   load_mosaic9<  st   

&
&&.$0

,$ 

z LoadImagesAndLabels.load_mosaic9c                 C   sN   t |  \}}}}t|D ]\}}||d d df< qt|dt|d||fS r  )r  rG  r   rV  cat)r  r   r  rG   r  rY  r  rL   rL   rM   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 ]x}|d9 }t dk rftj|| d	 ddd	d
d 
|| 
 }|| }nDtt|| ||d  fdt||d  ||d  fdfd}t|| ||d  |
 ||d  | ||d  |
 | fd| }|| || q<t|D ]\}}||d d df< qt|dt|d||	fS )Nrl   )r   r   r   r^   r   r   )r   r   r^   r   r   r   )r^   r^         ?rG  rG  rG  rG  r   g       @bilinearF)scale_factorr   align_cornersr^   rj   rk   )r  r   r   tensorr   r   Finterpolate	unsqueezerR  typerF  r  rG  rV  )r  r   r  rG   r  rX  im4label4path4shapes4howorg   rY  im1r  rL   rL   rM   r     s0   $
DD
zLoadImagesAndLabels.collate_fn4)r   rs  FNFFFFr   r   r   rO   r]   )r  rO   )r   r   r   r  r    INTER_NEARESTr  INTER_CUBICr  INTER_LANCZOS4rand_interp_methodsr   r  r   r  r   r  r  r  r  rE  staticmethodr   r   rL   rL   rL   rM   r     s<    
 
7	J:M
r   coco128c                 C   sr   t t|  d}tj|rt| t| tt	j	tt |  dddD ]}t
||t |j  q)d S )N_flatz/**/*.*Tr   )r   rS   rF   rG   rH   shutilrmtreemakedirsr   r  copyfilename)rG   new_pathfilerL   rL   rM   flatten_recursive  s   

$re  c              
   C   s.  t | } | d  rt| d nd  t| d}t|}t||dD ]}|jdd  t	v rt
t|dd d df }|jd d \}}t tt|gd }t | rt|}tjd	d
 |   D tjd}	W d    n1 s{w   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| qq$d S )Nclassificationr   r  r^   .r@   rj   r   c                 S   s   g | ]}|  qS rL   )r   r   rL   rL   rM   r     r3  z!extract_boxes.<locals>.<listcomp>r  
classifierr   z.jpgT)parentsg333333?rk   rl   zbox failure in )"r   r  r^  r_  r  rglobr   r   r   r   r    r&  rS   r=  rr  rH   r]  r   r   r$  r  r  float32rG  r   r  rw  mkdirr&   r  ravelr  r  imwrite)rG   r  rX  r  r   rZ   r[  lb_filer`  r  r  r   r;  r  rL   rL   rM   extract_boxes  s6   
((
Brp  zcoco128/images)g?r  r   c              	   C   s  t | } tdd | dD }t|}td tjg d||d}g d}|D ]}| j|  r9| j| 	  q)t
d|  d	|   tt|||d
D ]=\}}	|rat tt|	gd  rt| j||  d}
|
d|	| j  d  W d   n1 sw   Y  qNdS )a[   Autosplit a dataset into train/val/test splits and save path/autosplit_*.txt files
    Usage: from yolov5.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 )r^   N)r   r   r   r   rL   rL   rM   rN     r  zautosplit.<locals>.<genexpr>r   r   )r   r^   rj   )weightsr  )zautosplit_train.txtzautosplit_val.txtzautosplit_test.txtzAutosplitting images from z!, using *.txt labeled images onlyrg  art  ry  N)r   r  rj  r   r   r   r&  rw  rH   unlinkprintr   r  rr  rS   r]  writerelative_tor  )rG   rq  annotated_onlyr  rX  r  txtr   rY  rf   r`  rL   rL   rM   	autosplit  s$   
"ry  c                    sd  | \}}}dddddg f\}}}}} zst |}	|	  t|	}
|
d dk|
d dk@ s6J d|
 d|	j tv sEJ d|	j |	j dv rt|d	+}|d
d | dkrut	
t |j|dddd | d| d}W d    n1 sw   Y  tj|rrd}t|H}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 sw   Y  t|}|rg|jd dksJ d|jd  d|dk sJ d||dk   |d d dd f dk s6J d|d d dd f |d d dd f dk  tj|ddd \}}t||k rf|| } rW 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y } zd}| d| d%| }d d d d |||||g	W  Y d }~S d }~ww )&Nr   rO   	   r^   zimage size z <10 pixelszinvalid image format )r-   r,   rbrj   s   JPEGr8  )subsamplingqualityu   WARNING ⚠️ z!: corrupt JPEG restored and savedc                 S   s   g | ]
}t |r| qS rL   )r   r   r   rL   rL   rM   r     r   z&verify_image_label.<locals>.<listcomp>c                 s   s    | ]	}t |d kV  qdS )r\   Nr  r   rL   rL   rM   rN   	  s    z%verify_image_label.<locals>.<genexpr>c                 S   s   g | ]}|d  qS )r   rL   r   rL   rL   rM   r   
  r3  r  c                 S   s,   g | ]}t j|d d t jdddqS )r^   Nr  r@   rj   )r   r   rk  r  r   rL   rL   rM   r     s   , r@   rm   zlabels require 5 columns, z columns detectedznegative label values z,non-normalized or out of bounds coordinates T)r?  return_indexc                    s   g | ]} | qS rL   rL   r   r  rL   rM   r     r3  r   z duplicate labels removed)r   rm   z : ignoring corrupt image/label: )r	   r]  verifyri   formatr   r   seekr$  r
   r~   r  rF   rG   r
  r  r  r  r   r   rk  r  r  r#   r   r=  rf  rW  r  ra   )r   r  ro  r   r  r  r  r  r  r   r=  r`  r  classesr  r   rY  r  rL   r  rM   r    sb   

(
$$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 yolov5.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|\}}}z%tt|dd}t|}|r||d< W d    n1 s)w   Y  W n ty@ } ztd|d }~ww t|| t|d d | _| jd | _	| j	j
ddd |d	 t|d
  d| _|| _d S )Nignore)errorsrG   z!error/HUB/dataset_stats/yaml_loadz-hubr  T)ri  exist_okr  names)r  r  )_unzipr   r]  r   yaml	safe_loadra   r   hub_dirim_dirrl  r  r  statsdata)	r   rG   autodownloadzippeddata_dir	yaml_pathr`  r  r  rL   rL   rM   r   5  s&   



zHUBDatasetStats.__init__c                    s   t  dpt  d}|sJ d  t|dkr0 fdd|D }|s0J d  dt|dks@J d| d	  |d
 S )Nz*.yamlzNo *.yaml file found in r^   c                    s   g | ]
}|j  j kr|qS rL   )r  r  dirrL   rM   r   M  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  rj  r   )r  r  rL   r  rM   
_find_yamlG  s    zHUBDatasetStats._find_yamlc                 C   s~   t |dsdd |fS t| sJ d| dt||jd |d}| s5J d| d| dd	t || |fS )
Nz.zipFzError unzipping z, file not found)rG   rO   z, z6 not found. path/to/abc.zip MUST unzip to path/to/abc/T)	rS   endswithr   r  r$   rw  r  r  r  )r   rG   r  rL   rL   rM   r  R  s   

zHUBDatasetStats._unzip  c           	   
   C   s  | j t|j }z/t|}|t|j|j }|dk r,|t	|j| t	|j| f}|j
|dddd W d S  ty } zFtd| d|  t|}|jd d \}}|t|| }|dk rvtj|t	|| t	|| ftjd	}tt|| W Y d }~d S d }~ww )
Ng      ?r}  2   T)r  optimizeu#   WARNING ⚠️ HUB ops PIL failure r   rj   r  )r  r   rb  r	   r]  r   r   r   r  r   r  ra   r   r{   r    r&  r=  r  rn  rS   )	r   r`  max_dimf_newr   r  r  	im_heightim_widthrL   rL   rM   _hub_ops\  s"   
"
&zHUBDatasetStats._hub_opsc              	      sJ  dd  dD ]a}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 sw   Y  |rt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   r6  )rl   N)roundr   rL   rL   rM   rN   r  r8  zFHUBDatasetStats.get_json.<locals>._round.<locals>.<listcomp>.<genexpr>r   )rJ   r;  pointsrL   rL   rM   r   r  rx  z<HUBDatasetStats.get_json.<locals>._round.<locals>.<listcomp>rL   r  rL   rL   rM   _roundp  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)r   bincountr  r   r  )rJ   r  r   rL   rM   r   y  s    $z,HUBDatasetStats.get_json.<locals>.<listcomp>
Statisticsr  r  r   )r  	per_classr^   )r  
unlabelledr  c                    s*   g | ]\}}t t|j | iqS rL   )rS   r   rb  tolist)rJ   r  v)r  rL   rM   r     s    )instance_statsimage_statsrl  z
stats.jsonzSaving r  r[  rj   F)indent	sort_keys)r  rq   r  r   r   r   r   rl  rX  r   rP   r  rf  r  r  r  rt  r  r]  jsondumpdumps)r   r  verboser   r   r   
stats_pathr`  rL   )r  r   rM   get_jsonn  s:   



zHUBDatasetStats.get_jsonc                 C   sp   dD ]*}| j |d u rqt| j | }| d}ttt| j|j|j	|dD ]}q)qt
d| j  | jS )Nr  z imagesr  zDone. All images saved to )r  rq   r   r   r   r   r  r  r  rX  rt  r  )r   r   r   r  r   rL   rL   rM   process_images  s   
$zHUBDatasetStats.process_imagesN)r  F)r  )FF)r   r   r   r   r   r[  r  r  r  r  r  rL   rL   rL   rM   r  &  s    





#r  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   rL   rL   rM   r     s   * z2ClassificationDataset.__init__.<locals>.<listcomp>)	r   r   r   torch_transformsr   album_transforms	cache_ram
cache_disksamples)r   r  r   r   r   r   rL   rM   r     s   

zClassificationDataset.__init__c                 C   s   | j | \}}}}| jr|d u rt| }| j | d< n| jr5| s/t| t| t	|}nt|}| j
rN| j
t|tjdd }||fS | |}||fS )Nrk   )r|   r|   )r  r  r    r&  r  rH   r   r  r  r  r  cvtColorCOLOR_BGR2RGBr  )r   rY  r`  r  r  r   samplerL   rL   rM   r    s   

z!ClassificationDataset.__getitem__)F)r   r   r   r   r   r  r   rL   rL   r   rM   r    s    r     rs  c              
   C   s   t | t| |||d}W d    n1 sw   Y  t|t|}tj }	tt t	|	d |dkr7|nd|g}
|dkrBd nt
j||d}t }|dt  t|||o\|d u |
|tt|dS )N)r  r   r   r   r^   r   r@   r   r   )r   r   r   r   r   r   r   )r)   r  r   r   r   r   r   rF   r   r   r   r   r   r   rA   r   rB   r   )rG   r   r   r   r   r   r   r   r   r   r   r   r   rL   rL   rM    create_classification_dataloader  s$   
	
(
r  )FNFFr   Fr@   r]   FFrO   Fr   )r  rs  TFr@   r]   T)hr   r_   r  rQ   r  rS  rF   r   r^  r^  	itertoolsr   multiprocessing.poolr   r   pathlibr   	threadingr   urllib.parser   numpyr   r  r   torch.nn.functionalnn
functionalrL  torchvisionr  PILr   r	   r
   torch.utils.datar   r   r   r   r   yolov5.utils.augmentationsr   r   r   r   r   r   r   r   yolov5.utils.generalr   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   yolov5.utils.torch_utilsr)   r  r   r   r   getenvr?   rA   rS   r   rB   TAGSr  re   r[   ri   r~   r   r   r   r   r   r   r1  rr  r   re  rp  ry  r  r  datasetsImageFolderr  r  rL   rL   rL   rM   <module>   s   (L

61gV   |
"4y#