
    EPhL                        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m	Z	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mZmZmZmZmZmZmZmZ dZdZdd	d
ddZ dddddZ!dddddZ"d e#dgejH                  dd z          de de dZ%dZ&dZ'dZ(dZ)d Z*edfde
e#eeef   d efd!Z+d3d"Z,d# Z-d3d$ed%efd&Z.d'e	e#   d(e	e#   fd)Z/d'e	e#   d(dfd*Z0d'e	e#   d(dfd+Z1d, Z2d- Z3d4d/Z4d0 Z5e6d1k(  r
 e4d.2       yy)5    N)Path)SimpleNamespace)DictListUnion)ASSETSDEFAULT_CFGDEFAULT_CFG_DICTDEFAULT_CFG_PATHLOGGERRANKROOTRUNS_DIRSETTINGSSETTINGS_YAMLTESTS_RUNNINGIterableSimpleNamespace__version__checkscolorstrdeprecation_warn	yaml_load
yaml_print)trainvalpredictexporttrack	benchmark)detectsegmentclassifyposez
coco8.yamlzcoco8-seg.yaml
imagenet10zcoco8-pose.yaml
yolov8n.ptzyolov8n-seg.ptzyolov8n-cls.ptzyolov8n-pose.ptzmetrics/mAP50-95(B)zmetrics/mAP50-95(M)zmetrics/accuracy_top1zmetrics/mAP50-95(P)z
    Arguments received: yolo   z. Ultralytics 'yolo' commands use the following syntax:

        yolo TASK MODE ARGS

        Where   TASK (optional) is one of z+
                MODE (required) is one of a  
                ARGS (optional) are any number of custom 'arg=value' pairs like 'imgsz=320' that override defaults.
                    See all ARGS at https://docs.ultralytics.com/usage/cfg or with 'yolo cfg'

    1. Train a detection model for 10 epochs with an initial learning_rate of 0.01
        yolo train data=coco128.yaml model=yolov8n.pt epochs=10 lr0=0.01

    2. Predict a YouTube video using a pretrained segmentation model at image size 320:
        yolo predict model=yolov8n-seg.pt source='https://youtu.be/LNwODJXcvt4' imgsz=320

    3. Val a pretrained detection model at batch-size 1 and image size 640:
        yolo val model=yolov8n.pt data=coco128.yaml batch=1 imgsz=640

    4. Export a YOLOv8n classification model to ONNX format at image size 224 by 128 (no TASK required)
        yolo export model=yolov8n-cls.pt format=onnx imgsz=224,128

    5. Run special commands:
        yolo help
        yolo checks
        yolo version
        yolo settings
        yolo copy-cfg
        yolo cfg

    Docs: https://docs.ultralytics.com
    Community: https://community.ultralytics.com
    GitHub: https://github.com/ultralytics/ultralytics
    )warmup_epochsboxclsdfldegreesshear)dropoutioulr0lrfmomentumweight_decaywarmup_momentumwarmup_bias_lrlabel_smoothinghsv_hhsv_shsv_v	translatescaleperspectiveflipudfliplrmosaicmixup
copy_pasteconfr/   fraction)epochspatiencebatchworkersseedclose_mosaic
mask_ratiomax_det
vid_stride
line_width	workspacenbssave_period) saveexist_okverbosedeterministic
single_clsrectcos_lroverlap_maskr   	save_jsonsave_hybridhalfdnnplotsshowsave_txt	save_conf	save_cropshow_labels	show_conf	visualizeaugmentagnostic_nmsretina_masksboxeskerasoptimizeint8dynamicsimplifynmsprofilec                     t        | t        t        f      rt        |       } | S t        | t              rt        |       } | S )a<  
    Convert a configuration object to a dictionary, whether it is a file path, a string, or a SimpleNamespace object.

    Args:
        cfg (str | Path | dict | SimpleNamespace): Configuration object to be converted to a dictionary.

    Returns:
        cfg (dict): Configuration object in dictionary format.
    )
isinstancestrr   r   r   vars)cfgs    cC:\Users\daisl\Desktop\realtime-object-detection\venv\Lib\site-packages\ultralytics/cfg/__init__.pycfg2dictrv   N   s<     #T{#n J 
C	)3iJ    rt   	overridesc                    t        |       } |r3t        |      }d| vr|j                  dd       t        | |       i | |} dD ]2  }|| v st        | |   t        t
        f      s"t        | |         | |<   4 | j                  d      dk(  rC| j                  dd      j                  d      d   | d<   t        j                  d	| d    d
       | j                         D ][  \  }}|
