
    h5                     j    S SK r S SKrS SKJr  S SKJr  S SKJr  S SKJ	r	  S SK
JrJr   " S S\5      rg)	    N)Image)classify_transforms)BasePredictor)Results)DEFAULT_CFGopsc                   N   ^  \ rS rSrSr\SS4U 4S jjrU 4S jrS rS r	Sr
U =r$ )	ClassificationPredictor   am  
A class extending the BasePredictor class for prediction based on a classification model.

This predictor handles the specific requirements of classification models, including preprocessing images
and postprocessing predictions to generate classification results.

Attributes:
    args (dict): Configuration arguments for the predictor.

Methods:
    preprocess: Convert input images to model-compatible format.
    postprocess: Process model predictions into Results objects.

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

Examples:
    >>> from ultralytics.utils import ASSETS
    >>> from ultralytics.models.yolo.classify import ClassificationPredictor
    >>> args = dict(model="yolo11n-cls.pt", source=ASSETS)
    >>> predictor = ClassificationPredictor(overrides=args)
    >>> predictor.predict_cli()
Nc                 H   > [         TU ]  XU5        SU R                  l        g)a6  
Initialize the ClassificationPredictor with the specified configuration and set task to 'classify'.

This constructor initializes a ClassificationPredictor instance, which extends BasePredictor for classification
tasks. It ensures the task is set to 'classify' regardless of input configuration.

Args:
    cfg (dict): Default configuration dictionary containing prediction settings.
    overrides (dict, optional): Configuration overrides that take precedence over cfg.
    _callbacks (list, optional): List of callback functions to be executed during prediction.
classifyN)super__init__argstask)selfcfg	overrides
_callbacks	__class__s       b/home/james-whalen/.local/lib/python3.13/site-packages/ultralytics/models/yolo/classify/predict.pyr    ClassificationPredictor.__init__&   s     	4#		    c                 H  > [         TU ]  U5        [        U R                  R                  S5      (       a  [        U R                  R                  R                  R                  S   S5      (       aM  U R                  R                  R                  R                  S   R
                  [        U R                  5      :g  OSnU(       d  U R                  R                  (       d  [        U R                  5      U l        gU R                  R                  R                  U l        g)z9Set up source and inference mode and classify transforms.
transformsr   sizeFN)
r   setup_sourcehasattrmodelr   r   maximgszptr   )r   sourceupdatedr   s      r   r   $ClassificationPredictor.setup_source5   s    V$ tzz''6674::CSCSC^C^CiCijkClnt;u;u JJ''2215::c$**oM 	 07djjmm

+ 	QUQ[Q[QaQaQlQl 	r   c                 J   [        U[        R                  5      (       dk  [        R                  " U Vs/ s HJ  o R	                  [
        R                  " [        R                  " U[        R                  5      5      5      PML     snSS9n[        U[        R                  5      (       a  UO[        R                  " U5      R                  U R                  R                  5      nU R                  R                  (       a  UR                  5       $ UR!                  5       $ s  snf )zVConvert input images to model-compatible tensor format with appropriate normalization.r   )dim)
isinstancetorchTensorstackr   r   	fromarraycv2cvtColorCOLOR_BGR2RGB
from_numpytor   devicefp16halffloat)r   imgims      r   
preprocess"ClassificationPredictor.preprocessA   s    #u||,,++adead[]b#BSBS1T!UVadeklC !ell33s9I9I#9NRRSWS]S]SdSde!ZZ__sxxz=#))+= fs   AD c                 F   [        U[        5      (       d  [        R                  " U5      n[        U[        [        45      (       a  US   OUn[        XU R                  S   5       VVVs/ s H%  u  pEn[        XVU R                  R                  US9PM'     snnn$ s  snnnf )a  
Process predictions to return Results objects with classification probabilities.

Args:
    preds (torch.Tensor): Raw predictions from the model.
    img (torch.Tensor): Input images after preprocessing.
    orig_imgs (list[np.ndarray] | torch.Tensor): Original images before preprocessing.

Returns:
    (list[Results]): List of Results objects containing classification results for each image.
r   )pathnamesprobs)
r(   listr   convert_torch2numpy_batchtuplezipbatchr   r   r<   )r   predsr6   	orig_imgspredorig_imgimg_paths          r   postprocess#ClassificationPredictor.postprocessJ   s     )T**55i@I&utUm<<a% -0$**Q-,P
,P( H4::3C3C4P,P
 	
 
s   +,B)r   )__name__
__module____qualname____firstlineno____doc__r   r   r   r8   rH   __static_attributes____classcell__)r   s   @r   r
   r
      s*    0 '$4 $

>
 
r   r
   )r-   r)   PILr   ultralytics.data.augmentr   ultralytics.engine.predictorr   ultralytics.engine.resultsr   ultralytics.utilsr   r   r
    r   r   <module>rW      s*       8 6 . .P
m P
r   