Ë
    ÛÓ^jž&  ã                   ó
  — d Z ddlZddlZddlZddlmZ ddlmZm	Z	m
Z
mZmZmZ ddlmZmZ ddlmZmZmZ ddlmZmZ dd	lmZmZmZ d
dlmZ  e«       rddlmZ   G d„ ded¬«      Z! eded«       G d„ de«      «       Z"dgZ#y)z#video processor class for GLM-4.1V.é    Né   )ÚBatchFeature)ÚOPENAI_CLIP_MEANÚOPENAI_CLIP_STDÚChannelDimensionÚPILImageResamplingÚSizeDictÚget_image_size)ÚUnpackÚVideosKwargs)Ú
TensorTypeÚadd_start_docstringsÚis_torchvision_available)ÚBASE_VIDEO_PROCESSOR_DOCSTRINGÚBaseVideoProcessor)ÚVideoMetadataÚgroup_videos_by_shapeÚreorder_videosé   )Úsmart_resize)Ú
functionalc                   óJ   — e Zd ZU eeef   ed<   eed<   eed<   eed<   eed<   y)ÚGlm4vVideoProcessorInitKwargsÚmax_image_sizeÚ
patch_sizeÚtemporal_patch_sizeÚ
merge_sizeÚmax_durationN)Ú__name__Ú
__module__Ú__qualname__ÚdictÚstrÚintÚ__annotations__© ó    ú{/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/models/glm4v/video_processing_glm4v.pyr   r   )   s&   … Ø˜˜c˜‘NÓ"ØƒOØÓØƒOØÔr'   r   F)ÚtotalzfConstructs a fast GLM-4V image processor that dynamically resizes videos based on the original videos.aj  
        patch_size (`int`, *optional*, defaults to 14):
            The spacial patch size of the vision encoder.
        temporal_patch_size (`int`, *optional*, defaults to 2):
            The temporal patch size of the vision encoder.
        merge_size (`int`, *optional*, defaults to 2):
            The merge size of the vision encoder to llm encoder.
    c                   ó–  ‡ — e Zd Zej                  ZdddœZddiZeZ	e
ZdZdZdZdZdZdZdZdZdZeZd	ZdZd
dgZdee   fˆ fd„Zdefˆ fd„Z	 d%dedee z  dz  fd„Z!dddej                  dddddddddfde"e#jH                     de%de%de&dz  ddde%de de%de e"e    z  dz  de e"e    z  dz  d edz  d!edz  d"edz  d#e'e(z  dz  fd$„Z)ˆ xZ*S )&ÚGlm4vVideoProcessori 1  i ÆÍ)Úshortest_edgeÚlongest_edger-   Té   é   i,  é   Úpixel_values_videosÚvideo_grid_thwÚkwargsc                 ó$   •— t        ‰| �  di |¤Ž y )Nr&   )ÚsuperÚ__init__)Úselfr3   Ú	__class__s     €r(   r6   zGlm4vVideoProcessor.__init__R   s   ø€ Ü‰ÑÑ"˜6Ó"r'   Úreturnc                 ó¤   •— t        ‰| �  di |¤Ž}|j                  d| j                  «      }|j                  r|j
                  st        d«      ‚|S )z¢
        Update kwargs that need further processing before being validated
        Can be overridden by subclasses to customize the processing of kwargs.
        Úsizez:size must contain 'shortest_edge' and 'longest_edge' keys.r&   )r5   Ú_standardize_kwargsÚgetr;   r,   r-   Ú
