
    }g@                        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	Z	d dl
mZ d dlZd dlZd dl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 d dlmc mZ d dl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!m"Z"  ejF                   ejH                  dd             d Z%dYdZ&d dl'Z' e'jP                  d      Z)e)jU                  dde+ddd       e)jU                  dde+ddd       e)jU                  dddd        e)jU                  d!d"d#d        e)jU                  d$dd        e)jU                  d%dd        e)jU                  d&d'e+d()       e)jU                  d*e+d)       e)jU                  d+d,e,d-d./       e)jU                  d0d1e,d2d3/       e)jU                  d4e,d5d6/       e)jU                  d7e,dd8/       e)jU                  d9e-d:d;/       e)jU                  d<e, e,d=      d;/       e)jU                  d>d#dd?@       e)jU                  dAe,dBdC/       e)jU                  dDe-d-dE/       e)jU                  dFdddG@       e)jU                  dHe+dddI       e)jU                  dJe,d-dK/       e)jU                  dLe,d-dM/       e)jU                  dNd#ddO@       e)jU                  dPd#ddQ@       e)jU                  dRdddS@       e)jU                  dTdddU@       dZdVZ. e.       Z/ej`                  jc                  d        e&e/e/jd                  e/jf                  jh                  e/jf                  jj                  sdndWe/jf                  jl                  X       y)[    N)trange)	rearrange)deepcopy)	make_grid)r   repeat)ch_sec)autocast
GradScaler)glob)rasterization)r   r   zcuda:0)devicec           
          t        | t              r@| j                         D ci c]$  \  }}|t        t	        j
                  |            & c}}S | j                         S c c}}w N)
isinstancedictitemsto_gputorchtensorcuda)obkvs      :/home/cameronsmith/repos/multivid_point_track_sfm/train.pyr   r      sK    jY[]aNbrxxzJtq!6%,,q/22JqhjhohohqqJs   )A!d     c                 
   d }g }t         j                  j                  | j                  j                  | j
                  j                               }t        j                  | j                  j                  dz   | j                  j                  | j                  j                        }	t        t         j                  j                  j                  |	| j                  j                  t!        | j                  j"                  | j                  j                        dd            }
d}t%        | j                  j&                  d	      D ]n  }|dk(  r$t)        |
      \  }}t/        |      t/        |      }}d}| j                        } |||| j
                  |      }|j1                         D ]1  \  }}t3        j4                  ||j7                         i|       ||z  }3 t3        j4                  d|j7                         i|       |j9                          |j;                          |j=                          |dk(  rt?        j>                         | _        t        j@                         5  d }||z  dk(  rB	 ||dz  z  dk(  s | j
                  jC                  |      }tE        jF                  d|||d |      }d d d        ||z  dk(  r|r| j                  jH                  rqt-        d| jJ                          t        jL                  || j
                  jO                         dtP        jR                  jU                  | jJ                  d             | j                  jV                  r|dz  dk(  rt        j@                         5  | j
                  jC                  |      }d d d        |d   |d<   d|v r|d   |d   c|d<   |d<   t        jL                  |j1                         D ci c]L  \  }}tY        |      t         jZ                  k(  s#t]        |j^                        dkD  s<||ja                         N c}}d| j                  jb                   d       t-        d       | j                  jd                  r9|dz  dk(  r1t        jL                  |d   d| j                  jb                   d       |dz  }q y # t*        $ rx t-        d
       t        t         j                  j                  j                  |	| j                  j                  t!        d| j                  j                        dd            }
Y w xY w# 1 sw Y   xY w# 1 sw Y   xY wc c}}w )Nc                    d }i }d| v r|dkD  s | d   dz  |d<   d| v r|dkD  s | d   dz  |d<   |dz  d	k(  rt        ||       t        j                  d
|d   d   i|       t        j                  d|d   d   i|       |S )Nc           
          t        j                  t        t        |             D cg c]  }| |d d ||   j	                         f    c}      S c c}w r   )r   stackrangelenlong)xyis      r   <lambda>z0train_flowmap.<locals>.loss_fn.<locals>.<lambda>   s:    5;;E#a&M'Rq!Aadiik/(:'RS 'Rs   "Apoint_track_loss2   g     @zmetrics/tracks_errpoint_track_loss_staticzmetrics/tracks_err_static
   r   zest/fx
