o
    0j{(                     @   s   d dl mZmZmZmZmZ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mZmZmZmZ d
dlmZmZ ddlmZmZ ddlm Z  dd eD Z!dd eD Z"e!e" Z#G dd deZ$G dd deZ%dS )    )AnyDictListOptionalTupleUnionN)Image   )MODELS)FuncRegister   ImageBatchSampler)	ReadImage   )	NormalizeResizeResizeByShortToBatch
ToCHWImage)RunnerPredictorTransformersPredictor   )CropTopk
TopkResultc                 C      g | ]	}| d r|qS )z	PP-LCNet_
startswith.0name r#   x/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/paddlex/inference/models/image_classification/predictor.py
<listcomp>       r%   c                 C   r   )z
PP-HGNetV2r   r    r#   r#   r$   r%      r&   c                	       s  e Zd ZdZi ZeeZ	d)deedf de	de
ddf fddZdefd	d
ZdefddZdefddZ	d)de	eeejf  deedf de
eef fddZed	d*ddZedd+ddZedg dg dddd fd!d"Zed#d$d% Zed&d)d'd(Z  ZS ),ClasRunnerPredictorz7ClasRunnerPredictor that inherits from RunnerPredictor.Ntopkargskwargsreturnc                    s,   t  j|i | || _|  \| _| _dS )aj  Initializes ClasPredictor.

        Args:
            topk (int, optional): The number of top-k predictions to return. If None, it will be depending on config of inference or predict. Defaults to None.
            *args: Arbitrary positional arguments passed to the superclass.
            **kwargs: Arbitrary keyword arguments passed to the superclass.
        N)super__init__r(   _buildpreprocessorspostprocessorsselfr(   r)   r*   	__class__r#   r$   r-   (   s   
zClasRunnerPredictor.__init__c                 C      t  S )zBuilds and returns an ImageBatchSampler instance.

        Returns:
            ImageBatchSampler: An instance of ImageBatchSampler.
        r   r2   r#   r#   r$   _build_batch_sampler6   s   z(ClasRunnerPredictor._build_batch_samplerc                 C      t S )zhReturns the result class, TopkResult.

        Returns:
            type: The TopkResult class.
        r   r6   r#   r#   r$   _get_result_class>   s   z%ClasRunnerPredictor._get_result_classc           
      C   s   dt ddi}| jd d D ])}t| d }| j| }||i }|r-|| fi |n|| \}}|||< qt |d< i }| jd D ]%}	| j|	}| jd |	i }|r_|| fi |n|| \}}|||< qD||fS )	zBuild the preprocessors and postprocessors based on the configuration.

        Returns:
            tuple: A tuple containing the preprocessors and postprocessors.
        ReadRGBformatZ
PreProcessZtransform_opsr   r   PostProcess)r   configlistkeys	_FUNC_MAPgetr   )
r2   r/   cfgZtf_keyfuncr)   r"   opr0   keyr#   r#   r$   r.   F   s   
 

 
zClasRunnerPredictor._build
batch_datac           
      C   s   | j d |jd}| j d |d}d| j v r| j d |d}| j d |d}| j d |d}| j d |d}| j|d}| jd	 ||pE| jd
\}}}	|j|j||||	dS )aD  
        Process a batch of data through the preprocessing, inference, and postprocessing.

        Args:
            batch_data (List[Union[str, np.ndarray], ...]): A batch of input data (e.g., image file paths).
            topk: The number of top predictions to keep. If None, it will be depending on `self.topk`. Defaults to None.

        Returns:
            dict: A dictionary containing the input path, raw image, class IDs, scores, and label names for every instance of the batch. Keys include 'input_path', 'input_img', 'class_ids', 'scores', and 'label_names'.
        r:   Zimgsr   r   r   ToCHWr   )xr   r(   Z
input_pathZ
page_indexZ	input_img	class_idsZscoresZlabel_names)r/   	instancesrunnerr0   r(   input_pathspage_indexes)
r2   rH   r(   batch_raw_imgsZ
batch_imgsrK   Zbatch_predsZbatch_class_idsbatch_scoresbatch_label_namesr#   r#   r$   process]   s$   

zClasRunnerPredictor.processZResizeImagecv2LINEARc                 C   s@   |s|sJ |rt |d ||d}d|fS t|d ||d}d|fS )N)Ztarget_short_edgesize_divisorinterpbackend)Ztarget_sizerY   rZ   r[   r   )r   r   )r2   Zresize_shortsizer[   interpolationrF   r#   r#   r$   build_resize~   s    z ClasRunnerPredictor.build_resizeZ	CropImage   c                 C   s   dt |dfS )Nr   )Z	crop_size)r   )r2   r\   r#   r#   r$   
build_crop   s   zClasRunnerPredictor.build_cropZNormalizeImage)g
ףp=
?gv/?gCl?)gZd;O?gy&1?g?gp? r   c                 C   s*   |dksJ |dksJ dt |||dfS )Nr   ra   r   )scalemeanstd)r   )r2   rc   rd   rb   orderZchannel_numr#   r#   r$   build_normalize   s   	z#ClasRunnerPredictor.build_normalizer   c                 C   s
   dt  fS )NrJ   )r   r6   r#   r#   r$   build_to_chw   s   
