
    *hGj                        d dl Z d dlZd dl 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 d dlZd dl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Zd dlmZ d dlmZmZmZmZmZm Z  d d	l!m"Z" d dl#Z#d dl$Z$d
 Z%ddZ&d Z'd Z(d Z)ddZ*d Z+d Z,d Z- G d dej\                        Z/ G d dej\                        Z0 G d dej\                        Z1 G d dej\                        Z2 G d dej\                        Z3y)    N)nn)	rearrangerepeat)
functional)deepcopy)cm)tqdm)CallableListOptionalTuple	GeneratorDict)defaultdictc                     t        | d      S )Nz... c x y -> ... (x y) c)r   xs    ,/home/cameronsmith/repos/kpt3r/our_models.py<lambda>r      s    9Q :;     c           	      f    t        | d|"t        | j                  d      dz              S |      S )Nz... (x y) c -> ... c x yg      ?r   )r   intsize)srcr   s     r   r   r      s2    Y-Gijir3sxxXZ|`cOdKez xyz r   c                 d    t        j                  | t        j                  | ddgf         fd      S )N.r   )torchcat	ones_liker   s    r   r   r      s)    		1eooaaSk:;R@ r   c                 .    | dd df   d| ddd f   z   z  S )N.r   gh㈵> r   s    r   r   r      s&    !C"H+#rs(!34 r   c                 @    t        j                  | |dz  dz
  ||      S )N      )modepadding_mode)Fgrid_sampler   ypadr&   s       r   r   r      s    AMM1a!eaidY\$] r   c                     t        | j                        dk(  rt        | |||      S t        | j                  dd      |j                  dd      ||      j	                  d| j                  d d       S )N   r   r%   r$   )lenshape
grid_samp_flatten	unflattenr*   s       r   r   r      s    WZ[\[b[bWcghWhAq#d9S nxyz  zC  zC  DE  GH  zI  KL  KT  KT  UV  XY  KZ  [^  _c  od  on  on  op  rs  ry  ry  z|  {|  r}  o~ r   c                 B    t        t        j                  d||             S )Nb...cij,b...ckj->b...cki)unhomr   einsum)crdsKs     r   r   r      s    %-GD QR r   c           	      d    t        t        j                  d|t        |             dd df   |      S )Nr5   .   )projectr   r7   hom)r8   posesr9   s      r   r   r      s6    gu||4NPUWZ[_W`'abegihigibi'jlmn r   c                 b    | t        j                  t        |             j                  |          S N)r   randpermr/   tor   s    r   r   r      s#    AennSV,//23 r   c                   8     e Zd Zd fd	Zdi fdZdi fdZ xZS )!CanonRobotTrajPredTransfEuclideanNc                 
   t         |           || _        t        d       d}t	        |dd      | _        d}t        j                  t        j                  ||z   |dd      t        j                  d	      t        j                  ||dd      t        j                  d	      t        j                  ||dd      t        j                  d	      t        j                  ||d            | _
        t        j                  t        j                  |d
d      t        j                  d	      t        j                  d
dd            | _        t        j                  |dd      | _        t        j                  d|d      | _        y )Nloading model   r;   Tin_chout_dimuse_first_pool@   r%   paddinginplace   $      )super__init__argsprint	ResnetFPNimg_encr   
SequentialConv2dReLU	hires_outjoint_sdf_outjoint_sdf_predlink_lin)selfrV   ch_in
latent_dim	__class__s       r   rU   z*CanonRobotTrajPredTransfEuclidean.__init__"   s-   	o uatL
IIej&8*aQRSZ\ZaZajnZoIIj*aQRSZ\ZaZajnZoIIj*aQRSZ\ZaZajnZoIIj*aH	J
 MMIIj"a@rwwW[G\IIb!Q79
 !#		*dA >))CQ7r   c                    | j                  | j                  |d   j                         j                  dd      d      d         j	                  d|d   j
                  d d       }t        j                  |d   j                  d      |d	   j                         fd      }| j                  |      }| j                  t        j                  |t        j                  ||d   j
                  d
