U
    Hc]                     @   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	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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- ddl.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z: ddl;m<Z< dZ=dddddddddg	Z>ddddddddd d!g
Z?ej@A D ]ZBej@eB d"kr qqd#d$ ZCd%d& ZDd'd( ZEdOd.d/ZFG d0d1 d1e$j"ZGG d2d3 d3ZHG d4d5 d5ZIG d6d7 d7ZJG d8d9 d9ZKd:d; ZLG d<d= d=e#ZMdPd?d@ZNe/dA fdBdCZOe/dA fdDdEZPe/dF dGd)fdHdIZQdJdK ZRdQdMdNZSdS )Rz
Dataloaders and dataset utils
    N)repeat)Pool
ThreadPool)Path)Thread)ZipFile)ExifTagsImageImageOps)
DataLoaderDataset
dataloaderdistributed)tqdm)Albumentationsaugment_hsv
copy_paste	letterboxmixuprandom_perspective)DATASETS_DIRLOGGERNUM_THREADScheck_datasetcheck_requirements
check_yaml	clean_strsegments2boxesxyn2xy	xywh2xyxy
xywhn2xyxy
xyxy2xywhn)torch_distributed_zero_firstz<https://github.com/ultralytics/yolov5/wiki/Train-Custom-DatabmpZdngjpegjpgZmpopngZtiftiffwebpZasfavigifZm4vZmkvZmovmp4ZmpegZmpgZwmv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 r4   D/var/www/html/VideoAnalyticsDashboard/src/./yolov5/utils/datasets.py	<genexpr>/   s      zget_hash.<locals>.<genexpr> )sumhashlibmd5strencodeupdatejoin	hexdigest)pathssizehr4   r4   r5   get_hash-   s    rC   c                 C   sj   | j }zJt|   t }|dkr6|d |d f}n|dkrN|d |d f}W n tk
rd   Y nX |S )N      r      )rA   dictZ_getexifitemsorientation	Exception)imgsrotationr4   r4   r5   	exif_size5   s    rN   c                 C   sn   |   }|dd}|dkrjtjtjtjtjtjtjtj	d|}|dk	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  rE   )            rD      rF   Nexif)getexifgetr	   FLIP_LEFT_RIGHT
ROTATE_180FLIP_TOP_BOTTOM	TRANSPOSE
ROTATE_270
TRANSVERSE	ROTATE_90	transposetobytesinfo)imagerT   rI   methodr4   r4   r5   exif_transposeD   s$    
rc   F        rF   r7   c                 C   s   |	r|rt d d}t|
* t| |||||	||t||||d}W 5 Q R X t|t|}tj	 }tt
 t|d d |dkr|nd|g}|
dkrd ntj||d}|rtnt}||||o|d k||d	|rtjntjd
|fS )NzNWARNING: --rect is incompatible with DataLoader shuffle, setting shuffle=FalseF)	augmenthyprectcache_images
single_clsstridepadimage_weightsprefixrO   rE   r   re   )shuffleT)
batch_sizero   num_workerssampler
pin_memory
collate_fn)r   warningr"   LoadImagesAndLabelsintminlentorchcudadevice_countr.   	cpu_countmaxr   DistributedSamplerr   InfiniteDataLoadercollate_fn4rt   )r/   imgszrp   rk   rj   rg   rf   cacherl   rh   rankZworkersrm   quadrn   ro   datasetndnwrr   loaderr4   r4   r5   create_dataloader^   s<    


