
    kh/                        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y)    N)AnyDictListOptionalTuple)nnTensor   )	ImageList)paste_masks_in_imageimagereturnc                 6    ddl m} |j                  |       dd  S )Nr   )	operators)
torch.onnxr   shape_as_tensor)r   r   s     b/var/www/teggl/fontify/venv/lib/python3.12/site-packages/torchvision/models/detection/transform.py_get_shape_onnxr      s    $$$U+BC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        |       }nPt        j                  j                         r#t        j                  | j                  dd        }n| j                  dd  }d }d }d }||d   |d   g}n%t        j                  j                         st        j                         rt        j                  |      j                  t        j                        }	t        j                  |      j                  t        j                        }
t        |      }t        |      }t        j                  ||	z  ||
z        }t        j                         rt        |      }n9|j                         }n(t        |      }	t        |      }
t        ||	z  ||
z        }d}t        j                  j                   j#                  | d    ||d|d      d   } || |fS d	|v ra|d	   }t        j                  j                   j#                  |d d d f   j                         |||
      d d df   j%                         }||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@      s     "5)				!<<BC 01;;rs# $D$(L-11z!}-99!!#{'>'>'@yy*--EMM-BHyy*--EMM-BH#M2O#M2OIIo8/H:TUE&&(.u5$zz| 8}H8}H}x79QRL!%HH++d!5 ,  	E ~f}&gxx""..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
    r:   r;   
image_mean	image_stdsize_divisibler   kwargsc                     t         |           t        |t        t        f      s|f}|| _        || _        || _        || _        || _	        || _
        |j                  dd      | _        y )N_skip_resizeF)super__init__
isinstancelisttupler:   r;   rC   rD   rE   r   poprH   )	selfr:   r;   rC   rD   rE   r   rF   	__class__s	           r   rJ   z!GeneralizedRCNNTransform.__init__b   sc     	(T5M2 {H  $",$"JJ~u=r   imagestargetsr   c                    |D cg c]  }| }}|;g }|D ]2  }i }|j                         D ]
  \  }}|||<    |j                  |       4 |}t        t        |            D ]q  }	||	   }
|||	   nd }|
j	                         dk7  rt        d|
j                         | j                  |
      }
| j                  |
|      \  }
}|
||	<   |j|m|||	<   s |D cg c]  }|j                  dd   }}| j                  || j                        }g }|D ]@  }t        j                  t        |      dk(  d|        |j                  |d   |d   f       B t        ||      }||fS c c}w c c}w )	N   zFimages is expected to be a list of 3d tensors of shape [C, H, W], got r   )rE      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_imagesrE   r+   _assertr   )rO   rQ   rR   imgtargets_copytdatakr   ir   target_indeximage_sizesimage_sizes_list
image_size
image_lists                   r   forwardz GeneralizedRCNNTransform.forwardw   s    "((##((
 57L **,GGI  DAqDG ##D)	*
 #Gs6{# 
	*A1IE)0)<71:$Lyy{a #ijojujuiv!wxxNN5)E"&++e\"BE<F1I"|'?)

	* 288#syy~88""6$:M:M"N24% 	DJMMJ1$_`j_kl ##Z]JqM$BC	D v'78
7""I )2 9s   	E%E*r   c                 <   |j                         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!   rn   r+   	as_tensorrC   rD   )rO   r   r!   rn   meanstds         r   r\   z"GeneralizedRCNNTransform.normalize   s    &&(""'++h8  U\\vteFKoodnnE&IQd]++s1dD=/AAAr   rd   c           
          t        t        j                  d      j                  dt	        t        |                  j                               }||   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   rY   r5   )rO   rd   indexs      r   torch_choicez%GeneralizedRCNNTransform.torch_choice   s=    
 EKKN++Cs1v?DDFGxr   r   c                    |j                   dd  \  }}| j                  r,| j                  r||fS | j                  | 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/   trainingrH   ry   r:   r@   r;   r   resize_boxesresize_keypoints)rO   r   r   hwr#   bboxr}   s           r   r]   zGeneralizedRCNNTransform.resize   s    
 {{231==  f}$$$T]]3D==$D/tT]]FTXTcTcdv>&= gD1a&%++bc*:;w& {+I(QFEKK<LMI"+F;f}r   c                 8   g }t        |d   j                               D ]  }t        j                  t        j                  |D cg c]  }|j
                  |    c}      j                  t        j                              j                  t        j                        }|j                  |        |}t        j                  |d   j                  t        j                        |z        |z  j                  t        j                        |d<   t        j                  |d   j                  t        j                        |z        |z  j                  t        j                        |d<   t        |      }g }|D ]  }t        |t        |j
                              D 	
cg c]
  \  }	}
|	|
z
   }}	}