intrinsics)r   r   r   r   stepzest/fy)r   r      r/   )printwandblog)	model_outgtmodel_inputmodelr.   rayslossess          r   loss_fnztrain_flowmap.<locals>.loss_fn   s    S *R^ghz^{|^vFZ?[$	1tBwlu  wP  mQ  RU  mUfMhFi
 7A:eF4(4 			8[6w?@dK		8[6w?@dK    )lrparamsr/   )num_trgtn_skipsfr   T)
batch_sizenum_workersshuffle
pin_memoryFitting)desczdone w dataset   g        r-   loss   z
Saving to )r.   model_state_dictzcheckpoint.ptr   r,   c2wgt_intrinsicsgt_posesz/data/cameron/pose_exps/poses_z.ptzexported posesaffinity_embz$/data/cameron/feat_exp_exps/featexp_z_oursaff.pt)3r   optimAdamargsr;   r6   
parametersdataMultiImageFoldervid_lenr>   r?   iterutils
DataLoaderr@   min	n_workersr   n_train_stepsnextStopIterationr0   r   r   r1   r2   itembackwardr.   	zero_gradtimeno_gradforward_allptsviswandb_summary
save_modelsave_dirsave
state_dictospathjoinexport_posestypeTensorr"   shapedetachnameexport_feats)runtrain_dataset	until_img	until_vid
until_saverN   single_datar9   
losses_aggdataset
dataloaderr.   step_r5   ground_truth
total_lossoutr8   	loss_namerG   
wandb_imgsr   r   s                          r   train_flowmapr      s   0d JKKCII4H4H4JKE !!CHH,<,<Q,>[^[c[c[f[fgGU[[%%00SXXEXEXfijmjrjrj|j|  ~A  ~F  ~F  ~Q  ~Q  gR  gk  w{0  |  }J 
D..Y? 5 !8-1*-=*l )/{(;VL=QK 
IIk"lK		$G%||~ 	OItIIy$))+.T:$J	 			6:??,-D9ejjl5??+< 7DIIK38]]_ 	aJI~q Q)A+&)SYY5M5Mk5Z,,ak<QU[_`
		a
 
?aDSXX-@-@Js||n-.

T_b_h_h_s_s_u;xz|  {B  {B  {G  {G  HK  HT  HT  Xe  {g  1h 88  T#Xq[Kcii&>&>{&K#K +L 9C#+V[J\]hix]y%IS_S5IJJ		h1tAw?TY\]^]d]dYefgYg!((*h  mK  LO  LT  LT  LY  LY  KZ  Z]  k^  _"#88  T#Xq[JJs>*.RSVS[S[S`S`Raal,mnak5 ! &' !1!1!<!<WQTQYQYQdQdruvwx{  yA  yA  yL  yL  sM  VZ  fj!<  "k  l
2	a 	a LK is>   R=-AUU($UU&U=A=T>=T>U	U	zsimple training job)descriptionz-nz--name Fzwandb training name)rm   defaultrequiredhelpz-cz--init_ckptzIFile for checkpoint loading. If folder specific, will use latest .pt filez-oz--online
store_true)r   actionz-sz--save_modelTz--viserz--save_opt_visz-dz	--datasethydrant)rm   r   z	--imgpathz-bz--batch_sizer/   z,number of videos/sequences per training step)rm   r   r   z-vz	--vid_len   z*video length or number of images per batchz--n_workersrF   z number of workers per dataloaderz--until_savez number of steps until model savez--lrg-C6?zlearning ratez--n_train_stepsg    חAz	--overfitz$Whether to overfit on a single scene)r   r   r   z--until_imgr)   z%Number of steps until image summary. z--sfz5Image resolution scale factor (fractional is cheaper)z--load_savezVWhether to load the previously saved data if overfitting (to avoid running flow again)z--splat_srczsplat src pt filez--time_stridezYNumber of frames to flatten in the encoder like a temporal convolution (to save memory). z--n_skipz@Number of frames to skip between adjacent frames in dataloader. z--use_gt_intrinsicszZWhether to use GT intrinsics instead of predicting them. Useful for pretraining scene rep.z--point_trackzWhether to use point trackingz--export_poseszExport poses when overfittingz--export_featszExport feats when overfittingc                 R   t         j                  |       } t        j                         }t	        j
                         }t        d|        t        j                  dd| j                  rdnd| j                  d      }t        j                  j                  d       d	| j                  z   |_        t        j                  |j                  d
       t        j                   t        j"                  j%                  |j                  d             t        j                   t        j"                  j%                  |j                  d             | |_        ||_        | j(                  rt)        j*                         |_        g }d}d |_        t        d       t1        j2                  |       j5                         |_        | j8                  t        j"                  j;                  t        j"                  j=                  | j8                              r| j8                  nUt?        tA        t        j"                  j%                  | j8                  d            t        j"                  jB                        }	 |j6                  jE                  tG        jH                  |      d   d       |S |S )Nzuser=cameronsmithbusinessbiasingonlinedisabledz
