o
    0jN.                     @   s   d dl mZmZmZmZmZ d dlZd dlm	Z	 ddl
mZmZ ddlmZmZ ddlmZ dd	lmZ dd
lmZ ddgZG dd deZG dd deZdS )    )AnyListOptionalTupleUnionN)Image   )DetRunnerPredictorDetTransformersPredictor)ResizeToBatch   )LayoutAnalysisProcessLayoutAnalysisResult)STATIC_SHAPE_MODEL_LISTPP-DocLayoutV2PP-DocLayoutV3c                       s   e Zd ZdZdddeeeeeef f  f fddZdd Z							
		dde
e deeeef  dedeeeeeef ef  deeeef  dee dee dee
e  fddZeddddZdd Zdd Z  ZS ) LayoutAnalysisRunnerPredictorzLayout analysis predictor.N)img_sizer   c                   s   |dur8| j tvsJ d| j  dt|tr||f}nt|ttfr.t|dks-J dn
tdt| dt	 j
|i | dS )ad  Initializes LayoutAnalysisPredictor.
        Args:
            *args: Arbitrary positional arguments passed to the superclass.
            img_size (Optional[Union[int, Tuple[int, int]]], optional): The input image size (w, h). Defaults to None.
            threshold (Optional[float], optional): The threshold for filtering out low-confidence predictions.
                Defaults to None.
            layout_nms (bool, optional): Whether to use layout-aware NMS. Defaults to False.
            layout_unclip_ratio (Optional[Union[float, Tuple[float, float]]], optional): The ratio of unclipping the bounding box.
                Defaults to None.
                If it's a single number, then both width and height are used.
                If it's a tuple of two numbers, then they are used separately for width and height respectively.
                If it's None, then no unclipping will be performed.
            layout_merge_bboxes_mode (Optional[Union[str, dict]], optional): The mode for merging bounding boxes. Defaults to None.
            **kwargs: Arbitrary keyword arguments passed to the superclass.
        Nz
The model z! is not supported set input shaper   z%The length of `img_size` should be 2.z?The type of `img_size` must be int or Tuple[int, int], but got .)
model_namer   
isinstanceinttuplelistlen
ValueErrortypesuper__init__)selfr   argskwargs	__class__ s/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/paddlex/inference/models/layout_analysis/predictor.pyr        s   

z&LayoutAnalysisRunnerPredictor.__init__c                 C      t S Nr   r!   r&   r&   r'   _get_result_classC      z/LayoutAnalysisRunnerPredictor._get_result_classFautoT
batch_data	threshold
layout_nmslayout_unclip_ratiolayout_merge_bboxes_modelayout_shape_modefilter_overlap_boxesskip_order_labelsc	                 C   s   |j }	| jdd D ]}
|
|	}	q
| jd |	}| |}| |}| j||	|dur,|n| j|p2| j|p6| j|p:| j|||d	}|j	|j
dd |	D |dS )a+  
        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).
            threshold (Optional[float, dict], optional): The threshold for filtering out low-confidence predictions.
            layout_nms (bool, optional): Whether to use layout-aware NMS. Defaults to None.
            layout_unclip_ratio (Optional[Union[float, Tuple[float, float]]], optional): The ratio of unclipping the bounding box.
            layout_merge_bboxes_mode (Optional[Union[str, dict]], optional): The mode for merging bounding boxes. Defaults to None.
            layout_shape_mode (Optional[str], optional): The mode for layout shape. Defaults to "auto", [ "rect", "quad","poly", "auto"]. are supported.
            filter_overlap_boxes (Optional[bool], optional): Whether to filter out overlap boxes. Defaults to True.
            skip_order_labels (Optional[List[str]], optional): The labels to skip order. 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'.
        Nr/   r0   r1   r2   r3   r4   r5   c                 S      g | ]}|d  qS Zori_imgr&   .0datar&   r&   r'   
<listcomp>       z9LayoutAnalysisRunnerPredictor.process.<locals>.<listcomp>Z
input_pathZ
page_indexZ	input_imgboxes)	instancesZpre_opsrunnerZ_format_outputZpost_opr/   r0   r1   r2   input_pathspage_indexes)r!   r.   r/   r0   r1   r2   r3   r4   r5   datasZpre_opZbatch_inputsZbatch_predsZ
preds_listr@   r&   r&   r'   processF   s.   


