
    ڧg/                        d dl Z d dlmZmZmZmZmZ d dlZd dlZd dlm	Z	m
Z
 ddlmZ ddlmZ ej        j        de
de
fd	            Zej        j        d
e
defd            Z	 	 dde
dededeeee
f                  deeeef                  dee
eeee
f                  f         fdZ G d de	j                  Zde
dee         dee         de
fdZde
dee         dee         de
fdZdS )    N)AnyDictListOptionalTuple)nnTensor   )	ImageList)paste_masks_in_imageimagereturnc                 H    ddl m} |                    |           dd          S )Nr   )	operators)
torch.onnxr   shape_as_tensor)r   r   s     b/var/www/html/ai-engine/env/lib/python3.11/site-packages/torchvision/models/detection/transform.py_get_shape_onnxr      s1    $$$$$$$$U++BCC00    vc                     | S N )r   s    r   _fake_cast_onnxr      s	     Hr   self_min_sizeself_max_sizetarget
fixed_sizec                    t          j                    rt          |           }nOt          j                                        r"t          j        | j        dd                    }n| j        dd          }d }d }d }||d         |d         g}n<t          j                                        st          j                    rt          j        |          	                    t          j
                  }	t          j        |          	                    t          j
                  }
t          |          }t          |          }t          j        ||	z  ||
z            }t          j                    rt          |          }nI|                                }n4t          |          }	t          |          }
t          ||	z  ||
z            }d}t          j        j                            | d          ||d|d          d         } || |fS d	|v rm|d	         }t          j        j                            |d d d f                                         |||
          d d df                                         }||d	<   | |fS )Nr   r
   r   )dtypeTbilinearF)sizescale_factormoderecompute_scale_factoralign_cornersmasks)r#   r$   r&   )torchvision_is_tracingr   torchjitis_scriptingtensorshapemintofloat32maxfloatr   itemr   
functionalinterpolatebyte)r   r   r   r   r   im_shaper#   r$   r&   min_sizemax_sizeself_min_size_fself_max_size_fscalemasks                  r   _resize_image_and_masksr@      sm       $"5))				!	! $<BCC 011;rss# $D$(L-11z!}-9!!## 	S{'>'@'@ 	Sy**--EM-BBHy**--EM-BBH#M22O#M22OIo8/H:TUUE&(( ,.u55$zz|| 8}}H8}}H}x79QRRL!%H++d!5 ,   	E ~f}&gx"..DM!!<`v / 
 

!!Q$ 	 w&=r   c                       e Zd ZdZ	 	 ddededee         dee         ded	eeeef                  d
e	f fdZ
	 d dee         deeeeef                           deeeeeeef                           f         fdZdedefdZdee         defdZ	 d dedeeeef                  deeeeeef                  f         fdZej        j        d!dee         dedefd            Zdeee                  dee         fdZd!dee         dedefdZdeeeef                  deeeef                  deeeef                  deeeef                  fdZdefdZ xZS )"GeneralizedRCNNTransformah  
    Performs input / target transformation before feeding the data to a GeneralizedRCNN
    model.

    The transformations it performs are:
        - input normalization (mean subtraction and std division)
        - input / target resizing to match min_size / max_size

    It returns a ImageList for the inputs, and a List[Dict[Tensor]] for the targets
        Nr:   r;   
image_mean	image_stdsize_divisibler   kwargsc                    t                                                       t          |t          t          f          s|f}|| _        || _        || _        || _        || _	        || _
        |                    dd          | _        d S )N_skip_resizeF)super__init__
isinstancelisttupler:   r;   rD   rE   rF   r   poprI   )	selfr:   r;   rD   rE   rF   r   rG   	__class__s	           r   rK   z!GeneralizedRCNNTransform.__init__b   s     	(T5M22 	# {H  $",$"JJ~u==r   imagestargetsr   c                    d |D             }|?g }|D ]8}i }|                                 D ]
\  }}|||<   |                    |           9|}t          t          |                    D ]}||         }	|||         nd }
|	                                dk    rt          d|	j                   |                     |	          }	|                     |	|
          \  }	}
|	||<   ||
|
||<   d |D             }| 	                    || j
                  }g }|D ]N}t          j        t          |          dk    d|            |                    |d         |d	         f           Ot          ||          }||fS )