,
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                    s2   t  j|| t| dt| j t   | _d S )Nbatch_sampler)super__init__object__setattr___RepeatSamplerr   __iter__iterator)selfargskwargs	__class__r4   r5   r      s    zInfiniteDataLoader.__init__c                 C   s   t | jjS r-   )ry   r   rr   r   r4   r4   r5   __len__   s    zInfiniteDataLoader.__len__c                 c   s"   t t| D ]}t| jV  qd S r-   )rangery   nextr   )r   ir4   r4   r5   r      s    zInfiniteDataLoader.__iter__)__name__
__module____qualname____doc__r   r   r   __classcell__r4   r4   r   r5   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 r-   )rr   )r   rr   r4   r4   r5   r      s    z_RepeatSampler.__init__c                 c   s   t | jE d H  q d S r-   )iterrr   r   r4   r4   r5   r      s    z_RepeatSampler.__iter__N)r   r   r   r   r   r   r4   r4   r4   r5   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 )
LoadImages      Tc                 C   s0  t t| }d|kr,ttj|dd}nJtj|rRtttj|d}n$tj	|rf|g}nt
d| ddd |D }d	d |D }t|t| }	}
|| _|| _|| | _|	|
 | _d
g|	 dg|
  | _d| _|| _t|r | |d  nd | _| jdks,td| dt dt d S )N*T	recursive*.*zERROR:  does not existc                 S   s&   g | ]}| d d  tkr|qS .re   )splitlowerIMG_FORMATSr2   xr4   r4   r5   
<listcomp>   s      z'LoadImages.__init__.<locals>.<listcomp>c                 S   s&   g | ]}| d d  tkr|qS r   )r   r   VID_FORMATSr   r4   r4   r5   r      s      Fra   r   zNo images or videos found in z!. Supported formats are:
images: z	
videos: )r;   r   resolvesortedglobr.   r/   isdirr>   isfilerJ   ry   img_sizerk   filesnf
video_flagmodeautoany	new_videocapAssertionErrorr   r   )r   r/   r   rk   r   r3   r   imagesZvideosninvr4   r4   r5   r      s,    


zLoadImages.__init__c                 C   s
   d| _ | S Nr   countr   r4   r4   r5   r      s    zLoadImages.__iter__c                 C   sb  | j | jkrt| j| j  }| j| j  rd| _| j \}}|s|  j d7  _ | j  | j | jkrjtq<| j| j  }| 	| | j \}}q<|  j
d7  _
d| j d  d| j d| j
 d| j d| d}nJ|  j d7  _ t|}|d k	std| d	| j  d| j d
| d}t|| j| j| jdd }|dd d d }t|}|||| j|fS )NvideorE   zvideo /z (z) : Image Not Found zimage  rk   r   r   rO   r   rE   re   )r   r   StopIterationr   r   r   r   readreleaser   frameframescv2imreadr   r   r   rk   r   r^   npascontiguousarray)r   r/   ret_valimg0rL   rK   r4   r4   r5   __next__   s0    

2

zLoadImages.__next__c                 C   s*   d| _ t|| _t| jtj| _d S r   )r   r   VideoCapturer   rw   rV   CAP_PROP_FRAME_COUNTr   )r   r/   r4   r4   r5   r      s    zLoadImages.new_videoc                 C   s   | j S r-   )r   r   r4   r4   r5   r      s    zLoadImages.__len__N)r   r   T)r   r   r   r   r   r   r   r   r4   r4   r4   r5   r      s
   
&r   c                   @   s.   e Zd ZdddZdd Zdd	 Zd
d ZdS )
LoadWebcam0r   r   c                 C   sD   || _ || _| rt|n|| _t| j| _| jtj	d d S )NrP   )
r   rk   	isnumericevalpiper   r   r   setCAP_PROP_BUFFERSIZE)r   r   r   rk   r4   r4   r5   r      s
    zLoadWebcam.__init__c                 C   s
   d| _ | S Nre   r   r   r4   r4   r5   r      s    zLoadWebcam.__iter__c                 C   s   |  j d7  _ tdtdkr6| j  t  t| j \}}t	|d}|sdt
d| j d}d| j  d}t|| j| jdd }|d	d d d
 }t|}|||d |fS )NrE   qzCamera Error z
webcam.jpgzwebcam r   )rk   r   r   re   )r   r   waitKeyordr   r   destroyAllWindowsr   r   flipr   r   r   r   rk   r^   r   r   )r   r   r   Zimg_pathrL   rK   r4   r4   r5   r      s    