|t        v rGt        |t        t
        f      s1t        d| d| dt        |      j                   d| d| d| d      |t         v rjt        |t        t
        f      s1t        d| d| dt        |      j                   d| d| d| d      d|cxk  rdk  rn t#        d| d| d| d      |t$        v r>t        |t              s.t        d| d| dt        |      j                   d| d| d      |t&        v st        |t(              r-t        d| d| dt        |      j                   d| d| d| d       t+        di | S )aQ  
    Load and merge configuration data from a file or dictionary.

    Args:
        cfg (str | Path | Dict | SimpleNamespace): Configuration data.
        overrides (str | Dict | optional): Overrides in the form of a file name or a dictionary. Default is None.

    Returns:
        (SimpleNamespace): Training arguments namespace.
    save_dirN)projectnamer|   model .r   u;   WARNING ⚠️ 'name=model' automatically updated to 'name='.'=z' is of invalid type z	. Valid 'z' types are int (i.e. 'z=0') or float (i.e. 'z=0.5')g        g      ?z' is an invalid value. Valid 'z!' values are between 0.0 and 1.0.z. 'z' must be an int (i.e. 'z=8')z' must be a bool (i.e. 'z=True' or 'z=False') )rv   popcheck_dict_alignmentrq   intfloatrr   getsplitr   warningitemsCFG_FLOAT_KEYS	TypeErrortype__name__CFG_FRACTION_KEYS
ValueErrorCFG_INT_KEYSCFG_BOOL_KEYSboolr   )rt   rx   kvs       ru   get_cfgr   _   s    3-C Y'	S MM*d+S),""	" 8
3q6C<8Q[CF  wwv'!gggr*005a8FTUXY_U`Taacde 		1=N":a#u+F!A3as*?Q@P@P?Q R**+,CA3F[\][^^d!f g g''!!c5\2#as!A3.CDGDTDTCU V../S0GsJ_`a_bbh%j k kqC$q1QC 0//0c1R&T U Ul":a+=!A3as*?Q@P@P?Q R$$%3&>qc!G H Hm#Jq$,?!A3as*?Q@P@P?Q R$$%3&>qcQCx!Y Z Z! ( #)S))rw   c                 r   t        | dd      r| j                  }t        |      S ddlm} | j                  xs, t
        rt        j                  dz  nt        | j                  z  }|xs | j                  xs | j                   } |t        |      |z  t        dv r| j                  nd      }t        |      S )	z<Return save_dir as created from train/val/predict arguments.rz   Nr   )increment_pathztests/tmp/runs)r   T)rR   )getattrrz   ultralytics.utils.filesr   r{   r   r   parentr   taskr|   moder   r   rR   )argsr|   rz   r   r{   s        ru   get_save_dirr      s     tZ&== > 	;,,m]4;;1A#AX`dhdmdm"m2tyy2tyyk!$w-$"6RVZaRagkl>rw   c                 8   | j                         j                         D ]x  }|dk(  r#t        |d       | j                  d      dk(  | d<   |dk(  r#t        |d       | j                  d      dk(  | d<   |dk(  sYt        |d       | j                  d      | d<   z | S )z4Hardcoded function to handle deprecated config keys.hide_labelsrb   False	hide_confrc   line_thicknessrM   )copykeysr   r   )customkeys     ru   _handle_deprecationr      s     {{}!!#-S-0$*JJ}$=$HF=!+S+."(**["9W"DF;""S,/#)::.>#?F<  $ Mrw   baser   c                 b   t        |      }d | |fD        \  }}|D cg c]	  }||vs| }}|rvddlm} d}|D ]V  }	 ||	|      }
|
D cg c]  }| j                  |      
| d| |    n|! }
}|
rd|
 dnd}|d	t	        d
