o
    *j7                     @   s`  d dl Z d dlmZ d dlZd dlmZmZmZm	Z	 d dl
Z
d dlZd dlmZ d dlm  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 d dlmZ d dlmZ d dlm Z  d d	l!m"Z" d d
l#m$Z$m%Z%m&Z&m'Z' d dl(m)Z) d dl*m+Z+ d dl,m-Z- e.d e- Z/dddZ0dddZ1dddZ2dddZ3e)j4e+j5ej5dG dd de&Z6dS )    N)AnyDictListUnion)	animation)writers)MultipleLocator)	Pipelines)KeypointsTypes)
OutputKeys)pipeline)InputModelPipelineTensor)	PIPELINES)Tasks)
get_loggerZAgg   c           	      C   sf  ddgddgddgddgd	d
gddgddgddgddgddgddgdd	gddgddgd
dgg}| j \}}t||f}|D ]}| |d  ||d < q=|dkrtddgddgddgddgd	d	gddgddgddgddgddgddgddgdd
gddgd
dgg}td}||d d df  ||d d df < |d |d  d |d< |d |d  d |d< |}|S )Nr                                 	      
         r      )r#   r         ?)shapenpZzerosarray)	Zjoints
joints_nbrZlst_mappingsZnbrdimZh36m_jointsmappingZlst_mappings_17Zh36m_joints_17 r,   s/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/pipelines/cv/body_3d_keypoints_pipeline.pyconvert_2_h36m!   s,   *$
"

r.         .@c              	   C   s&  |d u r| S |d |d  \}}|dks|dkr| S t |}t | }|dks*|dkr,| S ||  }	||  }
t|D ]V}t|	t| | d || d   }t|
t| | d || d   }d| | | d  ||| d   | | d< d| | | d  ||| d   | | d< q:| S )Nr   r   g      ?)lenranger'   expabs)Zcur_ptsZpre_ptsZbboxsmooth_xsmooth_ywhZsize_preZsize_curZfactor_xZfactor_yiZw_xZw_yr,   r,   r-   
smooth_pts9   s"   

((,.r9   c                 C   st   | j d |j d ksJ g }d }t| j d D ]}t| | ||| dd dd||}|| |}qt|S )Nr   r   )r&   r1   r9   reshapeappendr'   r(   )lst_kps
lst_bboxesr4   r5   Zlst_smoothed_kpsZprev_ptsr8   Zsmoothed_cur_kpsr,   r,   r-   	smoothingQ   s   


r?   c                 C   sh   |   } |  }| jd |jd ksJ t| |} g }t| jd D ]}t| | |d}|| q"|S )Nr   r)   )Zsqueezer&   r?   r1   r.   r<   )r=   r>   r)   	keypointsr8   Zh36m_joints_2dr,   r,   r-   convert_2_h36m_data`   s   
rB   )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
deeejf fddZdd Z  ZS )Body3DKeypointsPipelinemodelc                    s   t  jdd|i| | j| _| j  d| _ttj| jt	j
 r#dndd| _t| jjjjdr;| jjjjj| _dS | jjjjj| _dS )	aj  Human body 3D pose estimation.

        Args:
            model (str): model id on modelscope hub.
            kwargs (dict, `optional`): Extra kwargs passed into the preprocessor's constructor.
        Example:
            >>> from modelscope.pipelines import pipeline
            >>> body_3d_keypoints = pipeline(Tasks.body_3d_keypoints,
                model='damo/cv_hdformer_body-3d-keypoints_video')
            >>> test_video_url = 'https://modelscope.oss-cn-beijing.aliyuncs.com/test/videos/Walking.54138969.mp4'
            >>> output = body_3d_keypoints(test_video_url)
            >>> print(output)
        rE   z*damo/cv_hrnetv2w32_body-2d-keypoints_imageZgpucpu)rE   Zdevice	MAX_FRAMENr,   )super__init__rE   keypoint_model_3devalZhuman_body_2d_kps_det_pipeliner   r   Zbody_2d_keypointstorchcudaZis_availablehuman_body_2d_kps_detectorhasattrcfgZINPUTrG   	max_frame)selfrE   kwargs	__class__r,   r-   rI   s   s   