zLoadWebcam.__next__c                 C   s   dS r   r4   r   r4   r4   r5   r     s    zLoadWebcam.__len__N)r   r   r   )r   r   r   r   r   r   r   r4   r4   r4   r5   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streams.txtr   r   Tc                    s  d _ | _| _tj|rNt| }dd |  	 D }W 5 Q R X n|g}t
|}d g| dg| dg| d g| f\ _ _ _ _dd |D  _| _t|D ]\}}|d  d| d| d	}	d
|ksd|krtd dd l}
|
|jddj}| rt|n|}t|}| sDt|	 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|< t)*|	 d j|  d| d| d j| dd
  j| +  qt)*d t,- fdd jD }t,j.|ddj/d dk _0 j0st)1d d S )Nstreamc                 S   s    g | ]}t | r| qS r4   )ry   stripr   r4   r4   r5   r   $  s      z(LoadStreams.__init__.<locals>.<listcomp>r   c                 S   s   g | ]}t |qS r4   )r   r   r4   r4   r5   r   *  s     rE   r   r   z... zyoutube.com/z	youtu.be/)pafyzyoutube_dl==2020.12.2r+   )ZpreftypezFailed to open infd      T)targetr   daemonz
 Success (z frames r   z at z.2fz FPS)r7   c                    s(   g | ] }t | j j jd d jqS r   r   )r   r   rk   r   shaper   r   r4   r5   r   C  s     )axiszWWARNING: Stream shapes differ. For optimal performance supply similarly-shaped streams.)2r   r   rk   r.   r/   r   openr   r   
