o
    *jl=                     @   s`   d dl Z d dlmZ d dlm  mZ ddlmZmZm	Z	 ddl
mZmZ G dd dejZdS )    N   )RenderingNetwork
SDFNetworkSingleVarianceNetwork)extract_geometry
sample_pdfc                       sn   e Zd Z fddZ		dddZ	ddd	Zd
d ZdddZ					dddZ				dddZ	  Z
S )SurfaceRendererc                    s   t    || _|| _tdi | jd | j| _tdi | jd | j| _t	di | jd | j| _
t	di | jd | j| _| jd d | _| jd d | _| jd d | _| jd d	 | _| jd d
 | _d S )Nsdf_networkvariance_networkZrendering_networklight_networkZneus_renderer	n_samplesn_importance	n_outsideup_sample_stepsperturb )super__init__confdevicer   tor	   r   r
   r   color_networkr   r   r   r   r   r   )selfr   r   	__class__r   s/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/models/cv/surface_recon_common/renderer.pyr      s0   
zSurfaceRenderer.__init__        cudac                    s   t |||| fdd|dS )Nc                    s    j |  S N)r	   sdf)ptsr   r   r   <lambda>.   s    z2SurfaceRenderer.extract_geometry.<locals>.<lambda>)
resolution	thresholdZ
query_funcr   )r   )r   Z	bound_minZ	bound_maxr#   r$   r   r   r!   r   r   #   s   
z SurfaceRenderer.extract_geometryNc              	   C   s  |j \}}|ddd f |dd df  }	t|	t|g|	dd df j gd}	||	d  }
|d d d d d f |d d d d d f |
dd d d f   }tjj|dddddd	}tj|| d| gdd
}|d d d d d f ||d}|ddt	| j
dk }|dd}|||\}}dtt||| |	  }|||}|ttt|dgd| d gddd d d df  }|||d}|d d d d d f | jdd
}|d ur||d|jddd   }||||dS )N.r         ?   Torddimkeepdim      ?g    _Br*      r   Hz>r*   r+   )colorsampled_coloralphaweights)shapetorchcatTensorexpandlinalgnormclipreshapeintr   expFZsoftpluscumprodonessum)r   rays_orays_dz_valssample_distnerfbackground_rgb
batch_sizer   dists
mid_z_valsr    Zdis_to_centerdirsZdensityr2   r3   r4   r1   r   r   r   render_core_outside1   sZ   
 *  "z#SurfaceRenderer.render_core_outsidec              	   C   s0  |j \}}|d d d d d f |d d d d d f |dd d d f   }	tjj|	dddd}
|
d d d df dk |
d d dd f dk B }|||}|d d d df |d d dd f }}|d d d df |d d dd f }}|| d }|| || d	  }tjt|dg| j|d d d df gdd
}tj	||gdd
}tj
|ddd\}}|dd| }|| }||| d  }||| d  }t|| }t|| }|| d	 |d	  }|ttt|dg| jd| d gddd d d df  }t|||d| jd }|S )N.r'   r%   Fr(   r,   r   r&   h㈵>r-   r0   g     @r   r/   T)Zdetr   )r5   r6   r:   r;   r=   r7   zerosr   r   stackminr<   sigmoidrA   rB   r   detach)r   rD   rE   rF   r   r   inv_srJ   r   r    Zradiusinside_sphereZprev_sdfZnext_sdfZprev_z_valsZnext_z_valsZmid_sdfZcos_valZprev_cos_val_distZprev_esti_sdfZnext_esti_sdfprev_cdfnext_cdfr3   r4   Z	z_samplesr   r   r   	up_samplea   sN   
>0**(zSurfaceRenderer.up_sampleFc                 C   s   |j \}}|j \}	}
|d d d d d f |d d d d d f |dd d d f   }tj||gdd}tj|dd\}}|sy| j|dd||
}tj||gdd}t|d d d f |||
 d}|d}|||f |||
 }||fS )N.r%   r-   r.   )	r5   r6   r7   sortr	   r   r=   Zaranger9   )r   rD   rE   rF   
new_z_valsr   lastrJ   r   rW   r   r    indexZnew_sdfxxr   r   r   
cat_z_vals   s0   

&
zSurfaceRenderer.cat_z_valsc           5      C   s  |j \}}|ddd f |dd df  }t|t|g|dd df j | jgd}||d  }|d d d d d f |d d d d d f |dd d d f   }|d d d d d f |j }|dd}|dd}||}|d d d df }|d d dd f }||	 }|||||||d}|||||||d}|| }|t
ddgd d d df dd}||| d}|| jddd	}t| d d d
|  }|t| |   }|||dd d  }|||dd d  } t| | }!t|| }"|!|" }#|!}$|#d |$d  ||dd
}%tjj|dddd||}&|&d
k   }'|&dk   }(|
d ur|%|' |
d d d |f d
|'   }%tj|%|
d d |d f gdd}%||'d d d d d f  })|d d d |f d
|' d d d d d f  }*|)|* }tj||d d |d f gdd}ttj|dg|%jdd
|% d gd}+|%t|+dd d d df  },|,jddd}-||,d d d d d f  jdd}.|d ur|.|d
|-   }.||,d d d d d f  jdd}/||, jdd}0|	d ur=|d d d d d f |d d d d d f |	dd d d f   }1|1dd}1||1d d d df }2nd }2tjj|||dddd}3|3d
 d }4|(|4  }4|4|( d  }4|.|/|0||2||||dd
| ||,|$|||4|'dS )N.r   r%   r&   r.   gư>g    .AT)r+   r,   rO   r   r'   r(   g333333?r-   )r   r/   r0   )r)   r*   )r1   albedodepthr   	sdf_depthrK   	gradientss_valrL   r4   cdfgradient_errorrV   )r5   r6   r7   r8   r9   r   r   r=   ZgradientZsqueezerP   r<   rC   r@   ZrelurS   r:   r;   floatrT   rB   rA   )5r   rD   rE   rF   rG   r	   Zdeviation_networkr   r   depth_zbackground_alphaZbg_sampled_colorrI   cos_anneal_ratiorJ   r   rK   rL   r    rM   Zsdf_nn_outputr   Zfeature_vectorre   Zsampled_albedoZsampled_lightr2   rU   Ztrue_cosZiter_cos_p1Ziter_cosZestimated_next_sdfZestimated_prev_sdfrY   rZ   pcr3   Zpts_normrV   Zrelax_inside_sphereforeground_colorbackground_colorbetar4   weights_sumr1   rb   rc   Z	pts_depthrd   Zgradients_normrh   r   r   r   render_core   s   
  &*
" "
"
*
zSurfaceRenderer.render_corer%   c	           &      C   s  t |}	d| j }
tdd| j| j}||| |d d d f   }d }| jdkr;dd| jd   }td|| j}| j}| j}|dkrG|}|dkrt|	dg| jd }||d | j  }| jdkrd|ddd f |dd d	f   }t	||dd	d f gd	}t	|dd df |gd	}t|	|j
d	 g}|d d d f || d d d f |  }| jdkr|tj|d	gd
 d| j  }d }d }| jdkrFt c |d d d d d f |d d d d d f |dd d d f   }| j|d	d|	| j}t| jD ]'}| ||||| j| j dd|  }| j||||||d | jkd\}}qW d    n	1 s;w   Y  | j| j }| jdkrptj	||gd	d}tj|d	d\}}| ||||
| j}|d }|d }| j||||
| j| j| j| j|||||d}|d }|d }|d } |d }!|d }"|"jd	dd}#|d }$|d |	|jd	dd}%||| |!|%|d |#tj|"d	ddd |$|"|d |d |d d S )!Ng       @r   r,   r   gMbP?r   r&   .r%   )dimsr.   @   r'   )r^   r-   r2   r3   )rj   rI   rk   background_sampled_colorrl   r1   rb   rc   rd   r4   Tr0   re   rf   rg   rL   rh   rV   )
color_finealbedo_fine
depth_finerd   rf   Zcdf_fineZ
weight_sumZ
weight_maxre   r4   rL   rh   rV   )lenr   r6   Zlinspacer   r   r   r   Zrandr7   r5   flipr   Zno_gradr	   r   r=   ranger   r[   ra   r\   rN   rH   rs   r
   r   r   rC   meanmax)&r   rD   rE   ZnearZfarrj   Zperturb_overwriterI   rl   rJ   rG   rF   Zz_vals_outsideZ
z_vals_endr   r   Zt_randZmidsupperlowerrk   rv   r    r   ir]   Zz_vals_feedrW   Zret_outsideZret_finerw   rx   ry   rd   r4   rr   re   rf   r   r   r   render  s   	





2

zSurfaceRenderer.render)r   r   r   )F)NNNNr   )Nr%   Nr   )__name__
__module____qualname__r   r   rN   r[   ra   rs   r   __classcell__r   r   r   r   r      s*    

0
"
 r   )r6   Ztorch.nnnnZtorch.nn.functionalZ
functionalr@   fieldsr   r   r   utilsr   r   Moduler   r   r   r   r   <module>   s   