o
    ॵi                     @   s   d dl m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mZmZ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 d dl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)ClassifierFreeSampleModelcreate_modelload_model_wo_clip)
OutputKeys)InputPipeline)	PIPELINES)Config)	ModelFileTasks)recover_from_ric)plot_3d_motion)
get_logger)module_namec                       s   e Zd Zdef fddZdedeeef fddZdeeef deeef fdd	Z	d
eeef deeef fddZ
  ZS )MDMMotionGenerationmodelc                    s$  t  jdd|i| t| jtj}td|  t| jtj	}td|  t
t| jd| _t
t| jd| _t|| _| jdt| jdi | j| d| _d	| _d
| _t| j\| _| _tj|dd}t| j| t| j| _| j| j | j  td dS )z
        use `model` to create motion generation pipeline for prediction
        Args:
            model: model id on modelscope hub.
        r   zloading model from zloading config from zMean.npyzStd.npysmpl_data_pathsmpl      x   cpu)map_locationzload model doneN )super__init__ospjoinr   r   TORCH_MODEL_FILEloggerinfoCONFIGURATIONnploadmeanstdr   	from_filecfgupdaten_jointsfpsn_framesr   mdm	diffusiontorchr   r   todeviceeval)selfr   kwargs
model_pathconfig_path
state_dict	__class__r   f/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/pipelines/cv/motion_generation_pipeline.pyr      s(   
zMDMMotionGeneration.__init__inputreturnc                 C   s.   t |tr|}n	tdt| d|i}|S )Nz input should be a str,  but got 
input_text)
isinstancestr	TypeErrortype)r5   r=   r?   resultr   r   r<   
preprocess9   s   
zMDMMotionGeneration.preprocessc                 C   s0  |d g}dt ddd| jdkt | jgd |t jd| jdd di}| jj}|| jd| jj| jj	| jfd|dd d	d d dd

}|
 dddd| j | j  }t|| j}|jdg|jdd  R  dddd}| jj|d dd	d	dd	d dd dd}|
  }|d ddd}tj|d|d i}|S )Nr?   y   r   )r3   g      @)masklengthstokenstextscaleFT)clip_denoisedmodel_kwargsskip_timesteps
init_imageprogress
dump_stepsnoiseconst_noise      xyzr   )xrH   pose_repglobtranslation
jointstype
vertstransbetasbetaglob_rotget_rotations_backrK   )r1   onesr.   tensorr3   r0   p_sample_loopr/   njointsnfeatsr   permuter(   r'   floatr   r,   viewshaperot2xyznumpy	transposer   	KEYPOINTS)r5   r=   textsrN   	sample_fnsamplemotionoutr   r   r<   forwardB   s\   
	(zMDMMotionGeneration.forwardinputsc                 K   st   | dtjddj}g dg dg dg dg dg}|d ur0t|||tj |d	d
dd |tj	|i |S )Noutput_videoz.mp4)suffix)r   rU            )r   rG         
   )r   rV      	         )r               )r            r   rK   humanmlr   )datasetr-   )
gettempfileNamedTemporaryFilenamer   r   ro   popr+   OUTPUT_VIDEO)r5   rv   r6   output_video_pathkinematic_chainr   r   r<   postprocessp   s&   zMDMMotionGeneration.postprocess)__name__
__module____qualname__rA   r   r	   r   r   rE   ru   r   __classcell__r   r   r:   r<   r      s
    "	*.r   )'os.pathpathr   r   typingr   r   rm   r%   r1   modelscope.metainfor   &modelscope.models.cv.motion_generationr   r   r   modelscope.outputsr   modelscope.pipelines.baser	   r
   modelscope.pipelines.builderr   modelscope.utils.configr   modelscope.utils.constantr   r   /modelscope.utils.cv.motion_utils.motion_processr   ,modelscope.utils.cv.motion_utils.plot_scriptr   modelscope.utils.loggerr   r"   register_modulemotion_generationmotion_generattionr   r   r   r   r<   <module>   s(   