o
    ॵi'                     @   s  d dl Z d dlZd dlZd dl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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 d dlm Z m!Z! d dl"m#Z# e# Z$dddZ%dgZ&ej'e!j(ej(dG dd deZ)dS )    N)AnyDictOptionalUnion)	Pipelines)warpprocess)DUTRAFTStabilizer)
OutputKeys)InputPipeline)	PIPELINES)	LoadImage)VideoReader)	ModelFileTasks)
get_loggerfile "{}" does not existc                 C   s   t | st|| d S N)ospisfileFileNotFoundErrorformat)filenamemsg_tmpl r   h/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/pipelines/cv/video_stabilization_pipeline.pycheck_file_exist   s   
r   VideoStabilizationPipeline)module_namec                       s   e Zd ZdZ	ddeeef 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 )r   aj    Video Stabilization Pipeline.

    Examples:

    >>> import cv2
    >>> from modelscope.outputs import OutputKeys
    >>> from modelscope.pipelines import pipeline
    >>> from modelscope.utils.constant import Tasks

    >>> test_video = 'https://modelscope.oss-cn-beijing.aliyuncs.com/test/videos/video_stabilization_test_video.avi'
    >>> video_stabilization = pipeline(Tasks.video_stabilization, model='damo/cv_dut-raft_video-stabilization_base')
    >>> out_video_path = video_stabilization(test_video)[OutputKeys.OUTPUT_VIDEO]
    >>> print('Pipeline: the output video path is {}'.format(out_video_path))
    Nmodelc                    s&   t  jd||d| td d S )N)r   preprocessorz#load video stabilization model doner   )super__init__loggerinfo)selfr   r    kwargs	__class__r   r   r"   7   s   z#VideoStabilizationPipeline.__init__inputreturnc                 C   s(   t |}|j}|j}|j}||||dS )N)vid_pathfpswidthheight)r   r,   r-   r.   )r%   r)   video_readerr,   r-   r.   r   r   r   
preprocess?   s   z%VideoStabilizationPipeline.preprocessc                    sd   | j |d }t|}|d    tj  fddt jd D  |d } |d |dS )	Nr+   outputc                    s   g | ]
}t  | d qS ))      r   )np	transpose).0idx
out_imagesr   r   
<listcomp>R   s    z6VideoStabilizationPipeline.forward.<locals>.<listcomp>r   base_crop_widthr,   )r1   r,   r;   )	r   _inference_forwardr   numpyastyper4   uint8rangeshape)r%   r)   resultsr;   r   r8   r   forwardM   s   
z"VideoStabilizationPipeline.forwardinputsc                 K   s:  | dd }| dd}|d u rtjddj}|d d jdd	 \}}tjd
 }t|||d ||f}t|d D ]/\}	}
t	|d | d }t	|| | }|
|| || f }t
|||f}|| q;|  |rtddks|J d|d d d }d| d| }tj|dd tj|iS tj|iS )Noutput_videois_cvt_h264Fz.mp4)suffixr1   r   mp4vr,   r;   i   zffmpeg -versionzaffmpeg is not installed correctly, please refer to https://trac.ffmpeg.org/wiki/CompilationGuide.z_web.mp4z
ffmpeg -i z -vcodec h264 -crf 5 T)shell)gettempfileNamedTemporaryFilenamerA   cv2VideoWriter_fourccVideoWriter	enumerateintresizewritereleaseossystem
subprocesscallr	   OUTPUT_VIDEO)r%   rD   r&   output_video_pathrF   hwfourccvideo_writerr7   framehorizontal_bordervertical_border	new_frameoutput_video_path_for_webconvert_cmdr   r   r   postprocess^   s>   



z&VideoStabilizationPipeline.postprocessr   )__name__
__module____qualname____doc__r   r   strr"   r
   r   r   r0   rC   ri   __classcell__r   r   r'   r   r   %   s    
"*)r   )*globmathrY   r[   rN   typingr   r   r   r   rQ   r=   r4   torchmodelscope.metainfor   -modelscope.metrics.video_stabilization_metricr   :modelscope.models.cv.video_stabilization.DUTRAFTStabilizerr   modelscope.outputsr	   modelscope.pipelines.baser
   r   modelscope.pipelines.builderr   modelscope.preprocessorsr   modelscope.preprocessors.cvr   modelscope.utils.constantr   r   modelscope.utils.loggerr   r#   r   __all__register_modulevideo_stabilizationr   r   r   r   r   <module>   s4   
