o
    ॵim%                     @   s  d dl mZ d dlmZmZmZmZ d dlZd dl	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%m&Z& d dl'm(Z( e( Z)e!j*e&j+ej+dG dd deZ,G dd dZ-dS )    N)AnyDictListUnion)Image)
transforms)	Pipelines)PoseHighResolutionNetV2)cfg_128x128_15)
OutputKeys)pipeline)InputModelPipelineTensor)	PIPELINES)	LoadImage)	ModelFileTasks)
get_logger)module_namec                       s   e Zd Zdef fddZdedeeeee	j
f f fddZdedeeeee	j
f f fdd	Zdeeeee	j
f f defd
dZ  ZS )Body2DKeypointsPipelinemodelc                    s\   t  jdd|i| ttj rdd nd}t||| _d| _t	t
j| jd| _d S )Nr   zcuda:r   cpuz damo/cv_resnet18_human-detection)r    )super__init__torchdevicecudais_availableKeypointsDetectionkeypoint_modelhuman_detect_model_idr   r   human_detectionhuman_detector)selfr   kwargsr   	__class__r   f/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/pipelines/cv/body_2d_keypoints_pipeline.pyr       s   z Body2DKeypointsPipeline.__init__inputreturnc                 C   s8   |  |}t|}|d d d d g df }||dS )N)      r   )imageoutput)r%   r   convert_to_ndarray)r&   r+   r0   r/   r   r   r*   
preprocess*   s   


z"Body2DKeypointsPipeline.preprocessc                 C   s   |d }|d }g }t j|tj  t jd}t j|tj  t jd}t|D ]#\}}|d |d |d |d  |d |d  || dg}	||	 q(t	|dkr[t
d d d gS | j||g\}
}| j|
}||gS )	Nr/   r0   dtyper   r.   r-      z cannot detect human in the image)nparrayr   SCORESr   float32BOXES	enumerateappendlenloggererrorr"   r2   forward)r&   r+   input_imager0   bboxesscoresboxesidboxbox_tmphuman_imagesmetasoutputsr   r   r*   r@   2   s"   0
zBody2DKeypointsPipeline.forwardc                 K   s   |d d u s|d d u rt jg t jg t jg iS | j|\}}}g }|D ]}||d d |d d |d d |d d g q$t j|t j|t j|iS )Nr   r.   )r   r:   	KEYPOINTSr8   r"   postprocessr<   )r&   r+   r'   posesrC   rD   result_boxesrF   r   r   r*   rL   G   s   4z#Body2DKeypointsPipeline.postprocess)__name__
__module____qualname__strr   r   r   r   r   r6   ndarrayr2   r@   rL   __classcell__r   r   r(   r*   r      s    $
$r   c                   @   s   e Zd ZdedefddZdd Zdd Zd	ed
efddZdd Z	dd Z
deeeeejf f fddZddgfddZd	ed
eeef fddZdd Zd	eeef d
eeef fddZdS )r!   r   r   c                 K   s   || _ || _t}t|| _tjt| j t	j
|d}| jj|dd | j|| _| j  |d d | _|d d | _|d d | _|d d	 | _d
| _d S )N)map_locationF)strictMODEL
IMAGE_SIZEDATASET
PARENT_IDSLEFT_IDS	RIGHT_IDSg?)r   r   r
   r	   key_points_modelr   loadospjoinr   TORCH_MODEL_FILEload_state_dicttoeval
input_sizelst_parent_idslst_left_idslst_right_idsbox_enlarge_ratio)r&   r   r   r'   cfgpretrained_state_dictr   r   r*   r   ]   s$   


zKeypointsDetection.__init__c                 C   
   | j  S N)r]   trainr&   r   r   r*   rn   p      
zKeypointsDetection.trainc                 C   rl   rm   )r]   rd   ro   r   r   r*   rd   s   rp   zKeypointsDetection.evalr+   r,   c                 C   s@   t   | j|| jW  d    S 1 sw   Y  d S rm   )r   no_gradr]   r@   rc   r   )r&   r+   r   r   r*   r@   v   s   
$zKeypointsDetection.forwardc                 C   sL  |j \}}}g }g }t|D ]}||d d d d f }t|t|k}	|t| |	d d }
|	d d }|j \}}|
dkr|
|d kr|dkr||d kr|||
d f |||
d f  }||d |
f ||d |
f  }d}d}|dk r|d}|dkrd}|dk rd}|dkrd}|
|d  }
||d  }||
|g q||fS )Nr.   r   r-   g      ?)shaperanger6   wheremaxr<   )r&   heatmapspts_numheightwidthptsrC   iheatmapptxyhwx_diffy_diffx_signy_signr   r   r*   get_ptsz   s6   
(  zKeypointsDetection.get_ptsc                 C   s   g }|d }|d }t |}t|D ]1}	d}
t||	 d |
 |d  |d  }t||	 d |
 |d  |d  }||g}|| q|S )Nso   r   r.   )r=   rt   intr<   )r&   metar{   lt_xlt_ypts_newr   r   sizer|   ratior   r   r~   r   r   r*   pts_transform   s   $$z KeypointsDetection.pts_transforminputsc           
      K   s   g }g }g }t |d jd D ]N}| |d |    \}}| |d | |dd}t|d | d dd 	dd}	t||	d  }|
