a
    yf                     @   sh   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 G d
d deZdS )z
YOLO-NAS model interface.

Example:
    ```python
    from ultralytics import NAS

    model = NAS("yolo_nas_s")
    results = model.predict("ultralytics/assets/bus.jpg")
    ```
    )PathN)Model)attempt_download_asset)
model_info   )NASPredictor)NASValidatorc                       sP   e Zd ZdZddd fddZdedddd	ZdddZedd Z	  Z
S )NASa  
    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.

    Example:
        ```python
        from ultralytics import NAS

        model = NAS("yolo_nas_s")
        results = model.predict("ultralytics/assets/bus.jpg")
        ```

    Attributes:
        model (str): Path to the pre-trained model or model name. Defaults to 'yolo_nas_s.pt'.

    Note:
        YOLO-NAS models only support pre-trained models. Do not provide YAML configuration files.
    yolo_nas_s.ptN)returnc                    s*   t |jdvsJ dt j|dd dS )zMInitializes the NAS model with the provided or default 'yolo_nas_s.pt' model.>   z.ymlz.yamlz0YOLO-NAS models only support pre-trained models.detect)taskN)r   suffixsuper__init__)selfmodel	__class__ X/var/www/html/django/DPS/env/lib/python3.9/site-packages/ultralytics/models/nas/model.pyr   0   s    zNAS.__init__)weightsr   c                    s   ddl }t|j}|dkr,tt| _n|dkrH|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_dS )zgLoads an existing NAS model weights or creates a new NAS model with pretrained weights if not provided.r   Nz.pt Zcoco)Zpretrained_weightsc                    s    j | S )z%Ignore additional __call__ arguments.)r   _original_forward)xargskwargsr   r   r   new_forwardA   s    zNAS._load.<locals>.new_forwardTc                    s    j S )N)r   )verboser   r   r   <lambda>I       zNAS._load.<locals>.<lambda>    c                   S   s   dS )NFr   r   r   r   r   r    L   r!   r   )T)super_gradientsr   r   torchloadr   r   Ztrainingmodelsgetforwardr   ZfuseZtensorZstridedict	enumerateZ_class_namesnamesZis_fusedyamlZpt_pathr   )r   r   r   r#   r   r   r   r   r   _load5   s     
z	NAS._loadFTc                 C   s   t | j||ddS )z
        Logs model info.

        Args:
            detailed (bool): Show detailed information about model.
            verbose (bool): Controls verbosity.
        i  )detailedr   Zimgsz)r   r   )r   r.   r   r   r   r   infoQ   s    zNAS.infoc                 C   s   dt tdiS )zQReturns a dictionary mapping tasks to respective predictor and validator classes.r   )Z	predictor	validator)r   r   r   r   r   r   task_map[   s    zNAS.task_map)r
   )N)FT)__name__
__module____qualname____doc__r   strr-   r/   propertyr1   __classcell__r   r   r   r   r	      s   

r	   )r5   pathlibr   r$   Zultralytics.engine.modelr   Zultralytics.utils.downloadsr   Zultralytics.utils.torch_utilsr   Zpredictr   valr   r	   r   r   r   r   <module>   s   