
    FPhR                         d dl Z d dlZd dlmZmZ d dlmZ d dlmZ d dl	m
Z
mZ d dlmZmZmZmZ d dlmZmZ d dlmZmZmZ  G d	 d
e      Zy)    N)ClassificationDatasetbuild_dataloader)BaseTrainer)yolo)ClassificationModelattempt_load_one_weight)DEFAULT_CFGLOGGERRANKcolorstr)plot_imagesplot_results)is_parallelstrip_optimizertorch_distributed_zero_firstc                   z     e Zd ZdZeddf fd	Zd ZddZd ZddZ	ddZ
d	 Zd
 Zd ZddZd Zd Zd Z xZS )ClassificationTrainera  
    A class extending the BaseTrainer class for training based on a classification model.

    Notes:
        - Torchvision classification models can also be passed to the 'model' argument, i.e. model='resnet18'.

    Example:
        ```python
        from ultralytics.models.yolo.classify import ClassificationTrainer

        args = dict(model='yolov8n-cls.pt', data='imagenet10', epochs=3)
        trainer = ClassificationTrainer(overrides=args)
        trainer.train()
        ```
    Nc                 f    |i }d|d<   |j                  d      d|d<   t        | 	  |||       y)z^Initialize a ClassificationTrainer object with optional configuration overrides and callbacks.Nclassifytaskimgsz   )getsuper__init__)selfcfg	overrides
_callbacks	__class__s       qC:\Users\daisl\Desktop\realtime-object-detection\venv\Lib\site-packages\ultralytics/models/yolo/classify/train.pyr   zClassificationTrainer.__init__    sB    I&	&==!)!$Igi4    c                 @    | j                   d   | j                  _        y)z9Set the YOLO model's class names from the loaded dataset.namesN)datamodelr$   r   s    r!   set_model_attributesz*ClassificationTrainer.set_model_attributes)   s    99W-

r"   c                    t        || j                  d   |xr	 t        dk(        }|r|j                  |       |j	                         D ]  }| j
                  j                  st        |d      r|j                          t        |t        j                  j                        sZ| j
                  j                  sq| j
                  j                  |_         |j                         D ]	  }d|_         |S )z>Returns a modified PyTorch model configured for training YOLO.nc)r*   verbosereset_parametersT)r   r%   r   loadmodulesargs
pretrainedhasattrr-   
isinstancetorchnnDropoutdropoutp
parametersrequires_grad)r   r   weightsr,   r&   mr8   s          r!   	get_modelzClassificationTrainer.get_model-   s    #CDIIdOWE[QUY[Q[\JJwA99''GA7I,J""$!UXX--.4993D3Dii''	 !
 !!#A"AO $r"   c                    t        | j                  t        j                  j                        ryt        | j                        d}}|j                  d      r<t        |d      \  | _        }| j                  j                         D ]	  }d|_	         n|j                  d      d   dv r| j                  |	      | _        nl|t        j                  j                  v rAt        j                  j                  |   | j                  j                   rd
nd      | _        nt#        d| d       t%        j&                  | j                  | j(                  d          |S )z,Load, create or download model for any task.Nz.ptcpu)deviceT.r+   )yamlyml)r   IMAGENET1K_V1)r;   zERROR: model=z6 not found locally or online. Please check model name.r*   )r3   r&   r4   r5   Modulestrendswithr   r9   r:   splitr=   torchvisionmodels__dict__r0   r1   FileNotFoundErrorr   reshape_outputsr%   )r   r&   ckptr8   s       r!   setup_modelz!ClassificationTrainer.setup_model<   s   djj%((//2$**ott>>% 6uUKDJZZ**,"& -[[b!_4E2DJk((111$++44U;W[W`W`WkWkOquvDJeW4jkl++DJJ		$Hr"   c                 :    t        || j                  |dk(  |      S )zYCreates a ClassificationDataset instance given an image path, and mode (train/test etc.).train)rootr0   augmentprefix)r   r0   )r   img_pathmodebatchs       r!   build_datasetz#ClassificationTrainer.build_datasetQ   s    $(DT[Odhiir"   c                    t        |      5  | j                  ||      }ddd       t        || j                  j                  |      }|dk7  rkt        | j                        r1|j                  j                  | j                  j                  _
        |S |j                  j                  | j                  _
        |S # 1 sw Y   xY w)zNReturns PyTorch DataLoader with transforms to preprocess images for inference.N)rankrQ   )r   rX   r   r0   workersr   r&   datasettorch_transformsmodule