d  d      fd            }| j                  |d d d f   |z   j                  dd            j	                  d|j
                  d d       }|d|iz  S )N	link_imgsr   r%   T)just_global).NNr$   img
points_camr   bilinearr&   
joint_sdfs)r`   rY   floatr2   r3   r0   r   r   squeezer]   r(   interpolater^   )	ra   model_input
track_idxsoutlink_enc	hires_inp	img_featsfull_res_featslink_dec_featss	            r   forwardz)CanonRobotTrajPredTransfEuclidean.forward:   s   ==$,,{;/G/M/M/O/W/WXYZ[/\im,"no|"}  J  J  KL  MX  Yd  Me  Mk  Mk  ln  mn  Mo  pII{5199!<[=V=\=\=^_`ab	LL)-			Iq}}YWbchWiWoWoprpsWt  {E  @F  3G  HI  )J  K++^AdF-Ch-N,W,WXYZ[,\]gghijrjxjxy{z{j|}
  .  	r   c                    | j                  t        j                  t        j                  |d   |d   fd      j                  dd      dd      d	      j                  dd
      }| j                  |d       d d df   }ddlm	}  |        t        j                  ||d   j                  d      j                  dd  d      }| j                  t        j                  |d   j                  d      |gd            }|d   j                  d      }	| j                  |	      }
