
    FPhSp                        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 d dlmZ d dlZd dlZd dlmZmZ d dlmZ d dlmZmZmZmZmZmZmZmZmZm Z  d dl!m"Z"m#Z#m$Z$ d d	l%m&Z&m'Z'm(Z( d d
l)m*Z* dZ+dZ,dZ- e. ej^                  dd            ja                         dk(  Z1d Z2d Z3dej$                  fdZ4d Z5d Z6d&dZ7d'dZ8d'dZ9dedefdZ:d(dZ;d)dZ< G d d       Z=d*d!Z>ed"z  d#d$fd%Z?y)+    N)
ThreadPool)Path)
is_tarfile)ImageImageOps)check_class_names)
DATASETS_DIRLOGGERNUM_THREADSROOTSETTINGS_YAMLTQDM	clean_urlcolorstremojis	yaml_load)
check_file
check_fontis_ascii)downloadsafe_download
unzip_file)segments2boxeszQSee https://docs.ultralytics.com/datasets/detect for dataset formatting guidance.)
bmpdngjpegjpgmpopngtiftiffwebppfm)asfavigifm4vmkvmovmp4mpegmpgtswmvwebm
PIN_MEMORYTtruec           	      "   t         j                   dt         j                   t         j                   dt         j                   }}| D cg c]9  }|j                  |j                  |d            j                  dd      d   dz   ; c}S c c}w )z0Define label paths as a function of image paths.imageslabels   .r   z.txt)ossepjoinrsplit)	img_pathssasbxs       aC:\Users\daisl\Desktop\realtime-object-detection\venv\Lib\site-packages\ultralytics/data/utils.pyimg2label_pathsr@       ss    xvbffX&266(&(ABIRSABGGAHHRO$++C3A6?SSSs   >Bc                     t        d | D              }t        j                  t        |      j	                               }|j                  dj                  |       j	                                |j                         S )z?Returns a single hash value of a list of paths (files or dirs).c              3      K   | ]C  }t         j                  j                  |      s#t         j                  j                  |       E y wN)r7   pathexistsgetsize).0ps     r?   	<genexpr>zget_hash.<locals>.<genexpr>(   s-     F5aBGGNN14Erwwq!5s
   $A$A )sumhashlibsha256strencodeupdater9   	hexdigest)pathssizehs      r?   get_hashrU   &   sV    F5FFDs4y'')*AHHRWWU^""$%;;=    imgc                    | j                   }| j                  dk(  rVt        j                  t              5  | j                         }|r |j                  dd      }|dv r
|d   |d   f}ddd       |S |S # 1 sw Y   |S xY w)z Returns exif-corrected PIL size.JPEGi  N)      r5   r   )rS   format
contextlibsuppress	Exceptiongetexifget)rW   sexifrotations       r?   	exif_sizere   .   sy    A
zzV  +;;=D88C.v%!ad
A , H1H , Hs   3A44A>c                    | \  \  }}}d\  }}}	 t        j                  |      }|j                          t        |      }|d   |d   f}|d   dkD  |d   dkD  z  sJ d| d       |j                  j                         t        v sJ d|j                          |j                  j                         dv r}t        |d	      5 }	|	j                  d
d       |	j                         dk7  rCt        j                  t        j                  |            j                  |ddd       | d| d}ddd       d}||f|||fS # 1 sw Y   xY w# t        $ r}
d}| d| d|
 }Y d}
~
.d}
~
ww xY w)zVerify one image.)r   r   rJ   r5   r   	   image size  <10 pixelsinvalid image format r   r   rb      rY   d   subsamplingquality   WARNING ⚠️ !: corrupt JPEG restored and savedN : ignoring corrupt image/label: )r   openverifyre   r\   lowerIMG_FORMATSseekreadr   exif_transposesaver_   )argsim_fileclsprefixnfncmsgimshapefes              r?   verify_imager   ;   s~   !NWcFKBCUZZ 
		"q58$a1qA.P+eWK0PP.yy K/T3H1TT/99??/gt$r1668{*++EJJw,?@EEgvcdnqEr#HOG9<]^C	 %
  S>2r3&& %$  Uy0PQRPSTUs1   B2E	 A)D=+
