o
    ߥi$0                     @   s   d dl Zd dlZd dlmZ d dlm  mZ d dlm	Z	 G dd dej
ZG dd dej
ZG dd dej
ZG d	d
 d
ej
ZG dd dej
ZG dd dej
ZG dd dZdddZdS )    N)spectral_normc                       sL   e Zd Z							d fdd	Zd	d
 Zdd Zdd Zdd Z  ZS )
SDFNetwork   r         ?   TFc              	      s  t t|   |g fddt|D  |g }d | _|dkr.t||d\}}|| _||d< t|| _|| _|| _	td| jd D ]}|d | jv rV||d  |d  }n||d  }t
|| |}|	rG|| jd kr|stj
jj|jttjt||  dd tj
j|j|  ntj
jj|jttj t||  dd tj
j|j| n|dkr|dkrtj
j|jd	 tj
j|jd d d
d f d	 tj
j|jd d d d
f d	tdt|  nX|dkr,|| jv r,tj
j|jd	 tj
j|jd	tdt|  tj
j|jd d |d d
  d f d	 ntj
j|jd	 tj
j|jd	tdt|  |
rPt
j|}t| dt| | qAt
jdd| _d S )Nc                       g | ]} qS  r	   .0_d_hiddenr	   d/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/models/cv/surface_recon_common/fields.py
<listcomp>   s    z'SDFNetwork.__init__.<locals>.<listcomp>r   
input_dimsr      g-C6?)meanstd           lind   )beta)superr   __init__rangeembed_fn_fineget_embedderlen
num_layersskip_inscalennLineartorchinitnormal_weightnpsqrtpi	constant_biasutilsweight_normsetattrstrSoftplus
activation)selfd_ind_outr   n_layersr"   multiresr.   r#   geometric_initr0   inside_outsidedimsembed_fninput_chlayerout_dimr   	__class__r   r   r      sh   "
"&zSDFNetwork.__init__c                 C   s   || j  }| jd ur| |}|}td| jd D ]-}t| dt| }|| jv r6t||gdt	
d }||}|| jd k rF| |}qtj|d d d df | j  |d d dd f gddS )Nr   r   r   r   dim)r#   r   r   r!   getattrr2   r"   r&   catr*   r+   r4   )r5   inputsxr?   r   r	   r	   r   forwardW   s   




8zSDFNetwork.forwardc                 C   s   |  |d d d df S )Nr   rJ   r5   rI   r	   r	   r   sdfj   s   zSDFNetwork.sdfc                 C   s
   |  |S NrK   rL   r	   r	   r   sdf_hidden_appearancem      
z SDFNetwork.sdf_hidden_appearancec                 C   st   | d t  | |}W d    n1 sw   Y  tj|d|jd}tjj|||ddddd }|dS )NTF)requires_graddevice)outputsrH   grad_outputscreate_graphretain_graphonly_inputsr   r   )	requires_grad_r&   enable_gradrM   	ones_likerR   autogradgrad	unsqueeze)r5   rI   yd_output	gradientsr	   r	   r   gradientp   s    


zSDFNetwork.gradient)r   r   r   r   TTF)	__name__
__module____qualname__r   rJ   rM   rO   ra   __classcell__r	   r	   rA   r   r      s    Hr   c                       s,   e Zd Z			d fdd	Zdd Z  ZS )RenderingNetworkTr   c
                    s   t    || _|	| _|| g fddt|D  |g }
d | _|dkr8t|\}}|| _|
d  |d 7  < t|
| _td| jd D ]"}|
|d  }t	
|
| |}|r]t	j|}t| dt| | qEt	 | _d S )Nc                    r   r	   r	   r
   r   r	   r   r      s    z-RenderingNetwork.__init__.<locals>.<listcomp>r   r   r   r   )r   r   modesqueeze_outr   embedview_fnr   r    r!   r$   r%   r/   r0   r1   r2   ReLUrelu)r5   	d_featurerg   r6   r7   r   r8   r0   multires_viewrh   r<   ri   r>   r?   r@   r   rA   r   r   r      s*   


zRenderingNetwork.__init__c           	      C   s   | j d ur
|  |}d }| jdkrtj||||gdd}n| jdkr-tj|||gdd}n| jdkr<tj|||gdd}|}td| jd D ]}t| dt| }||}|| jd	 k ra| |}qF| j	rjt
|}|S )
NidrrC   rD   no_view_dir	no_normalr   r   r   r   )ri   rg   r&   rG   r   r!   rF   r2   rk   rh   sigmoid)	r5   pointsnormals	view_dirsfeature_vectorsrendering_inputrI   r?   r   r	   r	   r   rJ      s2   






zRenderingNetwork.forward)Tr   Trb   rc   rd   r   rJ   re   r	   r	   rA   r   rf      s    	$rf   c                	       s:   e Zd Zddddddddgdf	 fdd	Zd	d
 Z  ZS )NeRF      r   r   r   Fc
                    s.  t t  |_ _|_|_d_d_d _	d _