/tmp/wandb)entityprojectmoderq   dir.z/tmp/T)exist_okzcheckpoint*zvideo*z(/data/cameron/monocular_ests/pets_dogs/*zdummy multivid testz*.pt)keyrI   F)strict)'parser
parse_argsargparse	Namespacegetpassgetuserr0   r1   initr   rq   rs   log_coderf   ri   makedirsrg   rj   rk   rP   viserViserServerviser_serverrz   modelsFlowMapr   r6   	init_ckptisfile
expandusermaxr   getctimeload_state_dictr   loadrh   r   )rP   valselfuserrs   
imgfoldersglob_str	ckpt_filecurrent_model_dictloaded_state_dictr   r   new_state_dicts                r   make_runr      s   T"DD??D	E$. **29VZVaVa(gqw{  xA  xA  HR  TC	IIsDII%DMKKt,	JJrww||DMM=9:	JJrww||DMM845DIDJzzU%6%6%84$
 J9H DL	
 %**,DJ~~!&(ggnnRWW5G5G5W&XDNN^abfgigngngsgstx  uC  uC  DJ  hK  cL  RT  RY  RY  Rb  Rb  _c	JJ&&uzz)'<=O'PX]&^ K4Kr:   i,  )rw   rv   ru   )   r   r   NN)NF)7ri   r`   r   r1   tqdmr   einopsr   rc   geometrycopyr   numpynppiqakorniatorchvision.utilsr   r   r   r   torch.cuda.ampr	   r
   torch.nn.functionalnn
functionalFr   r   rR   r   nerfviewgsplatr   inverseonesr   r   r   ArgumentParserr   add_argumentstrintfloatr   rs   autogradset_detect_anomalyrz   rP   rw   overfitru    r:   r   <module>r      sh           ' $  /         jejj1 2 q~B 	 	 	 -B	C   DBK`  a   DSu  S^   _   DU<  H   Dl  K   Iu\  B   $eL  I   D3y  A   Kc"  5   Dc!Ao  p   D3q>j  k   Ms1:\  ]   NC=_  `   Fd  H   %3s3x_  U   KlHn  o   MB<c  d   Fq6m  n   M5  Ld   e   MD%M`  a   O#a  >Y   Z   JS8z  {   )4  So   p   OT,Lk  l   $eLNm  n   $eLNm  n2h j  ! !% ( c#++)<)<SVS[S[ScScilx{  yA  yA  yK  yK  Lr:   