z Body3DKeypointsPipeline.__init__inputreturnc                 C   sf  || _ | | j }dt|krddd}|S g }g }t|D ]Q\}}| |}g |dkr:dd| d}|  S |d d }	|d d }
t|d d  }|	|
 |	t
t|	d	|g  |d
 | jkro nqt|t|ddf}t|t|df}t| jjjjdr| jjjjjn| jjjjj}t|||d}t|}d|d}|S )Nr   Fzget video frame failed.successmsgZboxesz%fail to detect person at image frame rA   Zscoresr:   r   r   r   r   IN_NUM_JOINTSr@   T)rY   input_2d_pts)	video_urlread_video_framesr0   	enumeraterN   getr'   r(   maxr<   listr;   rQ   rO   rJ   rP   rE   ZMODELr[   Zn_jointsrB   )rR   rV   Zvideo_framesresZall_2d_posesZall_boxes_with_socrer8   frameZkps_2dboxZposeZscoreZall_2d_poses_npZall_boxes_npZ	joint_numZkps_2d_h36m_17r,   r,   r-   
preprocess   s`   







z"Body3DKeypointsPipeline.preprocessc                 C   sN   |d sddd}|S |d }| j |}| j |}tddifi |}|S )NrY   Fzpreprocess failed.rX   r\   T)rJ   rf   forwarddict)rR   rV   rc   r\   Zoutputsr,   r,   r-   rg      s   
zBody3DKeypointsPipeline.forwardc                 K   s   | dd }|d u rtjddj}tjg tjg tj|i}|d s(| j|tj< |S |t	j
 }|j  d }d| jj v rI| || ||tj< ||tj< | j|tj< |S )NZoutput_videoz.mp4)suffixrY   r   render)r`   tempfileNamedTemporaryFilenamer   Z	KEYPOINTSZ
TIMESTAMPSZOUTPUT_VIDEOr]   r
   ZPOSES_CAMERAdatarF   numpyrJ   rP   keysrender_prediction
timestamps)rR   rV   rS   output_video_pathrc   ZposesZpred_3d_poser,   r,   r-   postprocess   s(   


z#Body3DKeypointsPipeline.postprocessr]   c                 C   s   dd }g }g | _ t|trt|}| std| n|}|tj| _	| j	du s1| j	dkr7td| d}	 |
 \}}|sCn| j ||| j	 d |d	7 }|| || jkr^nq:|  |S )
a  Read video from local video file or from a video stream URL.

        Args:
            video_url (str or cv2.VideoCapture): Video path or video stream.

        Raises:
            Exception: Open video fail.

        Returns:
            [nd.array]: List of video frames.
        c                 S   s.   t | d\}}t |d\}}d|||f }|S )N<   z%02d:%02d:%06.3f)divmod)secondsmsr7   timer,   r,   r-   timestamp_format   s   zCBody3DKeypointsPipeline.read_video_frames.<locals>.timestamp_formatz1modelscope error: %s cannot be decoded by OpenCV.Nr   z/modelscope error: %s cannot get video fps info.T)rw   r   )rr   
