o
    *j^                     @   s  d dl Z d dlZd dlZd dlm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  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' d dl(m)Z) d dl*m+Z+m,Z, d dl-m.Z. dZ/e. Z0dd Z1dd Z2d%ddZ3	d&ddZ4	d&ddZ5dd Z6dd Z7d d! Z8d"gZ9e#j:e,j;ej;d#G d$d" d"e!Z<dS )'    N)AnyDictOptionalUnion)	make_grid)	Pipelines)do_scene_detect) VFINetForVideoFrameInterpolation)
OutputKeys)InputPipeline)	PIPELINES)	LoadImage)VideoReader)Config)	ModelFileTasks)
get_logger).mp4z.movc                 C   s4   | d } t g ddddd| }| |8 } | S )Ng     o@g~jt?g/$?g rh?      torchZTensorviewZtype_as)
img_tensormean r   {/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/pipelines/cv/video_frame_interpolation_pipeline.py	img_trans"   s   r   c                 C   s(   t g ddddd| }| | S )Nr   r   r   r   )xr   r   r   r   add_mean*   s    r!       c                 C   sL   |d | d | }|d | d | }d|| d|| f}t | |} | S )Nr   r   )Fpad)r   heightwidthpad_numphpwpaddingr   r   r   img_padding/   s
   r+   Fc                 C   s   |r|d8 }n|d8 }||krM|d | }t |d}|d |	d k r%|}nd| |	d k r0|}n
|| ||||||}dt| }|
| ||	7 }||ks|
|fS Nr      r      roundr!   append)flow_10flow_12flow_21flow_23img1img2inter_model
read_countinter_countdeltaoutputsstart_end_flagtoutputr   r   r   do_inference_lowers7   s$   


r@   c              
   C   s   |r|	d8 }	n|	d8 }	|
|	krO|
d |	 }t |d}|d |d k r%|}nd| |d k r0|}n|| ||||||||	}dt| }|| |
|7 }
|
|	ks||
fS r,   r/   )r2   r3   r4   r5   r6   r7   img1_upimg2_upr8   r9   r:   r;   r<   r=   r>   r?   r   r   r   do_inference_highersZ   s$   


rC   c           $      C   s8  |
|  d|
|  d}}d }d }d }d }t u ||k r7|
| }t|||}|	| |t| |d7 }t|dkr|d }|d }|	d }|	d }| ||ddd\}}| ||ddd\}}|||||d\}}t|d d d d d|d|f |d d d d d|d|f |	d d d d d d|d|f |	d d d d d d|d|f |d< |d rtd d d d |||||||dd\}}ntd ||d |||||||dd\}}t|d	kr3|d u s|d u rY|d }|	d }| ||ddd\}}| ||ddd\}}|||||d\}}t|d d d d d|d|f |d d d d d|d|f |	d d d d d d|d|f |	d d d d d d|d|f |d< |d }|	d } | || ddd\}}!| | |ddd\}}"||||!|"d\}}#t|d d d d d|d|f |#d d d d d|d|f |	d d d d d d|d|f |	d d d d d d|d|f |d< |d rtd d d d |||||||\}}n+|d s|d rtd ||d |||||||\}}nt||||!|||||||\}}|	d |		d |}|}|}| }|}|}|#}|}|!}|"}|d |d< |d |d< d
|d< ||k s"|dkr|		d |	d t|dksOJ |d rgtd d d d |||||||dd\}}n"td ||d |||||||dd\}}W d    |S W d    |S W d    |S 1 sw   Y  |S )Nr-   r   r   r      TZitersZ	test_moder=      F)
sizer   no_gradr+   r1   r   lenr   r@   pop)$
flow_modelrefine_modelr8   	video_lenr9   r:   r;   scene_change_flagimg_tensor_listimg_ori_listinputsr<   r%   r&   r2   r3   r4   r5   imgimg0r6   img0_oriimg1_ori_
flow_01_up
flow_10_upflow_01r7   img2_ori
flow_12_up
flow_21_upimg3img3_ori
flow_23_up
flow_32_upflow_32r   r   r   inference_lowers   sh  



2""


""

2""






s


 
 
 
   rc   c           *      C   s  |
|  dd dks|
|  dd dkrtd|
|  dd |
|  dd }}d }d }d }d }g }t  ||k r|
| }t||d |d dd}tj|ddd	d
}|t| |	| |t| |d7 }t	|dkr"|d }|d }|	d }|	d }|d }|d }| ||ddd\}}| ||ddd\}}|||||d\}}t
|d d d d d|d|f |d d d d d|d|f |	d d d d d d|d|f |	d d d d d d|d|f |d< |d rtd d d d |||||||||dd\}}ntd ||d |||||||||dd\}}t	|dkr|d u s3|d u r|d }|	d } |d }!| || ddd\}}"| | |ddd\}}#||||"|#d\}}t
|d d d d d|d|f |d d d d d|d|f |	d d d d d d|d|f |	d d d d d d|d|f |d< |d }$|	d }%|d }&| | |%ddd\}}'| |%| ddd\}}(|||$|'|(d\}})t
|d d d d d|d|f |)d d d d d|d|f |	d d d d d d|d|f |	d d d d d d|d|f |d< |d r)td d d d ||||!|||||\}}n/|d s3|d rFtd ||d ||||!|||||\}}nt||||'||||!|||||\}}|d |d |	d |}|$}| }|%} |!}|&}!|}|}|)}|#}|'}"|(}#|d |d< |d |d< d	|d< ||k sB|dkr|	d |d t	|dksJ |d rtd d d d ||||!|||||dd\}}n$td ||d ||||!|||||dd\}}W d    |S W d    |S W d    |S 1 sw   Y  |S )Nr-   r   r   z#Video width and height must be even@   )r'   g      ?ZbilinearF)Zscale_factormodeZalign_cornersr   rD   TrE   rF   rG   )rH   RuntimeErrorr   rI   r+   r#   Zinterpolater1   r   rJ   r   rC   rK   )*rL   rM   r8   rN   r9   r:   r;   rO   rP   rQ   rR   r<   r%   r&   r2   r3   r4   r5   Zimg_up_listZimg_uprS   rT   r6   rU   rV   Zimg0_uprA   rW   rX   rY   rZ   r7   r[   rB   r\   r]   r^   r_   Zimg3_upr`   ra   rb   r   r   r   inference_highers$  s  