splitlinesry   imgsfpsr   threadssourcesr   	enumerater   r   newZgetbesturlr   r   r   r   isOpenedr   rw   rV   CAP_PROP_FRAME_WIDTHCAP_PROP_FRAME_HEIGHTCAP_PROP_FPSr~   r   floatmathisfiniter   r=   r   r`   startr   stackuniquer   rh   ru   )r   r   r   rk   r   fnr   rL   str   r   wrB   r   _r4   r   r5   r     sD    
&4
&*6
zLoadStreams.__init__c           	      C   s   d| j | d  }}}| r||k r|d7 }|  || dkr| \}}|r^|| j|< n*td t| j| | j|< |	| t
d| j|   qd S )Nr   rE   zKWARNING: Video stream unresponsive, please check your IP camera connection.)r   r  grabretriever   r   ru   r   
zeros_liker   timesleepr   )	r   r   r   r   r  r  r   successimr4   r4   r5   r=   H  s    

zLoadStreams.updatec                 C   s
   d| _ | S r   r   r   r4   r4   r5   r   Y  s    zLoadStreams.__iter__c                    s     j d7  _ tdd  jD r4tdtdkr@t  t j	 } fdd|D }t
|d}|dd d d	f d
}t
|} j||d dfS )NrE   c                 s   s   | ]}|  V  qd S r-   )is_aliver   r4   r4   r5   r6   _  s     z'LoadStreams.__next__.<locals>.<genexpr>r   c                    s,   g | ]$}t | j j jo jd d qS r   )r   r   rk   rh   r   r   r   r4   r5   r   e  s     z(LoadStreams.__next__.<locals>.<listcomp>r   .re   )r   rP   rE   rO   r7   )r   allr   r   r   r   r   r   r   copyr   r	  r^   r   r   )r   r   rK   r4   r   r5   r   ]  s    &

zLoadStreams.__next__c                 C   s
   t | jS r-   )ry   r   r   r4   r4   r5   r   p  s    zLoadStreams.__len__N)r   r   r   T)r   r   r   r   r=   r   r   r   r4   r4   r4   r5   r     s
   
+r   c                    s6   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 )rE   r   r   z.txt)r>   rsplitr   sasbr4   r5   r   w  s     z#img2label_paths.<locals>.<listcomp>)r.   sep)Z	img_pathsr4   r  r5   img2label_pathst  s    "r   c                   @   sl   e Zd Z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edd Zedd ZdS )rv   g333333?r      FNr   rd   r7   c           -         s  |_ |_|_|_|r dn|_jo2j _| d | d g_|
_|_|rbt	 nd _
zg }t|tr||n|gD ]}t|}| r|tjt|d d dd7 }q| rt|<}|   }t|jtj |fdd|D 7 }W 5 Q R X qt| | d	qtd
d |D _jsJt| dW nB tk
r } z"t| d| d| dt W 5 d }~X Y nX tj_| r|ntjd j d}zNt!j"|dd# d  } d j$kst d t%jj kstW n( tk
r6   &||d  }Y nX  'd\}}}}}|rd| d| d| d| d| d}t(d || ||d  d rt)*d+ d  |dks|rt| d| d t  fd!dd"D  t, -  \}}_.t|_/t!j0|t!j1d#_2t 3 _t 3 _t4|}t!5t!6|| 7t!j8}|d$ d% }|_9|_:t;|_<g }t!0|=d%d$}t>t,j/j.D ]\}\} }!|r| d d dd%f |k?d%}"| |" j/|< |!r|!|" j.|< |	rdj/| d d df< |!rdj.| d d df< qjrFj2}#|#d d d%f |#d d df  }$|$@ }%fd&d|%D _fd'd|%D _fd(d|%D _/|#|% _2|$|% }$d%d%gg| }t;|D ]V}|$||k }&|&A |&B  }'}(|(d%k r|(d%g||< n|'d%krd%d%|' g||< qt!Ct!0|| |
 | 7t!j8|
 _Dd g| d g|  _E_F|r|d)krttjd jG d* _Hfd+djD _FjHjIddd, d})d g| d g|  _J_KtLtMNjOt;|}*t(t>|*|d-}+|+D ]\}},|d)krNjF| P s8t!QjF| G |,d  |)jF| R jS7 })n,|,\jE|< jJ|< jK|< |)jE| jT7 })| d.|)d/ d0d1| d2|+_Uq|+V  d S )3NFrO   z**r   Tr   c                    s&   g | ]}| d r|d  n|qS )./)
startswithreplacer   )parentr4   r5   r     s     z0LoadImagesAndLabels.__init__.<locals>.<listcomp>r   c                 s   s2   | ]*}| d d  tkr|dtjV  qdS )r   re   r   N)r   r   r   r$  r.   r  r   r4   r4   r5   r6     s      z/LoadImagesAndLabels.__init__.<locals>.<genexpr>zNo images foundzError loading data from r   z
See r   z.cacheallow_pickleversionhashresults
Scanning 'z' images and labels...  found, 
 missing,  empty,  corrupt)desctotalinitialmsgs
zNo labels in z$. Can not train without labels. See c                    s   g | ]}  |qS r4   )pop)r2   k)r   r4   r5   r     s     )r)  r(  r3  dtypere   rE   c                    s   g | ]} j | qS r4   )	img_filesr2   r   r   r4   r5   r     s     c                    s   g | ]} j | qS r4   )label_filesr:  r   r4   r5   r     s     c                    s   g | ]} j | qS r4   r  r:  r   r4   r5   r     s     diskZ_npyc                    s"   g | ]} j t|d j qS ).npy)im_cache_dirr   with_suffixname)r2   r  r   r4   r5   r     s     parentsexist_okr1  zCaching images (g    eAz.1fzGB ))Wr   rf   rg   rm   rh   mosaicmosaic_borderrk   r/   r   albumentations
isinstancelistr   is_dirr   r;   is_filer   r   r   r   r%  r.   r  rJ   r   r9  r   HELP_URLr   r;  r@  r   loaditemcache_versionrC   cache_labelsr5  r   r   r`   r>   zipvaluessegmentsr  arrayfloat64shapeskeysry   floorarangeastyperw   batchr  r   indicesreshaper   r   argsortrx   r~   ceilbatch_shapesr   img_npyas_posixr?  mkdirimg_hw0img_hwr   r   imap
load_imager0   savestatst_sizenbytesr0  close)-r   r/   r   rp   rf   rg   rh   rm   ri   rj   rk   rl   rn   r  r3   te
cache_pathr0   r   nmnencr  dr  rX  binbZinclude_classZinclude_class_arrayr   labelsegmentjrL   arZirectZariZminiZmaxigbr*  pbarr   r4   )r   r%  r   r5   r   ~  s     

