
    Ng-              	          U d dl Z d dlmZmZmZmZmZmZ d dlZd dl	Z
d dl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mZ d d
lmZ d dlm Z m!Z!m"Z"  ej#         ej$                               ddddddZ%eee&e'f                  e(d<    e  e!e"dd          e%d          e j)        *                    edd          e%dd e  e!e"dd          e%d          dZ+ee'ee e,f         f         e(d<    G d de          Z-dS )    N)DictFinalListOptionalUnioncast)HUGGINGFACE_HUB_CACHE)_pybind_state)	QuantTypequantize_dynamic)Image)Source)LayoutElement)loggerlogger_onnx) UnstructuredObjectDetectionModel)LazyDictLazyEvaluateInfo%download_if_needed_and_get_local_pathTextTitler   TableFigure)r               DEFAULT_LABEL_MAPz1unstructuredio/detectron2_faster_rcnn_R_50_FPN_3xz
model.onnxg?)
model_path	label_mapconfidence_thresholddetectron2_quantizedzdetectrin2_quantized.onnxz6unstructuredio/detectron2_mask_rcnn_X_101_32x8d_FPN_3x)detectron2_onnxr"   detectron2_mask_rcnnMODEL_TYPESc                        e Zd ZdZdZdZdej        dee         f fdZ		 dde
d	eee
f         d
ee         fdZdej        dee
ej        f         fdZdej        dej        dej        dededee         fdZ xZS )UnstructuredDetectronONNXModelz5Unstructured model wrapper for detectron2 ONNX model.i   i  imagereturnc                    t                                          |           |                     |          }	 | j                            d|          }|d         }|d         }d| j        v r|d         n|d         }n5# t          j        j        j	        $ r t          j        d           g cY S w xY w|j        \  }}|                     |||||          }	|	S )z*Makes a prediction using detectron2 model.Nr   r   R_50r   r   zIIgnoring runtime error from onnx (likely due to encountering blank page).)superpredict
preprocessmodelrunr   onnxruntimecapionnxruntime_pybind11_stateRuntimeExceptionr   debugsizepostprocess)selfr(   prepared_inputresultbboxeslabelsconfidence_scoresinput_winput_hregions	__class__s             h/var/www/html/ai-engine/env/lib/python3.11/site-packages/unstructured_inference/models/detectron2onnx.pyr-   z&UnstructuredDetectronONNXModel.predictK   s    //	Z^^D.99FAYFAYF .4t-F-Fq		FSTI:K 	 	 	[   III		
 !:""663DgwWWs   AA> >/B0/B0Nr   r    r!   c                    t           j                            |          sd|v rt          j        d           t          j        d                    t           j                            |          dd                              t          d         d         }t          ||t          j                   t          j                    g d	}fd
|D             }t          j        ||          | _        || _        || _        |d}|| _        dS )z9Loads the detectron2 model using the specified parametersr"   z9Quantized model don't currently exists, quantizing now... Nr#   r   )weight_type)TensorrtExecutionProviderCUDAExecutionProviderCPUExecutionProviderc                     g | ]}|v |	S  rK   ).0provideravailable_providerss     rB   
<listcomp>z=UnstructuredDetectronONNXModel.initialize.<locals>.<listcomp>t   s$    ccc(8ObCbCbXCbCbCb    )	providersg      ?)ospathexistsr   infomkdirjoinsplitr%   r   r   QUInt8Cget_available_providersr1   InferenceSessionr/   r   r    r!   )r8   r   r    r!   source_pathordered_providersrQ   rN   s          @rB   
initializez)UnstructuredDetectronONNXModel.initializea   s    w~~j)) 	T.D
.R.RKSTTTHRWWRW]]:66ss;<<===%&78FK[*)BRSSSS799
 
 

 dccc.?ccc	 1
 
 

 %"'#& $8!!!rP   c                 @   t          j        |          }| j        }t          j        || j        | j        ft          j                                      t           j	                  }|
                    ddd          }|                                d         j        |i}|S )zProcess input image into required format for ingestion into the Detectron2 ONNX binary.
        This involves resizing to a fixed shape and converting to a specific numpy format.
        )interpolationr   r   r   )nparrayr/   cv2resize
required_w
required_hINTER_LINEARastypefloat32	transpose
get_inputsname)r8   r(   imgsession
ort_inputss        rB   r.   z)UnstructuredDetectronONNXModel.preprocess   s    
 huoo* j_do.*
 
 
 &

	 	
 mmAq!$$((**1-2C8
rP   r;   r<   r=   r>   r?   c                    g }|| j         z  }|| j        z  }t          |||          D ]w\  \  }	}
}}}}| j        t	          |                   }|| j        k    rGt          j        |	|z  |
|z  ||z  ||z  d||t          j	                  }|
                    |           x|                    d            t          t          t                   |          S )ztProcess output into Unstructured class. Bounding box coordinates are converted to
        original image resolution.N)texttypeprobsourcec                     | j         j        S N)bboxy1)elements    rB   <lambda>z<UnstructuredDetectronONNXModel.postprocess.<locals>.<lambda>   s
     rP   )key)rf   rg   zipr    intr!   r   from_coordsr   DETECTRON2_ONNXappendsortr   r   )r8   r;   r<   r=   r>   r?   r@   width_conversionheight_conversionx1ry   x2y2labelconfdetected_classregions                    rB   r7   z*UnstructuredDetectronONNXModel.postprocess   s     "T_4#do5-0AR-S-S 	' 	')RReT!^CJJ7Nt000&2))**))**'!1	 	 	 v&&&88999D'111rP   rw   )__name__
__module____qualname____doc__rf   rg   r   r   r   r-   strr   r~   r   floatr_   rb   ndarrayr.   r7   __classcell__)rA   s   @rB   r'   r'   D   s2       ?? JJU[ T--@      4 15	9 99 S>9 'uo	9 9 9 9> S"*_0E    &2
2 
2 :	2
 2 2 
m	2 2 2 2 2 2 2 2rP   r'   ).rR   typingr   r   r   r   r   r   rd   numpyrb   r1   huggingface_hub.constantsr	   onnxruntime.capir
   rZ   onnxruntime.quantizationr   r   PILr    unstructured_inference.constantsr   .unstructured_inference.inference.layoutelementr   unstructured_inference.loggerr   r   /unstructured_inference.models.unstructuredmodelr   unstructured_inference.utilsr   r   r   set_default_logger_severitygetEffectiveLevelr   r~   r   __annotations__rS   rW   r%   dictr'   rK   rP   rB   <module>r      s   					 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; 



         ; ; ; ; ; ; / / / / / / @ @ @ @ @ @ @ @       3 3 3 3 3 3 H H H H H H = = = = = = = =               ( '(E(E(G(G H H H , , 5c3h(     x##1?
 

 $    gll!"'
 

 ' #  %H##1D
 

 $   '1 1T#uXt^,,-   >m2 m2 m2 m2 m2%E m2 m2 m2 m2 m2rP   