o
    0jF<                     @   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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 ej G dd deZ!edG dd deZ"dS )    )AnyDictListOptionalTupleUnionN   )logging)pipeline_requires_extra   )ImageBatchSampler)	ReadImage)	HPIConfigPaddlePredictorOption)	DetResult)	benchmark   )(AutoParallelImageSimpleInferencePipeline)BasePipeline)CropByBoxes   )FormulaRecognitionResultc                       sf  e Zd ZdZddddddddedee dee deeeef  d	ee d
e	dee
eeef ef  ddf fddZdee	 dee	 dee	 defddZdede
eee f de	fddZ								dde
eee ejeej f dee	 dee	 dee	 dee
eee f  dee
eef  dee	 dee
eeeef f  dee defddZ  ZS ) _FormulaRecognitionPipelinezFormula Recognition PipelineNFdeviceengineengine_config	pp_optionuse_hpip
hpi_configconfigr   r   r   r   r   r   returnc             	      s\  t  jd||||||d| |dd| _| jr,|di dddi}	| |	| _|dd| _| jr|d	i d
ddi}
i }|
dd }durR||d< |
dd }dur`||d< |
dd }durn||d< |
dd }dur|||d< | j|
fi || _|d	i dddi}| || _	t
 | _t|ddd| _tdd| _dS )a  Initializes the formula recognition pipeline.

        Args:
            config (Dict): Configuration dictionary containing various settings.
            device (Optional[str], optional): The device to use for prediction. Defaults to `None`.
            engine (Optional[str], optional): Inference engine. Defaults to `None`.
            engine_config (Optional[Dict[str, Any]], optional): Engine-specific config. Defaults to `None`.
            pp_option (Optional[PaddlePredictorOption], optional): Paddle predictor options.
                Defaults to `None`.
            use_hpip (bool, optional): Whether to use HPIP. Defaults to `False`.
            hpi_config (Optional[Union[Dict[str, Any], HPIConfig]], optional):
                HPIP configuration. Defaults to `None`.
        r   use_doc_preprocessorTZSubPipelinesZDocPreprocessorZpipeline_config_errorz+config error for doc_preprocessor_pipeline!use_layout_detectionZ
SubModulesZLayoutDetectionZmodel_config_errorz"config error for layout_det_model!	thresholdN
layout_nmslayout_unclip_ratiolayout_merge_bboxes_modeZFormulaRecognitionz#config error for formula_rec_model!
batch_sizer   )r(   ZBGR)format )super__init__getr"   Zcreate_pipelinedoc_preprocessor_pipeliner#   Zcreate_modellayout_det_modelformula_recognition_modelr   _crop_by_boxesr   batch_samplerr   
img_reader)selfr    r   r   r   r   r   r   kwargsZdoc_preprocessor_configZlayout_det_configZlayout_kwargsr$   r%   r&   r'   Zformula_recognition_config	__class__r*   y/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/paddlex/inference/pipelines/formula_recognition/pipeline.pyr,   $   sp   
z$_FormulaRecognitionPipeline.__init__use_doc_orientation_classifyuse_doc_unwarpingr#   c                 C   sL   |du r|du r| j }n|du s|du rd}nd}|du r | j}t||dS )a  
        Get the model settings based on the provided parameters or default values.

        Args:
            use_doc_orientation_classify (Optional[bool]): Whether to use document orientation classification.
            use_doc_unwarping (Optional[bool]): Whether to use document unwarping.
            use_layout_detection (Optional[bool]): Whether to use layout detection.

        Returns:
            dict: A dictionary containing the model settings.
        NTF)r"   r#   )r"   r#   dict)r4   r9   r:   r#   r"   r*   r*   r8   get_model_settingsz   s   z._FormulaRecognitionPipeline.get_model_settingsmodel_settingslayout_det_resc                 C   sR   |d r| j std dS |d r'|durtd dS | js'td dS dS )	a  
        Check if the input parameters are valid based on the initialized models.

        Args:
            model_settings (Dict): A dictionary containing input parameters.
            layout_det_res (Union[DetResult, List[DetResult]]): The layout detection result(s).
        Returns:
            bool: True if all required models are initialized according to input parameters, False otherwise.
        r"   zRSet use_doc_preprocessor, but the models for doc preprocessor are not initialized.Fr#   Nz^The layout detection model has already been initialized, please set use_layout_detection=FalsezRSet use_layout_detection, but the models for layout detection are not initialized.T)r"   r	   errorr#   )r4   r=   r>   r*   r*   r8   check_model_settings_valid   s"   z6_FormulaRecognitionPipeline.check_model_settings_validinputlayout_thresholdr%   r&   r'   c
           (   
   k   s   |  |||}| ||sddiV  |}|dur%t|ts!|g}t|}t| |D ]@\}}| |j}|d rFt| j	|||d}ndd |D }dd |D }g }|d	 s|du rd
d |D }t| 
|}|D ]}g }d|d< || || qnn|d	 rt| j|||||	d}ng }|D ]}zt|}W n ty   tdw || qg }g }dg}t||D ]C\}}d}|d D ]1}|d  dv r| ||g}|d }||d  i }||d< |d |d< || |d7 }q|t| qt| 
|}tt|d D ];}||| ||d   } ||| ||d   }!t| |!D ]\}"}|"d }|"d }#||d< |#|d< q/||! qt|j|j|||D ]\}$}%}}&}|$|%||&||d}'t|'V  qVq,dS )aH  
        This function predicts the layout parsing result for the given input.

        Args:
            input (Union[str, list[str], np.ndarray, list[np.ndarray]]): The input image(s) of pdf(s) to be processed.
            use_layout_detection (Optional[bool]): Whether to use layout detection.
            use_doc_orientation_classify (Optional[bool]): Whether to use document orientation classification.
            use_doc_unwarping (Optional[bool]): Whether to use document unwarping.
            layout_det_res (Optional[Union[DetResult, List[DetResult]]]): The layout detection result(s).
                It will be used if it is not None and use_layout_detection is False.
            **kwargs: Additional keyword arguments.

        Returns:
            formulaRecognitionResult: The predicted formula recognition result.
        r?   z0the input params for model settings are invalid!Nr"   )r9   r:   c                 S   s   g | ]}d |iqS Z
output_imgr*   ).0Zarrr*   r*   r8   
<listcomp>   s    z7_FormulaRecognitionPipeline.predict.<locals>.<listcomp>c                 S   s   g | ]}|d  qS rC   r*   )rD   itemr*   r*   r8   rE      s    r#   c                 S   s   g | ]}i qS r*   r*   )rD   _r*   r*   r8   rE      s    r   formula_region_id)r$   r%   r&   r'   zNo more layout det resultsr   Zboxeslabel)ZformulaZimgZ
coordinatedt_polys)
input_path
page_indexr>   doc_preprocessor_resZformula_res_listr=   )r<   r@   
isinstancelistiter	enumerater2   r3   Z	instancesr.   r0   appendr/   nextStopIteration
ValueErrorziplowerr1   lenrangeZinput_pathsZpage_indexesr   )(r4   rA   r#   r9   r:   r>   rB   r%   r&   r'   r5   r=   Zexternal_layout_det_resultsrG   Z
batch_dataZimage_arraysZdoc_preprocessor_resultsZdoc_preprocessor_imagesZformula_resultsZlayout_det_resultsZformula_rec_resultsZformula_rec_resZformula_results_for_imgZformula_crop_imgsZformula_det_resultsZchunk_indicesZdoc_preprocessor_imagerH   Zbox_infoZcrop_img_inforesidxZformula_det_results_for_idxZformula_rec_results_for_idxZformula_det_resrJ   rK   rL   rM   Zsingle_img_resr*   r*   r8   predict   s   




	z#_FormulaRecognitionPipeline.predict)NNNNNNNN)__name__
__module____qualname____doc__r   r   strr   r   boolr   r   r,   r;   r<   r   r   r@   npZndarrayfloatr   r   r\   __classcell__r*   r*   r6   r8   r       s    	V
!
%	
r   Zocrc                   @   s&   e Zd ZdgZedd Zdd ZdS )FormulaRecognitionPipelineZformula_recognitionc                 C   s   t S )N)r   )r4   r*   r*   r8   _pipeline_clsa  s   z(FormulaRecognitionPipeline._pipeline_clsc                 C   s   | ddS )Nr(   r   )r-   )r4   r    r*   r*   r8   _get_batch_sizee  s   z*FormulaRecognitionPipeline._get_batch_sizeN)r]   r^   r_   entitiespropertyrg   rh   r*   r*   r*   r8   rf   ]  s
    
rf   )#typingr   r   r   r   r   r   numpyrc   utilsr	   Z
utils.depsr
   Zcommon.batch_samplerr   Zcommon.readerr   modelsr   r   Zmodels.object_detection.resultr   Zutils.benchmarkr   Z	_parallelr   baser   
componentsr   resultr   Ztime_methodsr   rf   r*   r*   r*   r8   <module>   s&      >