o
    *j	                     @   s  d dl Z d dlZd dlmZmZ d dlZd dlZd dlm	Z
 d dl	Z	d dlZd dlmZ d dlmZ d dlmZmZmZmZmZmZ d dlmZ d dlmZ d dlmZmZ d d	lmZ d d
l m!Z! d dl"m#Z#m$Z$ d dl%m&Z& e& Z'ej(e$j)ej)dG dd deZ*dS )    N)AnyDict)	Pipelines)mesh_to_string)
projectionread_objrenderrotate_xrotate_y	translate)	MsDataset)
OutputKeys)ModelPipeline)	PIPELINES)is_model)InvokeTasks)
get_logger)module_namec                       s   e Zd ZdZddef fddZdeeef deeef fdd	Zd
d Z	dd Z
dddZdeeef deeef fddZdeeef fddZ  ZS )Human3DRenderPipelinea   Human3D library render pipeline
    Example:

    ```python
    >>> from modelscope.pipelines import pipeline
    >>> human3d = pipeline(Tasks.human3d_render,
                'damo/cv_3d-human-synthesis-library')
    >>> human3d({
            'data_dir': '/data/human3d-syn-library', # data dir path (str)
            'case_id': '3f2a7538253e42a8', # case id (str)
        })
    >>> #
    ```
    gpumodelc                    s    t  jdd|i| || _dS )z
        use model to create a image sky change pipeline for image editing
        Args:
            model (str or Model): model_id on modelscope hub
            device (str): only support gpu
        r   N )super__init__	model_dir)selfr   Zdevicekwargs	__class__r   p/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/pipelines/cv/human3d_render_pipeline.pyr   .   s   
zHuman3DRenderPipeline.__init__inputsreturnc                 C   s   |S )Nr   )r   r"   r   r   r!   
preprocess8   s   z Human3DRenderPipeline.preprocessc                 C   sP   t |}|dd}tj|stjdtjd}nt	|}|
 |d< ||fS )N.objz.png)   r&      )ZdtypeZtexture_map)r   replaceospathexistsnpZzerosuint8cv2Zimreadcopy)r   	mesh_pathmeshZtex_pathtexr   r   r!   load_3d_model;   s   
z#Human3DRenderPipeline.load_3d_modelc                 C   s  |d }|j dd|jdd d }||8 }|d }| dkr$|d n|}|d }|d }| dkr8|d n|}t|tj }t|tj }	t|tj }
t|tj }|d d d	d d d d d	f }t|tjd
  }||	|
||fS )NZverticesr   )Zaxis   Zfaces   ZuvsZfaces_uv     o@)	maxmintorchZ
from_numpyastyper,   float32cudaZint32)r   r1   r2   ZvertcentZtriZvert_uvZtri_uvvtx_pospos_idxvtx_uvuv_idxr   r   r!   format_nvdiffrast_formatE   s   z.Human3DRenderPipeline.format_nvdiffrast_format   c                 C   s  t j|std|  t j| jddd}| |\}}| ||\}}}}}	t	
 }
d}d}dtj | }g }g }tt|D ]}tdd	d
d}ttdt|}ttddd|}t||tj}t|
||||||	|ddd
\}}}tt|d    d ddtjd d dd d d d f }tt|d    d ddtjd d dd d d d f }|| || || }qCtdt jt j|  |||fS )Nz!can not found %s, use default onez	3D-assetsZ3f2a7538253e42a8body.objg        P   r4   g?g      ?g      i@)xnfr   gF	   )
resolutionZ
enable_mipZmax_mip_levelr7      r6   zrender case %s done) r)   r*   r+   loggerinfojoinr   r3   rC   drZRasterizeCudaContextr,   pitqdmranger   matmulr	   r
   r   r;   r<   r   ZclipZrintdetachcpunumpyr-   appendbasenamedirname)r   r0   rK   r1   Ztexturer?   r@   rA   rB   r2   ZglctxangZframe_lengthstepframes_colorZframes_normalsiZprojZa_rotZa_mvZr_mvpZpred_imgZ	pred_masknormalcolornormalsr   r   r!   render_sceneV   sf   



z"Human3DRenderPipeline.render_sceneinputc                 C   s   |d }|d }d|v r|d }nd}| dr|}n)|dd }|dd }tj|||d	jd
 d }tj||}	tj|	d}| ||\}
}}|
||d}t	j
d t	j|iS )N
dataset_idcase_idrK   rD   r%   /r6   r   )	namespaceZsubset_nameZsplit_configtestrE   )r1   r]   Zframes_normal)endswithsplitr   loadZconfig_kwargsr)   r*   rO   rb   r   
OUTPUT_OBJOUTPUT)r   rc   rd   re   rK   r0   Zdataset_nameZ	user_namedata_dirZcase_dirr1   colorsra   resultsr   r   r!   forward   s2   

zHuman3DRenderPipeline.forwardc           	      K   sp   | dd}|tj }|tj }|r't }t|d }|jdd}|| tj|tj|r3d i}|S |i}|S )Nr   Fr1   zutf-8)encoding)	getr   rl   rm   ioBytesIOr   encodewrite)	r   r"   r   r   Z
output_objrp   Zmesh_strZ
mesh_bytesresultr   r   r!   postprocess   s   



z!Human3DRenderPipeline.postprocess)r   )rD   )__name__
__module____qualname____doc__strr   r   r   r$   r3   rC   rb   rq   ry   __classcell__r   r   r   r!   r      s    "


"/r   )+rt   r)   typingr   r   r.   rW   r,   Znvdiffrast.torchr:   rP   rR   Zmodelscope.metainfor   Z.modelscope.models.cv.face_reconstruction.utilsr   Z&modelscope.models.cv.human3d_animationr   r   r   r	   r
   r   Zmodelscope.msdatasetsr   Zmodelscope.outputsr   Zmodelscope.pipelines.baser   r   Zmodelscope.pipelines.builderr   Zmodelscope.pipelines.utilr   Zmodelscope.utils.constantr   r   Zmodelscope.utils.loggerr   rM   Zregister_moduleZhuman3d_renderr   r   r   r   r!   <module>   s.    