d|	       d| dz  }X t        |t        z         |yc c}w c c}w )a  
    This function checks for any mismatched keys between a custom configuration list and a base configuration list. If
    any mismatched keys are found, the function prints out similar keys from the base list and exits the program.

    Args:
        custom (dict): a dictionary of custom configuration options
        base (dict): a dictionary of base configuration options
        e (Error, optional): An optional error that is passed by the calling function.
    c              3   N   K   | ]  }t        |j                                 y wN)setr   ).0xs     ru   	<genexpr>z'check_dict_alignment.<locals>.<genexpr>   s     D^c!&&(m^s   #%r   )get_close_matchesr~   Nr   zSimilar arguments are i.e. r   r   redboldz ' is not a valid YOLO argument. 
)r   difflibr   r   r   SyntaxErrorCLI_HELP_MSG)r   r   e	base_keyscustom_keysr   
mismatchedr   stringr   matches	match_strs               ru   r   r      s     !(FDdF^DI{(?[AY,>![J?-A'95GSZ[SZa488A;+B!Ad1gY'ISZG[DK5gYa@QSI(5&!455UV_U``bccF	 
 &</0a7  @ \s   	B'B'
$B,r   returnc                    g }t        |       D ]  \  }}|dk(  r7d|cxk  rt        |       dz
  k  r n n|dxx   d| |dz       z  cc<   | |dz   = B|j                  d      r=|t        |       dz
  k  r,d| |dz      vr"|j                  | | |dz              | |dz   = |j	                  d      r|dkD  r|dxx   |z  cc<   |j                  |        |S )a  
    Merges arguments around isolated '=' args in a list of strings. The function considers cases where the first
    argument ends with '=' or the second starts with '=', as well as when the middle one is an equals sign.

    Args:
        args (List[str]): A list of strings where each element is an argument.

    Returns:
        List[str]: A list of strings where the arguments around isolated '=' are merged.
    r   r   r'   r   )	enumeratelenendswithappend
startswith)r   new_argsiargs       ru   merge_equals_argsr      s     HD/3#:!a/#d)a-/RLaQU}--LQU\\#1s4y1}#4DQK9OOOseDQK=12QU^^C QURLCLOOC  " Orw   c                     ddl m} | d   dk(  r't        |       dkD  r| d   nd}|j                  |       y| d   dk(  r|j	                          yy)a  
    Handle Ultralytics HUB command-line interface (CLI) commands.

    This function processes Ultralytics HUB CLI commands such as login and logout.
    It should be called when executing a script with arguments related to HUB authentication.

    Args:
        args (List[str]): A list of command line arguments

    Example:
        ```bash
        python my_script.py hub login your_api_key
        ```
    r   )hubloginr'   r~   logoutN)ultralyticsr   r   r   r   )r   r   r   s      ru   handle_yolo_hubr      sM      Aw'TQd1gB		#	aH	

 
rw   c                    d}	 t        |       r}| d   dk(  r>t        j                          t        j                          t        j                  d       n7t        d | D              }t        t        |       t        j                  |       t        j                  d|        t        t               y
# t        $ r&}t        j                  d| d| d	       Y d
}~y
d
}~ww xY w)a  
    Handle YOLO settings command-line interface (CLI) commands.

    This function processes YOLO settings CLI commands such as reset.
    It should be called when executing a script with arguments related to YOLO settings management.

    Args:
        args (List[str]): A list of command line arguments for YOLO settings management.

    Example:
        ```bash
        python my_script.py yolo settings reset
        ```
    z=https://docs.ultralytics.com/quickstart/#ultralytics-settingsr   resetzSettings reset successfullyc              3   2   K   | ]  }t        |        y wr   )parse_key_value_pair)r   as     ru   r   z'handle_yolo_settings.<locals>.<genexpr>  s     ADq/2Ds   u   💡 Learn about settings at u    WARNING ⚠️ settings error: 'z'. Please see z
 for help.N)anyr   unlinkr   r   r   infodictr   updater   	Exceptionr   )r   urlnewr   s       ru   handle_yolo_settingsr     s     JC\t9Aw'!$$& 9:ADAA$Xs3$3C59:=! \9!N3%zZ[[\s   B/B4 4	C#=CC#c                     | j                  dd      \  }}|j                         |j                         }}|sJ d| d       |t        |      fS )z4Parse one 'key=value' pair and return key and value.r   r'   z	missing 'z' value)r   stripsmart_value)pairr   r   s      ru   r   r   "  sP    ::c1DAq779aggiqA$	!G$$1k!nrw   c                     | j                         }|dk(  ry|dk(  ry|dk(  ryt        j                  t              5  t	        |       cddd       S # 1 sw Y   | S xY w)zEConvert a string to an underlying type such as int, float, bool, etc.noneNtrueTfalseF)lower