isinstancestrcv2VideoCaptureZisOpened	Exceptionr`   ZCAP_PROP_FPSfpsreadr<   rQ   release)rR   r]   r{   framescap	frame_idxretrd   r,   r,   r-   r^      sB   




z)Body3DKeypointsPipeline.read_video_framesc                    s  j d g dddgddgddgddgddgddgdd	gdd
gd
dgd
dgd
dgddgddgddgddgddggt }tj|dd |  td} j|  j	|  j
|  d  d  d  dd  dd  dd | jjjj}| jjjj} || ddddf }ddddf }ddddf }	 |||	d\}
 fdd}||||	}fdd}tj||| j|
|fd }td! }|| ji d"d#}|j||d$ dS )%zrender predict result 3d poses.

        Args:
            pose3d_cam_rr (nd.array): [frame_num, joint_num, joint_dim], 3d pose joints
            output_video_path (str): output path for video
        Returns:
        r   )r"   r   r   r   r   r    r   r   r   r   r   r    r   r   r   r"   r   r   r$   r   r   r!   F)Zauto_add_to_figurer%   XYZr:   Nzr.c           
         s   i }t D ]8\}}|d |d }}|v rd}nd} j| | | | g|| || g|| || gd|d}	|	d ||< q|S )zrender bones in skeleton

            Args:
                xs (nd.array): [joint_num, joint_channel]
                ys (nd.array): [joint_num, joint_channel]
                zs (nd.array): [joint_num, joint_channel]
            r   r   redbluer   )Z	linewidthcolor)r_   plot)
xsyszsbonesidxedgeindex1index2Z
edge_colorconnect)axedgesleft_pointsr,   r-   renderBones<  s   z>Body3DKeypointsPipeline.render_prediction.<locals>.renderBonesc                    s   | dddf }| dddf }| dddf }t  D ];\}}|d |d }}	|| ||	 f}
|| ||	 f}|| ||	 f}|| |
 || | || |d q||| ||d d| d krxtd|  d  ||fS )	aM  update animation

            Args:
                frame_idx (int): frame index
                points (mpl_toolkits.mplot3d.art3d.Line3D): skeleton points ploter
                bones (dict[int, mpl_toolkits.mplot3d.art3d.Line3D]): connection ploter

            Returns:
                tuple: points and bones ploter
            Nr   r   r   zd   z
rendering /)r_   Z	set_xdataZ	set_ydataZset_3d_propertiesset_dataloggerinfo)r   pointsr   r   r   r   r   r   r   r   Zx1x2Zy1y2Zz1z2)r   	frame_numpose3d_cam_rrr,   r-   updateU  s    z9Body3DKeypointsPipeline.render_prediction.<locals>.update)figfuncr   intervalZfargsZffmpegi   )r   metadataZbitrate)writer)r&   pltZfigurep3ZAxes3DZadd_axesr   ZxaxisZset_major_locatorZyaxisZzaxisZ
set_xlabelZ
set_ylabelZ
set_zlabelZset_xlimZset_ylimZset_zlimrJ   rP   rj   azimelevZ	view_initr   r   ZFuncAnimationr   r   save)rR   r   rs   r   Zx_major_locatorr   r   xyr   r   r   r   r   ZaniWriterr   r,   )r   r   r   r   r   r-   rq     sT   
&$



 z)Body3DKeypointsPipeline.render_prediction)__name__
__module____qualname__r}   rI   r   r   r   rf   rg   rt   r   r~   r   r^   rq   __classcell__r,   r,   rT   r-   rD   o   s    ","1rD   )r   )r/   r/   )7datetimeZos.pathpathZosprk   typingr   r   r   r   r~   Z
matplotlibZmatplotlib.pyplotZpyplotr   Zmpl_toolkits.mplot3d.axes3dZmplot3dZaxes3dr   ro   r'   rL   r   Zmatplotlib.animationr   Zmatplotlib.tickerr   Zmodelscope.metainfor	   ZBmodelscope.models.cv.body_3d_keypoints.canonical_pose.body_3d_poser
   Zmodelscope.outputsr   Zmodelscope.pipelinesr   Zmodelscope.pipelines.baser   r   r   r   Zmodelscope.pipelines.builderr   Zmodelscope.utils.constantr   Zmodelscope.utils.loggerr   Zuser   r.   r9   r?   rB   Zregister_moduleZbody_3d_keypointsrD   r,   r,   r,   r-   <module>   s>   




