
    |2gf"                        d dl mZ d dlZd dlmZ d dlZd dl	m
Z
 d dlmc mZ d dlmZmZ d dlZd dlmZ  G d d      Zd Zd Z G d d	e      Z ej0                  g d
g d      Z eg d
g d      Z ej0                  dgdz  dgdz        Z edgdz  dgdz        Z G d de      Z	 	 	 	 	 	 ddZd ZddZ d Z! G d de      Z"ddZ# G d dejH                        Z%ddZ&y)    N)PCA)defaultdictdequec                   $    e Zd Zd Zd Zd Zd Zy)
RollingAvgc                 :     | _         t         fd       _        y )Nc                  0    t         j                        S )N)maxlen)r   length)selfs   ./home/cameronsmith/repos/FeatUp/featup/util.py<lambda>z%RollingAvg.__init__.<locals>.<lambda>   s    5+D     )r   r   metrics)r   r   s   ` r   __init__zRollingAvg.__init__   s    "#DEr   c                 @    | j                   |   j                  |       y N)r   append)r   namemetrics      r   addzRollingAvg.add   s    T!!&)r   c                 t    t        j                  t        | j                  |               j	                         S r   )torchtensorlistr   mean)r   r   s     r   getzRollingAvg.get   s(    ||Dd!345::<<r   c                 r    | j                   j                         D ]  } ||| j                  |              y r   )r   keysr   )r   log_funcks      r   logallzRollingAvg.logall   s0    ""$ 	%AQ$	%r   N)__name__
__module____qualname__r   r   r   r"    r   r   r   r      s    F*=%r   r   c                     | j                   j                  t        j                                | j                  j                  t        j                                | j                  g        | j                  g        y r   )xaxisset_major_formatterpltNullFormatteryaxis
set_xticks
set_yticks)axs    r   _remove_axesr0      sP    HH  !2!2!45HH  !2!2!45MM"MM"r   c                     t        | j                        dk(  r| D ]  }|D ]  }t        |         y | D ]  }t        |        y )N   )lenshaper0   )axesax1r/   s      r   remove_axesr7   $   sQ    
4::! 	!C !R !	!  	B	r   c                       e Zd Zd Zd Zy)UnNormalizec                      || _         || _        y r   )r   std)r   r   r;   s      r   r   zUnNormalize.__init__/   s    	r   c                 @   t        j                  |      }t        |j                        dk(  r|j	                  dddd      }t        || j                  | j                        D ]&  \  }}}|j                  |      j                  |       ( |j	                  dddd      S )N      r   r2      )
r   cloner3   r4   permutezipr   r;   mul_add_)r   imageimage2tmss         r   __call__zUnNormalize.__call__3   s    U#v||!^^Aq!Q/F6499dhh7 	GAq!FF1INN1	~~aAq))r   N)r#   r$   r%   r   rJ   r&   r   r   r9   r9   .   s    *r   r9   )g
ףp=
?gv/?gCl?)gZd;O?gy&1?g?      ?r?   c                       e Zd Zd Zy)ToTargetTensorc                     t        j                  t        j                  |      t         j                        j                  d      S )N)dtyper   )r   	as_tensornparrayint64	unsqueeze)r   targets     r   rJ   zToTargetTensor.__call__E   s+    rxx/u{{CMMaPPr   N)r#   r$   r%   rJ   r&   r   r   rM   rM   D   s    Qr   rM   c	                 N   g }	|r!|	j                  | j                  |             nt        j                  t        j                  |      dd df   dz  g d      }
t        j
                  |      t        j                  |
d      z  }
|	j                  | j                  |
             |r||j                         z  }|s|j                  d      }t        j                  |j                  d      j                  d      |j                  d   |j                  d   f      j                  d      j                  d      }|#t        j                  |      j                         }| j                  |d||| 	      }|t!        j"                  ||d
       |	j%                  |g       |	S )N.r?      )gŏ1w-!?gbX9?gv/?r   r>   rK   )alphacmapvmaxvminvertical)caxorientation)r   imshowrQ   dotrR   	ones_likeexpand_dimsr   	clamp_minFinterpolaterT   r4   squeezeabsmaxr*   colorbarextend)r/   rE   heatmaprZ   colorcentershow_negativer^   r[   framebwhms               r   show_heatmaprs   I   sW    ERYYu%&VVBHHUOC!G,s24LM\\% 2>>"b#99RYYr]#7<<>!##A&mmG--a0::1=APUP[P[\]P^?_`	GGAJ  |vvg""$	7"4d$	GB