ddlm	}  |        | j                  t        j                  |	t        j                  |
|d   j                  dd  d      fd            }|| j                  |dz        j                  d      | j!                  |      | j#                  |      dz  S )Ntarg_img	canon_imgr%   r      r}   rj   rk   T
autoresizer   r$   )	set_tracer   dim   )segspointmap_campointmap_link)feature_extractorr(   ro   r   r   r2   r3   vitpdbr   rn   r0   r]   rY   seg_mapsoftmaxcam_maplink_map)ra   rp   rq   rr   
dino_featsvit_outpdb_feat_uppointmaprz   ru   rv   s               r   forward_z*CanonRobotTrajPredTransfEuclidean.forward_L   s   ++Q]]599kR\F]^iju^vEwxy;z  <C  <C  DE  FG  <H  IR  Xb  .c  os+  u      @A  BH  I
((J-ac2)$& --K(@(H(H(K(Q(QRTRU(V\fg>>599k+.F.N.Nq.QSZ-[ab#ce z*2215LL(,	)$&		8Q]]9U`akUlUrUrsusvUw  ~H  >I  3J  KL  )M  N $^A-= > F F1 F M)-n)E)-~)F  	r   r@   __name__
__module____qualname__rU   rx   r   __classcell__rd   s   @r   rD   rD   !   s     80 04 $ 15" r   rD   c                        e Zd Zd fd	Zdi fdZdi fdZdi fdZdi fdZdi fdZdi fdZdi fd	Zdi fd
Z xZS )"CanonRobotTrajPredTransfEuclidean_Nc                    t         |           || _        t        d       t	        ddd      | _        d}t        j                  t        j                  dddd      t        j                  d	      t        j                  dddd      t        j                  d	      t        j                  dddd      t        j                  d	      t        j                  ddd            | _
        t        j                  ddd      | _        t        j                  dd
d      | _        t        j                  ddd      | _        t        j                  ddd      | _        	 y )NrF   r%   r;   TrH   rL      rM   rO      )rT   rU   rV   rW   rX   rY   r   rZ   r[   r\   r]   fg_mapr   obj_mapr   ditDiTfeature_extractorsSpatialDinocudar   feature_dimr   syspathappendmoge.model.v1	MoGeModelfrom_pretrainedmoge)	ra   rV   rc   r   r   	patch_resr   r   rd   s	           r   rU   z+CanonRobotTrajPredTransfEuclidean_.__init__g   s
   	 	o qatT
 IIgr1a@rwwW[G\IIb"a;rwwW[G\IIb"a;rwwW[G\IIb"a0	2
 iiAq)yyT1-yyQ*yyQ*  r   c                 r   |d   j                  d      }| j                  |      }| j                  t        j                  |t        j                  ||d   j                  dd  d      fd            }|| j                  |      j                  d      | j                  |      | j                  |      dz  S )Nrz   r%   r   rj   rk   r   )r   cam_pointmapobj_pointmap)rn   rY   r]   r   r   r(   ro   r0   r   r   r   r   )ra   rp   rq   rr   rz   ru   rv   s          r   rx   z*CanonRobotTrajPredTransfEuclidean_.forward   s    z*2215LL(,			8Q]]9U`akUlUrUrsusvUw  ~H  >I  3J  KL  )M  N $^ < D D D K(,^(D(,^(D  	r   c                 &   |d   j                  d      }|j                  dd  \  }}||z  }||z  }ddg\  }	}
t        |	d|
|	z
  z  z         }| j                  |d   j                  d      |dz        }||d   |d   |d   j	                         d	z  S )
Nrz   r%   r   i  i	        ?r$   r   r   r   r   )rn   r0   r   r   sigmoid)ra   rp   rq   rr   imageoriginal_heightoriginal_widthareaaspect_ratio
min_tokens
max_tokens
num_tokensmoge_outs                r   r   z+CanonRobotTrajPredTransfEuclidean_.forward_   s     J'//2*/++bc*:'/%7"&
Juj1H&IIJ
))K
3;;A>z1}Mx{HQKYabcYdYlYlYnqqqr   c                    | j                  t        j                  |d   d d df   dd      d      }| j                  |d d d f   d       d d df   }t        j                  ||d   j	                  d      j
                  d	d  d      }| j                  t        j                  |d   j	                  d      |gd
            }|| j                  |      | j                  |      | j                  |      j                         dz  S )Nrz   r   r|   rj   rk   Tr~   r%   r   r   r   )r   r(   ro   r   rn   r0   r]   r   r   r   r   r   r   )ra   rp   rq   rr   r   r   r   
hires_feats           r   r   z+CanonRobotTrajPredTransfEuclidean_.forward_   s    ++Q]];z;RSTUVSV;WXagq-r  C+  E
((Jqv.5ac: --J(?(G(G(J(P(PQSQT(U[ef^^UYYJ0G0O0OPQ0RT[/\bc%df
$(LL$<$(LL$< LL4<<>  	r   c           	         | j                  t        j                  t        j                  |d   |d   fd      j                  dd      dd      d	      j                  dd
      }| j                  |d       d d df   }t        j                  ||d   j                  d      j                  dd  d      }| j                  t        j                  |d   j                  d      |gd            }|d|iz  S )Nrz   r{   r%   r   r|   rj   rk   Tr~   r   r   r   r   )r   r(   ro   r   r   r2   r3   r   rn   r0   r]   )ra   rp   rq   rr   r   r   r   r   s           r   r   z+CanonRobotTrajPredTransfEuclidean_.forward_   s&    ++Q]]599kR\F]^iju^vEwxy;z  <C  <C  DE  FG  <H  IR  Xb  .c  os+  u      @A  BH  I
((J-ac2 --K(@(H(H(K(Q(QRTRU(V\fg>>599k+.F.N.Nq.QSZ-[ab#cez8...r   c                     | j                   j                  t        j                  |d   j	                  d      |d   j	                  d      fd      d      }|d|iz  S )Nrz   r%   r{   T)upsampler   )rY   forward_oneviewr   r   rn   ra   rp   rq   rr   r   s        r   r   z+CanonRobotTrajPredTransfEuclidean_.forward_   sz    <<//K
<S<[<[\]<^_jkv_w__  AB  `C  <D  EF  2G  SW/  Xz8...r   c                     | j                   j                  |d   j                  d      |d   j                  d            }|d|iz  S )Nr{   r%   rz   r   )rY   two_viewrn   r   s        r   r   z+CanonRobotTrajPredTransfEuclidean_.forward_   sJ    <<((+k*B*J*J1*MkZdNeNmNmnoNprz8...r   c                 X   |d   d d df   t        j                  t        |d               j                         d}|d   d d df   t        j                  t        |d               j                         d}| j	                  ||      }|d   d   j                  dddd      }|d	|iz  S )
Nrz   r   )rh   instancer{   r%   pts3d_in_other_viewr;   r$   r   )r   aranger/   r   dust3rpermute)ra   rp   rq   rr   view1view2
dust3r_outr   s           r   r   z+CanonRobotTrajPredTransfEuclidean_.forward_   s     -ac2ell3{[eOfKg>h>m>m>op -ac2ell3{[eOfKg>h>m>m>op;;uU+
A45==a!AF H
 
 	
r   c           	      \   | j                  t        j                  |d   |d   fd            }t        t	        j
                  |j                  dd      dd      j                  d|j                  d d             j                  d      \  }}| j                  D ]  } |||      } t        j                  |d d df   t	        j
                  t        |d	      |j                  d