ValueError)r7   r3   r;   r8   s      €r(   r<   z'Glm4vVideoProcessor._standardize_kwargsU   sM   ø€ ô
 ‘Ñ,Ñ6¨vÑ6ˆØ�z‰z˜& $§)¡)Ó,ˆØ×!Ò!¨×):Ò):ÜÐYÓZÐZØˆr'   NÚmetadataÚfpsc                 óØ  — |�t        |dd«      €t        d«      ‚|j                  }|�|n| j                  }|dz
  }|j                  xs t        ||j                  z  «      dz   }|| j                  k  rpt        t        j                  ||z  «      «      }t        |«      D �	cg c]:  }	t        |t        t        j                  |	|j                  z  |z  «      «      «      ‘Œ< }
}	n�t        | j                  |z  «      }||k\  rt        t        |«      «      }
n[t        j                  d||d¬«      }|D �cg c]7  }t        |t        t        j                  ||j                  z  «      «      «      ‘Œ9 }
}t!        «       g }}|
D ])  }||vsŒ|j#                  |«       |j%                  |«       Œ+ t'        |«      dz  r|j%                  |d   «       t        j(                  |«      S c c}	w c c}w )	a‡  
        Args:
            metadata (`VideoMetadata`):
                Metadata of the video containing information about total duration, fps and total number of frames.
            fps (`int` or `float`, *optional*):
                Target frames to sample per second. Defaults to `self.fps`.
        Returns:
            np.ndarray:
                Indices to sample video frames.
        Nr@   z´Asked to sample frames per second but no video metadata was provided which is required when sampling in GLM4V. Please pass in `VideoMetadata` object or set `do_sample_frames=False`r   r   T)Úendpointéÿÿÿÿ)Úgetattrr>   Útotal_num_framesr@   ÚdurationÚroundr   r$   ÚmathÚfloorÚrangeÚminÚceilÚlistÚnpÚlinspaceÚsetÚaddÚappendÚlenÚarray)r7   r?   r@   r3   Útotal_framesÚrequested_fpsÚmax_frame_idxrF   ÚnÚiÚframe_indicesÚnum_samplesÚtarget_secondsÚtÚseenÚuniqÚidxs                    r(   Úsample_framesz!Glm4vVideoProcessor.sample_frames`   sº  € ð  Ðœw x°¸Ó=ÐEÜðXóð ð
  ×0Ñ0ˆØ"˜™°D·H±Hˆà$ qÑ(ˆØ×$Ñ$ÒO¬¨m¸h¿l¹lÑ.JÓ(KÈaÑ(Oˆà�t×(Ñ(Ò(Ü”D—J‘J˜x¨-Ñ7Ó8Ó9ˆAÜkpÐqrÓksÖtÐfgœS ´´D·I±I¸aÀ(Ç,Á,Ñ>NÐQ^Ñ>^Ó4_Ó0`ÕaÐtˆMÑtä˜d×/Ñ/°-Ñ?Ó@ˆKØ˜lÒ*Ü $¤U¨<Ó%8Ó 9‘ä!#§¡¨Q°¸+ÐPTÔ!U�Ø_mÖ nÐZ[¤ ]´C¼¿	¹	À!ÀhÇlÁlÑBRÓ8SÓ4TÕ!UÐ n�Ð nä“U˜BˆdˆØ ò 	!ˆCØ˜$ŠØ—‘˜”Ø—‘˜CÕ ð	!ô
 ˆt‹9�qŠ=Ø�K‰K˜˜R™Ô!ä�x‰x˜‹~Ðùò% uùò !os   Â"?G"Ä3<G'gp?ÚvideosÚdo_convert_rgbÚ	do_resizer;   Úresamplez7PILImageResampling | tvF.InterpolationMode | int | NoneÚ
do_rescaleÚrescale_factorÚdo_normalizeÚ
image_meanÚ	image_stdr   r   r   Úreturn_tensorsc                 óî  — t        |«      \  }}i }|j                  «       D ]®  \  }}|r| j                  |«      }|j                  \  }}}}}|||}}}|rwt	        ||||||z  |j
                  |j                  ¬«      \  }}|j                  ||z  |||«      }| j                  |t        ||¬«      |¬«      }|j                  |||||«      }|||<   Œ° t        ||«      }t        |«      \  }}i } i }!|j                  «       D �]  \  }}t        |d   t        j                  ¬«      \  }}| j                  |||||	|
«      }|}"|"j                  d   |z  dk7  r:|"d d …dd …f   j                  d|dz
  ddd«      }#t!        j"                  |"|#gd¬«      }"|"j                  d d	 \  }$}%}&|%|z  }%||z  ||z  }(}'|"j                  |$|%||&|'|z  |||(|z  ||«
      }"|"j%                  ddd
dddd	ddd«
      }"|"j'                  |$|%|'z  |(z  |&|z  |z  |z  «      })|)| |<   |%|'|(gg|$z  |!|<   �Œ  t        | |«      }*t        |!|«      }!t!        j"                  |*d¬«      }+t!        j(                  |!«      },|+|,dœ}-t+        |-|¬«      S )N)Ú
num_framesÚheightÚwidthÚtemporal_factorÚfactorÚ
min_pixelsÚ
max_pixels)rn   ro   )r;   re   r   )Úchannel_dimr   rC   )Údimr   é   é   é   é   r/   é   é	   )r1   r2   )ÚdataÚtensor_type)r   ÚitemsÚconvert_to_rgbÚshaper   r,   r-   ÚviewÚresizer	   r   r
   r   ÚFIRSTÚrescale_and_normalizeÚrepeatÚtorchÚcatÚpermuteÚreshapeÚtensorr   ).r7   rb   rc   rd   r;   re   rf   rg   rh   ri   rj   r   r   r   rk   r3   Úgrouped_videosÚgrouped_videos_indexÚresized_videos_groupedr€   Ústacked_videosÚBÚTÚCÚHÚWrm   rn   ro   Úresized_heightÚresized_widthÚresized_videosÚprocessed_videos_groupedÚprocessed_gridsÚpatchesÚrepeatsÚ
