
    .h?                        d dl mZ d dlm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 d
dlmZ  G d de      Zy)    )annotations)Path)AnyN)Model)DEFAULT_CFG_DICT)attempt_download_asset)
torch_load)
model_info   )NASPredictor)NASValidatorc                  L     e Zd ZdZdd fdZdd	dZd
ddZedd       Z x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.

    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.

    Methods:
        info: Log model information and return model details.

    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.
    c                d    t        |      j                  dvsJ d       t        |   |d       y)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__)selfmodel	__class__s     Z/var/www/html/ai-service/venv/lib/python3.12/site-packages/ultralytics/models/nas/model.pyr   zNAS.__init__-   s4    E{!!)::n<nn:X.    c                4    ddl }t        |      j                  }|dk(  rt        t	        |             _        n1|dk(  r,|j                  j                  j                  |d       _         fd} j
                  j                   j
                  _
        | j
                  _	        d fd	 j
                  _        t        j                  d	g       j
                  _        t        t!         j
                  j"                               j
                  _        d
  j
                  _        i  j
                  _        | j
                  _        d j
                  _        i t.         j0                   j
                  _         j
                  j5                          y)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                :    j                   j                  |       S )z%Ignore additional __call__ arguments.)r   _original_forward)xargskwargsr   s      r   new_forwardzNAS._load.<locals>.new_forwardC   s    :://22r   c                    j                   S N)r   )verboser   s    r   <lambda>zNAS._load.<locals>.<lambda>K   s    tzz r       c                      y)NF r-   r   r   r*   zNAS._load.<locals>.<lambda>N   s    r   r   )T)super_gradientsr   r   r	   r   r   trainingmodelsgetforwardr"   fusetorchtensorstridedict	enumerate_class_namesnamesis_fusedyamlpt_pathr   r   	overridesr$   eval)r   weightsr   r.   r   r&   s   `     r   _loadz	NAS._load2   s    	g%%U?#$:7$CDDJr\(1188<<WY_<`DJ	3 (,zz'9'9

$(

 :

!LL".

	$***A*A BC

+



$

"

@-@@



r   c                4    t        | j                  ||d      S )z
        Log model information.

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

        Returns:
            (dict[str, Any]): Model information dictionary.
        i  )detailedr)   imgsz)r
   r   )r   rC   r)   s      r   infozNAS.infoU   s     $**xPSTTr   c                     dt         t        diS )zPReturn a dictionary mapping tasks to respective predictor and validator classes.r   )	predictor	validator)r   r   )r   s    r   task_mapzNAS.task_mapb   s     <PQQr   )zyolo_nas_s.pt)r   strreturnNoner(   )r@   rJ   rK   rL   )FT)rC   boolr)   rM   rK   zdict[str, Any])rK   zdict[str, dict[str, Any]])
__name__
__module____qualname____doc__r   rA   rE   propertyrI   __classcell__)r   s   @r   r   r      s/    0/
!FU R Rr   r   )
__future__r   pathlibr   typingr   r4   ultralytics.engine.modelr   ultralytics.utilsr   ultralytics.utils.downloadsr   ultralytics.utils.patchesr	   ultralytics.utils.torch_utilsr
   predictr   valr   r   r-   r   r   <module>r^      s8    #    * . > 0 4 ! QR% QRr   