z ClasRunnerPredictor.build_to_chwr   c                 C   s   | j st|| _ dt|dfS )Nr   )rN   )r(   intr   )r2   r(   Z
label_listr#   r#   r$   
build_topk   s   
zClasRunnerPredictor.build_topkN)NNrW   rX   )r_   )__name__
__module____qualname____doc__rB   r   registerr   rh   r   r   r-   r   r7   typer9   r   r.   strnpndarrayr   rV   r^   r`   rf   rg   ri   __classcell__r#   r#   r3   r$   r'   "   sR    



!
r'   c                	       s   e Zd ZdZddee dededdf fddZdd	d
Z	de
fddZdefddZdd Zdeeef fddZdd Z	ddeeeejf  dee deeef fddZdd Z  ZS )ClasTransformersPredictorzCImage classification predictor backed by Hugging Face transformers.Nr(   r)   r*   r+   c                    s@   t  j|i | || _|   tdd| _|  \| _| _d S )Nr;   r<   )	r,   r-   r(   _load_default_topkr   read_opr.   image_processorinferr1   r3   r#   r$   r-      s
   z"ClasTransformersPredictor.__init__c                 C   s\   | j d urd S | jdi }|di }t|tr)|dd ur)t|d | _ d S d| _ d S )Nr>   r   r(      )r(   Zmodel_configrC   
isinstancedictrh   )r2   postZtopk_cfgr#   r#   r$   rv      s   

z,ClasTransformersPredictor._load_default_topkc                 C   r5   rj   r   r6   r#   r#   r$   r7      s   z.ClasTransformersPredictor._build_batch_samplerc                 C   r8   rj   r   r6   r#   r#   r$   r9      s   z+ClasTransformersPredictor._get_result_classc                 C   s,   ddl m}m} | |}| |}||fS )Nr   )AutoImageProcessorAutoModelForImageClassification)Ztransformersr~   r   Z_load_pretrained_processorZ_load_pretrained_model)r2   r~   r   rx   modelr#   r#   r$   r.      s   

z ClasTransformersPredictor._buildc                 C   s$   t | jjjpi }dd | D S )Nc                 S   s   i | ]\}}t |t|qS r#   )rh   rq   )r!   kvr#   r#   r$   
<dictcomp>   s    z?ClasTransformersPredictor._resolve_id2label.<locals>.<dictcomp>)r|   ry   r?   id2labelitems)r2   rawr#   r#   r$   _resolve_id2label   s   z+ClasTransformersPredictor._resolve_id2labelc                 C   s   t |dd }|d ur|S t |dd }|d ur t |dd dkr |S t |dd }|d ur4t |dd dkr4|S t|drL| D ]}t |dd dkrK|  S q=tt|jd)Nlogitslast_hidden_statendimr   pooler_outputto_tuplez8 does not provide a usable classification logits tensor.)getattrhasattrr   AttributeErrorrp   rk   )r2   outputsr   r   r   itemr#   r#   r$   _resolve_logits   s$   
z)ClasTransformersPredictor._resolve_logitsrH   c           
      C   s\   | j |jd}dd |D }| j|d}| |}| j||d\}}}	|j|j||||	dS )NrI   c                 S   s   g | ]}t |qS r#   )r   Z	fromarray)r!   Zimgr#   r#   r$   r%      s    z5ClasTransformersPredictor.process.<locals>.<listcomp>)imagesrL   rM   )rw   rO   Zpreprocess_imagesforwardpostprocessrQ   rR   )
r2   rH   r(   rS   r   Zmodel_inputsr   indexesrT   rU   r#   r#   r$   rV      s   
z!ClasTransformersPredictor.processc          
         s   dd l }|   | |}|j|dd   t|d ur!|n| j}j	ddd d | d f d d d d df 
d}fddt|D } fd	d|D }	|||	fS )
Nr   )dimr   )ZaxisZint32c                    s&   g | ]\}}t j | | d dqS )rz   )Zdecimals)rr   around)r!   iidx)probsr#   r$   r%     s    z9ClasTransformersPredictor.postprocess.<locals>.<listcomp>c                    s   g | ]} fd d|D qS )c                    s    g | ]}  t|t|qS r#   )rC   rh   rq   )r!   r   r   r#   r$   r%     s     zDClasTransformersPredictor.postprocess.<locals>.<listcomp>.<listcomp>r#   )r!   rowr   r#   r$   r%     s    )torchr   r   Zsoftmaxdetachcpunumpyrh   r(   ZargsortZastype	enumerate)
r2   r   r(   r*   r   r   r   r   rT   rU   r#   )r   r   r$   r     s   
6


z%ClasTransformersPredictor.postprocessrj   )r+   N)rk   rl   rm   rn   r   rh   r   r   r-   rv   r   r7   rp   r9   r.   rq   r   r   r   rr   rs   r   rV   r   rt   r#   r#   r3   r$   ru      s$    $



ru   )&typingr   r   r   r   r   r   r   rr   ZPILr   Z'modules.image_classification.model_listr
   Zutils.func_registerr   Zcommon.batch_samplerr   Zcommon.readerr   commonr   r   r   r   r   Z
predictorsr   r   Z
processorsr   r   resultr   ZPPLCNET_MODELSZHGNETV2_MODELSZCLAS_TRANSFORMERS_MODELSr'   ru   r#   r#   r#   r$   <module>   s"     