Nc                     g | ]}|S r   r   .0imgs     r   
<listcomp>z4GeneralizedRCNNTransform.forward.<locals>.<listcomp>z   s    (((##(((r      zFimages is expected to be a list of 3d tensors of shape [C, H, W], got c                 ,    g | ]}|j         d d         S )r   Nr/   rV   s     r   rY   z4GeneralizedRCNNTransform.forward.<locals>.<listcomp>   s"    888#sy~888r   )rF      zMInput tensors expected to have in the last two elements H and W, instead got r   r
   )itemsappendrangelendim
ValueErrorr/   	normalizeresizebatch_imagesrF   r+   _assertr   )rP   rR   rS   targets_copytdatakr   ir   target_indeximage_sizesimage_sizes_list
image_size
image_lists                  r   forwardz GeneralizedRCNNTransform.forwardw   s    )((((
 57L * **,GGII    DAqDGG##D))))"Gs6{{## 
	* 
	*A1IE)0)<71::$Lyy{{a !wjoju!w!wxxxNN5))E"&++e\"B"BE<F1I"|'?)
88888""6$:M"NN24% 	D 	DJMJ1$l`jll   ##Z]JqM$BCCCCv'788
7""r   r   c                 "   |                                 st          d|j         d          |j        |j        }}t	          j        | j        ||          }t	          j        | j        ||          }||d d d d f         z
  |d d d d f         z  S )NzOExpected input images to be of floating type (in range [0, 1]), but found type z insteadr!   device)is_floating_point	TypeErrorr!   ru   r+   	as_tensorrD   rE   )rP   r   r!   ru   meanstds         r   rd   z"GeneralizedRCNNTransform.normalize   s    &&(( 	8"'+8 8 8   U\vteFKKKodnE&IIIQQQd]++s111dD=/AAAr   rk   c           
          t          t          j        d                              dt	          t          |                                                                        }||         S )z
        Implements `random.choice` via torch ops, so it can be compiled with
        TorchScript and we use PyTorch's RNG (not native RNG)
        r
   g        )intr+   emptyuniform_r4   ra   r5   )rP   rk   indexs      r   torch_choicez%GeneralizedRCNNTransform.torch_choice   sJ    
 EKNN++Cs1vv??DDFFGGxr   r   c                    |j         dd          \  }}| j        r&| j        r||fS |                     | j                  }n| j        d         }t          ||| j        || j                  \  }}|||fS |d         }t          |||f|j         dd                    }||d<   d|v r-|d         }t          |||f|j         dd                    }||d<   ||fS )Nr   boxes	keypoints)
r/   trainingrI   r   r:   r@   r;   r   resize_boxesresize_keypoints)rP   r   r   hwr#   bboxr   s           r   re   zGeneralizedRCNNTransform.resize   s   
 {2331= 	%  %f}$$$T]33DD=$D/tT]FTXTcddv>&= gD1a&%+bcc*:;;w&  {+I(QFEK<LMMI"+F;f}r   c                 &  
 g }t          |d                                                   D ]
t          j        t          j        
fd|D                                           t          j                                                t          j                  }|                    |           |}t          j	        |d                             t          j                  |z            |z                      t          j                  |d<   t          j	        |d                             t          j                  |z            |z                      t          j                  |d<   t          |          }g }|D ]}d t          |t          |j                            D             }t          j        j                            |d|d         d|d         d|d         f          }	|                    |	           t          j        |          S )Nr   c                 *    g | ]}|j                  S r   r\   )rW   rX   rl   s     r   rY   z?GeneralizedRCNNTransform._onnx_batch_images.<locals>.<listcomp>   s    /O/O/O	!/O/O/Or   r
   r]   c                     g | ]