RSj9	LL"Lr   c                    d}t        j                  dd|| j                        }t        j                  t        j                  ||g      D cg c]  }|j                  d       c}      j                  d      }|r|| g}d}n|g}d}t        j                  |d      }t        j                  t        j                  d	d
|| j                              j                  |ddd      }	||	z  j                  d||z  ||      }|r,t        j                  |      t        j                  |      | g}
n*t        j                  |      t        j                  |      g}
t        j                  |
d      S c c}w )N   rX   r>   )devicer      r2   dim
   )
r   linspacerv   catmeshgridrT   expreshapesincos)original_image
input_sizecolor_featsn_freqsgridrG   feats	feat_listdim_multiplierfreqs	all_featss              r   implicit_featsr   o   s2   G>>"aN4I4IJDIIu~~tTl/KL!q{{1~LMWWXYZEN+	G	IIiQ'EIIennRW^=R=RST	!Q	" 
U]##Aw'?ZXEYYu%uyy'7H	YYu%uyy'78	99YA&&% Ms   E2c                    t        j                  |d      }|d   j                         j                         }|d   j                         j                         }t        j                         5  | j
                  dd  \  }}||k(  sJ t        | ||      j                         } ||      }	 ||	j                         j                               }	|	cd d d        S # 1 sw Y   y xY w)Ncpu)map_locationmodelunprojectorr2   )	r   loadcudaevalno_gradr4   r   detachr   )
r   
model_pathr   r   hr_modelr   hwr   hr_featss
             r   load_hr_embr      s    JJz6EW~""$))+H&++-224K	 ##AB'1Av~q+>CCEE?x04467  s   .A"CC#c                     t         j                  j                  d       t         j                  j                  |       d | S Nr   )rQ   randomseedpermutation)nbatchs     r   generate_subsetr      s.    IINN199  #FU++r   c                       e Zd Zd Zd Zd Zy)TorchPCAc                     || _         y r   n_components)r   r   s     r   r   zTorchPCA.__init__   s
    (r   c                     |j                  d      | _        || j                  j                  d      z
  }t        j                  || j
                  dd      \  }}}|j                  | _        || _        | S )Nr   rx   Fr=   )qrn   niter)	r   mean_rT   r   pca_lowrankr   Tcomponents_singular_values_)r   XunbiasedUSVs         r   fitzTorchPCA.fit   sh    VVV]
tzz++A..##H0A0A%WXY1a33 !r   c                 t    || j                   j                  d      z
  }|| j                  j                  z  }|S r   )r   rT   r   r   )r   r   t0	projecteds       r   	transformzTorchPCA.transform   s7    %%a(())+++	r   N)r#   r$   r%   r   r   r   r&   r   r   r   r      s    )r   r   c           	         | d   j                   }d
fd	}t        |       dkD  r| d   j                  d   }nd }g }| D ]  }	|j                   ||	|              t	        j
                  |d      }
|<|
j                  d   |kD  r*t	        j                  |
j                  d         d | }|
|   }
9|rt        |      j                  |
      nt        |      j                  |
      g }| D ]  }	j                   ||	            }t        |t        j                        rt	        j                  |      }||j                  dd      j                   z  }||j#                  dd      j                   z  }|	j                  \  }}}}|j                  |j%                  ||||      j'                  dd	dd      j)                  |              |fS )Nr   c                    |t        j                  | ||fd      } | j                  \  }}}}| j                  dddd      j	                  |||z  |z        j                  dd      j                         j                         S )Nbilinear)moder>   r   r2   r?   )re   rf   r4   rA   r   r   r   )r   target_sizeBCHWfit_pcas         r   flattenzpca.<locals>.flatten   s~    "w]]6K+EJWF\\