d  d      fd      }t        | j                  t        |            |j                  d
            }	|d|	iz  S )Nrz   r{   r%   r   )   r   rj   rk   r$   r   r   r   )rY   r   r   ch_secr(   ro   r2   r3   r0   unbindcross_attnsch_fstpointmap_decoder   )
ra   rp   rq   rr   ru   tokens_targtokens_canonattn
comb_featsr   s
             r   r   z+CanonRobotTrajPredTransfEuclidean_.forward_   sJ    LL%))[-D[Q\E],^_`"ac	"(y7H7H17MeYc)d)n)nopqz  rA  rA  BD  CD  rE  *F  #G  #N  #N  OP  #Q L $$SDT+l5SlS YY	!A#f\RS>TU^UdUdegehUioy0z{|}~
$..vj/AB:??SUCVWH
 
 	
r   r@   r   r   s   @r   r   r   f   sk    1Nf 04 	 15" r" 15"   15" 	/ 15" / 15" / 15" 
* 15" 
r   r   c                   8     e Zd Zd fd	Zdi fdZdi fdZ xZS )%CanonRobotTrajPredTransfBaselineNaiveNc           	      h   t         |           || _        t        dd      | _        d}d}t        j                  ||      | _        d}t        j                  t        |      D cg c]  }t        j                  ||       c}      | _        t        j                  ||||dg      | _        y c c}w )Nr;   T)rI   rK   rS   r%   rG   	   )rT   rU   rV   rX   rY   r   	Embeddingglobal_emb_latent
ModuleListrangemlp_helpers
CrossAttn_r   make_nettraj_decode)ra   rV   rc   n_timestepsn_layer_transf_rd   s         r   rU   z.CanonRobotTrajPredTransfBaselineNaive.__init__   s    	 !q>
!#k:!F==afguav)w\]+*@*@J*W)wx&//JzR\]^0_` *xs   &B/c                    t        | j                  |d   d d df               }| j                  j                  d    j	                  t        |      dd      }| j                  D ]  } |||      } | j                  |      j                  d      }|dd df   |ddd f   }	}t        j                  |	|      d   }
|d|
iz  S )N	start_imgr   r   r%   .r;   	pred_tris)r   rY   r   weightexpandr/   r   r   rn   geometryrot_trans_to_trisr   stackkorniaconversionseuler_from_quaternionrotation_matrix_to_quaternionrotation_6d_to_matrixmodel_outputr   )ra   rp   rq   rr   
img_tokensmotion_tokensr   	pred_trajtransrottransf_tris	rot_eulers               r   rx   z-CanonRobotTrajPredTransfBaselineNaive.forward  s     DLL[)A!A#)FGH
..55d;BB3z?SUVXY $$TDd:m6TmT $$]3;;A>	CF#Ys12v%6c..s59!<[
 
 	
r   c                 2   t        | j                  |d   d d df               }| j                  j                  d    j	                  t        |      dd      }| j                  D ]  } |||      } | j                  |      }||dd df   |ddd f   dz  S )Nr   r   r   .r;   )
pred_transpred_rot)r   rY   r   r   r   r/   r   r   )ra   rp   rq   rr   r   r   r   r   s           r   r   z.CanonRobotTrajPredTransfBaselineNaive.forward_'  s     DLL[)A!A#)FGH
..55d;BB3z?SUVXY $$TDd:m6TmT $$]3	'BQB/%c!"f-
 
 	
r   r@   r   r   s   @r   r   r      s"    a  04 |. 15" 
r   r   c                   ,     e Zd Zd fd	Zdi fdZ xZS ) CanonRobotTrajPredResnetBaselineNc                     t         |           || _        dd lm} |j                  d      }t        j                  t        |j                               d d  | _
        t        g d      | _        y )Nr   T)