E	 =EE	 		E(E##E(c                 
   | \  }}}}}}}dddddg df\  }}	}
}}}}	 t        j                  |      }|j                          t        |      }|d   |d   f}|d   dkD  |d   dkD  z  sJ d| d       |j                  j                         t        v sJ d|j                          |j                  j                         d	v r}t        |d
      5 }|j                  dd       |j                         dk7  rCt        j                  t        j                  |            j                  |ddd       | d| d}ddd       t        j                  j                  |      rd}	t        |      5 }|j                         j                         j!                         D cg c]  }t#        |      s|j%                           }}t'        d |D              r|st)        j*                  |D cg c]  }|d   	 c}t(        j,                        }|D cg c]:  }t)        j*                  |dd t(        j,                        j/                  dd      < }}t)        j0                  |j/                  dd      t3        |      fd      }t)        j*                  |t(        j,                        }ddd       t#              }|r]|rN|j4                  d   d||z  z   k(  sJ dd||z  z    d       |ddddf   j/                  d|      ddddf   }n5|j4                  d   dk(  sJ d|j4                  d    d       |ddddf   }|j7                         dk  sJ d||dkD             |j9                         dk\  sJ d||dk             |dddf   j7                         }||k  sJ dt;        |       d| d|dz
          t)        j<                  |dd !      \  }}t#        |      |k  r||   }|r|D cg c]  }||   	 }}| d| d"|t#        |      z
   d#}ngd}
t)        j>                  d|rd||z  z   ndft(        j,                        }n3d}t)        j>                  d|rd||z  z   ndft(        j,                        }|r|ddddf   j/                  d||      }|dk(  r_t)        j@                  |d$   dk  |d%   dk  z  d&d'      jC                  t(        j,                        }t)        j0                  ||d(   gd)      }|ddddf   }|||||||	|
||f
S # 1 sw Y   xY wc c}w c c}w c c}w # 1 sw Y   xY wc c}w # tD        $ r"}d}| d| d*| }ddddd||	|
||g
cY d}~S d}~ww xY w)+zVerify one image-label pair.r   rJ   Nr5   rg   rh   ri   rj   rk   rl   rm   rn   ro   rY   rp   rq   rt   ru   c              3   8   K   | ]  }t        |      d kD    yw)rZ   N)lenrG   r>   s     r?   rI   z%verify_image_label.<locals>.<genexpr>m   s     .2as1vz2s   dtype   zlabels require z columns eachzlabels require 5 columns, z columns detectedz,non-normalized or out of bounds coordinates znegative label values zLabel class z exceeds dataset class count z. Possible class labels are 0-T)axisreturn_index: z duplicate labels removed).r   ).r5                 ?).N)r   rv   )#r   rw   rx   re   r\   ry   rz   r{   r|   r   r}   r~   r7   rD   isfilestrip
splitlinesr   splitanynparrayfloat32reshapeconcatenater   r   maxminintuniquezeroswhereastyper_   )r   r   lb_filer   keypointnum_clsnkptndimnmr   ner   r   segments	keypointsr   r   r   r>   lbclassesnlpointsmax_cls_ikpt_maskr   s                               r?   verify_image_labelr   T   s   >B;GWfht/0!Q2r4/G,BBC9?CZZ 
		"q58$a1qA.P+eWK0PP.yy K/T3H1TT/99??/gt$r1668{*++EJJw,?@EEgvcdnqEr#HOG9<]^C	 % 77>>'"Bg!)*)9)D)D)FQ)FA#a&aggi)FQ.2.. hhb'9b!b'9LGZ\]Z\UV12bjj A I I"a PZ\H]Q)?PXAY(Z\]^BXXb