\  }}||z
  S r   r   )rW   s1s2s      r   rY   z?GeneralizedRCNNTransform._onnx_batch_images.<locals>.<listcomp>   s     OOOVRROOOr   )r`   rb   r+   r3   stackr1   r2   int64r_   ceilrN   zipr/   r   r6   pad)rP   rR   rF   r;   
max_size_istridepadded_imgsrX   padding
padded_imgrl   s             @r   _onnx_batch_imagesz+GeneralizedRCNNTransform._onnx_batch_images   s   vay}}'' 	( 	(A5;/O/O/O/O/O/O/O#P#P#S#STYTa#b#bccffglgrssJOOJ''''z8A;>>%-#@#@F"JKKfTXXY^Ydeez8A;>>%-#@#@F"JKKfTXXY^Ydee??
  	+ 	+COOs8U39=M=M/N/NOOOG,00q'!*aQRUVX_`aXb6cddJz****{;'''r   the_listc                     |d         }|dd          D ]0}t          |          D ]\  }}t          ||         |          ||<   1|S )Nr   r
   )	enumerater3   )rP   r   maxessublistr   r5   s         r   max_by_axisz$GeneralizedRCNNTransform.max_by_axis   s`    | 	7 	7G(11 7 7t"5<66e7r   c                    t          j                    r|                     ||          S |                     d |D                       }t	          |          }t          |          }t          t          j        t	          |d                   |z            |z            |d<   t          t          j        t	          |d                   |z            |z            |d<   t          |          g|z   }|d         
                    |d          }t          |j        d                   D ]P}||         }||d |j        d         d |j        d         d |j        d         f                             |           Q|S )Nc                 6    g | ]}t          |j                  S r   )rM   r/   rV   s     r   rY   z9GeneralizedRCNNTransform.batch_images.<locals>.<listcomp>   s     $G$G$GT#)__$G$G$Gr   r
   r]   r   )r)   r*   r   r   r4   rM   r|   mathr   ra   new_fullr`   r/   copy_)	rP   rR   rF   r;   r   batch_shapebatched_imgsrl   rX   s	            r   rf   z%GeneralizedRCNNTransform.batch_images   sg   "$$ 	C **6>BBB##$G$G$G$G$GHH~&&>>$)E(1+$6$6$?@@6IJJ$)E(1+$6$6$?@@6IJJ6{{mh.ay))+q99|)!,-- 	W 	WA)CNcilNNcilNNcilNJKQQRUVVVVr   resultimage_shapesoriginal_image_sizesc                 P   | j         r|S t          t          |||                    D ]}\  }\  }}}|d         }t          |||          }|||         d<   d|v r$|d         }	t	          |	||          }	|	||         d<   d|v r$|d         }
t          |
||          }
|
||         d<   ~|S )Nr   r(   r   )r   r   r   r   r   r   )rP   r   r   r   rl   predim_so_im_sr   r(   r   s              r   postprocessz$GeneralizedRCNNTransform.postprocess  s     = 	M'0V\K_1`1`'a'a 	3 	3#A#dFME f55E!&F1Ig$W,UE6BB%*q	'"d"" -	,YfEE	)2q	+&r   c                     | j         j         d}d}|| d| j         d| j         dz  }|| d| j         d| j         dz  }|d	z  }|S )
N(z
    zNormalize(mean=z, std=)zResize(min_size=z, max_size=z, mode='bilinear')z
))rQ   __name__rD   rE   r:   r;   )rP   format_string_indents      r   __repr__z!GeneralizedRCNNTransform.__repr__  sx    >2555G\\DO\\4>\\\\GppT]ppt}ppppr   )rC   Nr   )rC   )r   
__module____qualname____doc__r|   r   r4   r   r   r   rK   r	   r   strr   rr   rd   r   re   r+   r,   unusedr   r   rf   r   r   __classcell__)rQ   s   @r   rB   rB   V   s       	 	" !04> >> > K	>
 ;> > U38_-> > > > > > >, RV'# '#6l'#-5d4V;L6M-N'#	y(4S&[(9#:;;	<'# '# '# '#R	Bv 	B& 	B 	B 	B 	Bd3i C     /3  c6k*+ 
vxS&[ 122	3	   : Y( (f (s (TZ ( ( ( (*DcO S	     4<  f    (T#v+&' 5c?+ #5c?3	
 
d3;	    ,#        r   rB   r   original_sizenew_sizec                      fdt          ||          D             }|\  }}                                 }t          j                                        rK|d d d d df         |z  }|d d d d df         |z  }t          j        |||d d d d df         fd          }n |dxx         |z  cc<   |dxx         |z  cc<   |S )Nc                     g | ]R\  }}t          j        |t           j        j                   t          j        |t           j        j                   z  SS rt   r+   r.   r2   ru   )rW   ss_origr   s      r   rY   z$resize_keypoints.<locals>.<listcomp>!  sd        Av 	QemI4DEEE
,vU]9;K
L
L
L	M  r   r   r
   r]   rb   ).r   ).r
   )r   cloner+   _C_get_tracing_stater   )	r   r   r   ratiosratio_hratio_wresized_dataresized_data_0resized_data_1s	   `        r   r   r      s       X}55  F
 GW??$$Lx""$$ (%aaaAg.8%aaaAg.8{NNLQRQRQRTUTUTUWXQXDY#Z`abbbV'V'r   r   c                       fdt          ||          D             }|\  }}                     d          \  }}}}	||z  }||z  }||z  }|	|z  }	t          j        ||||	fd          S )Nc                     g | ]R\  }}t          j        |t           j        j                   t          j        |t           j        j                   z  SS r   r   )rW   r   r   r   s      r   rY   z resize_boxes.<locals>.<listcomp>3  sb        Av 	QemELAAA
,vU]5<
H
H
H	I  r   r
   r   )r   unbindr+   r   )
r   r   r   r   ratio_heightratio_widthxminyminxmaxymaxs
   `         r   r   r   2  s        X}55  F
 !'L+"\\!__D$d+D+D,D,D;dD$/Q7777r   )NN)r   typingr   r   r   r   r   r+   r)   r   r	   rq   r   	roi_headsr   r,   r   r   r4   r   r|   r   r@   ModulerB   r   r   r   r   r   <module>r      s0    3 3 3 3 3 3 3 3 3 3 3 3 3 3              ! ! ! ! ! ! + + + + + + 16 1f 1 1 1 1 v %     +/,0: ::: : T#v+&'	:
 sCx): 68Df-../: : : :zG G G G Gry G G GT tCy DQTI Z`    $8 8tCy 8DI 8RX 8 8 8 8 8 8r   