|  |
| |
|	  q|||fS )Nr   r.   	human_boxr   r-   )rt   rs   r   detachr   numpyr   r6   r7   reshaper<   tolist)
r&   r   r'   output_posesoutput_scoresoutput_boxesr|   rJ   rC   rF   r   r   r*   rL      s   &

zKeypointsDetection.postprocessr   c              	   C   s@  t j| jd | jd dft jd}|j\}}}| jd |d d  }| jd |d d  }t|| }	t|| }
t|	|
}t|| }t|| }t	|||ftj
}| jd d }| jd d }||||d  ||d  | ||d  ||d  | d d f< |t ||gt ||gt ||d  ||d  gfS )Nr.   r   r5   r3   r-   )r6   zerosre   uint8rs   floatminr   cv2resizeINTER_LINEARr7   )r&   r+   marginpad_imgr   r   chh_neww_news0s1r   img_newcxcyr   r   r*   image_crop_resize   s*   
 z$KeypointsDetection.image_crop_resizec                 C   s\  t |trt|dd d d d ddf }n<t |tjr<t|jdkr,t|tj	}n|}|d d d d ddf }nt |t
jrS|  d d d d ddf }|j\}}}| jd }| jd }t|tj}| |\}}	}
}t|d }g d}g d}|| | }tjdd||gtjd	}|d
}||dd d f< |	|
|d}t
||gS )Nrr   r   r5   r-   r.   g     o@)g
ףp=
?gv/?gCl?)gZd;O?gy&1?g?r3   )r-   r   r.   )cr   r   )
isinstancerR   r   imreadr6   rS   r=   rs   cvtColorCOLOR_GRAY2BGRr   r   r   r   re   COLOR_BGR2RGBr   r9   r   	transpose
from_numpy)r&   r+   r/   r   r   _r   r   
img_resizer   r   r   meanstd
input_datar   r   r   r*   image_transform   s.   
$"


z"KeypointsDetection.image_transformc           	      C   s  |j \}}}|d |d  \}}|dd d f  || j || j f8  < |dd d f  || j || j f7  < tt|d d||d< tt|d d||d< tt|d d||d< tt|d d||d< |t|d d t|d d t|d d t|d d f }|S )Nr.   r   )r   r   g        )r   r.   )r.   r   )r.   r.   )rs   ri   r   rv   r   )	r&   r/   rF   ry   rz   r   r   r   cropped_imager   r   r*   
crop_image   s   (( zKeypointsDetection.crop_imagec           
      C   s   |d }|d }g }g }t t|D ]8}t|| dd dd}|d  |d 7  < | | |}| |\}}	|| ||	d< ||	 qt	j
|dd|gS )Nr   r.   r   r-   r   )dim)rt   r=   r6   r7   r   r   cloner   r<   r   cat)
r&   r+   rB   r/   lst_human_imageslst_metar|   rF   human_imager   r   r   r*   r2      s   
zKeypointsDetection.preprocessN)rO   rP   rQ   rR   r   rn   rd   r   r@   r   r   r   r6   rS   rL   r   r   r   r   r   r2   r   r   r   r*   r!   [   s     &r!   ).os.pathpathr_   typingr   r   r   r   r   jsonr   r6   r   PILr   torchvisionr   modelscope.metainfor   /modelscope.models.cv.body_2d_keypoints.hrnet_v2r	   *modelscope.models.cv.body_2d_keypoints.w48r
   modelscope.outputsr   modelscope.pipelinesr   modelscope.pipelines.baser   r   r   r   modelscope.pipelines.builderr   modelscope.preprocessorsr   modelscope.utils.constantr   r   modelscope.utils.loggerr   r>   register_modulebody_2d_keypointsr   r!   r   r   r   r*   <module>   s0   =