o
    Vh                     @   st   d Z ddlmZ ddlZddlmZ ddlmZ ddlm	Z	 ddl
mZ dd	lmZ dd
lmZ G dd deZdS )z
YOLO-NAS model interface.

Examples:
    >>> from ultralytics import NAS
    >>> model = NAS("yolo_nas_s")
    >>> results = model.predict("ultralytics/assets/bus.jpg")
    )PathN)Model)DEFAULT_CFG_DICT)attempt_download_asset)
model_info   )NASPredictor)NASValidatorc                       s`   e Zd ZdZddeddf fddZddeddfd	d
ZddedefddZe	dd Z
  ZS )NASaW  
    YOLO NAS model for object detection.

    This class provides an interface for the YOLO-NAS models and extends the `Model` class from Ultralytics engine.
    It is designed to facilitate the task of object detection using pre-trained or custom-trained YOLO-NAS models.

    Attributes:
        model (torch.nn.Module): The loaded YOLO-NAS model.
        task (str): The task type for the model, defaults to 'detect'.
        predictor (NASPredictor): The predictor instance for making predictions.
        validator (NASValidator): The validator instance for model validation.

    Examples:
        >>> from ultralytics import NAS
        >>> model = NAS("yolo_nas_s")
        >>> results = model.predict("ultralytics/assets/bus.jpg")

    Notes:
        YOLO-NAS models only support pre-trained models. Do not provide YAML configuration files.
    yolo_nas_s.ptmodelreturnNc                    s*   t |jdvsJ dt j|dd dS )z<Initialize the NAS model with the provided or default model.>   .yml.yamlz0YOLO-NAS models only support pre-trained models.detect)taskN)r   suffixsuper__init__)selfr   	__class__ P/var/www/vscode/kcb/lib/python3.10/site-packages/ultralytics/models/nas/model.pyr   .   s   zNAS.__init__weightsc                    s   ddl }t|j}|dkrtt| _n|dkr$|jjj	|dd _ fdd} jj
 j_| j_
d fd
d	 j_tdg j_tt jj j_dd  j_i  j_| j_d j_i t j j_ j  dS )z
        Load an existing NAS model weights or create a new NAS model with pretrained weights.

        Args:
            weights (str): Path to the model weights file or model name.
            task (str, optional): Task type for the model.
        r   Nz.pt coco)pretrained_weightsc                    s    j | S )z%Ignore additional __call__ arguments.)r   _original_forward)xargskwargsr   r   r   new_forwardD   s   zNAS._load.<locals>.new_forwardTc                    s    j S N)r   )verboser"   r   r   <lambda>L   s    zNAS._load.<locals>.<lambda>    c                   S   s   dS )NFr   r   r   r   r   r&   O   s    r   )T)super_gradientsr   r   torchloadr   r   trainingmodelsgetforwardr   fusetensorstridedict	enumerate_class_namesnamesis_fusedyamlpt_pathr   r   	overridesr    eval)r   r   r   r(   r   r#   r   r"   r   _load3   s$   
z	NAS._loadFTdetailedr%   c                 C   s   t | j||ddS )z
        Log model information.

        Args:
            detailed (bool): Show detailed information about model.
            verbose (bool): Controls verbosity.

        Returns:
            (dict): Model information dictionary.
        i  )r<   r%   imgsz)r   r   )r   r<   r%   r   r   r   infoV   s   zNAS.infoc                 C   s   dt tdiS )zPReturn a dictionary mapping tasks to respective predictor and validator classes.r   )	predictor	validator)r   r	   r"   r   r   r   task_mapc   s   zNAS.task_map)r   r$   )FT)__name__
__module____qualname____doc__strr   r;   boolr>   propertyrA   __classcell__r   r   r   r   r
      s    #r
   )rE   pathlibr   r)   ultralytics.engine.modelr   ultralytics.utilsr   ultralytics.utils.downloadsr   ultralytics.utils.torch_utilsr   predictr   valr	   r
   r   r   r   r   <module>   s   	