3  RB88A;1td{?;oPQTX[_T_P_Naan=oo;12Y..r48BQB?F88A;!+h/I"((ST+Vg-hh+12YFzz|q(m,XY_`fij`jYkXl*mm(vvx1}K(>r"q&zl&KK} QT(,,.') A"3w<.0MgY W33:Q;-AA) yy!$?1q6B;AB9:#;AHQK#;#HOG9BrCF{mKdeCXXqx1td{?QGrzzZB19q4$;!DBJJWB1ab5	))"dD9Iqy88Yv%6%:y?PST?T$UWZ\_`gghjhrhrsNNIx	7J+KRTU	2A2YE8YBBKKe %$ R'9]	 6 $<  Cy0PQRPSTdD$b"b"cBBCs   B2U A)T85U -/T5T&-T&?)T5(T+
4T5?T0AT5&EU 3U?DU T#U &T55T?:U 	U2U-'U2-U2c                 X   t        j                  | t         j                        }t        j                  |t         j                        }|j                  |j                  d   ddf      }t        j                  |||       | d   |z  | d   |z  }}t        j                  |||f      S )z
    Args:
        imgsz (tuple): The image size.
        polygons (list[np.ndarray]): [N, M], N is the number of polygons, M is the number of points(Be divided by 2).
        color (int): color
        downsample_ratio (int): downsample ratio
    r   r   r   rn   )colorr5   )
r   r   uint8asarrayint32r   r   cv2fillPolyresize)imgszpolygonsr   downsample_ratiomasknhnws          r?   polygon2maskr      s     88E*Dzz("((3H!2B :;HLLxu-Ah**E!H8H,HB::dRH%%rV   c                     t        j                  |D cg c]   }t        | |j                  d      g||      " c}      S c c}w )z
    Args:
        imgsz (tuple): The image size.
        polygons (list[np.ndarray]): each polygon is [N, M], N is number of polygons, M is number of points (M % 2 = 0)
        color (int): color
        downsample_ratio (int): downsample ratio
    r   )r   r   r   r   )r   r   r   r   r>   s        r?   polygons2masksr      s?     88\de\dWX\%!))B-%AQR\deffes   %A c                    t        j                  | d   |z  | d   |z  ft        |      dkD  rt         j                  nt         j                        }g }g }t        t        |            D ]T  }t        | ||   j                  d      g|d      }|j                  |       |j                  |j                                V t        j                  |      }t        j                  |       }t        j                  |      |   }t        t        |            D ]-  }	||	   |	dz   z  }||z   }t        j                  |d|	dz         }/ ||fS )z!Return a (640, 640) overlap mask.r   r5      r   r   )r   r   )a_mina_max)r   r   r   r   r   ranger   r   appendrK   r   argsortr   clip)
r   r   r   masksareasmssir   indexr   s
             r?   polygons2masks_overlapr      s#   HHeAh"22E!H@P4PQ'*8}s':288JEE	BCM"EHRL$8$8$<#=P`hij
		$TXXZ  # JJuEJJvE	"e	B3x=!!uAQa!e4 " %<rV   rD   returnc                    t        | j                  d            xs t        | j                  d            }|sJ d| j                          d       t	        |      dkD  r)|D cg c]  }|j
                  | j
                  k(  s|  }}t	        |      dk(  s'J d| j                          dt	        |       d|        |d   S c c}w )	a  
    Find and return the YAML file associated with a Detect, Segment or Pose dataset.

    This function searches for a YAML file at the root level of the provided directory first, and if not found, it
    performs a recursive search. It prefers YAML files that have the samestem as the provided path. An AssertionError
    is raised if no YAML file is found or if multiple YAML files are found.

    Args:
        path (Path): The directory path to search for the YAML file.

    Returns:
        (Path): The path of the found YAML file.
    z*.yamlzNo YAML file found in ''r5   zExpected 1 YAML file in 'z', but found z.
r   )listglobrglobresolver   stem)rD   filesr   s      r?   find_dataset_yamlr      s     8$%Cdjj.B)CE=+DLLN+;1==5
5zA~!9EqQVVtyy%8E9u:?k77G}UXY^U_T``cdicjkk?8O :s   $CCc           
      	   t        |       d}t        t        t        f      rSt	        j
                        st              r3t        t        dd      }t        t        |z        j                  d}}t        t        t        f      rt        d      dD ]S  }|vs|dk(  r.dv r*t        j                  d	       j                  d      d<   ;t        t!        |  d
| d             dvrdvrt        t!        |  d            dv rDdv r@t#        d         d   k7  r,t        t!        |  dt#        d          dd    d            dvr#t%        d         D cg c]  }d| 	 c}d<   nt#        d         d<   t'        d         d<   t        |xs8 j)                  d      xs% t        j)                  dd            j                        }|j+                         st        |z  j-                         }|d<   dD ]  }j)                  |      st        |   t              rb||   z  j-                         }|j/                         s-|   j1                  d      r||   dd z  j-                         }t        |      |<   |   D cg c]  }t        ||z  j-                                 c}|<    fddD        \  }}	}
}|	rt        |	t2              r|	n|	gD cg c]  }t        |      j-                          }	}t5        d |	D              sft7        |       }d| d|	D cg c]  }|j/                         r| c}d    d}|r|rt        j8                  |       n|d t         d!t:         dz  }t=        |      t?        j>                         }d}|j1                  d"      r$|jA                  d#      rt        |t        d$       nN|j1                  d%      r/t        j                  d&| d'       tC        jD                  |      }ntG        |d(i       d)tI        t?        j>                         |z
  d*       d+}|d,v rd-| d.tK        d/t               nd0| d1}t        j                  d2| d3       tM        tO        d         rd4       S d5       S c c}w c c}w c c}w c c}w )6az  
    Download, verify, and/or unzip a dataset if not found locally.

    This function checks the availability of a specified dataset, and if not found, it has the option to download and
    unzip the dataset. It then reads and parses the accompanying YAML data, ensuring key requirements are met and also
    resolves paths related to the dataset.

    Args:
        dataset (str): Path to the dataset or dataset descriptor (like a YAML file).
        autodownload (bool, optional): Whether to automatically download the dataset if not found. Defaults to True.

    Returns:
        (dict): Parsed dataset information and paths.
    rJ   TFdirunzipdelete)append_filename)trainvalr   