|dkr1t||d\}
}|
_	|_|dkrCt||d\}}|_
|_|_|	_ttj g fddt|d D  _ttj   d g_|	rt  _t d_t d d_d S t |_d S )Nr   r   r   c                    s4   g | ]}|j vrt  nt j  qS r	   )skipsr$   r%   r>   )r   iWr5   r	   r   r      s    z!NeRF.__init__.<locals>.<listcomp>r   r   )r   rx   r   Dr~   r6   	d_in_viewr>   input_ch_viewr=   embed_fn_viewr   r{   use_viewdirsr$   
ModuleListr%   r   pts_linearsviews_linearsfeature_linearalpha_linear
rgb_linearoutput_linear)r5   r   r~   r6   r   r9   rm   	output_chr{   r   r=   r>   r   r   rA   r}   r   r      s@   


zNeRF.__init__c           	      C   s   | j d ur
|  |}| jd ur| |}|}t| jD ]\}}| j| |}t|}|| jv r8t||gd}q| j	rm| 
|}| |}t||gd}t| jD ]\}}| j| |}t|}qS| |}||fS J )NrC   )r=   r   	enumerater   Frk   r{   r&   rG   r   r   r   r   r   )	r5   	input_ptsinput_viewshr|   lalphafeaturergbr	   r	   r   rJ      s*   








zNeRF.forwardrw   r	   r	   rA   r   rx      s    2rx   c                       s$   e Zd Z fddZdd Z  ZS )SingleVarianceNetworkc                    s*   t t|   | dtt| d S )Nvariance)r   r   r   register_parameterr$   	Parameterr&   tensor)r5   init_valrA   r	   r   r     s   zSingleVarianceNetwork.__init__c                 C   s*   t jt|dg| jjdt | jd  S )Nr   )rR   g      $@)r&   onesr    r   rR   exprL   r	   r	   r   rJ     s   zSingleVarianceNetwork.forwardrw   r	   r	   rA   r   r     s    r   c                       s,   e Zd Zddef fddZdd Z  ZS )MeanFrE   c                    s   t    || _|| _d S rN   )r   r   rE   keepdim)r5   rE   r   rA   r	   r   r   !  s   

zMean.__init__c                 C   s   t || j| jS rN   )r&   r   rE   r   rL   r	   r	   r   rJ   &  s   zMean.forward)F)rb   rc   rd   listr   rJ   re   r	   r	   rA   r   r     s    r   c                       s&   e Zd Zd fdd	Zdd Z  ZS )Discriminator    Tc                    s   t    d| _d| _|| _|| _d}g }tdD ]9}|tt	j
||d|  ddddt	jddtt	j
|d|  |d|  ddddt	jddg |d|  }qt	j| | _| jrjtt	j
|dddd	| _d S t	tddgt	|d| _d S )
Nr   r   r   r   )stridepaddingT)inplacer   )r   )r   r   imsizencchannelpatchr   extendr   r$   Conv2d	LeakyReLU
Sequentialbodyheadr   r%   )r5   r   r   
in_channelr?   idxrA   r	   r   r   ,  s@   




"zDiscriminator.__init__c                 C   sP   |d d d | j f }|d| j| j| j dddd}| |}| |}|S )NrC   r   r   r   r   )r   viewr   permuter   r   rL   r	   r	   r   rJ   L  s
   "

zDiscriminator.forward)r   Trw   r	   r	   rA   r   r   *  s     r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )Embedderc                 K   s   || _ |   d S rN   )kwargscreate_embedding_fn)r5   r   r	   r	   r   r   V  s   zEmbedder.__init__c           	      C   s   g }| j d }d}| j d r|dd  ||7 }| j d }| j d }| j d r2d	td
|| }n	tdd	| |}|D ]}| j d D ]}|||fdd ||7 }qDq=|| _|| _d S )Nr   r   include_inputc                 S   s   | S rN   r	   )rI   r	   r	   r   <lambda>_  s    z.Embedder.create_embedding_fn.<locals>.<lambda>max_freq_log2	num_freqslog_samplingg       @r   g      ?periodic_fnsc                 S   s   || | S rN   r	   )rI   p_fnfreqr	   r	   r   r   m  s    )r   appendr&   linspace	embed_fnsr@   )	r5   r   dr@   max_freqN_freqs
freq_bandsr   r   r	   r	   r   r   Z  s(   






zEmbedder.create_embedding_fnc                    s   t  fdd| jD dS )Nc                    s   g | ]}| qS r	   r	   )r   fnrH   r	   r   r   t  s    z"Embedder.embed.<locals>.<listcomp>rC   )r&   rG   r   )r5   rH   r	   r   r   embeds  s   zEmbedder.embedN)rb   rc   rd   r   r   r   r	   r	   r	   r   r   T  s    r   r   c                 C   sB   d|| d | dt jt jgd}tdi |}|fdd}||jfS )NTr   )r   r   r   r   r   r   c                 S   s
   | | S rN   )r   )rI   eor	   r	   r   r     rP   zget_embedder.<locals>.embedr	   )r&   sincosr   r@   )r9   r   embed_kwargsembedder_objr   r	   r	   r   r   w  s   
	
r   )r   )numpyr*   r&   torch.nnr$   torch.nn.functional
functionalr   torch.nn.utilsr   Moduler   rf   rx   r   r   r   r   r   r	   r	   r	   r   <module>   s   sBP*#