a
    yfy                     @   s>  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	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mZm Z  h dZ!h dZ"dd	d
dddZ#ddddddZ$ddddddZ%dd e"D Z&ej'pddgZ(de)dge(dd   de" de! dZ*h d Z+h d!Z,h d"Z-h d#Z.d$d% Z/edfee)ee	ef e	d&d'd(Z0dKd*d+Z1dLd,d-Z2d.d/ Z3dMe	e	d0d1d2Z4e
e) e
e) d3d4d5Z5e
e) dd3d6d7Z6e
e) dd3d8d9Z7e
e) d:d;d<Z8d=d> Z9dNe)d@dAdBZ:dCdD Z;dOdEdFZ<dGdH Z=e>dIkr:e<ddJ dS )P    N)Path)SimpleNamespace)DictListUnion)ASSETSDEFAULT_CFGDEFAULT_CFG_DICTDEFAULT_CFG_PATH	IS_VSCODELOGGERRANKROOTRUNS_DIRSETTINGSSETTINGS_FILETESTS_RUNNINGIterableSimpleNamespace__version__checkscolorstrdeprecation_warn
vscode_msg	yaml_load
yaml_print>   trackexporttrainZ	benchmarkpredictval>   obbposesegmentclassifydetectz
coco8.yamlzcoco8-seg.yamlZ
imagenet10zcoco8-pose.yamlz
dota8.yaml)r$   r"   r#   r!   r    
yolo11n.ptzyolo11n-seg.ptzyolo11n-cls.ptzyolo11n-pose.ptzyolo11n-obb.ptzmetrics/mAP50-95(B)zmetrics/mAP50-95(M)zmetrics/accuracy_top1zmetrics/mAP50-95(P)c                 C   s   h | ]}t | qS  )
TASK2MODEL).0taskr&   r&   T/var/www/html/django/DPS/env/lib/python3.9/site-packages/ultralytics/cfg/__init__.py	<setcomp>:       r+    z
    Arguments received: Z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=coco8.yaml model=yolo11n.pt epochs=10 lr0=0.01

    2. Predict a YouTube video using a pretrained segmentation model at image size 320:
        yolo predict model=yolo11n-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=yolo11n.pt data=coco8.yaml batch=1 imgsz=640

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

    5. Explore your datasets using semantic search and SQL with a simple GUI powered by Ultralytics Explorer API
        yolo explorer data=data.yaml model=yolo11n.pt
    
    6. Streamlit real-time webcam inference GUI
        yolo streamlit-predict
        
    7. 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
    >	   batchZwarmup_epochsboxZshearZdflZ	workspacetimedegreescls>   Zperspective	translateZlrfZdropoutZmixupscaleconfZbgrfractionZlabel_smoothingZ
copy_pasteZweight_decayZhsv_vZmomentumZlr0ZiouZwarmup_momentumZmosaicZfliplrZhsv_hZflipudZwarmup_bias_lrZhsv_s>   ZpatienceZsave_periodZ
mask_ratioseedZnbsZ
vid_stride
line_widthZclose_mosaicZmax_detworkersZepochs>"   Zsave_framesZnmsZhalfZkerasoptimizeZsave_txtZagnostic_nmsZaugmentZcos_lrZ
single_clsZdynamicrectZint8	show_confverbosesaveZ	save_confZretina_maskssimplifyZ	save_jsonZ	visualizeZ	save_cropshow_labels
show_boxesZmulti_scaleZdeterministicZplotsexist_okZprofileZdnnZsave_hybridZoverlap_maskshowr   c                 C   s.   t | ttfrt| } nt | tr*t| } | S )a  
    Converts a configuration object to a dictionary.

    Args:
        cfg (str | Path | Dict | SimpleNamespace): Configuration object to be converted. Can be a file path,
            a string, a dictionary, or a SimpleNamespace object.

    Returns:
        (Dict): Configuration object in dictionary format.

    Examples:
        Convert a YAML file path to a dictionary:
        >>> config_dict = cfg2dict("config.yaml")

        Convert a SimpleNamespace to a dictionary:
        >>> from types import SimpleNamespace
        >>> config_sn = SimpleNamespace(param1="value1", param2="value2")
        >>> config_dict = cfg2dict(config_sn)

        Pass through an already existing dictionary:
        >>> config_dict = cfg2dict({"param1": "value1", "param2": "value2"})

    Notes:
        - If cfg is a path or string, it's loaded as YAML and converted to a dictionary.
        - If cfg is a SimpleNamespace object, it's converted to a dictionary using vars().
        - If cfg is already a dictionary, it's returned unchanged.
    )