pretrainedr   )   rS      <   )rT   rU   rV   torchvision.modelsmodelsresnet18r   rZ   listchildrenresnetr   	traj_pred)ra   rV   r  r  rd   s       r   rU   z)CanonRobotTrajPredResnetBaseline.__init__9  sZ    	 	,D1mmT&//*;%<Sb%AB!"45r   c                     | j                  || j                  j                  sdnd   d d df         j                  d      j                  d      }| j	                  |      j                  dd      }|d|iz  S )Ncanon_pc_filtered_imgstart_img_imgr   r   )   r;   r   )r  rV   noncanonrn   r  r3   )ra   rp   rq   rr   latentpreds         r   rx   z(CanonRobotTrajPredResnetBaseline.forwardD  s    [		HZHZ)@`opqrstqtuv~~  @B  C  K  K  LN  O~~f%//6: 
 
 	
r   r@   )r   r   r   rU   rx   r   r   s   @r   r  r  8  s    	6 04 
r   r  c                   N     e Zd Z	 	 	 	 	 	 	 	 	 	 	 d fd	ZddZddZddZ xZS )	rX   c                 Z   t         |           dd}|| _        || _         ||	      }t	        d|d        t        t        j                  |      ||      | _        |
dk7  rt        j                  |
| j                  j                  j                  j                  d   | j                  j                  j                  | j                  j                  j                  | j                  j                  j                   | j                  j                  j"                        | j                  _        t        j$                         | j                  _        t        j$                         | j                  _        g d|   | _        || _        || _        || _        || _        | j5                  d	t7        j8                  d
d
d
d
      d       | j5                  dt7        j8                  dt6        j:                        d       t        j$                  t        j                  | j*                  dd
            | _        t        j>                  ddddd|ffD cg c]  \  }}t        j                  ||d
       c}}      jA                         | _!        t        j>                  dddd|fD cg c]  }t        j                  ||d
       c}      jA                         | _"        t        j                  |
|d
      jA                         | _#        t        j>                  g dd d d   D cg c]  }tI        jJ                  d|z   ||g       c}      | _&        t        j>                  tO        d      D cg c]  }tI        jP                  dd       c}      | _)        y c c}}w c c}w c c}w c c}w )Nc                 :   | dk(  r(t        j                  t        j                  dd      }|S | dk(  r(t        j                  t        j                  dd      }|S | dk(  r&t        j                  t        j
                  |      }|S | dk(  rd}|S t        d	| z        )
ax  Return a normalization layer
            Parameters:
                norm_type (str) -- the name of the normalization layer: batch | instance | none
            For BatchNorm, we use learnable affine parameters and track running statistics (mean/stddev).
            For InstanceNorm, we do not use learnable affine parameters. We do not track running statistics.
            batchT)affinetrack_running_statsr   FgroupnoneNz%normalization layer [%s] is not found)	functoolspartialr   BatchNorm2dInstanceNorm2d	GroupNormNotImplementedError)	norm_typegroup_norm_groups
norm_layers      r   get_norm_layerz*ResnetFPN.__init__.<locals>.get_norm_layer_  s     G#&..NN4T
  j(&..%%e
  g%&..r||=NO
  f$!

  *;iG r   zUsing torchvisionencoder)r  r)  r;   r   )r'   )r   rL   r	  rS   r  i   r  r%   F)