contextlibsuppressr   eval)r   v_lowers     ru   r   r   *  sT    ggiG&	F		G	  +7 ,++s   AAr~   c                 0   | r| j                  d      nt        j                  dd st        j                  t
               yd t        j                  d fdd fdfd	t        d
}i t        t        D ci c]  }|d c}t        D ci c]  }|d c}|}|j                  |j                         D ci c]  \  }}|d   | c}}       |j                  |j                         D ci c],  \  }}t        |      dkD  s|j                  d      s'|dd |. c}}       i ||j                         D ci c]  \  }}d| | c}}|j                         D ci c]  \  }}d| | c}}}i }t!              D ]  }|j#                  d      r$t        j$                  d| d|dd  d       |dd }|j                  d      r$t        j$                  d| d|dd  d       |dd }d|v r	 t'        |      \  }}|dk(  rg|et        j                  dt(         d|        t+        t        j,                  |            j                         D ci c]  \  }}|dk7  s|| }}}n|||<   |t        v r||d<   |t        v r||d<   |j9                         |v r ||j9                                     y|t        v rt;        t        |   t<              rd||<   c|t        v r-t1        dt?        dd |       d!| dt        |    d"t
               t7        ||di        t7        ||       |jA                  d      }	|	5tB        jD                  xs d#}	t        j$                  d$t         d%|	 d       n$|	t        vrt3        d&|	 d't         d(t
               |jG                  dd      }
|
r4|
t        vrt3        d)|
 d*t         d(t
               d+|vrtH        |
   |d+<   |jG                  d+tB        jJ                        }|d,}t        j$                  d-| d       ||d+<   d.|j9                         v rdd/l&m'}  ||      }nRd0|j9                         v rdd1l&m(}  ||      }n1d2|j9                         v rdd3l&m)}  ||      }ndd4l&m*}  |||
5      }t;        |jA                  d6      tV              r|jY                  |d6          |
|jZ                  k7  rD|
r6t        j$                  d7|
 d8|jZ                   d9|
 d:|jZ                   d;	       |jZ                  }