isinstancestrr   r   r   varscfgr&   r&   r*   cfg2dict   s
    

rJ   )rI   	overridesc                 C   s   t | } |r>t |}d| vr(|dd t| | i | |} dD ].}|| v rBt| | ttfrBt| | | |< qB| ddkr| dddd | d< t	
d	| d  d
 t|  tf i | S )a1  
    Load and merge configuration data from a file or dictionary, with optional overrides.

    Args:
        cfg (str | Path | Dict | SimpleNamespace): Configuration data source. Can be a file path, dictionary, or
            SimpleNamespace object.
        overrides (Dict | None): Dictionary containing key-value pairs to override the base configuration.

    Returns:
        (SimpleNamespace): Namespace containing the merged configuration arguments.

    Examples:
        >>> from ultralytics.cfg import get_cfg
        >>> config = get_cfg()  # Load default configuration
        >>> config = get_cfg("path/to/config.yaml", overrides={"epochs": 50, "batch_size": 16})

    Notes:
        - If both `cfg` and `overrides` are provided, the values in `overrides` will take precedence.
        - Special handling ensures alignment and correctness of the configuration, such as converting numeric
          `project` and `name` to strings and validating configuration keys and values.
        - The function performs type and value checks on the configuration data.
    save_dirN)projectnamerN   modelr-   .r   u;   WARNING ⚠️ 'name=model' automatically updated to 'name='.)rJ   popcheck_dict_alignmentrE   intfloatrF   getsplitr   warning	check_cfgr   )rI   rK   kr&   r&   r*   get_cfg   s    
r[   Tc                 C   s  |   D ]\}}|dur|tv rvt|ttfsv|rhtd| d| dt|j d| d| d| dt|| |< q|tv rt|ttfs|rtd| d| dt|j d| d| d| dt| | |< }d	|  krd
ksn t	d| d| d| dq|t
v rdt|tsd|rVtd| d| dt|j d| d| dt|| |< q|tv rt|ts|rtd| d| dt|j d| d| d| dt|| |< qdS )a  
    Checks configuration argument types and values for the Ultralytics library.

    This function validates the types and values of configuration arguments, ensuring correctness and converting
    them if necessary. It checks for specific key types defined in global variables such as CFG_FLOAT_KEYS,
    CFG_FRACTION_KEYS, CFG_INT_KEYS, and CFG_BOOL_KEYS.

    Args:
        cfg (Dict): Configuration dictionary to validate.
        hard (bool): If True, raises exceptions for invalid types and values; if False, attempts to convert them.

    Examples:
        >>> config = {
        ...     "epochs": 50,  # valid integer
        ...     "lr0": 0.01,  # valid float
        ...     "momentum": 1.2,  # invalid float (out of 0.0-1.0 range)
        ...     "save": "true",  # invalid bool
        ... }
        >>> check_cfg(config, hard=False)
        >>> print(config)
        {'epochs': 50, 'lr0': 0.01, 'momentum': 1.2, 'save': False}  # corrected 'save' key

    Notes:
        - The function modifies the input dictionary in-place.
        - None values are ignored as they may be from optional arguments.
        - Fraction keys are checked to be within the range [0.0, 1.0].
    N'=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'))itemsCFG_FLOAT_KEYSrE   rT   rU   	TypeErrortype__name__CFG_FRACTION_KEYS