2""



""

2""








  



 
 , 
 , 
 ,  ,rg   c                 C   s   dd |   D S )Nc                 S   s&   i | ]\}}d |v r| d d|qS )zmodule. )replace).0kvr   r   r   
<dictcomp>  s    zconvert.<locals>.<dictcomp>)items)paramr   r   r   convert  s   rp   VideoFrameInterpolationPipeline)module_namec                	       s   e Zd ZdZ	ddeeef f fddZdde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 )rq   aa   Video Frame Interpolation Pipeline.

    Examples:

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

    >>> video = 'https://modelscope.oss-cn-beijing.aliyuncs.com/test/videos/video_frame_interpolation_test.mp4'
    >>> video_frame_interpolation_pipeline = pipeline(Tasks.video_frame_interpolation,
    'damo/cv_raft_video-frame-interpolation')
    >>> result = video_frame_interpolation_pipeline(video)[OutputKeys.OUTPUT_VIDEO]
    >>> print('pipeline: the output video path is {}'.format(result))
    Nmodelc                    sl   t  jd||d| tj rtd| _ntd| _| jj| _| j	| j | j
  td d S )N)rs   preprocessorcudacpuz#load video frame-interpolation doner   )super__init__r   ru   Zis_availableZdeviceZ_devicers   nettoevalloggerinfo)selfrs   rt   kwargs	__class__r   r   rx     s   


z(VideoFrameInterpolationPipeline.__init__r   inputout_fpsreturnc           	      C   s   t |tr
t|}nt |trt|d }g }|D ]}|| q|j}t|D ]\}}t|	 
ddd }|d||< q(t |trLd| }nt |trid|v r\|d | }nd|v re|d }nd| }|||dS )Nvideor-   r   r   Zinterp_ratior   )r   fpsr   )
isinstancestrr   dictr1   r   	enumerater   Z
from_numpycopypermutefloatZ	unsqueeze)	r~   r   r   Zvideo_readerrR   framer   irS   r   r   r   
preprocess  s(   






z*VideoFrameInterpolationPipeline.preprocessc                 C   s  |d }|d }|d }t |}| jj}| jjj}d}d}	|| }
g d}g }g }g }|| d|| d}}|dksB|d	krW| jjj}t||||||	|
|||||}n| jjj}t||||||	|
|||||}t	t |D ]}|| d d d d d|d|f ||< qq||d
S )Nr   r   r   r   )FFFr-   r   i  i 
  )r?   r   )
rJ   ry   ZflownetZinternetZifnetrH   Zinternet_Dsrg   rc   range)r~   r   rR   r   r   rN   rL   rM   r9   r:   r;   rO   rP   rQ   r<   r%   r&   r8   r   r   r   r   forward)  s@   


*
z'VideoFrameInterpolationPipeline.forwardrR   c                 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t	|d D ] }	|d |	 }
|
d 
ddd   }
||
tj q=|  |rtddksoJ d|d d d }d| d| }tj|dd tj|iS tj|iS )NZoutput_videodemo_serviceTr   )suffixr?   r   Zmp4vr   r   r-   zffmpeg -versionz"ffmpeg is not installed correctly!z_web.mp4z
ffmpeg -i z -vcodec h264 -crf 5 )shell)gettempfileNamedTemporaryFilenameshapecv2ZVideoWriter_fourccZVideoWriterr   rJ   r   byterv   numpywriteZastypenpZuint8releaseossystem
subprocesscallr
   ZOUTPUT_VIDEO)r~   rR   r   Zoutput_video_pathr   hwZfourccZvideo_writerr   rS   Zoutput_video_path_for_webZconvert_cmdr   r   r   postprocessM  s6   


z+VideoFrameInterpolationPipeline.postprocess)N)r   )__name__
__module____qualname____doc__r   r	   r   rx   r   r   r   r   r   r   r   __classcell__r   r   r   r   rq     s    
 "*$)r"   )F)=globmathr   Zos.pathpathZospr   r   typingr   r   r   r   r   r   r   r   Ztorch.nn.functionalnnZ
functionalr#   Ztorchvision.utilsr   Zmodelscope.metainfor   ZKmodelscope.models.cv.video_frame_interpolation.utils.scene_change_detectionr   ZSmodelscope.models.cv.video_frame_interpolation.VFINet_for_video_frame_interpolationr	   Zmodelscope.outputsr
   Zmodelscope.pipelines.baser   r   Zmodelscope.pipelines.builderr   Zmodelscope.preprocessorsr   Zmodelscope.preprocessors.cvr   Zmodelscope.utils.configr   Zmodelscope.utils.constantr   r   Zmodelscope.utils.loggerr   ZVIDEO_EXTENSIONSr|   r   r!   r+   r@   rC   rc   rg   rp   __all__Zregister_moduleZvideo_frame_interpolationrq   r   r   r   r   <module>   sV   

0
% & A