t        j                  j                  j                  |d|d   d|d   d|d   f      }|j                  |        t        j                  |      S c c}w c c}
}	w )Nr   r
   rU   )rX   rZ   r+   r3   stackr/   r1   r2   int64rW   ceilrM   zipr   r6   pad)rO   rQ   rE   r;   re   r`   
max_size_istridepadded_imgss1s2padding
padded_imgs                r   _onnx_batch_imagesz+GeneralizedRCNNTransform._onnx_batch_images   s   vay}}' 	(A5;;/O		!/O#P#S#STYTaTa#bcffglgrgrsJOOJ'	(  zz8A;>>%--#@F"JKfTXXY^YdYdezz8A;>>%--#@F"JKfTXXY^YdYde?
  	+C/28U399=M/NOVRROGO,,00q'!*aQRUVX_`aXb6cdJz*	+
 {{;''! 0P Ps   HHthe_listc                 n    |d   }|dd  D ]'  }t        |      D ]  \  }}t        ||   |      ||<    ) |S )Nr   r
   )	enumerater3   )rO   r   maxessublistrx   r5   s         r   max_by_axisz$GeneralizedRCNNTransform.max_by_axis   sS    | 	7G(1 7t"5<6e7	7 r   c                    t        j                         r| j                  ||      S | j                  |D cg c]  }t	        |j
                         c}      }t        |      }t	        |      }t        t        j                  t        |d         |z        |z        |d<   t        t        j                  t        |d         |z        |z        |d<   t        |      g|z   }|d   j                  |d      }t        |j
                  d         D ]L  }||   }||d |j
                  d   d |j
                  d   d |j
                  d   f   j                  |       N |S c c}w )Nr
   rU   r   )r)   r*   r   r   rL   r/   r4   ru   mathr   rY   new_fullrX   copy_)	rO   rQ   rE   r`   r;   r   batch_shapebatched_imgsre   s	            r   r^   z%GeneralizedRCNNTransform.batch_images   sL   ""$ **6>BB##$GT#))_$GH~&>$))E(1+$6$?@6IJ$))E(1+$6$?@6IJ6{mh.ay))+q9|))!,- 	WA)CNciilNNciilNNciilNJKQQRUV	W  %Hs   E"resultimage_shapesoriginal_image_sizesc                    | j                   r|S t        t        |||            D ]`  \  }\  }}}|d   }t        |||      }|||   d<   d|v r|d   }	t	        |	||      }	|	||   d<   d|v sG|d   }
t        |
||      }
|
||   d<   b |S )Nr|   r(   r}   )r~   r   r   r   r   r   )rO   r   r   r   re   predim_so_im_sr|   r(   r}   s              r   postprocessz$GeneralizedRCNNTransform.postprocess  s     ==M'0V\K_1`'a 	3#A#dFME f5E!&F1Ig$W,UE6B%*q	'"d" -	,YfE	)2q	+&	3 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
))rP   __name__rC   rD   r:   r;   )rO   format_string_indents      r   __repr__z!GeneralizedRCNNTransform.__repr__  s}    >>22315G9ODOO3DF4>>JZZ[\\G9$4T]]O;t}}o]oppr   )    Nr   )r   )r   
__module____qualname____doc__ru   r   r4   r   r   r   rJ   r	   r   strr   rk   r\   ry   r]   r+   r,   unusedr   r   r^   r   r   __classcell__)rP   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d3i C  /3 c6k*+ 
vxS&[ 122	3	: YY(f (s (TZ ( (*DcO S	 4<  f (T#v+&' 5c?+ #5c?3	
 
d3;	 ,# r   rB   r}   original_sizenew_sizec           
      .   t        ||      D cg c]f  \  }}t        j                  |t        j                  | j                        t        j                  |t        j                  | j                        z  h }}}|\  }}| j                         }t        j                  j                         rD|d d d d df   |z  }	|d d d d df   |z  }
t        j                  |	|
|d d d d df   fd      }|S |dxx   |z  cc<   |dxx   |z  cc<   |S c c}}w )Nrm   r   r
   rU   rZ   ).r   ).r
   )	r   r+   r.   r2   rn   clone_C_get_tracing_stater   )r}   r   r   ss_origratiosratio_hratio_wresized_dataresized_data_0resized_data_1s              r   r   r      s    X}5 Av 	QemmI4D4DE
,,vU]]9;K;K
L	MF 
 GW??$Lxx""$%aAg.8%aAg.8{{NNLQRTUWXQXDY#Z`ab  	V'V's   A+Dr|   c           
         t        ||      D cg c]f  \  }}t        j                  |t        j                  | j                        t        j                  |t        j                  | j                        z  h }}}|\  }}| j                  d      \  }}	}
}||z  }|
|z  }
|	|z  }	||z  }t        j                  ||	|
|fd      S c c}}w )Nrm   r
   r   )r   r+   r.   r2   rn   unbindr   )r|   r   r   r   r   r   ratio_heightratio_widthxminyminxmaxymaxs               r   r   r   2  s     X}5 Av 	QemmELLA
,,vU]]5<<
H	IF 
 !'L+"\\!_D$d+D+D,D,D;;dD$/Q77s   A+C)NN)r   typingr   r   r   r   r   r+   r)   r   r	   rj   r   	roi_headsr   r,   r   r   r4   r   ru   r   r@   ModulerB   r   r   r   r   r   <module>r      sV    3 3    ! + 16 1f 1 1 v %   +/,0::: : T#v+&'	:
 sCx): 68Df-../:zGryy GT tCy DQTI Z` $8 8tCy 8DI 8RX 8r   