"0$"$
(

 


*

"zLoadImagesAndLabels.__init__z./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d}|D ]x\	}}}}}}}}}||7 }||7 }||7 }||7 }|r|||g||< |r|| |	 | d| d| d| d	|_qnW 5 Q R X |  |rtd	| |dkr4t| d
| dt  t| j	| j |d< ||||t| jf|d< ||d< | j|d< z4t|| |d| t| d|  W n@ tk
r } z t| d|j  d|  W 5 d }~X Y nX |S )Nr   r+  z' images and labels...)r0  r1  r,  r-  r.  r/  r4  zWARNING: No labels found in z. See r)  r*  r3  r(  z
.cache.npyzNew cache created: zWARNING: Cache directory z is not writeable: )r%  stemr   r   r   rh  verify_image_labelrS  r9  r;  r   ry   appendr0  rn  r   r`   r>   ru   rN  rC   rQ  r   rj  r@  renamerJ   )r   r/   rn   r   rr  r   rs  rt  r3  r0  poolr}  im_filelbr   rU  Znm_fZnf_fZne_fZnc_fmsgrp  r4   r4   r5   rR    sD    
 
.

.z LoadImagesAndLabels.cache_labelsc                 C   s
   t | jS r-   )ry   r9  r   r4   r4   r5   r   !  s    zLoadImagesAndLabels.__len__c              	   C   s  | j | }| j}| jo$t |d k }|rv| |\}}d }t |d k rtt||f| td| jd  \}}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rtt|||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 )NrG  r   r   rE   F)r   Zscaleup)padwpadhdegrees	translatescaleshearperspective)r  r  r  r  r  rR   TgMbP?)r  rB   clipepsZhsv_hZhsv_sZhsv_v)ZhgainZsgainZvgainflipudrO   fliplrrD   r   re   )"r^  rg   rG  randomload_mosaicr   randintr  ri  rh   rb  r]  r   r   rf   r  r  rA   r    r   ry   r!   r   rI  r   r   r  r  rz   zeros
from_numpyr^   r   r9  )r   indexrg   rG  rK   r  rX  h0w0rB   r  r   ratiorl   nlZ
labels_outr4   r4   r5   __getitem__*  sX    
*J
>
 
 
zLoadImagesAndLabels.__getitem__c                 C   s   | j | }|d kr| j| }|r4| r4t|}n*| j| }t|}|d k	s^td| |j	d d \}}| j
t|| }|dkrtj|t|| t|| f| js|dkrtjntjd}|||f|j	d d fS | j | | j| | j| fS d S )Nr   rO   rE   interpolation)r   rc  r0   r   rO  r9  r   r   r   r   r   r~   resizerw   rf   INTER_LINEAR
INTER_AREArf  rg  )r   r   r  Znpyr  r  r  rr4   r4   r5   ri  s  s"    



zLoadImagesAndLabels.load_imagec                    sh  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 f|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 )rO   Nrw   r  uniformr   rL   r4   r5   r6     s     z2LoadImagesAndLabels.load_mosaic.<locals>.<genexpr>rP   r6  r   rO   r   r7  rE   c                    s   g | ]}t | qS r4   r   r   )rB   r  r  r  r4   r5   r     s     z3LoadImagesAndLabels.load_mosaic.<locals>.<listcomp>outr   )r3   r  r  r  r  r  r  r  r  r  r  border)r   rH  r  choicesr^  ro   r   ri  r   fullr   uint8r~   rx   r  r  rU  rA   r    r  extendconcatenater  r   rg   r   )r   r  Zlabels4Z	segments4ycxcr^  r   rK   r  img4Zx1aZy1aZx2aZy2aZx1bZy1bZx2bZy2br  rU  r   r4   )rB   r  r  rL   r  r5   r    sT    

&((
,(
,(
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 f|D ]}tj|dd |d qt|
||| jd | jd | jd | jd | jd | jd	\}
}|
|fS )NrF   r  )re   re   r   rP   rO   r  r7  rE   rQ   rR   rD   rS   c                 s   s   | ]}t |d V  qdS r   N)r~   r   r4   r4   r5   r6     s     z3LoadImagesAndLabels.load_mosaic9.<locals>.<genexpr>c                    s   g | ]}t | qS r4   r  r   )rB   padxpadyr  r4   r5   r     s     z4LoadImagesAndLabels.load_mosaic9.<locals>.<listcomp>c                 3   s   | ]}t td  V  qdS r  r  )r2   r  r  r4   r5   r6     s     c                    s   g | ]}|  qS r4   r4   r   )cr4   r5   r     s     r  r  r  r  r  r  r  )r   r  r  r^  ro   r   ri  r   r  r   r  r  r  rU  rA   r    r  r  rH  r  rV  r  r   rg   )r   r  Zlabels9Z	segments9r^  hpZwpr   rK   r  Zimg9r  r  x1y1x2y2r  rU  r  r  r   r4   )r  rB   r  r  rL   r  r5   load_mosaic9  sn    

&
 

&
&
.

$0

,$
z LoadImagesAndLabels.load_mosaic9c                 C   sN   t |  \}}}}t|D ]\}}||d d df< qt|dt|d||fS r   )rS  r   rz   r	  cat)r]  rK   rx  r/   rX  r   r  r4   r4   r5   rt   
  s    zLoadImagesAndLabels.collate_fnc              
   C   s  t |  \}}}}t|d }g g |d | |d | f\}}}}	tddddddgg}
tddddddgg}tddddddg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| }|| || qt|D ]\}}||d d df< qt|dt|d||	fS )NrQ   rd   r   rE   g      ?g       @bilinearF)scale_factorr   align_cornersrO   rP   )rS  ry   rz   tensorr   r  Finterpolate	unsqueezer  typer  r  r   r	  )r]  rK   rx  r/   rX  r  r  Zlabel4Zpath4Zshapes4ZhoZworL   r   r  r  r4   r4   r5   r     s,    $

DD
zLoadImagesAndLabels.collate_fn4)r   r!  FNFFFFr   rd   r7   )r   r   r   rQ  r   r   rR  r   r  ri  r  r  staticmethodrt   r   r4   r4   r4   r5   rv   z  s$             
$	I8J
rv   ./newc                 C   s$   t j| rt|  t |  d S r-   )r.   r/   r0   shutilrmtreemakedirsr/   r4   r4   r5   create_folder-  s    
r  Zcoco128c                 C   sV   t t| d }t| ttjtt | d ddD ]}t||t |j  q6d S )NZ_flatz/**/*.*Tr   )r   r;   r  r   r   r  copyfilerA  )r/   new_pathfiler4   r4   r5   flatten_recursive4  s    "r  c              
   C   s  t | } | d  r"t| d nd  t| d}t|}t||dD ]}|jdd  t	krHt
t|dd d df }|jd d \}}t tt|gd }t | rHt|,}tjd	d
 |   D tjd}	W 5 Q R X t|	D ] \}
}t|d }| d |  | j d|j d|
 d }|j sJ|jjdd |dd  ||||g }|dd  d d |dd < t|dd tj}t |ddg d||ddg< t |ddg d||ddg< t
!t|||d |d |d |d f st"d| qqHd S )NZ
classifierr   rE  rE   .re   rO   r   c                 S   s   g | ]}|  qS r4   )r   r   r4   r4   r5   r   L  s     z!extract_boxes.<locals>.<listcomp>r7  r  z.jpgT)rC  g333333?rP   rQ   zbox failure in )#r   rL  r  r  rK  rglobry   r   suffixr   r   r   r;   r   r   r0   r   r   rV  r   r   r   float32r   rw   r~  r%  re  r   r_  ravelr\  r  imwriter   )r/   r   r  r  r  rB   r  lb_filer  r  rz  r   r  br4   r4   r5   extract_boxes<  s.    
0(r  zcoco128/images)g?g?rd   c           
   
      s   t   tdd  dD }t|}td tjdddg||d}dd	d
g} fdd|D  td  d|   tt	|||dD ]d\}}|rt t
t|gd  rt j||  d$}	|	d| j  d  W 5 Q R X qdS )aQ   Autosplit a dataset into train/val/test splits and save path/autosplit_*.txt files
    Usage: from utils.datasets 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kr|V  qdS )rE   N)r  r   r   r   r4   r4   r5   r6   g  s      zautosplit.<locals>.<genexpr>r   r   rE   rO   )weightsr6  zautosplit_train.txtzautosplit_val.txtzautosplit_test.txtc                    s   g | ]} j | jd dqS )T)
missing_ok)r%  unlinkr   r  r4   r5   r   m  s     zautosplit.<locals>.<listcomp>zAutosplitting images from z!, using *.txt labeled images onlyrE  ar"  r4  N)r   r   r  ry   r  seedr  printr   rS  r   r;   r0   r   r%  writerelative_tord  )
r/   r  Zannotated_onlyr   r  r^  txtr   rK   r  r4   r  r5   	autosplit^  s    

r  c                 C   s<  | \}}}dddddg f\}}}}}}	zt |}
|
  t|
}|d dk|d dk@ sltd| d|
j tkstd|
j |
j dkrt|d	L}|d
d |	 dkrt
t |j|dddd | d| d}W 5 Q R X 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 5 Q R X t|}|r|jd dkstd|jd  d|dk std||dk   |d d dd f dk sHtd|d d dd f |d d dd f dk  tj|ddd\}}t||k r|| }|	r|	| }	| d| d |t|  d!}nd}tjd"tjd}nd}tjd"tjd}||||	|||||f	W S  tk
r6 } z6d}| d| d#| }d d d d |||||g	 W Y S d }~X Y nX d S )$Nr   r7   	   rE   zimage size z <10 pixelszinvalid image format )r%   r$   rbrO   s   JPEGr   )Zsubsamplingqualityz	WARNING: z!: corrupt JPEG restored and savedc                 S   s   g | ]}t |r| qS r4   )ry   r   r   r4   r4   r5   r     s      z&verify_image_label.<locals>.<listcomp>c                 S   s   g | ]}t |d kqS )rF   )ry   r   r4   r4   r5   r     s     c                 S   s   g | ]}|d  qS )r   r4   r   r4   r4   r5   r     s     r7  c                 S   s,   g | ]$}t j|d d t jdddqS )rE   Nr7  re   rO   )r   rV  r  r_  r   r4   r4   r5   r     s     re   rR   zlabels require 5 columns, z columns detectedznegative label values z,non-normalized or out of bounds coordinates T)r   return_indexr   z duplicate labels removed)r   rR   z : ignoring corrupt image/label: )r	   r   verifyrN   r   formatr   r   seekr   r
   rc   rj  r.   r/   r   r   r   r   r   rV  r  r  r_  r   ry   r   r  r
  r  rJ   )r   r  r  rn   rr  r   rs  rt  r  rU  r  r   r  r  classesr  r  r   rp  r4   r4   r5   r  v  sV    

(
&$T r  coco128.yamlc              
      s  dd dd }d/ fdd	}|t | \}}}	tt|	dd	}
t|
}|rX||d
< W 5 Q R X t|| t |d
 |r|dnd }|d |d d}dD ]$}||dkrd||< qg }t|| }t|j	|j
ddD ].}|tj|dddf t|d d qt|}t| |d d|j
tt|dkd |dkd dfddt|j|j	D d||< |r|d   jddd ttt||j|j
ddD ]}qq|d  }|rtdD ]}|d!}t }t|| t }tj|dd"}td#t | d$d%|| d$d& |d'}t }t|d(}
t !||
 W 5 Q R X t }t|}
t |
}W 5 Q R X td)t | d$d%|| d$d& q|rtd*|"  d+ t|d(}
t !||
 W 5 Q R X |rtt j#|d,d-d. |S )0a0   Return dataset statistics dictionary with images and instances counts per split per class
    To run in parent directory: export PYTHONPATH="$PWD/yolov5"
    Usage1: from utils.datasets import *; dataset_stats('coco128.yaml', autodownload=True)
    Usage2: from utils.datasets import *; dataset_stats('path/to/coco128_with_yaml.zip')
    Arguments
        path:           Path to data.yaml or data.zip (with data.yaml inside data.zip)
        autodownload:   Attempt to download dataset if not found locally
        verbose:        Print stats dictionary
    c                 S   s   dd | D S )Nc                 S   s(   g | ] ^}}t |fd d |D qS )c                 s   s   | ]}t |d V  qdS )rQ   N)roundr   r4   r4   r5   r6     s     zAdataset_stats.<locals>.round_labels.<locals>.<listcomp>.<genexpr>)rw   )r2   r  pointsr4   r4   r5   r     s     z7dataset_stats.<locals>.round_labels.<locals>.<listcomp>r4   r<  r4   r4   r5   round_labels  s    z#dataset_stats.<locals>.round_labelsc                 S   sl   t | dr^t|  s*td|  dt| j| jd | d}dt |t	|
dfS dd | fS d S )	Nz.zipzError unzipping z, file not foundr  r7   Tz*.yamlF)r;   endswithr   rM  r   r   
extractallr%  r@  r   r  )r/   dirr4   r4   r5   unzip  s    
zdataset_stats.<locals>.unzip  c              
      s   t | j }z\t| }|t|j|j }|dk rV|t|j| t|j| f}|j	|dddd W n t
k
r
 } ztd|  d|  t| }|jd d \}}|t|| }|dk rtj|t|| t|| ftjd	}tt|| W 5 d }~X Y nX d S )
Ng      ?r  K   T)r  optimizezWARNING: HUB ops PIL failure r   rO   r  )r   rA  r	   r   r~   heightwidthr  rw   rj  rJ   r  r   r   r   r  r  r;   )r  Zmax_dimf_newr  r  rp  Z	im_heightZim_width)im_dirr4   r5   hub_ops  s    
"
&zdataset_stats.<locals>.hub_opsignore)errorsr/   z-hubr7   rt  names)rt  r   )trainvaltestNZ
Statistics)r1  r0  r   )	minlength)r1  	per_classrE   )r1  Z
unlabelledr  c                    s*   g | ]"\}}t t|j | iqS r4   )r;   r   rA  tolist)r2   r6  v)r  r4   r5   r     s     z!dataset_stats.<locals>.<listcomp>)Zinstance_statsZimage_statsr  r   TrB  zHUB Opsz
stats.jsonr>  r&  zstats.npy times: z.3fzs read, zs writez.jsonr  zstats.json times: zSaving z...rO   F)indent	sort_keys)r  )$r   r   r   yaml	safe_loadr   rV   rv   r   r  r  r  r   bincountr\  rw   rV  r8   r  r  rS  r9  re  r   r   rh  r   r@  r  rj  rO  r  jsondumpr   dumps)r/   Zautodownloadverboseprofilehubr  r  zippedZdata_dirZ	yaml_pathr  datahub_dirstatsr   r   r   rx  r  Z
stats_pathr  t1t2r4   )r  r  r5   dataset_stats  sr    



,


"
&

*r  )FNFFrd   Fre   rF   FFr7   F)r  )r  FFFF)Tr   r   r9   r  r  r.   r  r  r  	itertoolsr   Zmultiprocessing.poolr   r   pathlibr   	threadingr   zipfiler   r   numpyr   rz   Ztorch.nn.functionalnn
functionalr  r
  PILr   r	   r
   torch.utils.datar   r   r   r   r   Zutils.augmentationsr   r   r   r   r   r   utils.generalr   r   r   r   r   r   r   r   r   r   r    r!   utils.torch_utilsr"   rN  r   r   TAGSrY  rI   rC   rN   rc   r   r   r   r   r   r   r   rv   r  r  r  r  r  r  r4   r4   r4   r5   <module>   st    8
              
R*Y   6
"4