
    9i                     P   S SK JrJ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
Jr  S SKJr  S SKJr  S SKJr  S S	KJr  \" 5       r\R*                  " \R,                  \R.                  S
9 " S S\5      5       rS rS r " S S\5      rS rSS jr " S S\R>                  5      r g)    )AnyDictN)nn)	Pipelines)InputPipeline)	PIPELINES)	LoadImage)Tasks)
get_logger)module_namec                   n   ^  \ rS rSrS\4U 4S jjrS\4S jrS\\\	4   4S jr
S\\\	4   4S jrSrU =r$ )	VidtPipeline   modelc           	      L  > [         TU ]  " S
SU0UD6  U R                  R                  5         [        R
                  " [        R                  " SS/5      [        R                  " 5       [        R                  " / SQ/ SQS9/5      U l	        [        5       U l        SSS.U l        g	)ad  
use `model` to create a vidt pipeline for prediction
Args:
    model: model id on modelscope hub.
Example:
    >>> from modelscope.pipelines import pipeline
    >>> vidt_pipeline = pipeline('image-object-detection', 'damo/ViDT-logo-detection')
    >>> result = vidt_pipeline(
        'data/test/images/vidt_test1.png')
    >>> print(f'Output: {result}.')
r   i  )g
ףp=
?gv/?gCl?)gZd;O?gy&1?g?)meanstdnegativepositive)r      N )super__init__r   eval
transformsComposeResizeToTensor	Normalize	transformPostProcesspostprocessors	label_dic)selfr   kwargs	__class__s      e/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/modelscope/pipelines/cv/vidt_pipeline.pyr   VidtPipeline.__init__   s     	/u//

#++sCj)!  *0EG-
  *m'J7    inputsc                    [         R                  " U5      nUR                  S   UR                  S   /nU R                  U5      nU/nU/n[        R
                  " U5      R                  U R                  5      n[        U5      nUR                  U R                  5      n0 n	UR                  U	S'   UR                  U	S'   XyS'   U	$ )Nr   r   tensorsmaskorig_target_sizes)r
   convert_to_imgsizer!   torchtensortodevicenested_tensor_from_tensor_listr-   r.   )
