|
|
|
|
|
import random |
|
from collections.abc import Callable |
|
from enum import Enum |
|
from typing import Callable as TCallable |
|
from typing import List |
|
|
|
FrameTsList = List[int] |
|
FrameSelector = TCallable[[FrameTsList], FrameTsList] |
|
|
|
|
|
class FrameSelectionStrategy(Enum): |
|
""" |
|
Frame selection strategy used with videos: |
|
- "random_k": select k random frames |
|
- "first_k": select k first frames |
|
- "last_k": select k last frames |
|
- "all": select all frames |
|
""" |
|
|
|
|
|
RANDOM_K = "random_k" |
|
FIRST_K = "first_k" |
|
LAST_K = "last_k" |
|
ALL = "all" |
|
|
|
|
|
|
|
class RandomKFramesSelector(Callable): |
|
""" |
|
Selector that retains at most `k` random frames |
|
""" |
|
|
|
def __init__(self, k: int): |
|
self.k = k |
|
|
|
def __call__(self, frame_tss: FrameTsList) -> FrameTsList: |
|
""" |
|
Select `k` random frames |
|
|
|
Args: |
|
frames_tss (List[int]): timestamps of input frames |
|
Returns: |
|
List[int]: timestamps of selected frames |
|
""" |
|
return random.sample(frame_tss, min(self.k, len(frame_tss))) |
|
|
|
|
|
class FirstKFramesSelector(Callable): |
|
""" |
|
Selector that retains at most `k` first frames |
|
""" |
|
|
|
def __init__(self, k: int): |
|
self.k = k |
|
|
|
def __call__(self, frame_tss: FrameTsList) -> FrameTsList: |
|
""" |
|
Select `k` first frames |
|
|
|
Args: |
|
frames_tss (List[int]): timestamps of input frames |
|
Returns: |
|
List[int]: timestamps of selected frames |
|
""" |
|
return frame_tss[: self.k] |
|
|
|
|
|
class LastKFramesSelector(Callable): |
|
""" |
|
Selector that retains at most `k` last frames from video data |
|
""" |
|
|
|
def __init__(self, k: int): |
|
self.k = k |
|
|
|
def __call__(self, frame_tss: FrameTsList) -> FrameTsList: |
|
""" |
|
Select `k` last frames |
|
|
|
Args: |
|
frames_tss (List[int]): timestamps of input frames |
|
Returns: |
|
List[int]: timestamps of selected frames |
|
""" |
|
return frame_tss[-self.k :] |
|
|