o
    ॵit                     @   s   d dl Z d dlmZmZ d dlZd dlZd dlm  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 d d	lmZ d d
lmZ d dlmZ e Zejg dg ddZ dd Z!dd Z"ej#ej$ej$dG dd deZ%dS )    N)AnyDict)Image)
transforms)	Pipelines)InferenceCore)
OutputKeys)InputPipeline)	PIPELINES)Tasks)
get_logger)g
ףp=
?gv/?gCl?)gZd;O?gy&1?g?)meanstdc                 C   s   |d |d  dkr| d d d d |d |d  d d f } |d |d  dkr>| d d d d d d |d |d  f } | S )N      r       )imgpadr   r   n/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/pipelines/cv/video_object_segmentation_pipeline.pyunpad   s
   **r   c                 C   s   t | jdkrtjt || jd | jd | jd ftjd}ntjt || jd | jd ftjd}t|D ]\}}| |ktj||< q6|S )Nr   r   r   r   dtype)lenshapenpzerosuint8	enumerateastype)maskslabelsMsklr   r   r   all_to_onehot"   s    r&   )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 )VideoObjectSegmentationPipelinemodelc                    s`   t  jdd|i| td tt ttjdt	j
dg| _ttjdt	jdg| _dS )z
        use `model` to create video_object_segmentation pipeline for prediction
        Args:
            model: model id on modelscope hub.
        r)   zload model donei  )interpolationNr   )super__init__loggerinfor   ComposeToTensorim_normalizationResizer   BICUBICim_transformNEARESTmask_transform)selfr)   kwargs	__class__r   r   r,   6   s   
z(VideoObjectSegmentationPipeline.__init__inputreturnc                 C   sD  |d | _ |d | _t| j }t| j}i }d|d< ||d< ||d< i |d< g }g }t|D ]3}| j | }|| | | j }	|tj	| jtj
d t|d	 }
|
|
d
k }
|
|d |< q/t|d
}t|d
}t|tj
}||d
k }tt|| }| |}|d}||d< |||t	|	d}|S )Nimagesmaskmaas_test_videonameframessizegt_objr   r   r   r"   )rgbgtr.   palette)r=   r>   r   r   r   rangeappendr4   
getpalettearrayr   uniquetorchstackr    
from_numpyr&   floatr6   	unsqueeze)r7   r;   rA   r   r.   r=   r!   ir   rG   this_labelsr"   resultr   r   r   
preprocessH   sB   






z*VideoObjectSegmentationPipeline.preprocessc                 C   s<  |d  d}|d }|d }t|d }|d }|j}t| jj|||ddd	}||d d df d|jd
  tj|j	d
g|R tj
|rGdndd}	t|j	D ]#}
t|jd d |
f |j}tj|t|ddd}tj|dd|	|
< qP|r|	   d d df tj
}	n|	  d d df tj
}	tj|	iS )NrE   r   rF   r.   r"   rB         )top_k	mem_everyr   cudacpu)r   devicebilinearF)modealign_corners)dim)rQ   r   is_cudar   r)   interactr   rM   r   tr   rH   r   probr   Finterpolatetupleargmaxdetachr[   numpyr    r   r   MASKS)r7   r;   rE   mskr.   r$   rB   ra   	processor	out_maskstird   r   r   r   forwardw   s8    
 
z'VideoObjectSegmentationPipeline.forwardinputsc                 C   s   |S )Nr   )r7   rq   r   r   r   postprocess   s   z+VideoObjectSegmentationPipeline.postprocess)__name__
__module____qualname__strr,   r	   r   r   rU   rp   rr   __classcell__r   r   r9   r   r(   1   s
    "/*r(   )&ostypingr   r   rj   r   rM   torch.nn.functionalnn
functionalre   PILr   torchvisionr   modelscope.metainfor   =modelscope.models.cv.video_object_segmentation.inference_corer   modelscope.outputsr   modelscope.pipelines.baser	   r
   modelscope.pipelines.builderr   modelscope.utils.constantr   modelscope.utils.loggerr   r-   	Normalizer1   r   r&   register_modulevideo_object_segmentationr(   r   r   r   r   <module>   s2   