ValueErrorCFG_INT_KEYSCFG_BOOL_KEYSbool)rI   hardrZ   vr&   r&   r*   rY     s^    
(rY   c                 C   sz   t | ddr| j}n^ddlm} | jp<tr4tjd nt| j	 }|pN| j
pN| j }|t|| tdv rj| jndd}t|S )	a  
    Returns the directory path for saving outputs, derived from arguments or default settings.

    Args:
        args (SimpleNamespace): Namespace object containing configurations such as 'project', 'name', 'task',
            'mode', and 'save_dir'.
        name (str | None): Optional name for the output directory. If not provided, it defaults to 'args.name'
            or the 'args.mode'.

    Returns:
        (Path): Directory path where outputs should be saved.

    Examples:
        >>> from types import SimpleNamespace
        >>> args = SimpleNamespace(project="my_project", task="detect", mode="train", exist_ok=True)
        >>> save_dir = get_save_dir(args)
        >>> print(save_dir)
        my_project/detect/train
    rL   Nr   )increment_pathztests/tmp/runs>   r   T)rC   )getattrrL   Zultralytics.utils.filesrj   rM   r   r   parentr   r)   rN   moder   r   rC   )argsrN   rL   rj   rM   r&   r&   r*   get_save_dirO  s    "rp   c                 C   s   |    D ]}|dkr0t|d | d| d< |dkrTt|d | ddk| d< |dkrxt|d | ddk| d< |dkrt|d	 | d| d	< q| S )
a  
    Handles deprecated configuration keys by mapping them to current equivalents with deprecation warnings.

    Args:
        custom (Dict): Configuration dictionary potentially containing deprecated keys.

    Examples:
        >>> custom_config = {"boxes": True, "hide_labels": "False", "line_thickness": 2}
        >>> _handle_deprecation(custom_config)
        >>> print(custom_config)
        {'show_boxes': True, 'show_labels': True, 'line_width': 2}

    Notes:
        This function modifies the input dictionary in-place, replacing deprecated keys with their current
        equivalents. It also handles value conversions where necessary, such as inverting boolean values for
        'hide_labels' and 'hide_conf'.
    ZboxesrB   Zhide_labelsrA   FalseZ	hide_confr=   Zline_thicknessr9   )copykeysr   rR   )customkeyr&   r&   r*   _handle_deprecationo  s    



rv   basert   c           
         s   t |}dd  |fD \}fdd|D }|rddlm} d}|D ]R}||} fdd|D }|rxd	| d
nd}	|dtdd| d|	 d7 }qHt|t |dS )av  
    Checks alignment between custom and base configuration dictionaries, handling deprecated keys and providing error
    messages for mismatched keys.

    Args:
        base (Dict): The base configuration dictionary containing valid keys.
        custom (Dict): The custom configuration dictionary to be checked for alignment.
        e (Exception | None): Optional error instance passed by the calling function.

    Raises:
        SystemExit: If mismatched keys are found between the custom and base dictionaries.

    Examples:
        >>> base_cfg = {"epochs": 50, "lr0": 0.01, "batch_size": 16}
        >>> custom_cfg = {"epoch": 100, "lr": 0.02, "batch_size": 32}
        >>> try:
        ...     check_dict_alignment(base_cfg, custom_cfg)
        ... except SystemExit:
        ...     print("Mismatched keys found")

    Notes:
        - Suggests corrections for mismatched keys based on similarity to valid keys.
        - Automatically replaces deprecated keys in the custom configuration with updated equivalents.
        - Prints detailed error messages for each mismatched key to help users correct their configurations.
    c                 s   s   | ]}t | V  qd S N)setrs   )r(   xr&   r&   r*   	<genexpr>  r,   z'check_dict_alignment.<locals>.<genexpr>c                    s   g | ]}| vr|qS r&   r&   r(   rZ   )	base_keysr&   r*   
<listcomp>  r,   z(check_dict_alignment.<locals>.<listcomp>r   )get_close_matchesr-   c                    s0   g | ](}  |d ur(| d |  n|qS )Nr]   )rV   r}   )rx   r&   r*   r     r,   zSimilar arguments are i.e. rP   r\   redboldz ' is not a valid YOLO argument. 
N)rv   difflibr   r   SyntaxErrorCLI_HELP_MSG)
rx   rt   eZcustom_keysZ
mismatchedr   stringr{   matchesZ	match_strr&   )rx   r~   r*   rS     s    
 rS   )ro   returnc                 C   s   g }t | D ]\}}|dkrfd|  k r8t| d k rfn n*|d  d| |d   7  < | |d = q|dr|t| d k rd| |d  vr|| | |d    | |d = q|dr|dkr|d  |7  < q|| q|S )ae  
    Merges arguments around isolated '=' in a list of strings, handling three cases:
    1. ['arg', '=', 'val'] becomes ['arg=val'],
    2. ['arg=', 'val'] becomes ['arg=val'],
    3. ['arg', '=val'] becomes ['arg=val'].

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

    Returns:
        (List[str]): A list of strings where the arguments around isolated '=' are merged.

    Examples:
        >>> args = ["arg1", "=", "value", "arg2=", "value2", "arg3", "=value3"]
        >>> merge_equals_args(args)
        ['arg1=value', 'arg2=value2', 'arg3=value3']
    r]   r   r.   rk   )	enumeratelenendswithappend
