
    Pg                         d dl Z d dlZd dl mZ d dlZd dlmZmZ d dlmZ	 d dl
Zd
dZ G d dej                        Zd Zd	 Zy)    N)nn)	rearrangerepeat)
functionalc                 :   | 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        )
aP  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_statsinstanceFgroupnoneNz%normalization layer [%s] is not found)	functoolspartialr   BatchNorm2dInstanceNorm2d	GroupNormNotImplementedError)	norm_typegroup_norm_groups
norm_layers      C/home/cameronsmith/repos/refactor_flowmap_and_splat/conv_modules.pyget_norm_layerr      s     G&&NN4T

  
j	 &&e

  
g	&&r||5FG

 	 
f	
  ""II"UVV    c                   <     e Zd Z	 	 	 	 	 	 	 	 	 	 d fd	ZddZ xZS )PixelNeRFEncoderc           	      p   t         |           || _        || _        t	        |	      }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|   | _        || _        || _        || _        || _        | j7                  dt9        j:                  d	d	d	d	      d
       | j7                  dt9        j:                  dt8        j<                        d
       t        j&                  t        j                  | j,                  dd	            | _        y )NzUsing torchvisionencoder)
pretrainedr      r   )padding_mode)r   @            i   latent   F)
persistentlatent_scaling   )dtyper$   ) super__init__feature_scaleuse_first_poolr   printgetattrtorchvisionmodelsmodelr   Conv2dconv1weightshapekernel_sizestridepaddingr    
Sequentialfcavgpoollatent_size
num_layersindex_interpindex_paddingupsample_interpregister_buffertorchemptyfloat32out)selfbackboner   r?   r@   rA   rB   r-   r.   r   in_chr   	__class__s               r   r,   zPixelNeRFEncoder.__init__!   s    	*,#I.
!8Y7:W[//:!j

 A:!yy

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

  ,,

  ''

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

]]_

7
C$(*.Xu{{1aA'>5Qekk!5==Ae 	 	
 ==IId&&Q/
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	      }|j                  | j                  j                  
      }| j                  j                  |      }| j                  j                  |      }| j                  j                  |      }|g}| 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%                  |       || _        | j.                  dk(  rd nd}|d   j                  dd  }t1        t        |            D ]/  }t        j                  ||   ||n|| j2                  |      ||<   1 t5        j6                  |d      | _        | j                  j                  d   | j8                  d<   | j                  j                  d   | j8                  d<   | j8                  | j8                  dz
  z  dz  | _        | j;                  | j                        S )N   r   r&   r)         ?bilinearareaT)scale_factormodealign_cornersrecompute_scale_factor)devicer   znearest )rR   rS   )dimg       @)lenr7   flatten	unflattenr-   Finterpolatetor%   rU   r3   r5   bn1relur?   r.   maxpoollayer1appendlayer2layer3layer4latentsr@   rangerB   rD   catr(   rG   )rH   xcustom_sizerg   rS   	latent_szis          r   forwardzPixelNeRFEncoder.forwardU   s    qww<>$qyy1~k"B"L"LQqwwWYXY{"[[$!//#'#5#5#;Z&*&8&83&>dD'+A DD**D+JJQJJNN1JJOOA#??Q""JJ&&q)

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

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

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

!!!$ANN1 $ 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   )
resnet34TrM   rO   borderrO   rN   Tr   r   )N)__name__
__module____qualname__r,   rn   __classcell__)rK   s   @r   r   r       s.     "2
h0%r   r   c                     | j                         } | dddf   dz
  dz  | dddf<   | dddf   dz
  dz  | dddf<   | dddf   d	z
  d
z  | dddf<   | S )zi Normalize input images according to ImageNet standards.

    Args:
        x (tensor): input images
    Nr   g
ףp=
?gZd;O?r&   gv/?gy&1?r)   gCl?g?)clone)rj   s    r   normalize_imagenetrw      sn     	
	AAw%'AadGAw%'AadGAw%'AadGHr   c                 x    t        | d      r.t        j                  j                  | j                  ddd       y y )Nr6   g        r`   fan_in)anonlinearityrR   )hasattrr   initkaiming_normal_r6   )ms    r   init_weights_normalr      s0    q(
Cf8T r   )r       )rD   r1   r   r   einopsr   r   torch.nnr   r\   numpynpr   Moduler   rw   r    r   r   <module>r      s:       $ $ 0e%ryy e%N
Ur   