validationuQ   WARNING ⚠️ renaming data YAML 'validation' key to 'val' to match YOLO format. 'uE   :' key missing ❌.
'train' and 'val' are required in all data YAMLs.namesr   uI    key missing ❌.
 either 'names' or 'nc' are required in all data YAMLs.z 'names' length z
 and 'nc: z' must match.class_rD   	yaml_filer   r   testz../   Nc              3   @   K   | ]  }j                  |        y wrC   )ra   )rG   r>   datas     r?   rI   z$check_det_dataset.<locals>.<genexpr>#  s     U0T1488A;0Ts   )r   r   r   r   c              3   <   K   | ]  }|j                           y wrC   )rE   r   s     r?   rI   z$check_det_dataset.<locals>.<genexpr>&  s     +s!188:ss   z

Dataset 'u)   ' images not found ⚠️, missing path 'r   r   z%
Note dataset download directory is 'z'. You can update this in 'http.zip)urlr   r   bash zRunning z ...yaml(r5   zs))r   Nu   success ✅ z, saved to boldzfailure u    ❌zDataset download 
z	Arial.ttfzArial.Unicode.ttf)(r   
isinstancerN   r   zipfile
is_zipfiler   r   r	   r   parentr   r
   infopopSyntaxErrorr   r   r   r   ra   is_absoluter   rE   
startswithr   allr   warningr   FileNotFoundErrortimeendswithr7   systemexecroundr   r   r   )datasetautodownloadextract_dirnew_dirkr   rD   r>   r   r   r   rb   namemtrdtr   s                    @r?   check_det_datasetr     s     gD K$d$'*<*<T*BjQUFV,d5Q !78$(KK\ $d$t4 D=Ezld2op"hh|4U!gYb+qrsu u  dt4/&G9,v!wxyy$44<CW,>$t*,L&G9,<Sg=O<PPZ[_`d[eZffs!tuvvd/4T$Z/@A/@!6!/@AWg'T
%d7m4DM Ytxx/Y4b8Q3R3Y3YZDt#,,.DL#88A;$q'3'DG^,,.xxzd1g&8&8&?Q+446Aa&Q>B1gFg3q1134gFQ $ V0TUE3a
2<S$2G3cU+RT+RQtAw +RT+s++W%DdV#LY\MoY\TUdedldldnaY\MopqMrLsstuA\q!=l^Kfgtfuuvww'**		AA||F#