startswith)ro   new_argsiargr&   r&   r*   merge_equals_args  s    (*r   c                 C   sT   ddl m} | d dkr<t| dkr,| d nd}|| n| d dkrP|  dS )aS  
    Handles Ultralytics HUB command-line interface (CLI) commands for authentication.

    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. The first argument should be either 'login'
            or 'logout'. For 'login', an optional second argument can be the API key.

    Examples:
        ```bash
        yolo hub login YOUR_API_KEY
        ```

    Notes:
        - The function imports the 'hub' module from ultralytics to perform login and logout operations.
        - For the 'login' command, if no API key is provided, an empty string is passed to the login function.
        - The 'logout' command does not require any additional arguments.
    r   )hubloginr.   r-   logoutN)ultralyticsr   r   r   r   )ro   r   ru   r&   r&   r*   handle_yolo_hub  s    r   c              
   C   s   d}zrt | r\| d dkr6t  t  td n&tdd | D }tt| t	| t
t td|  W n< ty } z$td| d	| d
 W Y d}~n
d}~0 0 dS )a{  
    Handles YOLO settings command-line interface (CLI) commands.

    This function processes YOLO settings CLI commands such as reset and updating individual settings. 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.

    Examples:
        >>> handle_yolo_settings(["reset"])  # Reset YOLO settings
        >>> handle_yolo_settings(["default_cfg_path=yolo11n.yaml"])  # Update a specific setting

    Notes:
        - If no arguments are provided, the function will display the current settings.
        - The 'reset' command will delete the existing settings file and create new default settings.
        - Other arguments are treated as key-value pairs to update specific settings.
        - The function will check for alignment between the provided settings and the existing ones.
        - After processing, the updated settings will be displayed.
        - For more information on handling YOLO settings, visit:
          https://docs.ultralytics.com/quickstart/#ultralytics-settings
    z=https://docs.ultralytics.com/quickstart/#ultralytics-settingsr   resetzSettings reset successfullyc                 s   s   | ]}t |V  qd S ry   parse_key_value_pairr(   ar&   r&   r*   r|     r,   z'handle_yolo_settings.<locals>.<genexpr>u.   💡 Learn more about Ultralytics Settings at u    WARNING ⚠️ settings error: 'z'. Please see z
 for help.N)anyr   unlinkr   r   r   infodictrS   updateprint	ExceptionrX   )ro   urlnewr   r&   r&   r*   handle_yolo_settings  s    