persistentlatent_scalingr$   )dtyperL   )rS   r	  )r	  rL   )rL   rL   r	  )rS   r	  rL   rL   r;   r   rG   rS   )r       )*rT   rU   feature_scalerK   rW   getattrtorchvisionr  modelr   r[   conv1r   r0   kernel_sizestriderN   r'   rZ   fcavgpoollatent_size
num_layersindex_interpindex_paddingupsample_interpregister_bufferr   emptyfloat32rr   r   r   combs_1combs_2last_conv_upr   r   aux_inject_netsr   r   r   )ra   backboner  r:  r;  r<  r=  r0  rK   r'  rI   rJ   r*  r)  d1d2dfr   rd   s                      r   rU   zResnetFPN.__init__O  s    		2 +,#I.
!8Y7:W[//:j]gh
A:!yy

  ''--a0

  ,,

  ''

  ((!ZZ--:: DJJ 

]]_

7
C$(*.Xu{{1aA'>5Qekk!5==Ae 	 	
 ==IId&&A.
 }})T\]delnpqxmyIz%{2ryyR';%{|  B  B  D}}C2bQXCY%ZaryyAq'9%Z[``b))E7A6;;=!}}YjkomokoYp-qTUk.B.BCE!A;.O-qr==SXYZS[)\a+*@*@S*I)\] &|%Z .r)\s   !N
'N$"N#.N(c                    | j                  |      }| j                  |      }t        |d         }t        |d         }| j                  D ]  } |||      } t        ||d   j	                  d            |d<   | j                  ||      S )Nr   r   )latents)r   r   r   r   r   )	ra   r   additional_viewcustom_sizelatent_xlatent_additionaltoken_xtoken_additionalr   s	            r   r   zResnetFPN.two_view  s    %%a(..?x|$ 1" 56$$ND5Eg0NgNGHRL$5$5b$9:##Ah#77r   c                 0	   t        |j                        dkD  r: | |j                  dd      t              j	                  d|j                  d d       S | j
                  dk7  rFt        j                  || j
                  | j
                  dkD  rdnd| j
                  dkD  rdnd d	      }||g}| j                  j                  |      }| j                  j                  |      }| j                  j                  |      }| j                  j                  |      }|j                  |       | j                  dkD  rS| j                  r| j                  j                  |      }| j                  j!                  |      }|j                  |       | j                  dkD  r,| j                  j#                  |      }|j                  |       | j                  d
kD  r,| j                  j%                  |      }|j                  |       | j                  dkD  r,| j                  j'                  |      }|j                  |       |s|S | j(                  dk(  rd nd}|d   j                  dd  }t+        t        |            D ]~  }t-         | j.                  |   t1        t3        j4                  t        j                  |||   j                  dd  d      ||   fd                  ||   j7                  d            ||<     | j8                  d    | j:                  d   t        j                  |d   |d   j                  dd  d            |d   z   j                               } | j8                  d    | j:                  d   t        j                  ||d   j                  dd  d            |d   z   j                               } | j8                  d
    | j:                  d
   t        j                  ||d   j                  dd  d            |d   z   j                               } | j8                  d    | j:                  d   t        j                  ||d   j                  dd  d            | j=                  |d         z   j                               }|S )Nr.   r   r%   r$   r   rj   r   Tscale_factorr&   align_cornersrecompute_scale_factorr;   nearest r   rk   r   )r/   r0   r2   rM  r3   r0  r(   ro   r3  r4  maxpoolbn1relur   r:  rK   layer1layer2layer3layer4r;  r   r   rD  r   r   r   r   rB  rA  rC  )	ra   r   rK  r   