r%   r+   preprocess_paramsimgori_sizeimagetensor_listr/   samplesress
             r(   
preprocessVidtPipeline.preprocess.   s    &&v.HHQK!-s#g%J!LL):;>>t{{K0=**T[[) IllF#4 
r*   c                     US   nUS   nUS   n[         R                  " 5          U R                  X45      u  pg0 nXhS'   XxS'   XXS'   UsS S S 5        $ ! , (       d  f       g = f)Nr-   r.   r/   out_pred_logitsout_pred_boxes)r2   no_gradr   )	r%   r+   forward_paramsr-   r.   r/   rA   rB   r=   s	            r(   forwardVidtPipeline.forward=   sh    #f~"#67]]_.2jj.G+OC%4!"$2 !'8#$ __s   #A
A c                 &   U R                  US   US   US   5      n[        U5      S   n/ n/ n/ nU HL  nUR                  US   5        UR                  U R                  US      5        UR                  US   5        MN     0 n	XYS'   XiS'   XyS	'   U	$ )
NrA   rB   r/   r   r      scoreslabelsboxes)r#   get_predictionsappendr$   )
r%   r+   post_paramsresultsbatch_predictionsrI   rJ   rK   sub_preoutputss
             r(   postprocessVidtPipeline.postprocessI   s    %%f->&?&,-=&>&,-@&AC ,G4Q7(GMM'!*%MM$..45LL$ ) "" r*   )r$   r#   r!   )__name__
__module____qualname____firstlineno__strr   r   r>   r   r   rE   rS   __static_attributes____classcell__r'   s   @r(   r   r      sH    8c 80 
d38n 
$sCx.  r*   r   c                 X   [        U  Vs/ s H  n[        UR                  5      PM     sn5      n[        U 5      /U-   nUu  pEpgU S   R                  nU S   R
                  n	[        R                  " X8U	S9n
[        R                  " XFU4[        R                  U	S9n[        X
U5       Ho  u  pnUS UR                  S   2S UR                  S   2S UR                  S   24   R                  U5        SUS UR                  S   2S UR                  S   24'   Mq     [        X5      $ s  snf )Nr   )dtyper5   r   rH   F)_max_by_axislistshapelenr^   r5   r2   zerosonesboolzipcopy_NestedTensor)r;   r8   max_sizebatch_shapebchwr^   r5   r3   r.   pad_imgms                 r(   r6   r6   \   s   DT#))_DEH{#$x/KJA!N  E^""F[[&AF::qQiuzz&AD{D9a1}		!}msyy|m;<BB3G*/-399Q<-#))A,
&' : %% Es   D'c                 p    U S   nU SS   H'  n[        U5       H  u  p4[        X   U5      X'   M     M)     U$ )Nr   r   )	enumeratemax)the_listmaxessublistindexitems        r(   r_   r_   k   sC    QKEAB<$W-KEu|T2EL .   Lr*   c                   ,    \ rS rSrS rS rS rS rSrg)rh   t   c                     Xl         X l        g Nr-   r.   )r%   r-   r.   s      r(   r   NestedTensor.__init__v   s    	r*   c                     U R                   R                  U5      nU R                  nUb  Uc   eUR                  U5      nOS n[        X$5      $ r|   )r-   r4   r.   rh   )r%   r5   cast_tensorr.   	cast_masks        r(   r4   NestedTensor.toz   sL    lloof-yy###IIK33r*   c                 2    U R                   U R                  4$ r|   r}   r%   s    r(   	decomposeNestedTensor.decompose   s    ||TYY&&r*   c                 ,    [        U R                  5      $ r|   )rY   r-   r   s    r(   __repr__NestedTensor.__repr__   s    4<<  r*   )r.   r-   N)	rU   rV   rW   rX   r   r4   r   r   rZ   r   r*   r(   rh   rh   t   s    	4'!r*   rh   c                     U R                  S5      u  pp4USU-  -
  USU-  -
  USU-  -   USU-  -   /n[        R                  " USS9$ )Ng      ?dim)unbindr2   stack)xx_cy_crn   rm   rk   s         r(   box_cxcywh_to_xyxyr      sR    XXb\NCa
a-3q=C#'MS37]LA;;qb!!r*   c                    / nU  H  n/ n[        [        US   5      5       H  n[        US   U   R                  5       5      n[	        US   U   R                  5       5      n/ nUS   U   R                  5        H  n	UR                  [	        U	5      5        M     Xa:  d  M  UR                  XgU/5        M     UR                  U5        M     U$ )NrI   rJ   rK   )rangerb   floatcpuintrM   )
post_resultsbbox_thubatch_final_resper_img_resper_img_final_resiscorelabelbboxits
             r(   rL   rL      s    O#s;x012A+h/26689EH-a04467ED!'*1-113CG$ 4 !((%)=> 3 	01 $ r*   c                   ^   ^  \ rS rSrSrSU 4S jjr\R                  " 5       S 5       rSr	U =r
$ )r"      zPThis module converts the model's output into the format expected by the coco apic                 .   > [         TU ]  5         Xl        g r|   )r   r   processor_dct)r%   r   r'   s     r(   r   PostProcess.__init__   s    *r*   c           	         [        U5      [        U5      :X  d   eUR                  S   S:X  d   eUR                  5       n[        R                  " UR                  UR                  S   S5      SSS9u  pVUnXaR                  S   -  nXaR                  S   -  n	[        U5      n
[        R                  " U
SUR                  S5      R                  SSS5      5      n
UR                  S5      u  p[        R                  " XX/SS9R                  [        R                  5      nXSS2SSS24   -  n
[        XyU
5       VVVs/ s H  u  pnUUUS	.PM     nnnnU$ s  snnnf )
a  Perform the computation

Parameters:
    out_logits: raw logits outputs of the model
    out_bbox: raw bbox outputs of the model
    target_sizes: tensor of dimension [batch_size x 2] containing the size of each images of the batch
                  For evaluation, this must be the original image size (before any data augmentation)
                  For visualization, this should be the image size after data augment, but before padding
r   rH   r   r   d   r      N)rI   rJ   rK   )rb   ra   sigmoidr2   topkviewr   gather	unsqueezerepeatr   r   r4   float32rf   )r%   
out_logitsout_bboxtarget_sizesprobtopk_valuestopk_indexesrI   
topk_boxesrJ   rK   img_himg_w	scale_fctslrk   rO   s                     r(   rE   PostProcess.forward   sm    :#l"3333!!!$)))!!#$)JJIIj&&q)2.%<!!%5%5a%88
 0 0 33"8,UA'11"5<<Q1EG $**1-KKu <$%'')r%--'8 	!T1*-- VU3	5 4gaA 
 4	 	 5 5s   E)r   r|   )rU   rV   rW   rX   __doc__r   r2   rC   rE   rZ   r[   r\   s   @r(   r"   r"      s%    [+
 ]]_# #r*   r"   )g?)!typingr   r   r2   torchvision.transformsr   r   modelscope.metainfor   modelscope.pipelines.baser   r   modelscope.pipelines.builderr	   modelscope.preprocessorsr
   modelscope.utils.constantr   modelscope.utils.loggerr   loggerregister_moduleimage_object_detectionvidtr   r6   r_   objectrh   r   rL   Moduler"   r   r*   r(   <module>r      s      +  ) 5 2 . + .	 	  inn>E8 E>EP&!6 !0" ,")) ,r*   