r   ro   c                 C   sz   t d td ddtd ddg}tdd	 | D }td
d dD |d | D ]\}}|||g7 }qVt	| dS )a  
    Launches a graphical user interface that provides tools for interacting with and analyzing datasets using the
    Ultralytics Explorer API. It checks for the required 'streamlit' package and informs the user that the Explorer
    dashboard is loading.

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

    Examples:
        ```bash
        yolo explorer data=data.yaml model=yolo11n.pt
        ```

    Notes:
        - Requires 'streamlit' package version 1.29.0 or higher.
        - The function does not take any arguments or return any values.
        - It is typically called from the command line interface using the 'yolo explorer' command.
    streamlit>=1.29.0u"   💡 Loading Explorer dashboard...	streamlitrunzdata/explorer/gui/dash.pyz--server.maxMessageSizeZ2048c                 s   s   | ]}t |V  qd S ry   r   r   r&   r&   r*   r|   ;  r,   z"handle_explorer.<locals>.<genexpr>c                 S   s   i | ]}|t | qS r&   )r	   r}   r&   r&   r*   
<dictcomp><  r,   z#handle_explorer.<locals>.<dictcomp>)rO   datarw   N)
r   check_requirementsr   r   r   r   rS   r^   
subprocessr   )ro   cmdr   rZ   ri   r&   r&   r*   handle_explorer%  s    

r   c                   C   s0   t d td tddtd ddg dS )	a8  
    Open the Ultralytics Live Inference Streamlit app for real-time object detection.

    This function initializes and runs a Streamlit application designed for performing live object detection using
    Ultralytics models. It checks for the required Streamlit package and launches the app.

    Examples:
        >>> handle_streamlit_inference()

    Notes:
        - Requires Streamlit version 1.29.0 or higher.
        - The app is launched using the 'streamlit run' command.
        - The Streamlit app file is located in the Ultralytics package directory.
    r   u.   💡 Loading Ultralytics Live Inference app...r   r   z solutions/streamlit_inference.pyz--server.headlesstrueN)r   r   r   r   r   r   r   r&   r&   r&   r*   handle_streamlit_inferenceB  s    

r   	key=value)pairc                 C   sB   |  dd\}}| |  }}|s6J d| d|t|fS )a  
    Parses a key-value pair string into separate key and value components.

    Args:
        pair (str): A string containing a key-value pair in the format "key=value".

    Returns:
        (tuple): A tuple containing two elements:
            - key (str): The parsed key.
            - value (str): The parsed value.

    Raises:
        AssertionError: If the value is missing or empty.

    Examples:
        >>> key, value = parse_key_value_pair("model=yolo11n.pt")
        >>> print(f"Key: {key}, Value: {value}")
        Key: model, Value: yolo11n.pt

        >>> key, value = parse_key_value_pair("epochs=100")
        >>> print(f"Key: {key}, Value: {value}")
        Key: epochs, Value: 100

    Notes:
        - The function splits the input string on the first '=' character.
        - Leading and trailing whitespace is removed from both key and value.
        - An assertion error is raised if the value is empty after stripping.
    r]   r.   z	missing 'z' value)rW   stripsmart_value)r   rZ   ri   r&   r&   r*   r   V  s    r   c                 C   sf   |   }|dkrdS |dkr dS |dkr,dS tt t| W  d   S 1 sT0    Y  | S dS )a3  
    Converts a string representation of a value to its appropriate Python type.

    This function attempts to convert a given string into a Python object of the most appropriate type. It handles
    conversions to None, bool, int, float, and other types that can be evaluated safely.

    Args:
        v (str): The string representation of the value to be converted.

    Returns:
        (Any): The converted value. The type can be None, bool, int, float, or the original string if no conversion
            is applicable.

    Examples:
        >>> smart_value("42")
        42
        >>> smart_value("3.14")
        3.14
        >>> smart_value("True")
        True
        >>> smart_value("None")
        None
        >>> smart_value("some_string")
        'some_string'

    Notes:
        - The function uses a case-insensitive comparison for boolean and None values.
        - For other types, it attempts to use Python's eval() function, which can be unsafe if used on untrusted input.
        - If no conversion is possible, the original string is returned.
    noneNr   TfalseF)lower