6(:!dCg&hqc./IIaLQ'U499;?A./r2BRSW`R`,rd+hv|.L-MNhpqspttxfyAKK+A3b12htG}5{OK <OOKa B( G
 U Nps   .R:'#R?< SS	
S	
c                 T   t        |       j                  d      rt        | t        dd      } t	        |       } | j                         r| nt        | z  j                         }|j                         st        j                  d| d       t        j                         }t        |       dk(  r#t        j                  dt        d	z   dd
       nd|  d}t        ||j                         dt        j                         |z
  ddt        d|       d}t        j                   |       |dz  }|dz  j#                         r|dz  n|dz  j#                         r|dz  nd}|dz  j#                         r|dz  nd}|dk(  r|st        j                  d       n|dk(  r|st        j                  d       t%        |dz  j'                  d      D 	cg c]  }	|	j                         s|	 c}	      }
|dz  j)                         D 	cg c]  }	|	j                         s|	j*                  ! }}	t-        t/        t1        |                  }|||dj3                         D ]-  \  }}t        | d       d| d}|t        j                   |       3|j5                  d      D cg c](  }|j6                  d d j9                         t:        v s'|* }}t%        |      }t%        |D ch c]  }|j                   c}      }|d!k(  r>|dk(  rt=        t?        |  d"| d#            t        j                  | d$| d%| d&       ||
k7  r%t        j                  | d$| d%| d'|
 d(| 	       t        j                   | d$| d%| d)       0 ||||
|d*S c c}	w c c}	w c c}w c c}w )+a  
    Checks a classification dataset such as Imagenet.

    This function accepts a `dataset` name and attempts to retrieve the corresponding dataset information.
    If the dataset is not found locally, it attempts to download the dataset from the internet and save it locally.

    Args:
        dataset (str | Path): The name of the dataset.
        split (str, optional): The split of the dataset. Either 'val', 'test', or ''. Defaults to ''.

    Returns:
        (dict): A dictionary containing the following keys:
            - 'train' (Path): The directory path containing the training set of the dataset.
            - 'val' (Path): The directory path containing the validation set of the dataset.
            - 'test' (Path): The directory path containing the test set of the dataset.
            - 'nc' (int): The number of classes in the dataset.
            - 'names' (dict): A dictionary of class names in the dataset.
    )zhttp:/zhttps:/TFr   u(   
Dataset not found ⚠️, missing path z, attempting download...imagenetr   zdata/scripts/get_imagenet.sh)shellcheckz=https://github.com/ultralytics/yolov5/releases/download/v1.0/r   )r   u   Dataset download success ✅ (z.1fzs), saved to r   r   r   r   r   Nr   uI   WARNING ⚠️ Dataset 'split=val' not found, using 'split=test' instead.uI   WARNING ⚠️ Dataset 'split=test' not found, using 'split=val' instead.*r   : ...*.*r5   r   r   u    :' no training images found ❌ z found z images in u(    classes: WARNING ⚠️ no images foundu     classes: ERROR ❌️ requires z classes, not u    classes ✅ )r   r   r   r   r   ) rN   r  r   r	   r   is_dirr   r
   r	  r  