1a~~aAq)11!QUQY?GG1MTTVZZ\\r   r>   r2   rx   r   T)ry   keepdimr?   r   )rv   r3   r4   r   r   r}   randpermr   r   r   r   
isinstancerQ   ndarray
from_numpyminvaluesri   r   rA   to)image_feats_listry   r   use_torch_pcamax_samplesrv   r   r   flattened_featsr   xindicesreduced_featsx_redr   r   r   r   s     `               r   pcar      s   a ''F] q W_&q)//2O! <wuk:;<		/q)A 1771:#;..,\k:gJC044Q7Gs+//2GM! Y!!'%.1eRZZ($$U+Eq$/666q$/666[[
1aU]]1aC8@@Aq!LOOPVWXY '!!r   c                   ,     e Zd Zd fd	Zd Zd Z xZS )PCAUnprojectorc                    t         |           || _        ||j                  d   | _        n
|d   | _        | j                  | j                  k7  r|t        |g||      d   }| j                  dt        j                  |j                  ||j                               | j                  dt        j                  |j                  ||j                               | j                  dt        j                  |j                  ||j                               y | j                  d|d   j                                | j                  d|d          | j                  d|d          y t        d       y )	Nr>   original_dim)ry   r   r   )rv   rO   r   r   z&PCAUnprojector will not transform data)superr   ry   r4   r   r   register_bufferr   r   r   rO   r   r   rG   print)r   r   ry   rv   r   kwargssklearn_pca	__class__s          r   r   zPCAUnprojector.__init__   sF    %AD &~ 6D88t((( !5's-PQRS $$]%*\\+2I2IRX`e`k`k%ln$$%7%*\\+2N2NW]ejepep%qs$$Well;;L;LU[chcncn.op$$]F=4I4K4K4MN$$%7@R9ST$$WfWo> :;r   c                 d   | j                   | j                  k(  r|S |j                  \  }}}}|j                  dddd      j	                  ||z  |z  |      }|| j
                  z  | j                  j                  d      z   }|j	                  |||| j                        j                  dddd      S Nr   r2   r?   r>   )ry   r   r4   rA   r   r   r   rT   )r   	red_featsbcr   r   red_feats_reshapedunprojecteds           r   forwardzPCAUnprojector.forward   s    88t((("JAq!Q!*!2!21aA!>!F!Fq1uqyRS!T-0@0@@DJJDXDXYZD[[K&&q!Q0A0ABJJ1aQRTUVVr   c                    | j                   | j                  k(  r|S |j                  \  }}}}|j                  dddd      j	                  ||z  |z  |      }|| j
                  j                  d      j                  |j                        z
  }|| j                  j                         j                  |j                        z  }|j	                  |||| j                         j                  dddd      S r   )ry   r   r4   rA   r   r   rT   r   rv   r   rG   )	r   r   r   r   r   r   feats_reshapedr   r   s	            r   projectzPCAUnprojector.project   s    88t(((LJAq!Q"]]1aA6>>q1uqy!LN$**"6"6q"9"<"<U\\"JJBT--//144U\\BBI$$Q1dhh7??1aKKr   )F)r#   r$   r%   r   r   r   __classcell__)r   s   @r   r   r      s    <6WLr   r   c                    |r| | j                         z  } | | j                         z  } | dz  j                  dd      j                  t        j
                        } t        | j                        dk(  r| j                  d      } | S )NrW   r   r2   )	r   ri   clampr   r   uint8r3   r4   rT   )rG   subtract_mins     r   
prep_imager   
  sh    	QUUWLA	
S3""5;;/A
177|qKKNHr   )bwrFFFNN)T)r?   NTN)'matplotlib.pyplotpyplotr*   r   torchvision.transforms
transformsr   numpyrQ   sklearn.decompositionr   torch.nn.functionalnn
functionalre   collectionsr   r   torch.nnr   r0   r7   objectr9   	Normalizenormunnorm
midas_normmidas_unnormrM   rs   r   r   r   r   r   Moduler   r   r&   r   r   <module>r     s      "  %   *  % %"*& * q{{(*?@	*,A	BQ[[#SEAI.
C519seai0QV Q $#L'0,
v &("V.LRYY .Lb	r   