|	d<v r<d=|vr8tB        j\                  xs t^        |d=<   t        j$                  d>|d=    d       n|	d?v r^d@|vrdA|vrt`        jA                  |
xs tB        jZ                  tB        jb                        |d@<   t        j$                  dB|d@    d       n<|	dCk(  r7dD|vr3tB        jd                  xs dE|dD<   t        j$                  dF|dD    d        tg        ||	      dHi | t        j                  dG|	        yc c}w c c}w c c}}w c c}}w c c}}w c c}}w c c}}w # t.        t0        t2        t4        f$ r}t7        ||di|       Y d}~d}~ww xY w)Iar  
    This function is the ultralytics package entrypoint, it's responsible for parsing the command line arguments passed
    to the package.

    This function allows for:
    - passing mandatory YOLO args as a list of strings
    - specifying the task to be performed, either 'detect', 'segment' or 'classify'
    - specifying the mode, either 'train', 'val', 'test', or 'predict'
    - running special modes like 'checks'
    - passing overrides to the package's configuration

    It uses the package's default cfg and initializes it using the passed overrides.
    Then it calls the CLI function with the composed cfg
     r'   Nc                  4    t        j                  t              S r   )r   r   r   r   rw   ru   <lambda>zentrypoint.<locals>.<lambda>N  s    L1rw   c                  4    t        j                  t              S r   )r   r   r   r   rw   ru   r   zentrypoint.<locals>.<lambda>P  s    6;;{3rw   c                       t         dd        S Nr'   )r   r   s   ru   r   zentrypoint.<locals>.<lambda>Q  s    0ab:rw   c                       t        t              S r   )r   r   r   rw   ru   r   zentrypoint.<locals>.<lambda>R  s
    z"23rw   c                       t         dd        S r   r   r   s   ru   r   zentrypoint.<locals>.<lambda>S  s    tABx0rw   c                      t               S r   r   r   s   ru   r   zentrypoint.<locals>.<lambda>T  s
    .rw   )helpr   versionsettingsrt   r   r   zcopy-cfgr   sr   -z--u   WARNING ⚠️ 'z5' does not require leading dashes '--', updating to '   r   ,z4' does not require trailing comma ',', updating to 'r   rt   zOverriding z with r~   r   r   Tr   r   r   zR' is a valid YOLO argument but is missing an '=' sign to set its value, i.e. try 'z'
r   u2   WARNING ⚠️ 'mode' is missing. Valid modes are z. Using default 'mode=zInvalid 'mode=z'. Valid modes are z.
zInvalid 'task=z'. Valid tasks are r}   r%   u8   WARNING ⚠️ 'model' is missing. Using default 'model=rtdetr)RTDETRfastsam)FastSAMsam)SAM)YOLO)r   
pretrainedu!   WARNING ⚠️ conflicting 'task=z' passed with 'task=z' model. Ignoring 'task=z' and updating to 'task=z' to match model.)r   r   sourceu:   WARNING ⚠️ 'source' is missing. Using default 'source=)r   r   dataresumeu6   WARNING ⚠️ 'data' is missing. Using default 'data=r   formattorchscriptu:   WARNING ⚠️ 'format' is missing. Using default 'format=u6   💡 Learn more at https://docs.ultralytics.com/modes/r   )4r   sysargvr   r   r   r   collect_system_infocopy_default_cfgr
   TASKSMODESr   r   r   r   r   r   r   r   r   r   
check_yaml	NameErrorr   r   AssertionErrorr   r   rq   r   r   r   r	   r   r   
TASK2MODELr}   r   r  r  r  r  rr   loadr   r	  r   	TASK2DATAr
  r  r   )debugspecialr   full_args_dictr   rx   r   r   r   r   r   r}   r  r  r  r  r   s                   @ru   
entrypointr  9  s    !&EKK388QR8DL! 2,,3:30.$&G m(le,DeQWe,DlZ_H`Z_UVDZ_H`ldklN NN81AaD!G89NN'--/\/$!QSVaZAJJWZOAcrFAI/\]rrGMMODODAqqWaZODrahananapHqapY]YZ\]2aSSTapHqrGIt$<<NN-aS0efghihjfkellnop!"A::c?NN-aS0defgjhjekdllnop#2A!8A+A.1:!-KK+.>-?vaS IJ6?@Q@QRS@T6U6[6[6] l6]FAsabfkakC6]I l#$IaL %Z !If%Z !IfWWY'!GAGGI ""z2B12Et'LIaL""(5&!"<!= >==>CqAQRSAT@UUXYeXfh i i !!R9? %D 3 == D|,9KE7Rhimhnnpqr	U	>$/B5'\N[\\ ==&Du~dV3FugSQ]P^_``)#!+D!1Ig MM';#4#45E}QRWQXXZ[\Ig5;;= &u	ekkm	#'	%++-	#E
$U&)---s3

9\*+ uzzNN>tfDXY^YcYcXd e--1F2J5::,Vgi jzz ##	(A)00:F	(ST]^fTgShhjkl	!	!"xy'@ )d.Fk6F6FHXHX YIfNNST]^dTeSffhij		9$"-"4"4"EIhNNWXabjXkWllnop GE4%9% KKHOPS -EH` 9\DHq !m {JG A$^aWa@@Asa   <
X:
X??Y
5Y

Y

Y

Y+Y A#Y"#Y1Y6	Y"Y""Z;ZZc                      t        j                         t        j                  j	                  dd      z  } t        j                  t        |        t        j                  t         d|  d|  d       y)zSCopy and create a new default configuration file with '_copy' appended to its name.z.yamlz
_copy.yamlz copied to z>
Example YOLO command with this new custom cfg:
    yolo cfg='z' imgsz=320 batch=8N)	r   cwdr   r|   replaceshutilcopy2r   r   )new_files    ru   r  r    sc    xxz,1199'<PPH
LL!8,
KK#$Kz :QQYPZZmo prw   __main__)r  r   )r~   )7r   r!  r  pathlibr   typesr   typingr   r   r   ultralytics.utilsr   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  TASK2METRICrr   r  r   r   r   r   r   rv   r   r   r   r   r   r   r   r   r   r  r  r   r   rw   ru   <module>r*     s     
  ! $ $R R R R R
 	B/#0@lduv	 	
 $$'!	#	fX456 7+ ,1' 2++0' 2! J J[ AN" <L_c 2*sD$78 2*X\ 2*j"8t 8T 82DI $s) 4$s)  4\tCy \T \BFQTp zR rw   