batch_sizeÚgrid_tÚchannelÚgrid_hÚgrid_wÚflatten_patchesÚprocessed_videosr1   r2   r|   s.                                                 r(   Ú_preprocesszGlm4vVideoProcessor._preprocess’   s1  € ô$ 0EÀVÓ/LÑ,ˆÐ,Ø!#Ðà%3×%9Ñ%9Ó%;ò 	;Ñ!ˆE�>ÙØ!%×!4Ñ!4°^Ó!D�Ø*×0Ñ0‰MˆAˆq�!�Q˜Ø()¨1¨a ˜ˆJÙÜ0<Ø)Ø!ØØ$7Ø%¨
Ñ2Ø#×1Ñ1Ø#×0Ñ0ô1Ñ-� ð "0×!4Ñ!4°Q¸±U¸A¸qÀ!Ó!D�Ø!%§¡Ø"Ü!¨¸}ÔMØ%ð "-ó "�ð
 "0×!4Ñ!4°Q¸¸1¸nÈmÓ!\�Ø,:Ð" 5Ò)ð-	;ô. (Ð(>Ð@TÓUˆô 0EÀ^Ó/TÑ,ˆÐ,Ø#%Ð ØˆØ%3×%9Ñ%9Ó%;ó %	MÑ!ˆE�>Ü,:¸>È!Ñ;LÔZj×ZpÑZpÔ,qÑ)ˆN˜Mð "×7Ñ7Ø 
¨N¸LÈ*ÐV_óˆNð %ˆGð �}‰}˜QÑÐ"5Ñ5¸Ò:Ø!¢! R¡S &™/×0Ñ0°Ð4GÈ!Ñ4KÈQÐPQÐSTÓU�ÜŸ)™) W¨gÐ$6¸AÔ>�Ø*1¯-©-¸¸Ð*;Ñ'ˆJ˜ ØÐ2Ñ2ˆFØ+¨zÑ9¸=ÈJÑ;V�FˆFà—l‘lØØØ#ØØ˜*Ñ$ØØØ˜*Ñ$ØØóˆGð —o‘o a¨¨A¨q°!°Q¸¸1¸aÀÓCˆGØ%Ÿo™oØØ˜‘ &Ñ(ØÐ-Ñ-°
Ñ:¸ZÑGóˆOð />Ð$ UÑ+Ø'-¨v°vÐ&>Ð%?À*Ñ%LˆO˜EÓ"ðK%	MôN *Ð*BÐDXÓYÐÜ(¨Ð:NÓOˆÜ#Ÿi™iÐ(8¸aÔ@ÐÜŸ™ oÓ6ˆà#6Ø,ñ
ˆô
  °>ÔBÐBr'   )N)+r   r    r!   r   ÚBICUBICre   r;   r   r   ri   r   rj   rd   rf   rh   rc   Údo_sample_framesr   r   r   r   r   Úvalid_kwargsrm   r@   Úmodel_input_namesr   r6   r"   r<   r   r$   Úfloatra   rM   r†   ÚTensorÚboolr	   r#   r   r¢   Ú__classcell__)r8   s   @r(   r+   r+   1   sÚ  ø„ ð "×)Ñ)€HØ&Ð8KÑL€DØ$Ð&9Ð:€NØ!€JØ€IØ€IØ€JØ€LØ€NØÐØ€JØÐØ€LØ€JØ0€LØ€JØ
€Cà.Ð0@ÐAÐð# Ð(EÑ!Fõ #ð	¨tõ 	ð #'ñ0àð0ð �5‰[˜4Ñó0ðj  $ØØ $ØN`×NhÑNhØØ )Ø!Ø15Ø04Ø!%Ø*.Ø!%Ø26ñcCà�U—\‘\Ñ"ðcCð ðcCð ð	cCð
 ˜‰oðcCð LðcCð ðcCð ðcCð ðcCð ˜D ™KÑ'¨$Ñ.ðcCð ˜4 ™;Ñ&¨Ñ-ðcCð ˜$‘JðcCð ! 4™ZðcCð ˜$‘JðcCð ˜jÑ(¨4Ñ/÷cCr'   r+   )$Ú__doc__rH   ÚnumpyrN   r†   Úimage_processing_utilsr   Úimage_utilsr   r   r   r   r	   r
   Úprocessing_utilsr   r   Úutilsr   r   r   Úvideo_processing_utilsr   r   Úvideo_utilsr   r   r   Úimage_processing_glm4vr   Útorchvision.transforms.v2r   ÚtvFr   r+   Ú__all__r&   r'   r(   ú<module>r·      s�   ðñ *ã ã Û å 2÷÷ ÷ 5ß OÑ Oß Xß OÑ OÝ 0ñ ÔÝ;ô L¸õ ñ ØlØ"ðóôxCÐ,ó xCóðxCðv !Ð
!�r'   