o
    *j$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	   q/var/www/html/Deteccion_Ine/venv/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?)meanZstd           lind   )beta)superr   __init__rangeembed_fn_fineget_embedderlen
num_layersskip_inscalennLineartorchinitZnormal_weightnpsqrtpiZ	constant_biasutilsweight_normsetattrstrZSoftplus
activation)selfd_ind_outr   n_layersr!   multiresr+   r"   Zgeometric_initr-   Z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    getattrr/   r!   r%   catr(   r)   r0   )r1   inputsxr9   r   r	   r	   r   forwardW   s   




8zSDFNetwork.forwardc                 C   s   |  |d d d df S )Nr   rD   r1   rC   r	   r	   r   sdfj   s   zSDFNetwork.sdfc                 C   s
   |  |S NrE   rF   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)Zrequires_graddevice)ZoutputsrB   Zgrad_outputsZcreate_graphZretain_graphZonly_inputsr   r   )	Zrequires_grad_r%   Zenable_gradrG   Z	ones_likerK   ZautogradZgradZ	unsqueeze)r1   rC   yZd_outputZ	gradientsr	   r	   r   gradientp   s    


zSDFNetwork.gradient)r   r   r   r   TTF)	__name__
__module____qualname__r   rD   rG   rI   rM   __classcell__r	   r	   r;   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,   r-   r.   r/   ZReLUrelu)r1   Z	d_featurerS   r2   r3   r   r4   r-   multires_viewrT   r6   rU   r8   r9   r:   r   r;   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idrr=   r>   Zno_view_dirZ	no_normalr   r   r   r   )rU   rS   r%   rA   r   r    r@   r/   rV   rT   Zsigmoid)	r1   ZpointsZnormalsZ	view_dirsZfeature_vectorsZrendering_inputrC   r9   r   r	   r	   r   rD      s2   






zRenderingNetwork.forward)Tr   TrN   rO   rP   r   rD   rQ   r	   r	   r;   r   rR      s    	$rR   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$   r8   )r   iWr1   r	   r   r      s    z!NeRF.__init__.<locals>.<listcomp>r   r   )r   rZ   r   Dr`   r2   	d_in_viewr8   input_ch_viewr7   embed_fn_viewr   r]   use_viewdirsr#   Z
ModuleListr$   r   pts_linearsviews_linearsfeature_linearalpha_linear
rgb_linearZoutput_linear)r1   ra   r`   r2   rb   r5   rW   Z	output_chr]   re   r7   r8   rd   rc   r;   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 )Nr=   )r7   rd   	enumeraterf   FrV   r]   r%   rA   re   ri   rh   rg   rj   )	r1   Z	input_ptsZinput_viewshr^   lalphafeaturergbr	   r	   r   rD      s*   








zNeRF.forwardrY   r	   r	   r;   r   rZ      s    2rZ   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   rr   r   Zregister_parameterr#   	Parameterr%   Ztensor)r1   Zinit_valr;   r	   r   r     s   zSingleVarianceNetwork.__init__c                 C   s*   t jt|dg| jjdt | jd  S )Nr   )rK   g      $@)r%   Zonesr   rs   rK   exprF   r	   r	   r   rD     s   zSingleVarianceNetwork.forwardrY   r	   r	   r;   r   rr     s    rr   c                       s,   e Zd Zddef fddZdd Z  ZS )MeanFr?   c                    s   t    || _|| _d S rH   )r   r   r?   keepdim)r1   r?   rw   r;   r	   r   r   !  s   

zMean.__init__c                 C   s   t || j| jS rH   )r%   r   r?   rw   rF   r	   r	   r   rD   &  s   zMean.forward)F)rN   rO   rP   listr   rD   rQ   r	   r	   r;   r   rv     s    rv   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 )
Nrz   r   r   r   )ZstridepaddingT)Zinplacer   )r{   )r   r   imsizencchannelpatchr   extendr   r#   ZConv2dZ	LeakyReLUZ
Sequentialbodyheadrv   r$   )r1   r~   r   Z
in_channelr9   idxr;   r	   r   r   ,  s@   




"zDiscriminator.__init__c                 C   sP   |d d d | j f }|d| j| j| j dddd}| |}| |}|S )Nr=   r   r   r   r   )r}   viewr|   Zpermuter   r   rF   r	   r	   r   rD   L  s
   "

zDiscriminator.forward)rz   TrY   r	   r	   r;   r   ry   *  s     ry   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )Embedderc                 K   s   || _ |   d S rH   )kwargscreate_embedding_fn)r1   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 rH   r	   )rC   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 rH   r	   )rC   p_fnfreqr	   r	   r   r   m  s    )r   appendr%   Zlinspace	embed_fnsr:   )	r1   r   dr:   Zmax_freqZN_freqsZ
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rB   r	   r   r   t  s    z"Embedder.embed.<locals>.<listcomp>r=   )r%   rA   r   )r1   rB   r	   r   r   embeds  s   zEmbedder.embedN)rN   rO   rP   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 rH   )r   )rC   eor	   r	   r   r     rJ   zget_embedder.<locals>.embedr	   )r%   sincosr   r:   )r5   r   Zembed_kwargsZembedder_objr   r	   r	   r   r   w  s   
	
r   )r   )numpyr(   r%   Ztorch.nnr#   Ztorch.nn.functionalZ
functionalrl   Ztorch.nn.utilsr   Moduler   rR   rZ   rr   rv   ry   r   r   r	   r	   r	   r   <module>   s   sBP*#