transforms)r   dataset_path
batch_sizerZ   rV   r\   loaders          r!   get_dataloaderz$ClassificationTrainer.get_dataloaderU   s    )$/((t<G 0 "':tyy7H7HtT7?4::&/5~~/N/N

!!,  )/(G(G

% 0/s   B<<Cc                     |d   j                  | j                        |d<   |d   j                  | j                        |d<   |S )z+Preprocesses a batch of images and classes.imgcls)tor@   )r   rW   s     r!   preprocess_batchz&ClassificationTrainer.preprocess_batchc   s;    U|t{{3eU|t{{3er"   c                 j    dddt        | j                        z   z  z   ddg| j                  ddz  S )z5Returns a formatted string showing training progress.
z%11s   EpochGPU_mem	InstancesSize)len
loss_namesr'   s    r!   progress_stringz%ClassificationTrainer.progress_stringi   sD    vS%9!9::iG$//G;GGH 	Hr"   c                 z    dg| _         t        j                  j                  | j                  | j
                        S )z>Returns an instance of ClassificationValidator for validation.loss)rq   r   r   ClassificationValidatortest_loadersave_dirr'   s    r!   get_validatorz#ClassificationTrainer.get_validatorn   s,    !(}}44T5E5Et}}UUr"   c                     | j                   D cg c]	  }| d|  }}||S t        t        |      d      g}t        t	        ||            S c c}w )z
        Returns a loss dict with labelled training loss items tensor.

        Not needed for classification but necessary for segmentation & detection
        /   )rq   roundfloatdictzip)r   
loss_itemsrT   xkeyss        r!   label_loss_itemsz&ClassificationTrainer.label_loss_itemss   s\     *.9A6(!A39KE*-q12
Cj)**	 :s   Ac                 H    t        | j                  d| j                         y)zPlots metrics from a CSV file.T)filer   on_plotN)r   csvr   r'   s    r!   plot_metricsz"ClassificationTrainer.plot_metrics   s    $((T4<<Hr"   c                 b   | j                   | j                  fD ]  }|j                         st        |       || j                  u s.t	        j
                  d| d       | j                  j                  | j                  j                  _        | j                  j                  | j                  j                  _	        | j                  |      | _
        | j                  j                  dd       | j                  d        t	        j
                  dt        d| j                                y)	z3Evaluate trained model and save validation results.z
Validating z...)r&   fitnessNon_fit_epoch_endzResults saved to bold)lastbestexistsr   r
   infor0   r%   	validatorplotsmetricspoprun_callbacksr   rw   )r   fs     r!   
final_evalz ClassificationTrainer.final_eval   s    DII%Axxz"		>KK-s# 67/3yy~~DNN'',04		DNN''-#'>>>#:DLLL$$Y5&&'9: & 	'(G'HIJr"   c           	          t        |d   t        j                  t        |d               |d   j	                  d      | j
                  d| dz  | j                         y)z.Plots training samples with their annotations.re   rf   r+   train_batchz.jpg)images	batch_idxrf   fnamer   N)r   r4   arangerp   viewrw   r   )r   rW   nis      r!   plot_training_samplesz+ClassificationTrainer.plot_training_samples   sT    <ll3uU|#45e!!"%--Kt4"88LL	"r"   )NNT)rQ   N)   r   rQ   )NrQ   )__name__
__module____qualname____doc__r	   r   r(   r=   rO   rX   rc   rh   rr   rx   r   r   r   r   __classcell__)r    s   @r!   r   r      sW      '$4 5.*jH
V

+IK"r"   r   )r4   rI   ultralytics.datar   r   ultralytics.engine.trainerr   ultralytics.modelsr   ultralytics.nn.tasksr   r   ultralytics.utilsr	   r
   r   r   ultralytics.utils.plottingr   r   ultralytics.utils.torch_utilsr   r   r   r    r"   r!   <module>r      s6      D 2 # M A A @ d dI"K I"r"   