z%LayoutAnalysisRunnerPredictor.processr   r   c                 C   sH   |sJ || _ t|trdddddd| }t|d d d ||d}|S )	NZNEARESTZLINEARZBICUBICZAREAZLANCZOS4)r   r   r         r6   )target_size
keep_ratiointerp)rI   r   r   r   )r!   rI   rJ   rK   opr&   r&   r'   build_resize   s   
z*LayoutAnalysisRunnerPredictor.build_resizec                    s2   ddg}t  fdd|D rd}nd}t|dS )Nr   r   c                 3   s    | ]}| j v V  qd S r)   )r   )r;   namer*   r&   r'   	<genexpr>   s    z?LayoutAnalysisRunnerPredictor.build_to_batch.<locals>.<genexpr>)r   imgscale_factors)rP   rQ   )ordered_required_keys)anyr   )r!   Zmodels_required_imgsizerR   r&   r*   r'   build_to_batch   s   
z,LayoutAnalysisRunnerPredictor.build_to_batchc                 C   s   | j d u r| jdd| _ | js| jdd | _| jd u r%| jdd | _| jd u r2| jdd | _t| dddg}t| jd |d	S )
NZdraw_thresholdg      ?r0   r1   r2   rI      Z
label_listlabels
scale_size)r/   configgetr0   r1   r2   getattrr   )r!   rX   r&   r&   r'   build_postprocess   s   



z/LayoutAnalysisRunnerPredictor.build_postprocessNFNNr-   TN)Fr   )__name__
__module____qualname____doc__r   r   r   r   r    r+   r   r   floatdictboolstrrF   r	   registerrM   rT   r\   __classcell__r&   r&   r$   r'   r      sF    #
	
>r   c                       s   e Zd ZdZ fddZdd Zdee fddZd	d
 Z								ddee
 deeeef  dedeeeeeef ef  deeeef  dee dee deee  fddZdd Z  ZS )#LayoutAnalysisTransformersPredictorz=Layout analysis predictor backed by HuggingFace transformers.c                    s*   t  j|i | t| j|  d| _d S )NrV   )r   r    r   rW   _resolve_scale_sizelayout_postprocess)r!   r"   r#   r$   r&   r'   r       s
   z,LayoutAnalysisTransformersPredictor.__init__c                 C   r(   r)   r   r*   r&   r&   r'   r+      r,   z5LayoutAnalysisTransformersPredictor._get_result_classreturnc                 C   sr   | j dg D ]-}|ddkrq|d}t|tr!||g  S t|ttfr4t|dkr4t|  S qddgS )NZ
Preprocessr   r   rI   r   rU   )Zmodel_configrZ   r   r   r   r   r   )r!   cfgrI   r&   r&   r'   ri      s   

z7LayoutAnalysisTransformersPredictor._resolve_scale_sizec                 C   s   |  |}d|v r0|d    jtjdd}t|t|kr0tj||d d d f gdd}d|i}d|v rCdd	 |d D |d< |S )
N	order_seqF)copyr   )Zaxisr@   Zpolygon_pointsc                 S   s   g | ]}t |qS r&   )npZasarray)r;   Zpointsr&   r&   r'   r=      s    
zZLayoutAnalysisTransformersPredictor._format_layout_transformers_output.<locals>.<listcomp>)	Z_format_transformers_outputdetachcpunumpyZastypero   Zfloat32r   Zconcatenate)r!   
prediction	formattedrm   outputr&   r&   r'   "_format_layout_transformers_output   s"   

zFLayoutAnalysisTransformersPredictor._format_layout_transformers_outputNFr-   Tr.   r/   r0   r1   r2   r3   r4   r5   c	                    s   t  jdstt jj d |j}	dd |	D }
 |\}} j|
d} 	|} j
||	|d} fdd|D } j||	||pJ j|pN j|pR j|||d	}|j|jd	d |	D |d
S )Npost_process_object_detectionz2 does not support `post_process_object_detection`.c                 S   s   g | ]	}t |d  qS )rP   )r   Z	fromarrayr:   r&   r&   r'   r=      s    z?LayoutAnalysisTransformersPredictor.process.<locals>.<listcomp>)images)rE   r/   c                    s   g | ]}  |qS r&   )rv   )r;   rs   r*   r&   r'   r=      s    r7   c                 S   r8   r9   r&   r:   r&   r&   r'   r=     r>   r?   )hasattrimage_processorRuntimeErrorr   r^   Zread_oprA   Z_get_hf_thresholdZpreprocess_imagesforwardpostprocessrj   r0   r1   r2   rC   rD   )r!   r.   r/   r0   r1   r2   r3   r4   r5   rE   rx   Zeffective_thresholdZhf_thresholdZmodel_inputsoutputspredictionsZbatch_outputsr@   r&   r*   r'   rF      s<   

z+LayoutAnalysisTransformersPredictor.processc                K   s   | j j||| |d}|S )N)r/   Ztarget_sizes)rz   rw   Z_get_target_sizes)r!   r~   rE   r/   r#   r   r&   r&   r'   r}     s   z/LayoutAnalysisTransformersPredictor.postprocessr]   )r^   r_   r`   ra   r    r+   r   r   ri   rv   r   r   r   rb   rc   rd   r   re   rF   r}   rg   r&   r&   r$   r'   rh      s>    
	
1rh   )typingr   r   r   r   r   rr   ro   ZPILr   Zobject_detection.predictorr	   r
   Zobject_detection.processorsr   r   Z
processorsr   resultr   utilsr   Z#LAYOUT_ANALYSIS_TRANSFORMERS_MODELSr   rh   r&   r&   r&   r'   <module>   s    