contextlibsuppressr   eval)ri   Zv_lowerr&   r&   r*   r   y  s    &r   c                    s  | r|  dntdd   s,tt dS dd tjdd  fdddd  fd	d fd
d fddt fdddd d}i tdd t	D dd t
D |}|dd | D  |dd | D  i |dd | D dd | D }i }t D ]}|drPtd| d|dd  d |dd }|drtd| d|dd  d |dd }d|v r4z`t|\}}|dkr|durtdt d |  d!d tt| D }n|||< W n> ttttfy0 } zt||d"i| W Y d}~n
d}~0 0 n|t	v rH||d#< n|t
v r\||d$< n| |v r~||     dS |tv rtt| trd%||< nF|tv rtd&td'd(| d)| dt|  d*t nt||d"i qt|| |d$}|du r0tj pd+}td,t
 d-| d n$|t
vrTtd.| d/t
 d0t |!d#d}	|	r|	t	vrtd1|	 d2t	 d0t d3|vrt"|	 |d3< |!d3tj#}
|
du rd4}
td5|
 d |
|d3< t$|
j% }d6|v rd7d8l&m'} ||
}
nbd9|v r$d7d:l&m(} ||
}
nBd;|v s8d<|v rNd7d=l&m)} ||
}
nd7d>l&m*} ||
|	d?}
t|d@t+r|
,|d@  |	|
j-kr|	rtdA|	 dB|
j- dC|	 dD|
j- dE	 |
j-}	|dFv rdG|vrtj.pt/|dG< tdH|dG  d n|dIv rZdJ|vrdK|vrtj0p<t1|	p6tj-tj0|dJ< tdL|dJ  d n:|dMkrdN|vrtj2pxdO|dN< tdP|dN  d t3|
|f i | tdQ|  t4rt5dRd%rtt6  dS )Sa  
    Ultralytics entrypoint function for parsing and executing command-line arguments.

    This function serves as the main entry point for the Ultralytics CLI, parsing command-line arguments and
    executing the corresponding tasks such as training, validation, prediction, exporting models, and more.

    Args:
        debug (str): Space-separated string of command-line arguments for debugging purposes.

    Examples:
        Train a detection model for 10 epochs with an initial learning_rate of 0.01:
        >>> entrypoint("train data=coco8.yaml model=yolo11n.pt epochs=10 lr0=0.01")

        Predict a YouTube video using a pretrained segmentation model at image size 320:
        >>> entrypoint("predict model=yolo11n-seg.pt source='https://youtu.be/LNwODJXcvt4' imgsz=320")

        Validate a pretrained detection model at batch-size 1 and image size 640:
        >>> entrypoint("val model=yolo11n.pt data=coco8.yaml batch=1 imgsz=640")

    Notes:
        - If no arguments are passed, the function will display the usage help message.
        - For a list of all available commands and their arguments, see the provided help messages and the
          Ultralytics documentation at https://docs.ultralytics.com.
     r.   Nc                   S   s
   t tS ry   )r   r   r   r&   r&   r&   r*   <lambda>  r,   zentrypoint.<locals>.<lambda>c                   S   s
   t tS ry   )r   r   r   r&   r&   r&   r*   r     r,   c                      s   t  dd  S Nr.   )r   r&   r   r&   r*   r     r,   c                   S   s   t tS ry   )r   r
   r&   r&   r&   r*   r     r,   c                      s   t  dd  S r   r   r&   r   r&   r*   r     r,   c                      s   t  S ry   r   r&   r   r&   r*   r     r,   c                      s   t  S ry   r   r&   r   r&   r*   r     r,   c                      s   t  dd  S r   )r   r&   r   r&   r*   r     r,   c                   S   s   t  S ry   )r   r&   r&   r&   r*   r     r,   )helpr   versionsettingsrI   r   r   r   zcopy-cfgZexplorerzstreamlit-predictc                 S   s   i | ]
}|d qS ry   r&   r}   r&   r&   r*   r     r,   zentrypoint.<locals>.<dictcomp>c                 S   s   i | ]\}}|d  |qS )r   r&   r(   rZ   ri   r&   r&   r*   r     r,   c                 S   s4   i | ],\}}t |d kr|dr|dd |qS )r.   sNrk   )r   r   r   r&   r&   r*   r     r,   c                 S   s   i | ]\}}d | |qS )-r&   r   r&   r&   r*   r     r,   c                 S   s   i | ]\}}d | |qS )--r&   r   r&   r&   r*   r     r,   r   u   WARNING ⚠️ argument 'z5' does not require leading dashes '--', updating to '   rQ   ,z4' does not require trailing comma ',', updating to 'rk   r]   rI   zOverriding z with c                 S   s   i | ]\}}|d kr||qS rH   r&   )r(   rZ   r   r&   r&   r*   r     r,   r-   r)   rn   Tr\   r   r   zR' is a valid YOLO argument but is missing an '=' sign to set its value, i.e. try 'z'
r   u;   WARNING ⚠️ 'mode' argument is missing. Valid modes are z. Using default 'mode=zInvalid 'mode=z'. Valid modes are z.
zInvalid 'task=z'. Valid tasks are rO   r%   uA   WARNING ⚠️ 'model' argument is missing. Using default 'model=Zrtdetrr   )RTDETRZfastsam)FastSAMZsam_Zsam2_)SAM)YOLO)r)   Z
pretrainedu!   WARNING ⚠️ conflicting 'task=z' passed with 'task=z' model. Ignoring 'task=z' and updating to 'task=z' to match model.>   r   r   sourceuC   WARNING ⚠️ 'source' argument is missing. Using default 'source=>   r   r   r   resumeu?   WARNING ⚠️ 'data' argument is missing. Using default 'data=r   formatZtorchscriptuC   WARNING ⚠️ 'format' argument is missing. Using default 'format=u6   💡 Learn more at https://docs.ultralytics.com/modes/r   )7rW   ARGVr   r   r   r   Zcollect_system_infocopy_default_cfgr	   TASKSMODESr   r^   r   r   rX   r   r   r
   r   Z
check_yaml	NameErrorr   rd   AssertionErrorrS   r   rE   rg   r   rV   r   rn   rR   r'   rO   r   stemr   r   r   r   r   rF   loadr)   r   r   r   	TASK2DATAr   rl   r   r   r   )debugZspecialZfull_args_dictrK   r   rZ   ri   r   rn   r)   rO   r   r   r   r   r   r&   r   r*   
entrypoint  s    





(,  
(


















"

r   c                  C   sB   t  tjdd } tt|  tt d|  d|  d dS )a#  
    Copies the default configuration file and creates a new one with '_copy' appended to its name.

    This function duplicates the existing default configuration file (DEFAULT_CFG_PATH) and saves it
    with '_copy' appended to its name in the current working directory. It provides a convenient way
    to create a custom configuration file based on the default settings.

    Examples:
        >>> copy_default_cfg()
        # Output: default.yaml copied to /path/to/current/directory/default_copy.yaml
        # Example YOLO command with this new custom cfg:
        #   yolo cfg='/path/to/current/directory/default_copy.yaml' imgsz=320 batch=8

    Notes:
        - The new configuration file is created in the current working directory.
        - After copying, the function prints a message with the new file's location and an example
          YOLO command demonstrating how to use the new configuration file.
        - This function is useful for users who want to modify the default configuration without
          altering the original file.
    z.yamlz
_copy.yamlz copied to z>
Example YOLO command with this new custom cfg:
    yolo cfg='z' imgsz=320 batch=8N)	r   cwdr
   rN   replaceshutilcopy2r   r   )new_filer&   r&   r*   r   J  s    r   __main__)r   )T)N)N)r   )r-   )?r   r   r   syspathlibr   typesr   typingr   r   r   Zultralytics.utilsr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r'   ZTASK2METRICZMODELSargvr   rF   r   r_   rc   re   rf   rJ   r[   rY   rp   rv   rS   r   r   r   r   r   r   r   r   r   rb   r&   r&   r&   r*   <module>   st   X*&#"0
>
 #)! )#,
 &