aux_latentrU  	latent_szi	up_latents	            r   r   zResnetFPN.forward_oneview  s   qww<!D1a+$F$P$PQRTUT[T[\^]^T_$``$qt/A/A#'#5#5#;Z_c_q_qtw_wW[  ~B  [_aA?cG

  #A

""1%A

q!A

"ANN1"&&

**1-AJJ%%a(q!"JJ%%a(q!"JJ%%a(q!"JJ%%a(q!G^ !% 1 1Z ?TAJ$$RS)	 s7|$  	JA6:Q$:N:Nq:QRXY^YbYbdedqdqr|  ~E  FG  ~H  ~N  ~N  OQ  OR  ~S  Yc  ed  el  mn  eo  dp  qr  Zs  St  ;u  v}  ~  v@  vE  vE  FH  vI  4Jgaj  	J#DLLOodll1oammGBKPWXZP[PaPabdbePflv6w&x  zA  BD  zE  'E  &K  &K  &M  O	#DLLOodll1oammIgVXkN_N_`b`cNdjt6u&v  zA  BD  zE  'E  &K  &K  &M  O	#DLLOodll1oammIgVXkN_N_`b`cNdjt6u&v  zA  BD  zE  'E  &K  &K  &M  O	#DLLOodll1oammIgVXkN_N_`b`cNdjt6u&vy}  zK  zK  LS  TV  LW  zX  'X  &^  &^  &`  b	r   c                    t        |j                        dkD  r6 | |j                  dd      |      j                  d|j                  d d       S | j                  dk7  rFt        j                  || j                  | j                  dkD  rdnd| j                  dkD  rdnd d	      }g }| j                  j                  |      }| j                  j                  |      }| j                  j                  |      }|j                  |       | j                  dkD  rS| j                  r| j                  j                  |      }| j                  j                  |      }|j                  |       | j                  dkD  r,| j                  j!                  |      }|j                  |       | j                  d
kD  r,| j                  j#                  |      }|j                  |       | j                  dkD  r,| j                  j%                  |      }|j                  |       |r%|j                  dd      j'                  d      d   S | j(                  dk(  rd nd}|d   j                  dd  }t+        t        |            D ]/  }t        j                  ||   ||n|| j,                  |      ||<   1 t/        j0                  |d      | _        | j2                  j                  d   | j4                  d<   | j2                  j                  d   | j4                  d<   | j4                  | j4                  dz
  z  dz  | _        | j7                  | j2                        S )Nr.   r   r%   r$   r   rj   r   TrS  r;   r   r   r   rW  )r&   rU  g       @)r/   r0   r2   r3   r0  r(   ro   r3  r4  r\  r]  r   r:  rK   r[  r^  r_  r`  ra  maxr;  r   r=  r   r   r  r-  rr   )ra   r   rM  rg   rK  rU  rc  rd  s           r   rx   zResnetFPN.forward  s   qww<!		!Q5??1772A;OO$!//#'#5#5#;Z&*&8&83&>dD'+A JJQJJNN1JJOOAq??Q""JJ&&q)

!!!$ANN1??Q

!!!$ANN1??Q

!!!$ANN1??Q

!!!$ANN1qyyB/333;A>> $ 1 1Z ?TAJ$$RS)	s7|$ 	A
(0	k))+	GAJ	 iiQ/!%!2!22!6A!%!2!22!6A"11T5H5H15LMPSSxx$$r   )resnet34Tr.   rj   borderrj   r   Tr  r;   rL   r@   )NFN)NF)r   r   r   rU   r   r   rx   r   r   s   @r   rX   rX   N  s>     "T^l8,f2%r   rX   r@   )ri  rj   )4r   r2  r   r   r!  einopsr   r   matplotlib.pyplotpyplotplttorch.nnr   r(   numpynpr   randomtimeoscopyr   
matplotlibr   wandbr	   typingr
   r   r   r   r   r   collectionsr   r   r   r   r   r=   r6   r1   	grid_sampr<   warpshuffleModulerD   r   r   r  rX   r"   r   r   <module>r}     s        $  $        C C #  
<	z@4]
 	
Rn
3C		 CJW
 W
r8
BII 8
r
ryy 
,E%		 E%r   