subprocessrunr   r   r  r   r  rE   r   r   iterdirr  dict	enumeratesorteditemsr   suffixry   rz   r
  r   )r  r   data_dirr  r   rb   	train_setval_settest_setr>   r   r   r  vr   rD   r   r   filends                       r?   check_cls_datasetr4  ?  su   * 7|45\eT7mG">>+,2HRRTH??B8*LdefIIKw<:%NNU4*H#H"IJRV^bcQRYQZZ^_CShoo.,TYY[1_S,AxX^`hOiNjjlmA7"I#+e#3";";"=h	L	 ((* DLlCZ04 %-%6$>$>$@x& dH~gbc	&bc	(W,2237F7A188:a7F	GB&099;J;qxxzQVV;EJ6%=)*E $GXFLLN1s!W%&as#.9KK&'ggen_ndAB8M8M8OS^8^TnE_UBe4eddkke45BQw<+FgYbCc3d,effNNfXWRDB4Go#pqr&KtCcdfcgguvxuyz{vhgbTRDNO! O$ wUZ[[/ GJ `4s*   N&NNN#(N N &N%
c                   2    e Zd ZdZddZd Zd Zd	dZd Zy)
HUBDatasetStatsau  
    A class for generating HUB dataset JSON and `-hub` dataset directory.

    Args:
        path (str): Path to data.yaml or data.zip (with data.yaml inside data.zip). Default is 'coco128.yaml'.
        task (str): Dataset task. Options are 'detect', 'segment', 'pose', 'classify'. Default is 'detect'.
        autodownload (bool): Attempt to download dataset if not found locally. Default is False.

    Example:
        Download *.zip files from https://github.com/ultralytics/hub/tree/main/example_datasets
            i.e. https://github.com/ultralytics/hub/raw/main/example_datasets/coco8.zip for coco8.zip.
        ```python
        from ultralytics.data.utils import HUBDatasetStats

        stats = HUBDatasetStats('path/to/coco8.zip', task='detect')  # detect dataset
        stats = HUBDatasetStats('path/to/coco8-seg.zip', task='segment')  # segment dataset
        stats = HUBDatasetStats('path/to/coco8-pose.zip', task='pose')  # pose dataset
        stats = HUBDatasetStats('path/to/imagenet10.zip', task='classify')  # classification dataset

        stats.get_json(save=True)
        stats.process_images()
        ```
    c                 f   t        |      j                         }t        j                  d| d       || _        | j                  dk(  rt        |      }t        |      }||d<   n2| j                  t        |            \  }}}	 t        ||      }|r||d<   t        |d    d      | _
        | j                  dz  | _        | j                  j                  d	d	
       t        |d         t        |d   j                               d| _        || _        y# t        $ r}	t        d      |	d}	~	ww xY w)zInitialize class.z Starting HUB dataset checks for z....classifyrD   zerror/HUB/dataset_stats/initNz-hubr3   T)parentsexist_okr   )r   r   )r   r   r
   r  taskr   r4  _unzipr  r_   hub_dirim_dirmkdirr   r   valuesstatsr   )
selfrD   r;  r  	unzip_dirr   zippedr-  	yaml_pathr   s
             r?   __init__zHUBDatasetStats.__init__  s!   Dz!!#6tfDAB	99
""4(I$Y/D$DL*.++d4j*A'FHiG(LA#+DL tF|nD12llX-$6W.d7m>R>R>T9UV
	  G >?QFGs   D 	D0D++D0c                     t        |      j                  d      sdd|fS t        ||j                        }|j	                         sJ d| d| d       dt        |      t        |      fS )	zUnzip data.zip.r   FN)rD   zError unzipping z, z6 not found. path/to/abc.zip MUST unzip to path/to/abc/T)rN   r  r   r  r$  r   )rB  rD   rC  s      r?   r<  zHUBDatasetStats._unzip  s}    4y!!&)$$$t$++6	! 	Q%5dV2i[ IP $Q 	Q!S^%6y%AAArV   c                 \    t        || j                  t        |      j                  z         y)z*Saves a compressed image for HUB previews.N)compress_one_imager>  r   r  )rB  r   s     r?   _hub_opszHUBDatasetStats._hub_ops  s    1dkkDGLL89rV   c                 6     fd}dD ]<  }d j                   |<    j                  j                  |      }|1t        |      j	                  d      D cg c](  }|j
                  dd j                         t        v s'|* }}|s j                  dk(  rddl	m
}  | j                  |         }	t        j                  t        |	j                              j                  t               }
|	j"                  D ]  }|
|d   xx   dz  cc<    t        |	      |
j%                         d	t        |	      d|
j%                         d
|	j"                  D cg c]  \  }}t        |      j&                  |i c}}d j                   |<   ddlm}  | j                  |    j                   j                  dk(   j                  dk(        }	t        j,                  t/        |	j0                  t        |	      d      D cg c]J  }t        j2                  |d   j                  t               j5                          j                  d         L c}      }
t!        |
j7                               |
j7                  d      j%                         d	t        |	      t!        t        j8                  |
dk(  d      j7                               |
dkD  j7                  d      j%                         d
t;        |	j<                  |	j0                        D cg c]"  \  }}t        |      j&                   ||      i$ c}}d j                   |<   ? |rk j>                  dz  }tA        jB                  d|jE                          d       tG        |d      5 }tI        jJ                   j                   |       ddd       |r5tA        jB                  tI        jL                   j                   dd              j                   S c c}w c c}}w c c}w c c}}w # 1 sw Y   bxY w)z(Return dataset JSON for Ultralytics HUB.c                    j                   dk(  r| d   }nj                   dk(  r!| d   D cg c]  }|j                          }}n[j                   dk(  rA| d   j                  d   }t        j                  | d   | d   j                  |d      fd	      }nt        d
      t        | d   |      }|D cg c]  \  }}t        |d         gd |D         c}}S c c}w c c}}w )z:Update labels to integer class and 4 decimal place floats.detectbboxessegmentr   poser   r   r   r5   zUndefined dataset task.r   c              3   F   K   | ]  }t        t        |      d         yw)   N)r  floatr   s     r?   rI   z;HUBDatasetStats.get_json.<locals>._round.<locals>.<genexpr>  s     !Ef%a!"4fs   !)	r;  flattenr   r   r   r   
ValueErrorzipr   )r4   coordinatesr>   nrD  cr   rB  s          r?   _roundz(HUBDatasetStats.get_json.<locals>._round  s    yyH$$X.i'4::4FG4Fqqyy{4FGf$;'--a0 nnfX.>{@S@[@[\]_a@b-cefg !:;;4FX^_X^91fS1YF!Ef!EFX^__ H `s   C6"C!r   Nr#  r5   r8  r   )ImageFolder)total	per_class)r\  
unlabelledr]  )instance_statsimage_statsr4   YOLODatasetrO  rP  )img_pathr   use_segmentsuse_keypoints
Statisticsr\  descr   r   )	minlengthz
stats.jsonzSaving r"  wrn   F)indent	sort_keys)'rA  r   ra   r   r   r,  ry   rz   r;  torchvision.datasetsr[  r   r   r   r   r   r   imgstolistr  ultralytics.datarb  r   r   r4   bincountrT  rK   r  rV  im_filesr=  r
   r  r   rw   jsondumpdumps)rB  r~   verboserZ  r   rD   r   r   r[  r  r>   r   r  r1  rb  label
stats_paths   `                r?   get_jsonzHUBDatasetStats.get_json  sl   	` ,E $DJJu99=='D | $T
 0 0 7_ 71188AB<;M;M;OS^;^Q 7E_ yyJ&<%dii&67HHS1299#>!,,BbeHMH '
 "%W%&XXZ'1 "%W&'%&XXZ$1
 6=\\C5ATQQa )5AC	%D

5! 9%tyy/?+/993799	3I48II4GI HH!%gnnCL|!\^!\ KKe 3 3C 8 @ @ BdiiX\o^!\^ _
 "%QUUW%&UU1X__%6'8 "%W&)"&&a*;*?*?*A&B&'!e[[^%:%:%<$>
 >AAQAQSZSaSa=bd=bTQQfQi 1=bd	%e

5!S ,j 4JKK'*"4"4"6!7s;<j#&!		$**a( 'KK

4::a5IJzzk `,C^d '&s+   (O9?O9!O>?AP
'P	!PPc                    ddl m} dD ]  }| j                  j                  |       || j                  |   | j                        }t	        t
              5 }t        |j                  | j                  |j                        t        |      | d      D ]  } 	 ddd        t        j                  d| j                          | j                  S # 1 sw Y   xY w)	z$Compress images for Ultralytics HUB.r   ra  r   N)rc  r   z imagesrg  zDone. All images saved to )rp  rb  r   ra   r   r   r   imaprJ  rr  r   r
   r  r>  )rB  rb  r   r  poolr   s         r?   process_imageszHUBDatasetStats.process_images  s    0+Eyy}}U#+!499U+;$))LGK(Ddiiw7G7GHPST[P\fkellsctuA v )(	 , 	0>?{{	 )(s   ACC	N)zcoco128.yamlrM  F)FF)	__name__
__module____qualname____doc__rF  r<  rJ  ry  r}   rV   r?   r6  r6    s#    04B:M^rV   r6  c           	         	 t        j                  |       }|t        |j                  |j                        z  }|dk  r?|j                  t        |j                  |z        t        |j                  |z        f      }|j                  |xs | d|d       y# t        $ r}t        j                  d|  d|        t        j                  |       }|j                  dd \  }}|t        ||      z  }|dk  r@t        j
                  |t        ||z        t        ||z        ft        j                  	      }t        j                  t!        |xs |       |       Y d}~yd}~ww xY w)
at  
    Compresses a single image file to reduced size while preserving its aspect ratio and quality using either the Python
    Imaging Library (PIL) or OpenCV library. If the input image is smaller than the maximum dimension, it will not be
    resized.

    Args:
        f (str): The path to the input image file.
        f_new (str, optional): The path to the output image file. If not specified, the input file will be overwritten.
        max_dim (int, optional): The maximum dimension (width or height) of the output image. Default is 1920 pixels.
        quality (int, optional): The image compression quality as a percentage. Default is 50%.

    Example:
        ```python
        from pathlib import Path
        from ultralytics.data.utils import compress_one_image

        for f in Path('path/to/dataset').rglob('*.jpg'):
            compress_one_image(f)
        ```
    r   rY   T)rs   optimizeu#   WARNING ⚠️ HUB ops PIL failure r   Nrn   )interpolation)r   rw   r   heightwidthr   r   r~   r_   r
   r  r   imreadr   
INTER_AREAimwriterN   )	r   f_newmax_dimrs   r   r  r   	im_heightim_widths	            r?   rI  rI  $  s%   ,)ZZ]c"))RXX..s7C1-s299q=/ABCB

FGdC )9!BqcBCZZ] hhrl	8c)X..s7BX\!2C	A4F GWZWeWefBC
OR(()s   BB 	E$!B9EE$zcoco8/images)g?g?r   Fc                    t        |       } t        d | j                  d      D              }t        |      }t	        j
                  d       t	        j                  g d||      }g d}|D ]=  }| j                  |z  j                         s!| j                  |z  j                          ? t        j                  d|  d|z  z          t        t        ||      |	      D ]  \  }}	|r0t        t        t        |	      g      d         j                         s8t!        | j                  ||   z  d
      5 }
|
j#                  d|	j%                  | j                        j'                          dz          ddd        y# 1 sw Y   xY w)aL  
    Automatically split a dataset into train/val/test splits and save the resulting splits into autosplit_*.txt files.

    Args:
        path (Path, optional): Path to images directory. Defaults to DATASETS_DIR / 'coco8/images'.
        weights (list | tuple, optional): Train, validation, and test split fractions. Defaults to (0.9, 0.1, 0.0).
        annotated_only (bool, optional): If True, only images with an associated txt file are used. Defaults to False.

    Example:
        ```python
        from ultralytics.data.utils import autosplit

        autosplit()
        ```
    c              3   h   K   | ]*  }|j                   d d j                         t        v s'| , yw)r5   N)r,  ry   rz   r   s     r?   rI   zautosplit.<locals>.<genexpr>\  s-     W/188AB<3E3E3G;3V1/s   (22r#  r   )r   r5   rn   )weightsr  )zautosplit_train.txtzautosplit_val.txtzautosplit_test.txtzAutosplitting images from z!, using *.txt labeled images only)r\  az./r   N)r   r*  r   r   randomseedchoicesr  rE   unlinkr
   r  r   rV  r@   rN   rw   writerelative_toas_posix)rD   r  annotated_onlyr   rX  indicestxtr>   r   rW   r   s              r?   	autosplitr  J  s;   " :DWdjj/WWEE
A
KKNnnY1=G
LCKK!O##%[[1_$$&  KK,TF36Y\j6jjks7E*!43os3xj&A!&D!E!L!L!NdkkCF*C0A"S__T[[9BBDEFMN 10 500s   6?F  F		)r5   r5   )r5   )T)rJ   )Ni  2   )@r]   rL   rs  r7   r  r%  r  r   multiprocessing.poolr   pathlibr   tarfiler   r   numpyr   PILr   r   ultralytics.nn.autobackendr   ultralytics.utilsr	   r
   r   r   r   r   r   r   r   r   ultralytics.utils.checksr   r   r   ultralytics.utils.downloadsr   r   r   ultralytics.utils.opsr   HELP_URLrz   VID_FORMATSrN   getenvry   r0   r@   rU   re   r   r   r   r   r   r   r  r4  r6  rI  r  r  rV   r?   <module>r     s      	     +   
   82 2 2 E E K K 0^Ua<./5576A
T
5;; 
'2DCN&"g(D T ,[|D\N[ [|#)L  .0/Z_  OrV   