├── .gitignore ├── LICENSE ├── README.md ├── audio_diffusion_pytorch ├── __init__.py ├── diffusion.py ├── model.py ├── modules.py └── utils.py ├── beats_scores.py ├── configs ├── dance_s25.yaml ├── fe_s25.yaml ├── fe_s50.yaml ├── fs_s25.yaml └── fs_s50.yaml ├── d2m ├── .DS_Store ├── __init__.py ├── dataset.py ├── engine │ ├── clip_grad_norm.py │ ├── distributed.py │ ├── logger.py │ └── lr_scheduler.py ├── loris_modules.py ├── st_gcn │ ├── ops │ │ ├── __init__.py │ │ ├── gconv_origin.py │ │ └── graph.py │ └── st_gcn_aaai18.py └── utils.py ├── d2m_loris.py ├── data ├── dance │ ├── dance_audio_s25_test_segment.txt │ ├── dance_audio_s25_train_segment.txt │ ├── dance_i3d_s25_test_segment.txt │ ├── dance_i3d_s25_train_segment.txt │ ├── dance_pose2d_s25_test_segment.txt │ └── dance_pose2d_s25_train_segment.txt ├── fe │ ├── fe_audio_s25_test_segment.txt │ ├── fe_audio_s25_train_segment.txt │ ├── fe_audio_s50_test_segment.txt │ ├── fe_audio_s50_train_segment.txt │ ├── fe_i3d_s25_test_segment.txt │ ├── fe_i3d_s25_train_segment.txt │ ├── fe_i3d_s50_test_segment.txt │ ├── fe_i3d_s50_train_segment.txt │ ├── fe_pose2d_s25_test_segment.txt │ ├── fe_pose2d_s25_train_segment.txt │ ├── fe_pose2d_s50_test_segment.txt │ └── fe_pose2d_s50_train_segment.txt ├── fs │ ├── fs_audio_s25_test_segment.txt │ ├── fs_audio_s25_train_segment.txt │ ├── fs_audio_s50_test_segment.txt │ ├── fs_audio_s50_train_segment.txt │ ├── fs_i3d_s25_test_segment.txt │ ├── fs_i3d_s25_train_segment.txt │ ├── fs_i3d_s50_test_segment.txt │ ├── fs_i3d_s50_train_segment.txt │ ├── fs_pose2d_s25_test_segment.txt │ ├── fs_pose2d_s25_train_segment.txt │ ├── fs_pose2d_s50_test_segment.txt │ └── fs_pose2d_s50_train_segment.txt └── genre │ ├── dance_s25_test.npy │ └── dance_s25_train.npy ├── generate_loris.py ├── imgs ├── logo.png ├── loris.png └── pipeline.png ├── requirements.txt └── scripts ├── infer_dance_s25.sh ├── infer_fe_s25.sh ├── infer_fe_s50.sh ├── infer_fs_s25.sh ├── infer_fs_s50.sh ├── loris_dance_s25.sh ├── loris_fe_s25.sh ├── loris_fe_s50.sh ├── loris_fs_s25.sh └── loris_fs_s50.sh /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | share/python-wheels/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | MANIFEST 28 | 29 | # PyInstaller 30 | # Usually these files are written by a python script from a template 31 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 32 | *.manifest 33 | *.spec 34 | 35 | # Installer logs 36 | pip-log.txt 37 | pip-delete-this-directory.txt 38 | 39 | # Unit test / coverage reports 40 | htmlcov/ 41 | .tox/ 42 | .nox/ 43 | .coverage 44 | .coverage.* 45 | .cache 46 | nosetests.xml 47 | coverage.xml 48 | *.cover 49 | *.py,cover 50 | .hypothesis/ 51 | .pytest_cache/ 52 | cover/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | .pybuilder/ 76 | target/ 77 | 78 | # Jupyter Notebook 79 | .ipynb_checkpoints 80 | 81 | # IPython 82 | profile_default/ 83 | ipython_config.py 84 | 85 | # pyenv 86 | # For a library or package, you might want to ignore these files since the code is 87 | # intended to run in multiple environments; otherwise, check them in: 88 | # .python-version 89 | 90 | # pipenv 91 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 92 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 93 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 94 | # install all needed dependencies. 95 | #Pipfile.lock 96 | 97 | # poetry 98 | # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. 99 | # This is especially recommended for binary packages to ensure reproducibility, and is more 100 | # commonly ignored for libraries. 101 | # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control 102 | #poetry.lock 103 | 104 | # pdm 105 | # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. 106 | #pdm.lock 107 | # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it 108 | # in version control. 109 | # https://pdm.fming.dev/#use-with-ide 110 | .pdm.toml 111 | 112 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm 113 | __pypackages__/ 114 | 115 | # Celery stuff 116 | celerybeat-schedule 117 | celerybeat.pid 118 | 119 | # SageMath parsed files 120 | *.sage.py 121 | 122 | # Environments 123 | .env 124 | .venv 125 | env/ 126 | venv/ 127 | ENV/ 128 | env.bak/ 129 | venv.bak/ 130 | 131 | # Spyder project settings 132 | .spyderproject 133 | .spyproject 134 | 135 | # Rope project settings 136 | .ropeproject 137 | 138 | # mkdocs documentation 139 | /site 140 | 141 | # mypy 142 | .mypy_cache/ 143 | .dmypy.json 144 | dmypy.json 145 | 146 | # Pyre type checker 147 | .pyre/ 148 | 149 | # pytype static type analyzer 150 | .pytype/ 151 | 152 | # Cython debug symbols 153 | cython_debug/ 154 | 155 | # PyCharm 156 | # JetBrains specific template is maintained in a separate JetBrains.gitignore that can 157 | # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore 158 | # and can be added to the global gitignore or merged into this file. For a more nuclear 159 | # option (not recommended) you can uncomment the following to ignore the entire idea folder. 160 | #.idea/ 161 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 OpenGVLab 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # LORIS 4 | 5 | This is the official implementation of "Long-Term Rhythmic Video Soundtracker", ICML2023. 6 | 7 | Jiashuo Yu, Yaohui Wang, Xinyuan Chen, Xiao Sun, and Yu Qiao. 8 | 9 | OpenGVLab, Shanghai Artificial Intelligence Laboratory 10 | 11 | [Arxiv](https://arxiv.org/abs/2305.01319) | [Project Page](https://justinyuu.github.io/LORIS/) 12 | 13 | ## Introduction 14 | 15 | We present Long-Term Rhythmic Video Soundtracker (LORIS), a novel framework to synthesize long-term conditional waveforms in sync with visual cues. Our framework consists of a latent conditional diffusion probabilistic model to perform waveform synthesis. Furthermore, a series of context-aware conditioning encoders are proposed to take temporal information into consideration for a long-term generation. We also extend our model's applicability from dances to multiple sports scenarios such as floor exercise and figure skating. To perform comprehensive evaluations, we establish a benchmark for rhythmic video soundtracks including the pre-processed dataset, improved evaluation metrics, and robust generative baselines. 16 | 17 | ![intro](/imgs/pipeline.png) 18 | 19 | ## How to Start 20 | 21 | `pip install -r requirements.txt` 22 | 23 | ## Training 24 | 25 | `bash scripts/loris_{subset}_s{length}.sh` 26 | 27 | ## Inference 28 | 29 | `bash scripts/infer_{subset}_s{length}.sh` 30 | 31 | ## Dataset 32 | 33 | Dataset is available in [huggingface](https://huggingface.co/datasets/awojustin/LORIS). 34 | 35 | from datasets import load_dataset 36 | dataset = load_dataset("OpenGVLab/LORIS") 37 | 38 | ## Model Zoo 39 | 40 | We provide the pre-trained checkpoints and backbone audio diffusion model as follow: 41 | 42 | [Audio-diffusion-pytorch-v0.0.43](https://pjlab-gvm-data.oss-cn-shanghai.aliyuncs.com/loris/audio_1136_720k.pt), 43 | [Dance 25 seconds](https://pjlab-gvm-data.oss-cn-shanghai.aliyuncs.com/loris/loris_dance25_epoch100.pt), 44 | [Figure Skating 25 seconds](https://pjlab-gvm-data.oss-cn-shanghai.aliyuncs.com/loris/loris_fs25_loss_min.pt), 45 | [Floor Exercise 25 seconds](https://pjlab-gvm-data.oss-cn-shanghai.aliyuncs.com/loris/loris_fe25_epoch200.pt), 46 | [Floor Exercise 50 seconds](https://pjlab-gvm-data.oss-cn-shanghai.aliyuncs.com/loris/loris_fe50_epoch250.pt) 47 | 48 | It should be noted that these checkpoints must only be used for research purposes. 49 | 50 | ## Citation 51 | 52 | @inproceedings{Yu2023Long, 53 | title={Long-Term Rhythmic Video Soundtracker}, 54 | author={Yu, Jiashuo and Wang, Yaohui and Chen, Xinyuan and Sun, Xiao and Qiao, Yu }, 55 | booktitle={International Conference on Machine Learning (ICML)}, 56 | year={2023} 57 | } 58 | 59 | ## Acknowledgement 60 | 61 | We would like to thank the authors of previous related projects for generously sharing their code and insights: [audio-diffusion-pytorch](https://github.com/archinetai/audio-diffusion-pytorch), [CDCD](https://github.com/L-YeZhu/CDCD), [D2M-GAN](https://github.com/L-YeZhu/D2M-GAN), [VQ-Diffusion](https://github.com/microsoft/VQ-Diffusion), and [JukeBox](https://github.com/openai/jukebox). 62 | -------------------------------------------------------------------------------- /audio_diffusion_pytorch/__init__.py: -------------------------------------------------------------------------------- 1 | from .diffusion import ( 2 | ADPM2Sampler, 3 | AEulerSampler, 4 | Diffusion, 5 | DiffusionInpainter, 6 | DiffusionSampler, 7 | Distribution, 8 | KarrasSampler, 9 | KarrasSchedule, 10 | LogNormalDistribution, 11 | Sampler, 12 | Schedule, 13 | SpanBySpanComposer, 14 | ) 15 | from .model import ( 16 | AudioDiffusionConditional, 17 | AudioDiffusionModel, 18 | AudioDiffusionUpsampler, 19 | DiffusionUpsampler1d, 20 | Model1d, 21 | ) 22 | from .modules import UNet1d, UNetConditional1d 23 | -------------------------------------------------------------------------------- /audio_diffusion_pytorch/diffusion.py: -------------------------------------------------------------------------------- 1 | from math import sqrt 2 | from typing import Any, Callable, Optional, Tuple 3 | 4 | import torch 5 | import torch.nn as nn 6 | import torch.nn.functional as F 7 | from einops import rearrange, reduce 8 | from torch import Tensor 9 | 10 | from .utils import default, exists 11 | 12 | """ Distributions """ 13 | 14 | 15 | class Distribution: 16 | def __call__(self, num_samples: int, device: torch.device): 17 | raise NotImplementedError() 18 | 19 | 20 | class LogNormalDistribution(Distribution): 21 | def __init__(self, mean: float, std: float): 22 | self.mean = mean 23 | self.std = std 24 | 25 | def __call__( 26 | self, num_samples, device: torch.device = torch.device("cpu") 27 | ) -> Tensor: 28 | normal = self.mean + self.std * torch.randn((num_samples,), device=device) 29 | return normal.exp() 30 | 31 | 32 | """ Schedules """ 33 | 34 | 35 | class Schedule(nn.Module): 36 | """Interface used by different schedules""" 37 | 38 | def forward(self, num_steps: int, device: torch.device) -> Tensor: 39 | raise NotImplementedError() 40 | 41 | 42 | class KarrasSchedule(Schedule): 43 | """https://arxiv.org/abs/2206.00364 equation 5""" 44 | 45 | def __init__(self, sigma_min: float, sigma_max: float, rho: float = 7.0): 46 | super().__init__() 47 | self.sigma_min = sigma_min 48 | self.sigma_max = sigma_max 49 | self.rho = rho 50 | 51 | def forward(self, num_steps: int, device: Any) -> Tensor: 52 | rho_inv = 1.0 / self.rho 53 | steps = torch.arange(num_steps, device=device, dtype=torch.float32) 54 | sigmas = ( 55 | self.sigma_max ** rho_inv 56 | + (steps / (num_steps - 1)) 57 | * (self.sigma_min ** rho_inv - self.sigma_max ** rho_inv) 58 | ) ** self.rho 59 | sigmas = F.pad(sigmas, pad=(0, 1), value=0.0) 60 | return sigmas 61 | 62 | 63 | """ Samplers """ 64 | 65 | """ Many methods inspired by https://github.com/crowsonkb/k-diffusion/ """ 66 | 67 | 68 | class Sampler(nn.Module): 69 | def forward( 70 | self, noise: Tensor, fn: Callable, sigmas: Tensor, num_steps: int 71 | ) -> Tensor: 72 | raise NotImplementedError() 73 | 74 | def inpaint( 75 | self, 76 | source: Tensor, 77 | mask: Tensor, 78 | fn: Callable, 79 | sigmas: Tensor, 80 | num_steps: int, 81 | num_resamples: int, 82 | ) -> Tensor: 83 | raise NotImplementedError("Inpainting not available with current sampler") 84 | 85 | 86 | class KarrasSampler(Sampler): 87 | """https://arxiv.org/abs/2206.00364 algorithm 1""" 88 | 89 | def __init__( 90 | self, 91 | s_tmin: float = 0, 92 | s_tmax: float = float("inf"), 93 | s_churn: float = 0.0, 94 | s_noise: float = 1.0, 95 | ): 96 | super().__init__() 97 | self.s_tmin = s_tmin 98 | self.s_tmax = s_tmax 99 | self.s_noise = s_noise 100 | self.s_churn = s_churn 101 | 102 | def step( 103 | self, x: Tensor, fn: Callable, sigma: float, sigma_next: float, gamma: float 104 | ) -> Tensor: 105 | """Algorithm 2 (step)""" 106 | # Select temporarily increased noise level 107 | sigma_hat = sigma + gamma * sigma 108 | # Add noise to move from sigma to sigma_hat 109 | epsilon = self.s_noise * torch.randn_like(x) 110 | x_hat = x + sqrt(sigma_hat ** 2 - sigma ** 2) * epsilon 111 | # Evaluate ∂x/∂sigma at sigma_hat 112 | d = (x_hat - fn(x_hat, sigma=sigma_hat)) / sigma_hat 113 | # Take euler step from sigma_hat to sigma_next 114 | x_next = x_hat + (sigma_next - sigma_hat) * d 115 | # Second order correction 116 | if sigma_next != 0: 117 | model_out_next = fn(x_next, sigma=sigma_next) 118 | d_prime = (x_next - model_out_next) / sigma_next 119 | x_next = x_hat + 0.5 * (sigma - sigma_hat) * (d + d_prime) 120 | return x_next 121 | 122 | def forward( 123 | self, noise: Tensor, fn: Callable, sigmas: Tensor, num_steps: int 124 | ) -> Tensor: 125 | x = sigmas[0] * noise 126 | # Compute gammas 127 | gammas = torch.where( 128 | (sigmas >= self.s_tmin) & (sigmas <= self.s_tmax), 129 | min(self.s_churn / num_steps, sqrt(2) - 1), 130 | 0.0, 131 | ) 132 | # Denoise to sample 133 | for i in range(num_steps - 1): 134 | x = self.step( 135 | x, fn=fn, sigma=sigmas[i], sigma_next=sigmas[i + 1], gamma=gammas[i] # type: ignore # noqa 136 | ) 137 | 138 | return x 139 | 140 | 141 | class AEulerSampler(Sampler): 142 | def get_sigmas(self, sigma: float, sigma_next: float) -> Tuple[float, float]: 143 | sigma_up = sqrt(sigma_next ** 2 * (sigma ** 2 - sigma_next ** 2) / sigma ** 2) 144 | sigma_down = sqrt(sigma_next ** 2 - sigma_up ** 2) 145 | return sigma_up, sigma_down 146 | 147 | def step(self, x: Tensor, fn: Callable, sigma: float, sigma_next: float) -> Tensor: 148 | # Sigma steps 149 | sigma_up, sigma_down = self.get_sigmas(sigma, sigma_next) 150 | # Derivative at sigma (∂x/∂sigma) 151 | d = (x - fn(x, sigma=sigma)) / sigma 152 | # Euler method 153 | x_next = x + d * (sigma_down - sigma) 154 | # Add randomness 155 | x_next = x_next + torch.randn_like(x) * sigma_up 156 | return x_next 157 | 158 | def forward( 159 | self, noise: Tensor, fn: Callable, sigmas: Tensor, num_steps: int 160 | ) -> Tensor: 161 | x = sigmas[0] * noise 162 | # Denoise to sample 163 | for i in range(num_steps - 1): 164 | x = self.step(x, fn=fn, sigma=sigmas[i], sigma_next=sigmas[i + 1]) # type: ignore # noqa 165 | return x 166 | 167 | 168 | class ADPM2Sampler(Sampler): 169 | """https://www.desmos.com/calculator/jbxjlqd9mb""" 170 | 171 | def __init__(self, rho: float = 1.0): 172 | super().__init__() 173 | self.rho = rho 174 | 175 | def get_sigmas(self, sigma: float, sigma_next: float) -> Tuple[float, float, float]: 176 | r = self.rho 177 | sigma_up = sqrt(sigma_next ** 2 * (sigma ** 2 - sigma_next ** 2) / sigma ** 2) 178 | sigma_down = sqrt(sigma_next ** 2 - sigma_up ** 2) 179 | sigma_mid = ((sigma ** (1 / r) + sigma_down ** (1 / r)) / 2) ** r 180 | return sigma_up, sigma_down, sigma_mid 181 | 182 | def step(self, x: Tensor, fn: Callable, sigma: float, sigma_next: float) -> Tensor: 183 | # Sigma steps 184 | sigma_up, sigma_down, sigma_mid = self.get_sigmas(sigma, sigma_next) 185 | # Derivative at sigma (∂x/∂sigma) 186 | d = (x - fn(x, sigma=sigma)) / sigma 187 | # Denoise to midpoint 188 | x_mid = x + d * (sigma_mid - sigma) 189 | # Derivative at sigma_mid (∂x_mid/∂sigma_mid) 190 | d_mid = (x_mid - fn(x_mid, sigma=sigma_mid)) / sigma_mid 191 | # Denoise to next 192 | x = x + d_mid * (sigma_down - sigma) 193 | # Add randomness 194 | x_next = x + torch.randn_like(x) * sigma_up 195 | return x_next 196 | 197 | def forward( 198 | self, noise: Tensor, fn: Callable, sigmas: Tensor, num_steps: int 199 | ) -> Tensor: 200 | x = sigmas[0] * noise 201 | # Denoise to sample 202 | for i in range(num_steps - 1): 203 | x = self.step(x, fn=fn, sigma=sigmas[i], sigma_next=sigmas[i + 1]) # type: ignore # noqa 204 | return x 205 | 206 | def inpaint( 207 | self, 208 | source: Tensor, 209 | mask: Tensor, 210 | fn: Callable, 211 | sigmas: Tensor, 212 | num_steps: int, 213 | num_resamples: int, 214 | ) -> Tensor: 215 | x = sigmas[0] * torch.randn_like(source) 216 | 217 | for i in range(num_steps - 1): 218 | # Noise source to current noise level 219 | source_noisy = source + sigmas[i] * torch.randn_like(source) 220 | for r in range(num_resamples): 221 | # Merge noisy source and current then denoise 222 | x = source_noisy * mask + x * ~mask 223 | x = self.step(x, fn=fn, sigma=sigmas[i], sigma_next=sigmas[i + 1]) # type: ignore # noqa 224 | # Renoise if not last resample step 225 | if r < num_resamples - 1: 226 | sigma = sqrt(sigmas[i] ** 2 - sigmas[i + 1] ** 2) 227 | x = x + sigma * torch.randn_like(x) 228 | 229 | return source * mask + x * ~mask 230 | 231 | 232 | """ Diffusion Classes """ 233 | 234 | def pad_dims(x: Tensor, ndim: int) -> Tensor: 235 | # Pads additional ndims to the right of the tensor 236 | return x.view(*x.shape, *((1,) * ndim)) 237 | 238 | 239 | class Diffusion(nn.Module): 240 | """Elucidated Diffusion: https://arxiv.org/abs/2206.00364""" 241 | 242 | def __init__( 243 | self, 244 | net: nn.Module, 245 | *, 246 | sigma_distribution: Distribution, 247 | sigma_data: float, # data distribution standard deviation 248 | dynamic_threshold: float = 0.0, 249 | ): 250 | super().__init__() 251 | 252 | self.net = net 253 | self.sigma_data = sigma_data 254 | self.sigma_distribution = sigma_distribution 255 | self.dynamic_threshold = dynamic_threshold 256 | 257 | def get_scale_weights(self, sigmas: Tensor) -> Tuple[Tensor, ...]: 258 | sigma_data = self.sigma_data 259 | sigmas_padded = rearrange(sigmas, "b -> b 1 1") 260 | c_skip = (sigma_data ** 2) / (sigmas_padded ** 2 + sigma_data ** 2) 261 | c_out = ( 262 | sigmas_padded * sigma_data * (sigma_data ** 2 + sigmas_padded ** 2) ** -0.5 263 | ) 264 | c_in = (sigmas_padded ** 2 + sigma_data ** 2) ** -0.5 265 | c_noise = torch.log(sigmas) * 0.25 266 | return c_skip, c_out, c_in, c_noise 267 | 268 | def denoise_fn( 269 | self, 270 | x_noisy: Tensor, 271 | sigmas: Optional[Tensor] = None, 272 | sigma: Optional[float] = None, 273 | **kwargs, 274 | ) -> Tensor: 275 | batch, device = x_noisy.shape[0], x_noisy.device 276 | 277 | assert exists(sigmas) ^ exists(sigma), "Either sigmas or sigma must be provided" 278 | 279 | # If sigma provided use the same for all batch items (used for sampling) 280 | if exists(sigma): 281 | sigmas = torch.full(size=(batch,), fill_value=sigma).to(device) 282 | 283 | assert exists(sigmas) 284 | 285 | # Predict network output and add skip connection 286 | c_skip, c_out, c_in, c_noise = self.get_scale_weights(sigmas) 287 | x_pred = self.net(c_in * x_noisy, c_noise, **kwargs) 288 | x_denoised = c_skip * x_noisy + c_out * x_pred 289 | 290 | # Dynamic thresholding 291 | if self.dynamic_threshold == 0.0: 292 | return x_denoised.clamp(-1.0, 1.0) 293 | else: 294 | # Find dynamic threshold quantile for each batch 295 | x_flat = rearrange(x_denoised, "b ... -> b (...)") 296 | scale = torch.quantile(x_flat.abs(), self.dynamic_threshold, dim=-1) 297 | # Clamp to a min of 1.0 298 | scale.clamp_(min=1.0) 299 | # Clamp all values and scale 300 | scale = pad_dims(scale, ndim=x_denoised.ndim - scale.ndim) 301 | x_denoised = x_denoised.clamp(-scale, scale) / scale 302 | return x_denoised 303 | 304 | def loss_weight(self, sigmas: Tensor) -> Tensor: 305 | # Computes weight depending on data distribution 306 | return (sigmas ** 2 + self.sigma_data ** 2) * (sigmas * self.sigma_data) ** -2 307 | 308 | def forward(self, x: Tensor, noise: Tensor = None, **kwargs) -> Tensor: 309 | batch, device = x.shape[0], x.device 310 | 311 | # Sample amount of noise to add for each batch element 312 | sigmas = self.sigma_distribution(num_samples=batch, device=device) 313 | sigmas_padded = rearrange(sigmas, "b -> b 1 1") 314 | 315 | # Add noise to input 316 | noise = default(noise, lambda: torch.randn_like(x)) 317 | x_noisy = x + sigmas_padded * noise 318 | 319 | # Compute denoised values 320 | x_denoised = self.denoise_fn(x_noisy, sigmas=sigmas, **kwargs) 321 | 322 | # Compute weighted loss 323 | losses = F.mse_loss(x_denoised, x, reduction="none") 324 | losses = reduce(losses, "b ... -> b", "mean") 325 | losses = losses * self.loss_weight(sigmas) 326 | loss = losses.mean() 327 | 328 | return loss 329 | 330 | 331 | class DiffusionSampler(nn.Module): 332 | def __init__( 333 | self, 334 | diffusion: Diffusion, 335 | *, 336 | sampler: Sampler, 337 | sigma_schedule: Schedule, 338 | num_steps: Optional[int] = None, 339 | ): 340 | super().__init__() 341 | self.denoise_fn = diffusion.denoise_fn 342 | self.sampler = sampler 343 | self.sigma_schedule = sigma_schedule 344 | self.num_steps = num_steps 345 | 346 | @torch.no_grad() 347 | def forward( 348 | self, noise: Tensor, num_steps: Optional[int] = None, **kwargs 349 | ) -> Tensor: 350 | device = noise.device 351 | num_steps = default(num_steps, self.num_steps) # type: ignore 352 | assert exists(num_steps), "Parameter `num_steps` must be provided" 353 | # Compute sigmas using schedule 354 | sigmas = self.sigma_schedule(num_steps, device) 355 | # Append additional kwargs to denoise function (used e.g. for conditional unet) 356 | fn = lambda *a, **ka: self.denoise_fn(*a, **{**ka, **kwargs}) # noqa 357 | # Sample using sampler 358 | x = self.sampler(noise, fn=fn, sigmas=sigmas, num_steps=num_steps) 359 | x = x.clamp(-1.0, 1.0) 360 | return x 361 | 362 | 363 | class DiffusionInpainter(nn.Module): 364 | def __init__( 365 | self, 366 | diffusion: Diffusion, 367 | *, 368 | num_steps: int, 369 | num_resamples: int, 370 | sampler: Sampler, 371 | sigma_schedule: Schedule, 372 | ): 373 | super().__init__() 374 | self.denoise_fn = diffusion.denoise_fn 375 | self.num_steps = num_steps 376 | self.num_resamples = num_resamples 377 | self.inpaint_fn = sampler.inpaint 378 | self.sigma_schedule = sigma_schedule 379 | 380 | @torch.no_grad() 381 | def forward(self, inpaint: Tensor, inpaint_mask: Tensor) -> Tensor: 382 | x = self.inpaint_fn( 383 | source=inpaint, 384 | mask=inpaint_mask, 385 | fn=self.denoise_fn, 386 | sigmas=self.sigma_schedule(self.num_steps, inpaint.device), 387 | num_steps=self.num_steps, 388 | num_resamples=self.num_resamples, 389 | ) 390 | return x 391 | 392 | 393 | def sequential_mask(like: Tensor, start: int) -> Tensor: 394 | length, device = like.shape[2], like.device 395 | mask = torch.ones_like(like, dtype=torch.bool) 396 | mask[:, :, start:] = torch.zeros((length - start,), device=device) 397 | return mask 398 | 399 | 400 | class SpanBySpanComposer(nn.Module): 401 | def __init__( 402 | self, 403 | inpainter: DiffusionInpainter, 404 | *, 405 | num_spans: int, 406 | ): 407 | super().__init__() 408 | self.inpainter = inpainter 409 | self.num_spans = num_spans 410 | 411 | def forward(self, start: Tensor, keep_start: bool = False) -> Tensor: 412 | half_length = start.shape[2] // 2 413 | 414 | spans = list(start.chunk(chunks=2, dim=-1)) if keep_start else [] 415 | # Inpaint second half from first half 416 | inpaint = torch.zeros_like(start) 417 | inpaint[:, :, :half_length] = start[:, :, half_length:] 418 | inpaint_mask = sequential_mask(like=start, start=half_length) 419 | 420 | for i in range(self.num_spans): 421 | # Inpaint second half 422 | span = self.inpainter(inpaint=inpaint, inpaint_mask=inpaint_mask) 423 | # Replace first half with generated second half 424 | second_half = span[:, :, half_length:] 425 | inpaint[:, :, :half_length] = second_half 426 | # Save generated span 427 | spans.append(second_half) 428 | 429 | return torch.cat(spans, dim=2) 430 | -------------------------------------------------------------------------------- /audio_diffusion_pytorch/model.py: -------------------------------------------------------------------------------- 1 | import random 2 | from typing import Any, Optional, Sequence, Tuple, Union 3 | 4 | import torch 5 | from torch import Tensor, nn 6 | 7 | from .diffusion import ( 8 | ADPM2Sampler, 9 | Diffusion, 10 | DiffusionSampler, 11 | Distribution, 12 | KarrasSchedule, 13 | LogNormalDistribution, 14 | Sampler, 15 | Schedule, 16 | ) 17 | from .modules import UNet1d, UNetConditional1d 18 | from .utils import default, exists, to_list 19 | 20 | """ 21 | Diffusion Classes (generic for 1d data) 22 | """ 23 | 24 | 25 | class Model1d(nn.Module): 26 | def __init__( 27 | self, 28 | diffusion_sigma_distribution: Distribution, 29 | diffusion_sigma_data: int, 30 | diffusion_dynamic_threshold: float, 31 | use_classifier_free_guidance: bool = False, 32 | **kwargs 33 | ): 34 | super().__init__() 35 | 36 | UNet = UNetConditional1d if use_classifier_free_guidance else UNet1d 37 | 38 | self.unet = UNet(**kwargs) 39 | 40 | self.diffusion = Diffusion( 41 | net=self.unet, 42 | sigma_distribution=diffusion_sigma_distribution, 43 | sigma_data=diffusion_sigma_data, 44 | dynamic_threshold=diffusion_dynamic_threshold, 45 | ) 46 | 47 | def forward(self, x: Tensor, **kwargs) -> Tensor: 48 | return self.diffusion(x, **kwargs) 49 | 50 | def sample( 51 | self, 52 | noise: Tensor, 53 | num_steps: int, 54 | sigma_schedule: Schedule, 55 | sampler: Sampler, 56 | **kwargs 57 | ) -> Tensor: 58 | diffusion_sampler = DiffusionSampler( 59 | diffusion=self.diffusion, 60 | sampler=sampler, 61 | sigma_schedule=sigma_schedule, 62 | num_steps=num_steps, 63 | ) 64 | return diffusion_sampler(noise, **kwargs) 65 | 66 | 67 | class DiffusionUpsampler1d(Model1d): 68 | def __init__( 69 | self, factor: Union[int, Sequence[int]], in_channels: int, *args, **kwargs 70 | ): 71 | self.factor = to_list(factor) 72 | default_kwargs = dict( 73 | in_channels=in_channels, 74 | context_channels=[in_channels], 75 | ) 76 | super().__init__(*args, **{**default_kwargs, **kwargs}) # type: ignore 77 | 78 | def forward(self, x: Tensor, factor: Optional[int] = None, **kwargs) -> Tensor: 79 | # Either user provides factor or we pick one at random 80 | factor = default(factor, random.choice(self.factor)) 81 | # Downsample by picking every `factor` item 82 | downsampled = x[:, :, ::factor] 83 | # Upsample by interleaving to get context 84 | channels = torch.repeat_interleave(downsampled, repeats=factor, dim=2) 85 | return self.diffusion(x, channels_list=[channels], **kwargs) 86 | 87 | def sample( # type: ignore 88 | self, undersampled: Tensor, factor: Optional[int] = None, *args, **kwargs 89 | ): 90 | # Either user provides factor or we pick the first 91 | factor = default(factor, self.factor[0]) 92 | # Upsample channels by interleaving 93 | channels = torch.repeat_interleave(undersampled, repeats=factor, dim=2) 94 | noise = torch.randn_like(channels) 95 | default_kwargs = dict(channels_list=[channels]) 96 | return super().sample(noise, **{**default_kwargs, **kwargs}) # type: ignore 97 | 98 | 99 | class Bottleneck(nn.Module): 100 | """Bottleneck interface (subclass can be provided to DiffusionAutoencoder1d)""" 101 | 102 | def forward(self, x: Tensor) -> Tuple[Tensor, Any]: 103 | raise NotImplementedError() 104 | 105 | 106 | """ 107 | Audio Diffusion Classes (specific for 1d audio data) 108 | """ 109 | 110 | 111 | def get_default_model_kwargs(): 112 | return dict( 113 | channels=128, 114 | patch_blocks=4, 115 | patch_factor=2, 116 | kernel_sizes_init=[1, 3, 7], 117 | multipliers=[1, 2, 4, 4, 4, 4, 4], 118 | factors=[4, 4, 4, 2, 2, 2], 119 | num_blocks=[2, 2, 2, 2, 2, 2], 120 | attentions=[False, False, False, True, True, True], 121 | attention_heads=8, 122 | attention_features=64, 123 | attention_multiplier=2, 124 | use_attention_bottleneck=True, 125 | resnet_groups=8, 126 | kernel_multiplier_downsample=2, 127 | use_nearest_upsample=False, 128 | use_skip_scale=True, 129 | use_context_time=True, 130 | diffusion_sigma_distribution=LogNormalDistribution(mean=-3.0, std=1.0), 131 | diffusion_sigma_data=0.1, 132 | diffusion_dynamic_threshold=0.0, 133 | ) 134 | 135 | 136 | def get_default_sampling_kwargs(): 137 | return dict( 138 | sigma_schedule=KarrasSchedule(sigma_min=0.0001, sigma_max=3.0, rho=9.0), 139 | sampler=ADPM2Sampler(rho=1.0), 140 | ) 141 | 142 | 143 | class AudioDiffusionModel(Model1d): 144 | def __init__(self, **kwargs): 145 | super().__init__(**{**get_default_model_kwargs(), **kwargs}) 146 | 147 | def sample(self, *args, **kwargs): 148 | return super().sample(*args, **{**get_default_sampling_kwargs(), **kwargs}) 149 | 150 | 151 | class AudioDiffusionUpsampler(DiffusionUpsampler1d): 152 | def __init__(self, in_channels: int, **kwargs): 153 | default_kwargs = dict( 154 | **get_default_model_kwargs(), 155 | in_channels=in_channels, 156 | context_channels=[in_channels], 157 | ) 158 | super().__init__(**{**default_kwargs, **kwargs}) # type: ignore 159 | 160 | def sample(self, *args, **kwargs): 161 | return super().sample(*args, **{**get_default_sampling_kwargs(), **kwargs}) 162 | 163 | 164 | class AudioDiffusionConditional(Model1d): 165 | def __init__( 166 | self, 167 | embedding_features: int, 168 | embedding_max_length: int, 169 | rhythm_max_length: int, 170 | genre_features: Optional[int], 171 | embedding_mask_proba: float = 0.1, 172 | **kwargs 173 | ): 174 | self.embedding_mask_proba = embedding_mask_proba 175 | default_kwargs = dict( 176 | **get_default_model_kwargs(), 177 | context_embedding_features=embedding_features, 178 | context_embedding_max_length=embedding_max_length, 179 | context_rhythm_max_length=rhythm_max_length, 180 | use_classifier_free_guidance=True, 181 | context_genre_features=genre_features, 182 | ) 183 | super().__init__(**{**default_kwargs, **kwargs}) 184 | 185 | def forward(self, *args, **kwargs): 186 | default_kwargs = dict(embedding_mask_proba=self.embedding_mask_proba) 187 | return super().forward(*args, **{**default_kwargs, **kwargs}) 188 | 189 | def sample(self, *args, **kwargs): 190 | default_kwargs = dict( 191 | **get_default_sampling_kwargs(), 192 | embedding_scale=5.0, 193 | ) 194 | return super().sample(*args, **{**default_kwargs, **kwargs}) 195 | -------------------------------------------------------------------------------- /audio_diffusion_pytorch/utils.py: -------------------------------------------------------------------------------- 1 | from functools import reduce 2 | from inspect import isfunction 3 | from typing import Callable, List, Optional, Sequence, TypeVar, Union 4 | 5 | from typing_extensions import TypeGuard 6 | 7 | T = TypeVar("T") 8 | 9 | 10 | def exists(val: Optional[T]) -> TypeGuard[T]: 11 | return val is not None 12 | 13 | 14 | def iff(condition: bool, value: T) -> Optional[T]: 15 | return value if condition else None 16 | 17 | 18 | def is_sequence(obj: T) -> TypeGuard[Union[list, tuple]]: 19 | return isinstance(obj, list) or isinstance(obj, tuple) 20 | 21 | 22 | def default(val: Optional[T], d: Union[Callable[..., T], T]) -> T: 23 | if exists(val): 24 | return val 25 | return d() if isfunction(d) else d 26 | 27 | 28 | def to_list(val: Union[T, Sequence[T]]) -> List[T]: 29 | if isinstance(val, tuple): 30 | return list(val) 31 | if isinstance(val, list): 32 | return val 33 | return [val] # type: ignore 34 | 35 | 36 | def prod(vals: Sequence[int]) -> int: 37 | return reduce(lambda x, y: x * y, vals) 38 | 39 | def normalize(x): 40 | A = x.clone().squeeze() 41 | # print(f"A Shape: {A.shape}") 42 | A -= A.min(1, keepdim=True)[0] 43 | A /= A.max(1, keepdim=True)[0] 44 | x = A.unsqueeze(-1) 45 | # print(torch.max(x, dim=1, keepdim=False)[0]) 46 | # print(torch.min(x, dim=1, keepdim=False)[0]) 47 | return x -------------------------------------------------------------------------------- /beats_scores.py: -------------------------------------------------------------------------------- 1 | import glob, os, sys 2 | import soundfile as sf 3 | import librosa 4 | from librosa.core import load 5 | import numpy as np 6 | import argparse 7 | 8 | 9 | def parse_args(): 10 | parser = argparse.ArgumentParser() 11 | parser.add_argument("--path", default='./OUTPUT/loris_fe_s50/samples_min_20_50') 12 | args = parser.parse_args() 13 | return args 14 | 15 | 16 | def beat_detect(x, sr=22050): 17 | onsets = librosa.onset.onset_detect(x, sr=sr, wait=1, delta=0.2, pre_avg=3, post_avg=3, pre_max=3, post_max=3, units='time') 18 | n = np.ceil(len(x) / sr) 19 | beats = [0] * int(n) 20 | for time in onsets: 21 | beats[int(np.trunc(time))] = 1 22 | return beats 23 | 24 | def beat_scores(gt, syn): 25 | gt = gt[:len(syn)] 26 | assert len(gt) == len(syn) 27 | total_beats = sum(gt) 28 | cover_beats = sum(syn) 29 | hit_beats = 0 30 | for i in range(len(gt)): 31 | if gt[i] == 1 and gt[i] == syn[i]: 32 | hit_beats += 1 33 | print(f"Total Beats: {total_beats}, Cover Beats: {cover_beats}, Hit Beats: {hit_beats}") 34 | hit_rate = hit_beats/total_beats if total_beats else 0 35 | cover_rate = hit_beats/cover_beats if cover_beats else 0 36 | return cover_rate, hit_rate 37 | 38 | 39 | if __name__ == '__main__': 40 | args = parse_args() 41 | path = args.path 42 | ref_music = sorted(glob.glob(path+'/gt*')) 43 | syn_music = sorted(glob.glob(path+'/generated*')) 44 | total_score_cover = 0 45 | total_score_hit = 0 46 | hit_ls = [] 47 | cover_ls = [] 48 | print(f"ref_music num: {len(ref_music)}, syn_music num: {len(syn_music)}") 49 | for i, c in enumerate(ref_music): 50 | ref, _ = load(ref_music[i]) 51 | syn, _ = load(syn_music[i]) 52 | gt_beats = beat_detect(ref) 53 | syn_beats = beat_detect(syn) 54 | score_cover, score_hit = beat_scores(gt_beats, syn_beats) 55 | total_score_cover += score_cover 56 | total_score_hit += score_hit 57 | cover_ls.append(score_cover) 58 | hit_ls.append(score_hit) 59 | print("Inference:", score_cover, score_hit) 60 | cover_score, hit_score = total_score_cover/len(ref_music), total_score_hit/len(ref_music) 61 | cover_std, hit_std = np.std(cover_ls, ddof=1), np.std(hit_ls, ddof=1) 62 | f1_score = 2 * cover_score * hit_score / (cover_score + hit_score) 63 | print(f"Cover Score: {cover_score}, Cover Std: {cover_std}, Hit Score: {hit_score}, Hit Std: {hit_std}, F1 Score: {f1_score}") 64 | -------------------------------------------------------------------------------- /configs/dance_s25.yaml: -------------------------------------------------------------------------------- 1 | name: loris_dance_s25 2 | log_path: './logs/loris_dance_s25/' 3 | ckpt_name: loris_epoch100.pt 4 | sample_save_path: './OUTPUT/loris_dance_s25/samples_' 5 | model_save_path: './OUTPUT/loris_dance_s25/checkpoints/' 6 | audio_train_path: './data/dance/dance_audio_s25_train_segment.txt' 7 | video_train_path: './data/dance/dance_i3d_s25_train_segment.txt' 8 | motion_train_path: './data/dance/dance_pose2d_s25_train_segment.txt' 9 | genre_train_path: './data/genre/dance_s25_train.npy' 10 | audio_test_path: './data/dance/dance_audio_s25_test_segment.txt' 11 | video_test_path: './data/dance/dance_i3d_s25_test_segment.txt' 12 | motion_test_path: './data/dance/dance_pose2d_s25_test_segment.txt' 13 | genre_test_path: './data/genre/dance_s25_test.npy' 14 | data_root: 'yourpath/dataset/dance/' 15 | autoencoder_path: './audio_diffusion_pytorch/ckpt/audio_1136_720k_sd.pt' 16 | log_interval: 1 17 | save_interval: 50 18 | batch_size: 10 19 | base_lr: 3.0e-3 20 | backbone_base_lr: 3.0e-6 21 | max_epochs: 250 22 | betas: !!python/tuple [0.9, 0.96] 23 | weight_decay: 4.5e-2 24 | num_workers: 0 25 | 26 | model: 27 | autoencoder_type: 'cond_diffusion' 28 | use_pretrain: True 29 | motion_context_length: 400 30 | video_context_length: 50 31 | condition_dim: 1024 32 | motion_dim: 1024 33 | video_dim: 1024 34 | sample_rate: 22050 35 | segment_length: 25 36 | diffusion_length: 19 37 | diffusion_step: 50 38 | embedding_scale: 20 39 | rhythm_config: 40 | nbins: 10 41 | pre_avg: 2 42 | post_avg: 2 43 | pre_max: 3 44 | post_max: 3 45 | threshold: 0.1 46 | genre_config: 47 | use_genre: False 48 | num_embed: 10 49 | embed_dim: 1024 50 | 51 | lr_scheduler: 52 | step_iteration: 1 53 | factor: 0.5 54 | patience: 60000 55 | min_lr: 1.0e-6 56 | threshold: 1.0e-1 57 | threshold_mode: rel 58 | warmup_lr: 2.0e-4 # the lr to be touched after warmup 59 | warmup: 1000 60 | 61 | clip_grad_norm: 62 | target: d2m.engine.clip_grad_norm.ClipGradNorm 63 | params: 64 | start_iteration: 0 65 | end_iteration: 5000 66 | max_norm: 0.5 67 | -------------------------------------------------------------------------------- /configs/fe_s25.yaml: -------------------------------------------------------------------------------- 1 | name: loris_fe_s25 2 | log_path: './logs/loris_fe_s25/' 3 | ckpt_name: loris_epoch200.pt 4 | sample_save_path: './OUTPUT/loris_fe_s25/samples_' 5 | model_save_path: './OUTPUT/loris_fe_s25/checkpoints/' 6 | audio_train_path: './data/fe/fe_audio_s25_train_segment.txt' 7 | video_train_path: './data/fe/fe_i3d_s25_train_segment.txt' 8 | motion_train_path: './data/fe/fe_pose2d_s25_train_segment.txt' 9 | genre_train_path: None 10 | audio_test_path: './data/fe/fe_audio_s25_test_segment.txt' 11 | video_test_path: './data/fe/fe_i3d_s25_test_segment.txt' 12 | motion_test_path: './data/fe/fe_pose2d_s25_test_segment.txt' 13 | genre_test_path: None 14 | data_root: 'yourpath/dataset/fe/' 15 | autoencoder_path: './audio_diffusion_pytorch/ckpt/audio_1136_720k_sd.pt' 16 | log_interval: 1 17 | save_interval: 50 18 | batch_size: 10 19 | base_lr: 3.0e-3 20 | backbone_base_lr: 3.0e-6 21 | max_epochs: 250 22 | betas: !!python/tuple [0.9, 0.96] 23 | weight_decay: 4.5e-2 24 | num_workers: 0 25 | 26 | model: 27 | autoencoder_type: 'cond_diffusion' 28 | use_pretrain: True 29 | motion_context_length: 400 30 | video_context_length: 50 31 | condition_dim: 1024 32 | motion_dim: 1024 33 | video_dim: 1024 34 | sample_rate: 22050 35 | segment_length: 25 36 | diffusion_length: 19 37 | diffusion_step: 100 38 | embedding_scale: 20 39 | rhythm_config: 40 | nbins: 10 41 | pre_avg: 2 42 | post_avg: 2 43 | pre_max: 3 44 | post_max: 3 45 | threshold: 0.1 46 | genre_config: 47 | use_genre: False 48 | num_embed: 10 49 | embed_dim: 1024 50 | 51 | lr_scheduler: 52 | step_iteration: 1 53 | factor: 0.5 54 | patience: 60000 55 | min_lr: 1.0e-6 56 | threshold: 1.0e-1 57 | threshold_mode: rel 58 | warmup_lr: 2.0e-4 # the lr to be touched after warmup 59 | warmup: 1000 60 | 61 | clip_grad_norm: 62 | target: d2m.engine.clip_grad_norm.ClipGradNorm 63 | params: 64 | start_iteration: 0 65 | end_iteration: 5000 66 | max_norm: 0.5 67 | -------------------------------------------------------------------------------- /configs/fe_s50.yaml: -------------------------------------------------------------------------------- 1 | name: loris_fe_s50 2 | log_path: './logs/loris_fe_s50/' 3 | ckpt_name: loss_min.pt 4 | sample_save_path: './OUTPUT/loris_fe_s50/samples_' 5 | model_save_path: './OUTPUT/loris_fe_s50/checkpoints/' 6 | audio_train_path: './data/fe/fe_audio_s50_train_segment.txt' 7 | video_train_path: './data/fe/fe_i3d_s50_train_segment.txt' 8 | motion_train_path: './data/fe/fe_pose2d_s50_train_segment.txt' 9 | genre_train_path: None 10 | audio_test_path: './data/fe/fe_audio_s50_test_segment.txt' 11 | video_test_path: './data/fe/fe_i3d_s50_test_segment.txt' 12 | motion_test_path: './data/fe/fe_pose2d_s50_test_segment.txt' 13 | genre_test_path: None 14 | data_root: 'yourpath/dataset/fe/' 15 | autoencoder_path: './audio_diffusion_pytorch/ckpt/audio_1136_720k_sd.pt' 16 | log_interval: 1 17 | save_interval: 50 18 | batch_size: 4 19 | base_lr: 3.0e-3 20 | backbone_base_lr: 3.0e-6 21 | max_epochs: 250 22 | betas: !!python/tuple [0.9, 0.96] 23 | weight_decay: 4.5e-2 24 | num_workers: 0 25 | 26 | model: 27 | autoencoder_type: 'cond_diffusion' 28 | use_pretrain: True 29 | motion_context_length: 800 30 | video_context_length: 100 31 | condition_dim: 1024 32 | motion_dim: 1024 33 | video_dim: 1024 34 | sample_rate: 22050 35 | segment_length: 50 36 | diffusion_length: 20 37 | diffusion_step: 50 38 | embedding_scale: 20 39 | rhythm_config: 40 | nbins: 10 41 | pre_avg: 2 42 | post_avg: 2 43 | pre_max: 3 44 | post_max: 3 45 | threshold: 0.1 46 | genre_config: 47 | use_genre: False 48 | num_embed: 10 49 | embed_dim: 1024 50 | 51 | lr_scheduler: 52 | step_iteration: 1 53 | factor: 0.5 54 | patience: 60000 55 | min_lr: 1.0e-6 56 | threshold: 1.0e-1 57 | threshold_mode: rel 58 | warmup_lr: 2.0e-4 # the lr to be touched after warmup 59 | warmup: 1000 60 | 61 | clip_grad_norm: 62 | target: d2m.engine.clip_grad_norm.ClipGradNorm 63 | params: 64 | start_iteration: 0 65 | end_iteration: 5000 66 | max_norm: 0.5 67 | -------------------------------------------------------------------------------- /configs/fs_s25.yaml: -------------------------------------------------------------------------------- 1 | name: loris_fs_s25 2 | log_path: './logs/loris_fs_s25/' 3 | ckpt_name: loss_min.pt 4 | sample_save_path: './OUTPUT/loris_fs_s25/samples_' 5 | model_save_path: './OUTPUT/loris_fs_s25/checkpoints/' 6 | audio_train_path: './data/fs/fs_audio_s25_train_segment.txt' 7 | video_train_path: './data/fs/fs_i3d_s25_train_segment.txt' 8 | motion_train_path: './data/fs/fs_pose2d_s25_train_segment.txt' 9 | genre_train_path: None 10 | audio_test_path: './data/fs/fs_audio_s25_test_segment.txt' 11 | video_test_path: './data/fs/fs_i3d_s25_test_segment.txt' 12 | motion_test_path: './data/fs/fs_pose2d_s25_test_segment.txt' 13 | genre_test_path: None 14 | data_root: 'yourpath/dataset/fs/' 15 | autoencoder_path: './audio_diffusion_pytorch/ckpt/audio_1136_720k_sd.pt' 16 | log_interval: 1 17 | save_interval: 50 18 | batch_size: 8 19 | base_lr: 3.0e-3 20 | backbone_base_lr: 3.0e-6 21 | max_epochs: 250 22 | betas: !!python/tuple [0.9, 0.96] 23 | weight_decay: 4.5e-2 24 | num_workers: 0 25 | 26 | model: 27 | autoencoder_type: 'cond_diffusion' 28 | use_pretrain: True 29 | motion_context_length: 400 30 | video_context_length: 50 31 | condition_dim: 1024 32 | motion_dim: 1024 33 | video_dim: 1024 34 | sample_rate: 22050 35 | segment_length: 25 36 | diffusion_length: 19 37 | diffusion_step: 50 38 | embedding_scale: 20 39 | rhythm_config: 40 | nbins: 10 41 | pre_avg: 2 42 | post_avg: 2 43 | pre_max: 3 44 | post_max: 3 45 | threshold: 0.1 46 | genre_config: 47 | use_genre: False 48 | num_embed: 10 49 | embed_dim: 1024 50 | 51 | lr_scheduler: 52 | step_iteration: 1 53 | factor: 0.5 54 | patience: 60000 55 | min_lr: 1.0e-6 56 | threshold: 1.0e-1 57 | threshold_mode: rel 58 | warmup_lr: 2.0e-4 # the lr to be touched after warmup 59 | warmup: 1000 60 | 61 | clip_grad_norm: 62 | target: d2m.engine.clip_grad_norm.ClipGradNorm 63 | params: 64 | start_iteration: 0 65 | end_iteration: 5000 66 | max_norm: 0.5 67 | -------------------------------------------------------------------------------- /configs/fs_s50.yaml: -------------------------------------------------------------------------------- 1 | name: loris_fs_s50 2 | log_path: './logs/loris_fs_s50/' 3 | ckpt_name: loris_epoch200.pt 4 | sample_save_path: './OUTPUT/loris_fs_s50/samples_' 5 | model_save_path: './OUTPUT/loris_fs_s50/checkpoints/' 6 | audio_train_path: './data/fs/fs_audio_s50_train_segment.txt' 7 | video_train_path: './data/fs/fs_i3d_s50_train_segment.txt' 8 | motion_train_path: './data/fs/fs_pose2d_s50_train_segment.txt' 9 | genre_train_path: None 10 | audio_test_path: './data/fs/fs_audio_s50_test_segment.txt' 11 | video_test_path: './data/fs/fs_i3d_s50_test_segment.txt' 12 | motion_test_path: './data/fs/fs_pose2d_s50_test_segment.txt' 13 | genre_test_path: None 14 | data_root: 'yourpath/dataset/fs/' 15 | autoencoder_path: './audio_diffusion_pytorch/ckpt/audio_1136_720k_sd.pt' 16 | log_interval: 1 17 | save_interval: 50 18 | batch_size: 4 19 | base_lr: 3.0e-3 20 | backbone_base_lr: 3.0e-6 21 | max_epochs: 250 22 | betas: !!python/tuple [0.9, 0.96] 23 | weight_decay: 4.5e-2 24 | num_workers: 0 25 | 26 | model: 27 | autoencoder_type: 'cond_diffusion' 28 | use_pretrain: True 29 | motion_context_length: 800 30 | video_context_length: 50 31 | condition_dim: 1024 32 | motion_dim: 1024 33 | video_dim: 1024 34 | sample_rate: 22050 35 | segment_length: 25 36 | diffusion_length: 19 37 | diffusion_step: 50 38 | embedding_scale: 20 39 | rhythm_config: 40 | nbins: 10 41 | pre_avg: 2 42 | post_avg: 2 43 | pre_max: 3 44 | post_max: 3 45 | threshold: 0.1 46 | genre_config: 47 | use_genre: False 48 | num_embed: 10 49 | embed_dim: 1024 50 | 51 | lr_scheduler: 52 | step_iteration: 1 53 | factor: 0.5 54 | patience: 60000 55 | min_lr: 1.0e-6 56 | threshold: 1.0e-1 57 | threshold_mode: rel 58 | warmup_lr: 2.0e-4 # the lr to be touched after warmup 59 | warmup: 1000 60 | 61 | clip_grad_norm: 62 | target: d2m.engine.clip_grad_norm.ClipGradNorm 63 | params: 64 | start_iteration: 0 65 | end_iteration: 5000 66 | max_norm: 0.5 67 | -------------------------------------------------------------------------------- /d2m/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenGVLab/LORIS/b5bef7d9f9f9956f59386af408bf4dc33cfbef62/d2m/.DS_Store -------------------------------------------------------------------------------- /d2m/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /d2m/dataset.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import torch.utils.data 3 | import torch.nn.functional as F 4 | import math 5 | from torch.utils.data import Dataset 6 | import numpy as np 7 | import io 8 | import os 9 | import json 10 | import random 11 | from pathlib import Path 12 | from librosa.core import load 13 | from librosa.util import normalize 14 | 15 | 16 | def files_to_list(filename): 17 | """ 18 | Takes a text file of filenames and makes a list of filenames 19 | """ 20 | with open(filename, encoding="utf-8") as f: 21 | files = f.readlines() 22 | 23 | files = [f.rstrip() for f in files] 24 | return files 25 | 26 | 27 | class S25Dataset(Dataset): 28 | def __init__(self, audio_files, motion_files, video_files, genre_label, augment, config): 29 | self.config = config 30 | self.sampling_rate = config['sample_rate'] 31 | self.segment_length = self.sampling_rate * config['segment_length'] 32 | self.audio_files = files_to_list(audio_files) 33 | self.audio_files = [Path(audio_files).parent / x for x in self.audio_files] 34 | self.augment = True 35 | self.video_files = files_to_list(video_files) 36 | self.video_files = [Path(video_files).parent / x for x in self.video_files] 37 | self.motion_files = files_to_list(motion_files) 38 | self.motion_files = [Path(motion_files).parent / x for x in self.motion_files] 39 | self.use_genre = config['genre_config']['use_genre'] 40 | if self.use_genre: 41 | self.genre = np.load(genre_label) 42 | 43 | def __len__(self): 44 | return len(self.audio_files) 45 | 46 | def __getitem__(self, index): 47 | # Read audio 48 | audio_filename = self.audio_files[index] 49 | audio, sampling_rate = self.load_wav_to_torch(audio_filename) 50 | # Take segment 51 | if audio.size(0) >= self.segment_length: 52 | max_audio_start = audio.size(0) - self.segment_length 53 | audio_start = random.randint(0, max_audio_start) 54 | audio = audio[audio_start : audio_start + self.segment_length] 55 | else: 56 | audio = F.pad(audio, (0, self.segment_length - audio.size(0)), "constant").data 57 | 58 | # Read video 59 | video_filename = self.video_files[index] 60 | video = self.load_img_to_torch(video_filename) 61 | video_max_len = self.config['video_context_length'] 62 | if video.size(0) > video_max_len: 63 | video = video[:video_max_len] 64 | # Read motion 65 | motion_filename = self.motion_files[index] 66 | motion = np.load(motion_filename) 67 | motion_max_len = self.config['motion_context_length'] 68 | if len(motion) > motion_max_len: 69 | need_to_delete_num = len(motion) - motion_max_len 70 | delete_rate = math.ceil(len(motion) / need_to_delete_num) 71 | motion_tmp = [ 72 | num for i, num in enumerate(motion) 73 | if i % delete_rate != 0 74 | ] 75 | motion = np.array(motion_tmp)[:motion_max_len] 76 | motion = torch.from_numpy(motion).float() 77 | assert motion_max_len == motion.size(0), f"len motion: {len(motion)}" 78 | 79 | if self.use_genre: 80 | genre = self.genre[index] 81 | data = { 82 | 'music': audio.unsqueeze(0), 83 | 'motion': motion, 84 | 'video': video, 85 | 'genre': genre, 86 | } 87 | else: 88 | data = { 89 | 'music': audio.unsqueeze(0), 90 | 'motion': motion, 91 | 'video': video, 92 | } 93 | return data 94 | 95 | def load_wav_to_torch(self, full_path): 96 | """ 97 | Loads wavdata into torch array 98 | """ 99 | data, sampling_rate = load(full_path, sr=self.sampling_rate) # mono: (sr*len,), binaural: (2, sr*len) 100 | data = 0.95 * normalize(data) 101 | 102 | if self.augment: 103 | amplitude = np.random.uniform(low=0.3, high=1.0) 104 | data = data * amplitude 105 | 106 | return torch.from_numpy(data).float(), sampling_rate 107 | 108 | def load_img_to_torch(self, full_path): 109 | data = np.load(full_path) 110 | return torch.from_numpy(data).float() -------------------------------------------------------------------------------- /d2m/engine/clip_grad_norm.py: -------------------------------------------------------------------------------- 1 | from torch.nn.utils import clip_grad_norm_ 2 | 3 | 4 | class ClipGradNorm(object): 5 | def __init__(self, 6 | start_iteration=0, 7 | end_iteration=-1, # if negative, the norm will be always clipped 8 | max_norm=0.5): 9 | self.start_iteration = start_iteration 10 | self.end_iteration = end_iteration 11 | self.max_norm = max_norm 12 | 13 | self.last_epoch = -1 14 | 15 | 16 | def __call__(self, parameters): 17 | self.last_epoch += 1 18 | clip = False 19 | if self.last_epoch >= self.start_iteration: 20 | clip = True 21 | if self.end_iteration > 0 and self.last_epoch < self.end_iteration: 22 | clip = True 23 | if clip: 24 | for params in parameters: 25 | clip_grad_norm_(params['params'], max_norm=self.max_norm) 26 | 27 | def state_dict(self): 28 | return {key: value for key, value in self.__dict__.items()} 29 | 30 | 31 | def load_state_dict(self, state_dict): 32 | self.__dict__.update(state_dict) -------------------------------------------------------------------------------- /d2m/engine/distributed.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import subprocess 3 | import numpy as np 4 | import os 5 | import sys 6 | import torch.distributed as dist 7 | 8 | 9 | def is_primary(): 10 | return get_rank() == 0 11 | 12 | 13 | def get_rank(): 14 | if not dist.is_available(): 15 | return 0 16 | 17 | if not dist.is_initialized(): 18 | return 0 19 | 20 | return dist.get_rank() 21 | 22 | 23 | def distribute_model(model, is_dirtributed): 24 | """Distribute the model on different machines""" 25 | if is_dirtributed: 26 | model = torch.nn.parallel.DistributedDataParallel(model.cuda(), device_ids=[torch.cuda.current_device()], find_unused_parameters=True) 27 | else: 28 | model.cuda() 29 | return model 30 | 31 | def master_only(func): 32 | """Wrapper that only run on rank=0 node""" 33 | @functools.wraps(func) 34 | def wrapper(*args, **kwargs): 35 | rank, _ = get_dist_info() 36 | if rank == 0: 37 | return func(*args, **kwargs) 38 | return wrapper 39 | 40 | def set_dist_rank(args): 41 | """Set up distributed rank and local rank""" 42 | ngpus_per_node = torch.cuda.device_count() 43 | dist_url = 'env://' 44 | if 'SLURM_PROCID' in os.environ: 45 | proc_id = int(os.environ['SLURM_PROCID']) 46 | ntasks = os.environ['SLURM_NTASKS'] 47 | node_list = os.environ['SLURM_NODELIST'] 48 | num_gpus = torch.cuda.device_count() 49 | addr = subprocess.getoutput('scontrol show hostname {} | head -n1'.format(node_list)) 50 | ## manually set is also ok ## 51 | master_port = str(np.random.randint(29480, 29510)) 52 | os.environ['MASTER_PORT'] = master_port 53 | os.environ['MASTER_ADDR'] = addr 54 | os.environ['WORLD_SIZE'] = str(ntasks) 55 | os.environ['RANK'] = str(proc_id) 56 | os.environ['LOCAL_RANK'] = str(proc_id % num_gpus) 57 | os.environ['LOCAL_SIZE'] = str(num_gpus) 58 | args.world_size = int(ntasks) 59 | args.rank = int(proc_id) 60 | args.local_rank = int(proc_id % num_gpus) 61 | print(f'SLURM MODE: proc_id: {proc_id}, ntasks: {ntasks}, node_list: {node_list}, num_gpus:{num_gpus}, addr:{addr}, master port:{master_port}', flush=True) 62 | else: 63 | rank = int(os.getenv('RANK')) if os.getenv('RANK') is not None else 0 64 | local_rank = int(os.getenv('LOCAL_RANK')) if os.getenv('LOCAL_RANK') is not None else 0 65 | world_size = int(os.getenv('WORLD_SIZE')) if os.getenv('WORLD_SIZE') is not None else 1 66 | dist.init_process_group( 67 | backend="nccl", 68 | init_method=dist_url, 69 | world_size=args.world_size, 70 | rank=args.rank, 71 | ) 72 | torch.cuda.set_device(args.local_rank) 73 | print('Distributed Init (rank {}): {}'.format(args.rank, dist_url), flush=True) 74 | torch.cuda.set_device(args.local_rank) 75 | setup_for_distributed(args.rank==0) 76 | dist.barrier() 77 | 78 | def get_dist_info(): 79 | """Get dist rank and world size from torch.dist""" 80 | if dist.is_available(): 81 | initialized = dist.is_initialized() 82 | else: 83 | initialized = False 84 | if initialized: 85 | rank = dist.get_rank() 86 | world_size = dist.get_world_size() 87 | else: 88 | rank = 0 89 | world_size = 1 90 | return rank, world_size 91 | 92 | def setup_for_distributed(is_master): 93 | """ 94 | This function disables printing when not in master process 95 | """ 96 | import builtins as __builtin__ 97 | builtin_print = __builtin__.print 98 | 99 | def print(*args, **kwargs): 100 | force = kwargs.pop('force', False) 101 | if is_master or force: 102 | builtin_print(*args, **kwargs) 103 | 104 | __builtin__.print = print -------------------------------------------------------------------------------- /d2m/engine/logger.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import 2 | from __future__ import division 3 | from __future__ import print_function 4 | 5 | import os 6 | import time 7 | import sys 8 | import torch 9 | from d2m.utils import write_args, save_config_to_yaml 10 | from d2m.engine.distributed import is_primary 11 | import torch.utils.tensorboard as tensorboard 12 | 13 | 14 | class Logger(object): 15 | def __init__(self, args, config): 16 | self.args = args 17 | self.log_path = config['log_path'] 18 | self.is_primary = is_primary() 19 | 20 | if self.is_primary: 21 | os.makedirs(self.log_path, exist_ok=True) 22 | 23 | # save the args and config 24 | self.config_dir = os.path.join(self.log_path, 'configs') 25 | os.makedirs(self.config_dir, exist_ok=True) 26 | file_name = os.path.join(self.config_dir, 'args.txt') 27 | write_args(args, file_name) 28 | 29 | log_dir = os.path.join(self.log_path, 'logs') 30 | if not os.path.exists(log_dir): 31 | os.makedirs(log_dir, exist_ok=True) 32 | self.text_writer = open(os.path.join(log_dir, 'log.txt'), 'a') # 'w') 33 | if args.tensorboard is True: 34 | self.log_info('using tensorboard') 35 | self.tb_writer = torch.utils.tensorboard.SummaryWriter(log_dir=log_dir) # tensorboard.SummaryWriter(log_dir=log_dir) 36 | else: 37 | self.tb_writer = None 38 | 39 | 40 | def save_config(self, config): 41 | if self.is_primary: 42 | save_config_to_yaml(config, os.path.join(self.config_dir, 'config.yaml')) 43 | 44 | def log_info(self, info, check_primary=True): 45 | if self.is_primary or (not check_primary): 46 | print(info) 47 | if self.is_primary: 48 | info = str(info) 49 | time_str = time.strftime('%Y-%m-%d-%H-%M') 50 | info = '{}: {}'.format(time_str, info) 51 | if not info.endswith('\n'): 52 | info += '\n' 53 | self.text_writer.write(info) 54 | self.text_writer.flush() 55 | 56 | def add_scalar(self, **kargs): 57 | """Log a scalar variable.""" 58 | if self.is_primary: 59 | if self.tb_writer is not None: 60 | self.tb_writer.add_scalar(**kargs) 61 | 62 | def add_scalars(self, **kargs): 63 | """Log a scalar variable.""" 64 | if self.is_primary: 65 | if self.tb_writer is not None: 66 | self.tb_writer.add_scalars(**kargs) 67 | 68 | def add_image(self, **kargs): 69 | """Log a scalar variable.""" 70 | if self.is_primary: 71 | if self.tb_writer is not None: 72 | self.tb_writer.add_image(**kargs) 73 | 74 | def add_images(self, **kargs): 75 | """Log a scalar variable.""" 76 | if self.is_primary: 77 | if self.tb_writer is not None: 78 | self.tb_writer.add_images(**kargs) 79 | 80 | 81 | def close(self): 82 | if self.is_primary: 83 | self.text_writer.close() 84 | self.tb_writer.close() 85 | 86 | -------------------------------------------------------------------------------- /d2m/engine/lr_scheduler.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import math 3 | # from torch.optim import AdamW, Adam 4 | from torch._six import inf 5 | from torch.optim.optimizer import Optimizer 6 | from torch.optim.lr_scheduler import _LRScheduler, CosineAnnealingLR 7 | 8 | 9 | 10 | class ReduceLROnPlateauWithWarmup(object): 11 | """Reduce learning rate when a metric has stopped improving. 12 | Models often benefit from reducing the learning rate by a factor 13 | of 2-10 once learning stagnates. This scheduler reads a metrics 14 | quantity and if no improvement is seen for a 'patience' number 15 | of epochs, the learning rate is reduced. 16 | 17 | Args: 18 | optimizer (Optimizer): Wrapped optimizer. 19 | mode (str): One of `min`, `max`. In `min` mode, lr will 20 | be reduced when the quantity monitored has stopped 21 | decreasing; in `max` mode it will be reduced when the 22 | quantity monitored has stopped increasing. Default: 'min'. 23 | factor (float): Factor by which the learning rate will be 24 | reduced. new_lr = lr * factor. Default: 0.1. 25 | patience (int): Number of epochs with no improvement after 26 | which learning rate will be reduced. For example, if 27 | `patience = 2`, then we will ignore the first 2 epochs 28 | with no improvement, and will only decrease the LR after the 29 | 3rd epoch if the loss still hasn't improved then. 30 | Default: 10. 31 | threshold (float): Threshold for measuring the new optimum, 32 | to only focus on significant changes. Default: 1e-4. 33 | threshold_mode (str): One of `rel`, `abs`. In `rel` mode, 34 | dynamic_threshold = best * ( 1 + threshold ) in 'max' 35 | mode or best * ( 1 - threshold ) in `min` mode. 36 | In `abs` mode, dynamic_threshold = best + threshold in 37 | `max` mode or best - threshold in `min` mode. Default: 'rel'. 38 | cooldown (int): Number of epochs to wait before resuming 39 | normal operation after lr has been reduced. Default: 0. 40 | min_lr (float or list): A scalar or a list of scalars. A 41 | lower bound on the learning rate of all param groups 42 | or each group respectively. Default: 0. 43 | eps (float): Minimal decay applied to lr. If the difference 44 | between new and old lr is smaller than eps, the update is 45 | ignored. Default: 1e-8. 46 | verbose (bool): If ``True``, prints a message to stdout for 47 | each update. Default: ``False``. 48 | warmup_lr: float or None, the learning rate to be touched after warmup 49 | warmup: int, the number of steps to warmup 50 | """ 51 | 52 | def __init__(self, optimizer, mode='min', factor=0.1, patience=10, 53 | threshold=1e-4, threshold_mode='rel', cooldown=0, 54 | min_lr=0, eps=1e-8, verbose=False, warmup_lr=None, 55 | warmup=0): 56 | 57 | if factor >= 1.0: 58 | raise ValueError('Factor should be < 1.0.') 59 | self.factor = factor 60 | 61 | # Attach optimizer 62 | if not isinstance(optimizer, Optimizer): 63 | raise TypeError('{} is not an Optimizer'.format( 64 | type(optimizer).__name__)) 65 | self.optimizer = optimizer 66 | 67 | if isinstance(min_lr, list) or isinstance(min_lr, tuple): 68 | if len(min_lr) != len(optimizer.param_groups): 69 | raise ValueError("expected {} min_lrs, got {}".format( 70 | len(optimizer.param_groups), len(min_lr))) 71 | self.min_lrs = list(min_lr) 72 | else: 73 | self.min_lrs = [min_lr] * len(optimizer.param_groups) 74 | 75 | self.patience = patience 76 | self.verbose = verbose 77 | self.cooldown = cooldown 78 | self.cooldown_counter = 0 79 | self.mode = mode 80 | self.threshold = threshold 81 | self.threshold_mode = threshold_mode 82 | 83 | self.warmup_lr = warmup_lr 84 | self.warmup = warmup 85 | 86 | 87 | self.best = None 88 | self.num_bad_epochs = None 89 | self.mode_worse = None # the worse value for the chosen mode 90 | self.eps = eps 91 | self.last_epoch = 0 92 | self._init_is_better(mode=mode, threshold=threshold, 93 | threshold_mode=threshold_mode) 94 | self._reset() 95 | 96 | def _prepare_for_warmup(self): 97 | if self.warmup_lr is not None: 98 | if isinstance(self.warmup_lr, (list, tuple)): 99 | if len(self.warmup_lr) != len(self.optimizer.param_groups): 100 | raise ValueError("expected {} warmup_lrs, got {}".format( 101 | len(self.optimizer.param_groups), len(self.warmup_lr))) 102 | self.warmup_lrs = list(self.warmup_lr) 103 | else: 104 | self.warmup_lrs = [self.warmup_lr] * len(self.optimizer.param_groups) 105 | else: 106 | self.warmup_lrs = None 107 | if self.warmup > self.last_epoch: 108 | curr_lrs = [group['lr'] for group in self.optimizer.param_groups] 109 | self.warmup_lr_steps = [max(0, (self.warmup_lrs[i] - curr_lrs[i])/float(self.warmup)) for i in range(len(curr_lrs))] 110 | else: 111 | self.warmup_lr_steps = None 112 | 113 | def _reset(self): 114 | """Resets num_bad_epochs counter and cooldown counter.""" 115 | self.best = self.mode_worse 116 | self.cooldown_counter = 0 117 | self.num_bad_epochs = 0 118 | 119 | def step(self, metrics): 120 | # convert `metrics` to float, in case it's a zero-dim Tensor 121 | current = float(metrics) 122 | epoch = self.last_epoch + 1 123 | self.last_epoch = epoch 124 | 125 | if epoch <= self.warmup: 126 | self._increase_lr(epoch) 127 | else: 128 | if self.is_better(current, self.best): 129 | self.best = current 130 | self.num_bad_epochs = 0 131 | else: 132 | self.num_bad_epochs += 1 133 | 134 | if self.in_cooldown: 135 | self.cooldown_counter -= 1 136 | self.num_bad_epochs = 0 # ignore any bad epochs in cooldown 137 | 138 | if self.num_bad_epochs > self.patience: 139 | self._reduce_lr(epoch) 140 | self.cooldown_counter = self.cooldown 141 | self.num_bad_epochs = 0 142 | 143 | self._last_lr = [group['lr'] for group in self.optimizer.param_groups] 144 | 145 | def _reduce_lr(self, epoch): 146 | for i, param_group in enumerate(self.optimizer.param_groups): 147 | old_lr = float(param_group['lr']) 148 | new_lr = max(old_lr * self.factor, self.min_lrs[i]) 149 | if old_lr - new_lr > self.eps: 150 | param_group['lr'] = new_lr 151 | if self.verbose: 152 | print('Epoch {:5d}: reducing learning rate' 153 | ' of group {} to {:.4e}.'.format(epoch, i, new_lr)) 154 | 155 | def _increase_lr(self, epoch): 156 | # used for warmup 157 | for i, param_group in enumerate(self.optimizer.param_groups): 158 | old_lr = float(param_group['lr']) 159 | new_lr = max(old_lr + self.warmup_lr_steps[i], self.min_lrs[i]) 160 | param_group['lr'] = new_lr 161 | if self.verbose: 162 | print('Epoch {:5d}: increasing learning rate' 163 | ' of group {} to {:.4e}.'.format(epoch, i, new_lr)) 164 | 165 | @property 166 | def in_cooldown(self): 167 | return self.cooldown_counter > 0 168 | 169 | def is_better(self, a, best): 170 | if self.mode == 'min' and self.threshold_mode == 'rel': 171 | rel_epsilon = 1. - self.threshold 172 | return a < best * rel_epsilon 173 | 174 | elif self.mode == 'min' and self.threshold_mode == 'abs': 175 | return a < best - self.threshold 176 | 177 | elif self.mode == 'max' and self.threshold_mode == 'rel': 178 | rel_epsilon = self.threshold + 1. 179 | return a > best * rel_epsilon 180 | 181 | else: # mode == 'max' and epsilon_mode == 'abs': 182 | return a > best + self.threshold 183 | 184 | def _init_is_better(self, mode, threshold, threshold_mode): 185 | if mode not in {'min', 'max'}: 186 | raise ValueError('mode ' + mode + ' is unknown!') 187 | if threshold_mode not in {'rel', 'abs'}: 188 | raise ValueError('threshold mode ' + threshold_mode + ' is unknown!') 189 | 190 | if mode == 'min': 191 | self.mode_worse = inf 192 | else: # mode == 'max': 193 | self.mode_worse = -inf 194 | 195 | self.mode = mode 196 | self.threshold = threshold 197 | self.threshold_mode = threshold_mode 198 | 199 | self._prepare_for_warmup() 200 | 201 | def state_dict(self): 202 | return {key: value for key, value in self.__dict__.items() if key != 'optimizer'} 203 | 204 | def load_state_dict(self, state_dict): 205 | self.__dict__.update(state_dict) 206 | self._init_is_better(mode=self.mode, threshold=self.threshold, threshold_mode=self.threshold_mode) 207 | 208 | 209 | class CosineAnnealingLRWithWarmup(object): 210 | """ 211 | adjust lr: 212 | 213 | args: 214 | warmup_lr: float or None, the learning rate to be touched after warmup 215 | warmup: int, the number of steps to warmup 216 | """ 217 | 218 | def __init__(self, optimizer, T_max, last_epoch=-1, verbose=False, 219 | min_lr=0, warmup_lr=None, warmup=0): 220 | self.optimizer = optimizer 221 | self.T_max = T_max 222 | self.last_epoch = last_epoch 223 | self.verbose = verbose 224 | self.warmup_lr = warmup_lr 225 | self.warmup = warmup 226 | 227 | if isinstance(min_lr, list) or isinstance(min_lr, tuple): 228 | if len(min_lr) != len(optimizer.param_groups): 229 | raise ValueError("expected {} min_lrs, got {}".format( 230 | len(optimizer.param_groups), len(min_lr))) 231 | self.min_lrs = list(min_lr) 232 | else: 233 | self.min_lrs = [min_lr] * len(optimizer.param_groups) 234 | self.max_lrs = [lr for lr in self.min_lrs] 235 | 236 | self._prepare_for_warmup() 237 | 238 | def step(self): 239 | epoch = self.last_epoch + 1 240 | self.last_epoch = epoch 241 | 242 | if epoch <= self.warmup: 243 | self._increase_lr(epoch) 244 | else: 245 | self._reduce_lr(epoch) 246 | 247 | def _reduce_lr(self, epoch): 248 | for i, param_group in enumerate(self.optimizer.param_groups): 249 | progress = float(epoch - self.warmup) / float(max(1, self.T_max - self.warmup)) 250 | factor = max(0.0, 0.5 * (1.0 + math.cos(math.pi * progress))) 251 | old_lr = float(param_group['lr']) 252 | new_lr = max(self.max_lrs[i] * factor, self.min_lrs[i]) 253 | param_group['lr'] = new_lr 254 | if self.verbose: 255 | print('Epoch {:5d}: reducing learning rate' 256 | ' of group {} to {:.4e}.'.format(epoch, i, new_lr)) 257 | 258 | def _increase_lr(self, epoch): 259 | # used for warmup 260 | for i, param_group in enumerate(self.optimizer.param_groups): 261 | old_lr = float(param_group['lr']) 262 | new_lr = old_lr + self.warmup_lr_steps[i] 263 | param_group['lr'] = new_lr 264 | self.max_lrs[i] = max(self.max_lrs[i], new_lr) 265 | if self.verbose: 266 | print('Epoch {:5d}: increasing learning rate' 267 | ' of group {} to {:.4e}.'.format(epoch, i, new_lr)) 268 | 269 | def _prepare_for_warmup(self): 270 | if self.warmup_lr is not None: 271 | if isinstance(self.warmup_lr, (list, tuple)): 272 | if len(self.warmup_lr) != len(self.optimizer.param_groups): 273 | raise ValueError("expected {} warmup_lrs, got {}".format( 274 | len(self.optimizer.param_groups), len(self.warmup_lr))) 275 | self.warmup_lrs = list(self.warmup_lr) 276 | else: 277 | self.warmup_lrs = [self.warmup_lr] * len(self.optimizer.param_groups) 278 | else: 279 | self.warmup_lrs = None 280 | if self.warmup > self.last_epoch: 281 | curr_lrs = [group['lr'] for group in self.optimizer.param_groups] 282 | self.warmup_lr_steps = [max(0, (self.warmup_lrs[i] - curr_lrs[i])/float(self.warmup)) for i in range(len(curr_lrs))] 283 | else: 284 | self.warmup_lr_steps = None 285 | 286 | 287 | def state_dict(self): 288 | return {key: value for key, value in self.__dict__.items() if key != 'optimizer'} 289 | 290 | def load_state_dict(self, state_dict): 291 | self.__dict__.update(state_dict) 292 | self._prepare_for_warmup() -------------------------------------------------------------------------------- /d2m/loris_modules.py: -------------------------------------------------------------------------------- 1 | import torch.nn as nn 2 | import torch.nn.functional as F 3 | import torch 4 | import math 5 | import numpy as np 6 | from audio_diffusion_pytorch import AudioDiffusionModel, AudioDiffusionConditional, KarrasSchedule, KarrasSampler, AEulerSampler 7 | from d2m.st_gcn.st_gcn_aaai18 import st_gcn_baseline 8 | 9 | 10 | class MotionEncoder(nn.Module): 11 | def __init__(self, context_length): 12 | super().__init__() 13 | self.context_length = context_length 14 | in_channels = 3 15 | d_model = 1024 16 | layers = 9 17 | pose_net = st_gcn_baseline(in_channels, d_model, layers=layers, layout='coco', dropout=0.1) 18 | self.pose_net = pose_net 19 | self.avgpool1d = nn.AvgPool1d(2, stride=2) 20 | 21 | def forward(self, x): 22 | ''' 23 | input: bs, context_length, 17, 3 24 | output: bs, context_length // 2, d_model 25 | ''' 26 | bs = x.size()[0] # bs, context_length, 17, 3 27 | pose = self.pose_net(x.permute(0, 3, 1, 2).unsqueeze(-1)) 28 | out = self.avgpool1d(pose).permute(0, 2, 1) 29 | return out 30 | 31 | 32 | class VideoEncoder(nn.Module): 33 | def __init__(self, context_length, video_dim): 34 | super().__init__() 35 | self.context_length = context_length 36 | self.video_dim = video_dim 37 | self.lstm = nn.LSTM(video_dim, video_dim//2, 2, batch_first=True, bidirectional=True) 38 | 39 | def forward(self, x): 40 | ''' 41 | input: bs, context_length, C 42 | output: bs, context_length, C 43 | ''' 44 | bs = x.size(0) 45 | x = x.view(bs, self.context_length, -1) 46 | h0 = torch.randn(4, bs, self.video_dim//2).to(x.device) 47 | c0 = torch.randn(4, bs, self.video_dim//2).to(x.device) 48 | out, hidden = self.lstm(x, (h0, c0)) 49 | self.lstm.flatten_parameters() 50 | return out 51 | 52 | 53 | class RhythmEncoder(nn.Module): 54 | def __init__(self, config): 55 | super().__init__() 56 | self.nbins = config['nbins'] 57 | self.win_mean = config['post_avg'] + config['pre_avg'] 58 | self.win_max = config['post_max'] + config['pre_max'] 59 | self.threshold = config['threshold'] 60 | 61 | def directogram(self, pose): 62 | gxy = pose[:, :, :, :2] # bs, T, 17, 2, remove confidence 63 | gxy = gxy.permute(0, 1, 3, 2) # bs, T, 2, 17 64 | magnitude = gxy.norm(dim=2)[:, :, None, :] 65 | phase = torch.atan2(gxy[:, :, 1, :], gxy[:, :, 0, :]) 66 | phase_int = phase * (180 / math.pi) % 180 67 | phase_int = phase_int[:, :, None, :] 68 | phase_bin = phase_int.floor().long() % self.nbins 69 | n, t, c, j = gxy.shape 70 | out = torch.zeros((n, t, self.nbins, j), dtype=torch.float, device=gxy.device) 71 | out.scatter_(2, phase_bin, magnitude) 72 | out = out.sum(3) # bs, T, nbins 73 | return out 74 | 75 | def pick_peak(self, rhy_env): 76 | bs, n = rhy_env.shape 77 | rhy_local_mean = rhy_env.unfold(1, self.win_mean, 1).mean(dim=2) 78 | rhy_local_mean = F.pad(rhy_local_mean, (0, n-rhy_local_mean.size(1))) 79 | rhy_local_max = torch.max(rhy_env.unfold(1, self.win_max, 1), dim=2)[0] 80 | rhy_local_max = F.pad(rhy_local_max, (0, n-rhy_local_max.size(1))) 81 | rhy_global_max = torch.mean(rhy_env, dim=1, keepdim=True).repeat(1, n) 82 | rhy_peak = ((rhy_local_max - rhy_local_mean) > (0.1 * rhy_global_max)) * (rhy_local_max == rhy_env) 83 | rhy_peak = rhy_peak.long() 84 | rhy_peak_mask = F.pad(rhy_peak[:, 1:] - rhy_peak[:, :-1], (0, 1)) 85 | rhy_peak_mask = rhy_peak_mask.bool() 86 | rhy_peak *= rhy_peak_mask 87 | return rhy_peak 88 | 89 | def forward(self, pose): 90 | ''' 91 | input: bs, context_length, 17, 3 92 | output: rhy_peak: bs, context_length; rhy_env: bs, context_length 93 | ''' 94 | bs = pose.size(0) # bs, context_length, 17, 3 95 | motion = pose[:, 1:] - pose[:, :-1] 96 | # motion = F.pad(motion, (0, 0, 0, 0, 0, 1), mode='constant') # bs, context_length, 17, 3 97 | directo = self.directogram(motion) # bs, context_length, K 98 | sf = directo[:, 1:] - directo[:, :-1] # compute spectral flux 99 | # sf = F.pad(sf, (0, 0, 0, 1), mode="constant") 100 | sf_abs = (sf + torch.abs(sf)) / 2 # only consider increase 101 | rhy_env = torch.sum(sf_abs, dim=2, keepdim=False) # bs, context_length 102 | rhy_env = rhy_env / torch.max(rhy_env, dim=1, keepdim=True)[0] # normalize to 0-1 103 | rhy_peak = self.pick_peak(rhy_env) 104 | return rhy_peak, rhy_env.unsqueeze(-1) 105 | 106 | 107 | class GenreEncoder(nn.Module): 108 | def __init__(self, config): 109 | super().__init__() 110 | self.num_embed = config['num_embed'] 111 | self.embed_dim = config['embed_dim'] 112 | self.genre_embed = nn.Embedding(self.num_embed, self.embed_dim) 113 | 114 | def forward(self, genre): 115 | ''' 116 | input: bs, num_embed (one-hot vector) 117 | output: bs, 1, embed_dim 118 | ''' 119 | genre_idx = genre.nonzero(as_tuple=True)[1].cuda() 120 | genre_emb = self.genre_embed(genre_idx).unsqueeze(1) 121 | return genre_emb 122 | 123 | 124 | class LORIS(nn.Module): 125 | def __init__(self, config): 126 | super().__init__() 127 | self.motion_context_length = config['motion_context_length'] 128 | self.video_context_length = config['video_context_length'] 129 | self.diffusion_length = config['diffusion_length'] 130 | self.diffusion_step = config['diffusion_step'] 131 | self.embedding_scale = config['embedding_scale'] 132 | motion_dim = config['motion_dim'] 133 | video_dim = config['video_dim'] 134 | condition_dim = config['condition_dim'] 135 | self.sample_rate = config['sample_rate'] 136 | self.segment_length = config['segment_length'] 137 | self.vencoder = VideoEncoder(self.video_context_length, video_dim) 138 | self.genre_dim = None 139 | # self.mencoder = MotionEncoder(self.motion_context_length) 140 | self.rencoder = RhythmEncoder(config['rhythm_config']) 141 | self.use_genre = config['genre_config']['use_genre'] 142 | if self.use_genre: 143 | self.gencoder = GenreEncoder(config['genre_config']) 144 | self.genre_dim = config['genre_config']['embed_dim'] 145 | # self.cond_lin = nn.Linear(video_dim+motion_dim, condition_dim) 146 | self.cond_lin = nn.Linear(video_dim, condition_dim) 147 | self.autoencoder_type = config['autoencoder_type'] 148 | if self.autoencoder_type == 'diffusion': 149 | self.diffusion = AudioDiffusionModel( 150 | in_channels=2, 151 | channels=256, 152 | patch_blocks=1, 153 | patch_factor=32, 154 | multipliers=[1, 2, 4, 4, 4, 4, 4], 155 | factors=[4, 4, 4, 2, 2, 2], 156 | num_blocks=[2, 2, 2, 2, 2, 2], 157 | attention_heads=16, 158 | ) 159 | elif self.autoencoder_type == 'cond_diffusion': 160 | self.cond_diffusion = AudioDiffusionConditional( 161 | in_channels=2, 162 | channels=256, 163 | patch_blocks=1, 164 | patch_factor=32, 165 | multipliers=[1, 2, 4, 4, 4, 4, 4], 166 | factors=[4, 4, 4, 2, 2, 2], 167 | num_blocks=[2, 2, 2, 2, 2, 2], 168 | attention_heads=16, 169 | embedding_max_length=self.video_context_length, 170 | rhythm_max_length=self.motion_context_length, 171 | embedding_features=condition_dim, 172 | genre_features=self.genre_dim, 173 | embedding_mask_proba=0.1, # Conditional dropout of batch elements 174 | ) 175 | else: 176 | raise NotImplementedError ("Unrecognised Autoencoder Type!") 177 | 178 | 179 | def sample(self, input): 180 | cond_motion_input = input['motion'] 181 | cond_video_input = input['video'] 182 | content = input['music'] 183 | if self.use_genre: 184 | cond_genre_input = input['genre'] 185 | cond_genre = self.gencoder(cond_genre_input) 186 | batch_size = content.size(0) 187 | cond_video = self.vencoder(cond_video_input) 188 | cond_rhy_peak, cond_rhy_env = self.rencoder(cond_motion_input) 189 | cond_rhy_peak = cond_rhy_peak.unsqueeze(-1).float() 190 | cond_emb = self.cond_lin(cond_video) 191 | noise = torch.randn(batch_size, 2, 2 ** self.diffusion_length).cuda() 192 | if self.autoencoder_type == 'diffusion': 193 | samples = self.diffusion.sample( 194 | noise=noise, 195 | num_steps=self.diffusion_step, 196 | ) 197 | elif self.autoencoder_type == 'cond_diffusion': 198 | if self.use_genre: 199 | samples = self.cond_diffusion.sample( 200 | noise, 201 | num_steps=self.diffusion_step, 202 | embedding=cond_emb, 203 | embedding_scale=self.embedding_scale, # Classifier-free guidance scale 204 | rhythm=cond_rhy_peak, 205 | genre=cond_genre, 206 | ) 207 | else: 208 | samples = self.cond_diffusion.sample( 209 | noise, 210 | num_steps=self.diffusion_step, 211 | embedding=cond_emb, 212 | embedding_scale=self.embedding_scale, # Classifier-free guidance scale 213 | rhythm=cond_rhy_peak, 214 | ) 215 | else: 216 | raise NotImplementedError ("Unrecognised Autoencoder Type!") 217 | return samples 218 | 219 | def forward(self, input): 220 | cond_motion_input = input['motion'] 221 | cond_video_input = input['video'] 222 | content = input['music'] 223 | if self.use_genre: 224 | cond_genre_input = input['genre'] 225 | cond_genre = self.gencoder(cond_genre_input) 226 | 227 | # cond_motion = self.mencoder(cond_motion_input) 228 | cond_video = self.vencoder(cond_video_input) 229 | cond_rhy_peak, cond_rhy_env = self.rencoder(cond_motion_input) 230 | cond_rhy_peak = cond_rhy_peak.unsqueeze(-1).float() 231 | 232 | # cond_emb = self.cond_lin(torch.cat((cond_video, cond_motion), -1)) 233 | cond_emb = self.cond_lin(cond_video) 234 | # print(f"check content shape: {content.shape}") 235 | content = content.expand(content.shape[0], 2, content.shape[2]) # mono to binaural to fit the pre-trained model 236 | if self.autoencoder_type == 'diffusion': 237 | loss = self.diffusion(content[:, :, :2 ** self.diffusion_length]) 238 | elif self.autoencoder_type == 'cond_diffusion': 239 | if self.use_genre: 240 | loss = self.cond_diffusion(content[:, :, :2 ** self.diffusion_length], embedding=cond_emb, rhythm=cond_rhy_peak, genre=cond_genre) 241 | else: 242 | loss = self.cond_diffusion(content[:, :, :2 ** self.diffusion_length], embedding=cond_emb, rhythm=cond_rhy_peak) 243 | else: 244 | raise NotImplementedError ("Unrecognised Autoencoder Type!") 245 | 246 | return loss 247 | -------------------------------------------------------------------------------- /d2m/st_gcn/ops/__init__.py: -------------------------------------------------------------------------------- 1 | from .gconv_origin import ConvTemporalGraphical 2 | from .graph import Graph -------------------------------------------------------------------------------- /d2m/st_gcn/ops/gconv_origin.py: -------------------------------------------------------------------------------- 1 | # The based unit of graph convolutional networks. 2 | # This is the original implementation for ST-GCN papers. 3 | 4 | import torch 5 | import torch.nn as nn 6 | 7 | class ConvTemporalGraphical(nn.Module): 8 | r"""The basic module for applying a graph convolution. 9 | Args: 10 | in_channels (int): Number of channels in the input sequence data 11 | out_channels (int): Number of channels produced by the convolution 12 | kernel_size (int): Size of the graph convolving kernel 13 | t_kernel_size (int): Size of the temporal convolving kernel 14 | t_stride (int, optional): Stride of the temporal convolution. Default: 1 15 | t_padding (int, optional): Temporal zero-padding added to both sides of 16 | the input. Default: 0 17 | t_dilation (int, optional): Spacing between temporal kernel elements. 18 | Default: 1 19 | bias (bool, optional): If ``True``, adds a learnable bias to the output. 20 | Default: ``True`` 21 | Shape: 22 | - Input[0]: Input graph sequence in :math:`(N, in_channels, T_{in}, V)` format 23 | - Input[1]: Input graph adjacency matrix in :math:`(K, V, V)` format 24 | - Output[0]: Output graph sequence in :math:`(N, out_channels, T_{out}, V)` format 25 | - Output[1]: Graph adjacency matrix for output data in :math:`(K, V, V)` format 26 | where 27 | :math:`N` is a batch size, 28 | :math:`K` is the spatial kernel size, as :math:`K == kernel_size[1]`, 29 | :math:`T_{in}/T_{out}` is a length of input/output sequence, 30 | :math:`V` is the number of graph nodes. 31 | """ 32 | def __init__(self, 33 | in_channels, 34 | out_channels, 35 | kernel_size, 36 | t_kernel_size=1, 37 | t_stride=1, 38 | t_padding=0, 39 | t_dilation=1, 40 | bias=True): 41 | super().__init__() 42 | 43 | self.kernel_size = kernel_size 44 | self.conv = nn.Conv2d(in_channels, 45 | out_channels * kernel_size, 46 | kernel_size=(t_kernel_size, 1), 47 | padding=(t_padding, 0), 48 | stride=(t_stride, 1), 49 | dilation=(t_dilation, 1), 50 | bias=bias) 51 | 52 | def forward(self, x, A): 53 | assert A.size(0) == self.kernel_size 54 | 55 | x = self.conv(x) 56 | 57 | n, kc, t, v = x.size() 58 | x = x.view(n, self.kernel_size, kc // self.kernel_size, t, v) 59 | x = torch.einsum('nkctv,kvw->nctw', (x, A)) 60 | 61 | return x.contiguous(), A -------------------------------------------------------------------------------- /d2m/st_gcn/ops/graph.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | 3 | 4 | class Graph(): 5 | """ The Graph to model the skeletons extracted by the openpose 6 | 7 | Args: 8 | strategy (string): must be one of the follow candidates 9 | - uniform: Uniform Labeling 10 | - distance: Distance Partitioning 11 | - spatial: Spatial Configuration 12 | For more information, please refer to the section 'Partition Strategies' 13 | in our paper (https://arxiv.org/abs/1801.07455). 14 | 15 | layout (string): must be one of the follow candidates 16 | - openpose: Is consists of 18 joints. For more information, please 17 | refer to https://github.com/CMU-Perceptual-Computing-Lab/openpose#output 18 | - ntu-rgb+d: Is consists of 25 joints. For more information, please 19 | refer to https://github.com/shahroudy/NTURGB-D 20 | 21 | max_hop (int): the maximal distance between two connected nodes 22 | dilation (int): controls the spacing between the kernel points 23 | 24 | """ 25 | 26 | def __init__(self, 27 | layout='openpose', 28 | strategy='uniform', 29 | max_hop=1, 30 | dilation=1): 31 | self.max_hop = max_hop 32 | self.dilation = dilation 33 | 34 | self.get_edge(layout) 35 | self.hop_dis = get_hop_distance(self.num_node, 36 | self.edge, 37 | max_hop=max_hop) 38 | self.get_adjacency(strategy) 39 | 40 | def __str__(self): 41 | return self.A 42 | 43 | def get_edge(self, layout): 44 | # edge is a list of [child, parent] paris 45 | 46 | if layout == 'openpose': 47 | self.num_node = 18 48 | self_link = [(i, i) for i in range(self.num_node)] 49 | neighbor_link = [(4, 3), (3, 2), (7, 6), (6, 5), 50 | (13, 12), (12, 11), (10, 9), (9, 8), (11, 5), 51 | (8, 2), (5, 1), (2, 1), (0, 1), (15, 0), (14, 0), 52 | (17, 15), (16, 14)] 53 | self.edge = self_link + neighbor_link 54 | self.center = 1 55 | elif layout == 'ntu-rgb+d': 56 | self.num_node = 25 57 | self_link = [(i, i) for i in range(self.num_node)] 58 | neighbor_1base = [(1, 2), (2, 21), (3, 21), 59 | (4, 3), (5, 21), (6, 5), (7, 6), (8, 7), (9, 21), 60 | (10, 9), (11, 10), (12, 11), (13, 1), (14, 13), 61 | (15, 14), (16, 15), (17, 1), (18, 17), (19, 18), 62 | (20, 19), (22, 23), (23, 8), (24, 25), (25, 12)] 63 | neighbor_link = [(i - 1, j - 1) for (i, j) in neighbor_1base] 64 | self.edge = self_link + neighbor_link 65 | self.center = 21 - 1 66 | elif layout == 'ntu_edge': 67 | self.num_node = 24 68 | self_link = [(i, i) for i in range(self.num_node)] 69 | neighbor_1base = [(1, 2), (3, 2), (4, 3), (5, 2), (6, 5), (7, 6), 70 | (8, 7), (9, 2), (10, 9), (11, 10), (12, 11), 71 | (13, 1), (14, 13), (15, 14), (16, 15), (17, 1), 72 | (18, 17), (19, 18), (20, 19), (21, 22), (22, 8), 73 | (23, 24), (24, 12)] 74 | neighbor_link = [(i - 1, j - 1) for (i, j) in neighbor_1base] 75 | self.edge = self_link + neighbor_link 76 | self.center = 2 77 | elif layout == 'coco': 78 | self.num_node = 17 79 | self_link = [(i, i) for i in range(self.num_node)] 80 | neighbor_1base = [[16, 14], [14, 12], [17, 15], [15, 13], [12, 13], 81 | [6, 12], [7, 13], [6, 7], [8, 6], [9, 7], 82 | [10, 8], [11, 9], [2, 3], [2, 1], [3, 1], [4, 2], 83 | [5, 3], [4, 6], [5, 7]] 84 | neighbor_link = [(i - 1, j - 1) for (i, j) in neighbor_1base] 85 | self.edge = self_link + neighbor_link 86 | self.center = 0 87 | elif layout == 'body25': 88 | self.num_node = 25 89 | self_link = [(i, i) for i in range(self.num_node)] 90 | neighbor_link = [(1, 8), (1, 2), (1, 5), (2, 3), (3, 4), (5, 6), (6, 7), (8, 9), (9, 10), (10, 11), (8, 12), 91 | (12, 13), (13, 14), (1, 0), 92 | (0, 15), (15, 17), (0, 16), (16, 93 | 18), (14, 19), (19, 20), (14, 21), 94 | (11, 22), (22, 23), (11, 24)] 95 | self.edge = self_link + neighbor_link 96 | self.center = 1 97 | elif layout == 'hands': 98 | self.num_node = 21 * 2 99 | self_link = [(i, i) for i in range(self.num_node)] 100 | left_hand = [ 101 | (0, 1), (1, 2), (2, 3), (3, 4), 102 | (0, 5), (5, 6), (6, 7), (7, 8), 103 | (0, 9), (9, 10), (10, 11), (11, 12), 104 | (0, 13), (13, 14), (14, 15), (15, 16), 105 | (0, 17), (17, 18), (18, 19), (19, 20), 106 | ] 107 | right_hand = [(a + 21, b + 21) for a, b in left_hand] 108 | # neighbor_link = left_hand + right_hand + [(0, 21)] 109 | neighbor_link = left_hand + right_hand 110 | self.edge = self_link + neighbor_link 111 | self.center = 0 112 | 113 | elif layout == 'body65': 114 | self.num_node = 65 115 | self_link = [(i, i) for i in range(self.num_node)] 116 | body = [ 117 | (1, 8), (1, 2), (1, 5), (2, 3), (3, 4), 118 | (5, 6), (6, 7), (8, 9), (9, 10), (10, 11), (8, 12), 119 | (12, 13), (13, 14), (1, 0), 120 | (0, 15), (15, 17), (0, 16), 121 | (16, 18), (14, 19), (19, 20), (14, 21), 122 | (11, 22), (22, 23), (11, 24) 123 | ] 124 | 125 | def hand(i): 126 | return [ 127 | (i, 1), (1, 2), (2, 3), (3, 4), 128 | (i, 5), (5, 6), (6, 7), (7, 8), 129 | (i, 9), (9, 10), (10, 11), (11, 12), 130 | (i, 13), (13, 14), (14, 15), (15, 16), 131 | (i, 17), (17, 18), (18, 19), (19, 20), 132 | ] 133 | 134 | left_hand = [(a + 24, b + 24) for a, b in hand(7 - 24)] 135 | right_hand = [(a + 44, b + 44) for a, b in hand(4 - 44)] 136 | self.edge = self_link + body + left_hand + right_hand 137 | self.center = 1 138 | 139 | # elif layout=='customer settings' 140 | # pass 141 | else: 142 | raise ValueError("Do Not Exist This Layout.") 143 | 144 | def get_adjacency(self, strategy): 145 | valid_hop = range(0, self.max_hop + 1, self.dilation) 146 | adjacency = np.zeros((self.num_node, self.num_node)) 147 | for hop in valid_hop: 148 | adjacency[self.hop_dis == hop] = 1 149 | normalize_adjacency = normalize_digraph(adjacency) 150 | 151 | if strategy == 'uniform': 152 | A = np.zeros((1, self.num_node, self.num_node)) 153 | A[0] = normalize_adjacency 154 | self.A = A 155 | elif strategy == 'distance': 156 | A = np.zeros((len(valid_hop), self.num_node, self.num_node)) 157 | for i, hop in enumerate(valid_hop): 158 | A[i][self.hop_dis == hop] = normalize_adjacency[self.hop_dis == 159 | hop] 160 | self.A = A 161 | elif strategy == 'spatial': 162 | A = [] 163 | for hop in valid_hop: 164 | a_root = np.zeros((self.num_node, self.num_node)) 165 | a_close = np.zeros((self.num_node, self.num_node)) 166 | a_further = np.zeros((self.num_node, self.num_node)) 167 | for i in range(self.num_node): 168 | for j in range(self.num_node): 169 | if self.hop_dis[j, i] == hop: 170 | if self.hop_dis[j, self.center] == self.hop_dis[ 171 | i, self.center]: 172 | a_root[j, i] = normalize_adjacency[j, i] 173 | elif self.hop_dis[j, self.center] > self.hop_dis[ 174 | i, self.center]: 175 | a_close[j, i] = normalize_adjacency[j, i] 176 | else: 177 | a_further[j, i] = normalize_adjacency[j, i] 178 | if hop == 0: 179 | A.append(a_root) 180 | else: 181 | A.append(a_root + a_close) 182 | A.append(a_further) 183 | A = np.stack(A) 184 | self.A = A 185 | else: 186 | raise ValueError("Do Not Exist This Strategy") 187 | 188 | 189 | def get_hop_distance(num_node, edge, max_hop=1): 190 | A = np.zeros((num_node, num_node)) 191 | for i, j in edge: 192 | A[j, i] = 1 193 | A[i, j] = 1 194 | 195 | # compute hop steps 196 | hop_dis = np.zeros((num_node, num_node)) + np.inf 197 | transfer_mat = [np.linalg.matrix_power(A, d) for d in range(max_hop + 1)] 198 | arrive_mat = (np.stack(transfer_mat) > 0) 199 | for d in range(max_hop, -1, -1): 200 | hop_dis[arrive_mat[d]] = d 201 | return hop_dis 202 | 203 | 204 | def normalize_digraph(A): 205 | Dl = np.sum(A, 0) 206 | num_node = A.shape[0] 207 | Dn = np.zeros((num_node, num_node)) 208 | for i in range(num_node): 209 | if Dl[i] > 0: 210 | Dn[i, i] = Dl[i] ** (-1) 211 | AD = np.dot(A, Dn) 212 | return AD 213 | 214 | 215 | def normalize_undigraph(A): 216 | Dl = np.sum(A, 0) 217 | num_node = A.shape[0] 218 | Dn = np.zeros((num_node, num_node)) 219 | for i in range(num_node): 220 | if Dl[i] > 0: 221 | Dn[i, i] = Dl[i] ** (-0.5) 222 | DAD = np.dot(np.dot(Dn, A), Dn) 223 | return DAD 224 | -------------------------------------------------------------------------------- /d2m/st_gcn/st_gcn_aaai18.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import torch.nn as nn 3 | import torch.nn.functional as F 4 | 5 | from .ops import ConvTemporalGraphical, Graph 6 | 7 | 8 | class ST_GCN_18(nn.Module): 9 | r"""Spatial temporal graph convolutional networks. 10 | 11 | Args: 12 | in_channels (int): Number of channels in the input data 13 | num_class (int): Number of classes for the classification task 14 | graph_cfg (dict): The arguments for building the graph 15 | edge_importance_weighting (bool): If ``True``, adds a learnable 16 | importance weighting to the edges of the graph 17 | **kwargs (optional): Other parameters for graph convolution units 18 | 19 | Shape: 20 | - Input: :math:`(N, in_channels, T_{in}, V_{in}, M_{in})` 21 | - Output: :math:`(N, num_class)` where 22 | :math:`N` is a batch size, 23 | :math:`T_{in}` is a length of input sequence, 24 | :math:`V_{in}` is the number of graph nodes, 25 | :math:`M_{in}` is the number of instance in a frame. 26 | """ 27 | 28 | def __init__(self, 29 | in_channels, 30 | num_class, 31 | num_layer, 32 | graph_cfg, 33 | edge_importance_weighting=True, 34 | data_bn=True, 35 | **kwargs): 36 | super().__init__() 37 | 38 | # load graph 39 | self.graph = Graph(**graph_cfg) 40 | A = torch.tensor( 41 | self.graph.A, dtype=torch.float32, requires_grad=False) 42 | self.register_buffer('A', A) 43 | # build networks 44 | spatial_kernel_size = A.size(0) 45 | temporal_kernel_size = 9 46 | kernel_size = (temporal_kernel_size, spatial_kernel_size) 47 | self.data_bn = nn.BatchNorm1d( 48 | in_channels * A.size(1)) if data_bn else lambda x: x 49 | kwargs0 = {k: v for k, v in kwargs.items() if k != 'dropout'} 50 | 51 | self.st_gcn_networks = nn.ModuleList([ 52 | st_gcn_block( 53 | in_channels, 64, kernel_size, 1, residual=False, **kwargs0)] 54 | ) 55 | layer_cfg = [ 56 | ((64, 64, kernel_size, 1), kwargs), 57 | ((64, 64, kernel_size, 1), kwargs), 58 | ((64, 64, kernel_size, 1), kwargs), 59 | ((64, 128, kernel_size, 2), kwargs), 60 | ((128, 128, kernel_size, 1), kwargs), 61 | ((128, 128, kernel_size, 1), kwargs), 62 | ((128, 256, kernel_size, 2), kwargs), 63 | ((256, 256, kernel_size, 1), kwargs), 64 | ((256, 256, kernel_size, 1), kwargs) 65 | ] 66 | for args, kwargs in layer_cfg[:num_layer-1]: 67 | block = st_gcn_block(*args, ** kwargs) 68 | self.st_gcn_networks.append(block) 69 | fc_in_ch = layer_cfg[:num_layer-1][-1][0][1] 70 | 71 | # initialize parameters for edge importance weighting 72 | if edge_importance_weighting: 73 | # self.edge_importance = nn.ParameterList([ 74 | # nn.Parameter(torch.ones(self.A.size())) 75 | # for i in self.st_gcn_networks 76 | # ]) 77 | for i in range(len(self.st_gcn_networks)): 78 | parameter = nn.Parameter(torch.ones(self.A.size())) 79 | setattr(self, f'edge_importance_{i}', parameter) 80 | setattr(self, f'edge_importance_num', i+1) 81 | else: 82 | self.edge_importance = [1] * len(self.st_gcn_networks) 83 | # fcn for prediction 84 | self.fcn = nn.Conv2d(256, num_class, kernel_size=1) 85 | 86 | 87 | def forward(self, x): 88 | # print(f"original x shape: {x.shape}") 89 | # data normalization 90 | N, C, T, V, M = x.size() 91 | x = x.permute(0, 4, 3, 1, 2).contiguous() 92 | x = x.view(N * M, V * C, T) 93 | x = self.data_bn(x) 94 | x = x.view(N, M, V, C, T) 95 | x = x.permute(0, 1, 3, 4, 2).contiguous() 96 | x = x.view(N * M, C, T, V) 97 | for i in range(self.edge_importance_num): 98 | # print(f"gcn: {self.st_gcn_networks[i]}, importance: {getattr(self, f'edge_importance_{i}')}") 99 | # print(f"current i: {i}, current x size: {x.size()}") 100 | gcn, importance = self.st_gcn_networks[i], getattr(self, f'edge_importance_{i}') 101 | x, _ = gcn(x, self.A * importance) 102 | x = F.avg_pool2d(x, (1, V)) # [NM, C, T, V] -> [NM, C, T, 1] 103 | x = x.view(N, M, -1, x.shape[-2], 1).mean(dim=1) 104 | # prediction 105 | x = self.fcn(x) 106 | x = x.view(x.shape[:3]) # [B, C, T] 107 | # print(f"out x shape: {x.shape}") 108 | return x 109 | 110 | def extract_feature(self, x): 111 | 112 | # data normalization 113 | # print(f"input x size: {x.size()}") 114 | N, C, T, V, M = x.size() 115 | x = x.permute(0, 4, 3, 1, 2).contiguous() 116 | x = x.view(N * M, V * C, T) 117 | x = self.data_bn(x) 118 | x = x.view(N, M, V, C, T) 119 | x = x.permute(0, 1, 3, 4, 2).contiguous() 120 | x = x.view(N * M, C, T, V) 121 | 122 | # forwad 123 | for i in range(self.edge_importance_num): 124 | # print(f"gcn: {self.st_gcn_networks[i]}, importance: {getattr(self, f'edge_importance_{i}')}") 125 | gcn, importance = self.st_gcn_networks[i], getattr(self, f'edge_importance_{i}') 126 | x, _ = gcn(x, self.A * importance) 127 | 128 | _, c, t, v = x.size() 129 | feature = x.view(N, M, c, t, v).permute(0, 2, 3, 4, 1) 130 | 131 | # prediction 132 | x = self.fcn(x) 133 | output = x.view(N, M, -1, t, v).permute(0, 2, 3, 4, 1) 134 | # print(f"output shape: {output.shape}, feature shape: {feature.shape}") 135 | # exit() 136 | return output, feature 137 | 138 | 139 | class st_gcn_block(nn.Module): 140 | r"""Applies a spatial temporal graph convolution over an input graph sequence. 141 | 142 | Args: 143 | in_channels (int): Number of channels in the input sequence data 144 | out_channels (int): Number of channels produced by the convolution 145 | kernel_size (tuple): Size of the temporal convolving kernel and graph convolving kernel 146 | stride (int, optional): Stride of the temporal convolution. Default: 1 147 | dropout (int, optional): Dropout rate of the final output. Default: 0 148 | residual (bool, optional): If ``True``, applies a residual mechanism. Default: ``True`` 149 | 150 | Shape: 151 | - Input[0]: Input graph sequence in :math:`(N, in_channels, T_{in}, V)` format 152 | - Input[1]: Input graph adjacency matrix in :math:`(K, V, V)` format 153 | - Output[0]: Outpu graph sequence in :math:`(N, out_channels, T_{out}, V)` format 154 | - Output[1]: Graph adjacency matrix for output data in :math:`(K, V, V)` format 155 | 156 | where 157 | :math:`N` is a batch size, 158 | :math:`K` is the spatial kernel size, as :math:`K == kernel_size[1]`, 159 | :math:`T_{in}/T_{out}` is a length of input/output sequence, 160 | :math:`V` is the number of graph nodes. 161 | 162 | """ 163 | 164 | def __init__(self, 165 | in_channels, 166 | out_channels, 167 | kernel_size, 168 | stride=1, 169 | dropout=0, 170 | residual=True): 171 | super().__init__() 172 | 173 | assert len(kernel_size) == 2 174 | assert kernel_size[0] % 2 == 1 175 | padding = ((kernel_size[0] - 1) // 2, 0) 176 | 177 | self.gcn = ConvTemporalGraphical(in_channels, out_channels, 178 | kernel_size[1]) 179 | 180 | self.tcn = nn.Sequential( 181 | nn.BatchNorm2d(out_channels), 182 | nn.ReLU(inplace=True), 183 | nn.Conv2d( 184 | out_channels, 185 | out_channels, 186 | (kernel_size[0], 1), 187 | (stride, 1), 188 | padding, 189 | ), 190 | nn.BatchNorm2d(out_channels), 191 | nn.Dropout(dropout, inplace=True), 192 | ) 193 | 194 | if not residual: 195 | self.residual = lambda x: 0 196 | 197 | elif (in_channels == out_channels) and (stride == 1): 198 | self.residual = lambda x: x 199 | 200 | else: 201 | self.residual = nn.Sequential( 202 | nn.Conv2d( 203 | in_channels, 204 | out_channels, 205 | kernel_size=1, 206 | stride=(stride, 1)), 207 | nn.BatchNorm2d(out_channels), 208 | ) 209 | 210 | self.relu = nn.ReLU(inplace=True) 211 | 212 | def forward(self, x, A): 213 | res = self.residual(x) 214 | # print(f"check x device: {x.device}, A device: {A.device}") 215 | x, A = self.gcn(x, A) 216 | # print(f"check x device: {x.device}, A device: {A.device}") 217 | x = self.tcn(x) + res 218 | return self.relu(x), A 219 | 220 | 221 | def st_gcn_baseline(in_channels: int, out_channels: int, layers: int, layout='body25', dropout=0.1): 222 | graph_cfg = { 223 | "layout": layout, 224 | "strategy": "spatial" 225 | } 226 | model = ST_GCN_18( 227 | in_channels, 228 | out_channels, 229 | layers, 230 | graph_cfg, 231 | dropout=dropout, 232 | data_bn=False, 233 | ) 234 | return model 235 | 236 | 237 | if __name__ == '__main__': 238 | model = st_gcn_baseline(3, 1000, 9) 239 | print(model) 240 | -------------------------------------------------------------------------------- /d2m/utils.py: -------------------------------------------------------------------------------- 1 | import scipy.io.wavfile 2 | import sys 3 | import yaml 4 | import torch 5 | import json 6 | import importlib 7 | import random 8 | import numpy as np 9 | import warnings 10 | import os 11 | import torch.distributed as dist 12 | import subprocess 13 | 14 | 15 | def save_sample(file_path, sampling_rate, audio): 16 | """Helper function to save sample 17 | 18 | Args: 19 | file_path (str or pathlib.Path): save file path 20 | sampling_rate (int): sampling rate of audio (usually 22050) 21 | audio (torch.FloatTensor): torch array containing audio in [-1, 1] 22 | """ 23 | audio = (audio.numpy() * 32768).astype("int16") 24 | scipy.io.wavfile.write(file_path, sampling_rate, audio) 25 | 26 | 27 | def load_yaml_config(path): 28 | with open(path) as f: 29 | config = yaml.full_load(f) 30 | return config 31 | 32 | def save_config_to_yaml(config, path): 33 | assert path.endswith('.yaml') 34 | with open(path, 'w') as f: 35 | f.write(yaml.dump(config)) 36 | f.close() 37 | 38 | def save_dict_to_json(d, path, indent=None): 39 | json.dump(d, open(path, 'w'), indent=indent) 40 | 41 | 42 | def load_dict_from_json(path): 43 | return json.load(open(path, 'r')) 44 | 45 | 46 | def write_args(args, path): 47 | args_dict = dict((name, getattr(args, name)) for name in dir(args)if not name.startswith('_')) 48 | with open(path, 'a') as args_file: 49 | args_file.write('==> torch version: {}\n'.format(torch.__version__)) 50 | args_file.write('==> cudnn version: {}\n'.format(torch.backends.cudnn.version())) 51 | args_file.write('==> Cmd:\n') 52 | args_file.write(str(sys.argv)) 53 | args_file.write('\n==> args:\n') 54 | for k, v in sorted(args_dict.items()): 55 | args_file.write(' %s: %s\n' % (str(k), str(v))) 56 | args_file.close() 57 | 58 | def seed_everything(seed, cudnn_deterministic=False): 59 | """ 60 | Function that sets seed for pseudo-random number generators in: 61 | pytorch, numpy, python.random 62 | 63 | Args: 64 | seed: the integer value seed for global random state 65 | """ 66 | if seed is not None: 67 | random.seed(seed) 68 | np.random.seed(seed) 69 | torch.manual_seed(seed) 70 | torch.cuda.manual_seed_all(seed) 71 | 72 | if cudnn_deterministic: 73 | torch.backends.cudnn.deterministic = True 74 | warnings.warn('You have chosen to seed training. ' 75 | 'This will turn on the CUDNN deterministic setting, ' 76 | 'which can slow down your training considerably! ' 77 | 'You may see unexpected behavior when restarting ' 78 | 'from checkpoints.') 79 | 80 | 81 | def merge_opts_to_config(config, opts): 82 | def modify_dict(c, nl, v): 83 | if len(nl) == 1: 84 | c[nl[0]] = type(c[nl[0]])(v) 85 | else: 86 | # print(nl) 87 | c[nl[0]] = modify_dict(c[nl[0]], nl[1:], v) 88 | return c 89 | 90 | if opts is not None and len(opts) > 0: 91 | assert len(opts) % 2 == 0, "each opts should be given by the name and values! The length shall be even number!" 92 | for i in range(len(opts) // 2): 93 | name = opts[2*i] 94 | value = opts[2*i+1] 95 | config = modify_dict(config, name.split('.'), value) 96 | return config 97 | 98 | def modify_config_for_debug(config): 99 | config['dataloader']['num_workers'] = 0 100 | config['dataloader']['batch_size'] = 1 101 | return config 102 | 103 | 104 | 105 | def get_model_parameters_info(model): 106 | # for mn, m in model.named_modules(): 107 | parameters = {'overall': {'trainable': 0, 'non_trainable': 0, 'total': 0}} 108 | for child_name, child_module in model.named_children(): 109 | parameters[child_name] = {'trainable': 0, 'non_trainable': 0} 110 | for pn, p in child_module.named_parameters(): 111 | if p.requires_grad: 112 | parameters[child_name]['trainable'] += p.numel() 113 | else: 114 | parameters[child_name]['non_trainable'] += p.numel() 115 | parameters[child_name]['total'] = parameters[child_name]['trainable'] + parameters[child_name]['non_trainable'] 116 | 117 | parameters['overall']['trainable'] += parameters[child_name]['trainable'] 118 | parameters['overall']['non_trainable'] += parameters[child_name]['non_trainable'] 119 | parameters['overall']['total'] += parameters[child_name]['total'] 120 | 121 | # format the numbers 122 | def format_number(num): 123 | K = 2**10 124 | M = 2**20 125 | G = 2**30 126 | if num > G: # K 127 | uint = 'G' 128 | num = round(float(num)/G, 2) 129 | elif num > M: 130 | uint = 'M' 131 | num = round(float(num)/M, 2) 132 | elif num > K: 133 | uint = 'K' 134 | num = round(float(num)/K, 2) 135 | else: 136 | uint = '' 137 | 138 | return '{}{}'.format(num, uint) 139 | 140 | def format_dict(d): 141 | for k, v in d.items(): 142 | if isinstance(v, dict): 143 | format_dict(v) 144 | else: 145 | d[k] = format_number(v) 146 | 147 | format_dict(parameters) 148 | return parameters 149 | 150 | 151 | def format_seconds(seconds): 152 | h = int(seconds // 3600) 153 | m = int(seconds // 60 - h * 60) 154 | s = int(seconds % 60) 155 | 156 | d = int(h // 24) 157 | h = h - d * 24 158 | 159 | if d == 0: 160 | if h == 0: 161 | if m == 0: 162 | ft = '{:02d}s'.format(s) 163 | else: 164 | ft = '{:02d}m:{:02d}s'.format(m, s) 165 | else: 166 | ft = '{:02d}h:{:02d}m:{:02d}s'.format(h, m, s) 167 | 168 | else: 169 | ft = '{:d}d:{:02d}h:{:02d}m:{:02d}s'.format(d, h, m, s) 170 | 171 | return ft 172 | 173 | def instantiate_from_config(config): 174 | if config is None: 175 | return None 176 | if not "target" in config: 177 | raise KeyError("Expected key `target` to instantiate.") 178 | module, cls = config["target"].rsplit(".", 1) 179 | cls = getattr(importlib.import_module(module, package=None), cls) 180 | return cls(**config.get("params", dict())) 181 | 182 | 183 | def get_obj_from_str(string, reload=False): 184 | module, cls = string.rsplit(".", 1) 185 | if reload: 186 | module_imp = importlib.import_module(module) 187 | importlib.reload(module_imp) 188 | return getattr(importlib.import_module(module, package=None), cls) 189 | 190 | 191 | def class_from_string(class_name): 192 | module, cls = class_name.rsplit(".", 1) 193 | cls = getattr(importlib.import_module(module, package=None), cls) 194 | return cls 195 | 196 | def get_all_file(dir, end_with='.h5'): 197 | if isinstance(end_with, str): 198 | end_with = [end_with] 199 | filenames = [] 200 | for root, dirs, files in os.walk(dir): 201 | for f in files: 202 | for ew in end_with: 203 | if f.endswith(ew): 204 | filenames.append(os.path.join(root, f)) 205 | break 206 | return filenames 207 | 208 | 209 | def get_sub_dirs(dir, abs=True): 210 | sub_dirs = os.listdir(dir) 211 | if abs: 212 | sub_dirs = [os.path.join(dir, s) for s in sub_dirs] 213 | return sub_dirs 214 | 215 | 216 | def get_model_buffer(model): 217 | state_dict = model.state_dict() 218 | buffers_ = {} 219 | params_ = {n: p for n, p in model.named_parameters()} 220 | 221 | for k in state_dict: 222 | if k not in params_: 223 | buffers_[k] = state_dict[k] 224 | return buffers_ 225 | -------------------------------------------------------------------------------- /d2m_loris.py: -------------------------------------------------------------------------------- 1 | import os 2 | import numpy as np 3 | import torch 4 | import torch.nn as nn 5 | import torch.nn.functional as F 6 | from torch.utils.data import DataLoader 7 | from torch.utils.tensorboard import SummaryWriter 8 | import yaml 9 | import time 10 | import argparse 11 | from pathlib import Path 12 | import librosa 13 | import soundfile as sf 14 | import subprocess 15 | from d2m.dataset import S25Dataset 16 | from d2m.loris_modules import LORIS 17 | from d2m.utils import save_sample, seed_everything, load_yaml_config, get_model_parameters_info, instantiate_from_config 18 | from d2m.engine.distributed import set_dist_rank, distribute_model 19 | from d2m.engine.logger import Logger 20 | from d2m.engine.lr_scheduler import ReduceLROnPlateauWithWarmup 21 | import warnings 22 | import sys 23 | warnings.simplefilter("ignore") 24 | os.environ["KMP_WARNINGS"] = "0" 25 | 26 | def parse_args(): 27 | parser = argparse.ArgumentParser() 28 | parser.add_argument("--config_path", default='./configs/') 29 | parser.add_argument('--dataset', default='') 30 | parser.add_argument('--num_node', type=int, default=1, help='number of nodes for distributed training') 31 | parser.add_argument('--node_rank', type=int, default=0, help='node rank for distributed training') 32 | parser.add_argument('--dist_url', type=str, default='env://', help='url used to set up distributed training') 33 | parser.add_argument('--rank', type=int, default=0, help="distribted training") 34 | parser.add_argument('--local_rank', type=int, default=0, help="distribted training") 35 | parser.add_argument('--world_size', type=int, default=0, help="distribted training") 36 | parser.add_argument('--seed', type=int, default=2333, help='seed for initializing training. ') 37 | parser.add_argument('--cudnn_deterministic', action='store_true', help='set cudnn.deterministic True') 38 | parser.add_argument('--tensorboard', type=bool, default=False, help='use tensorboard for logging') 39 | args = parser.parse_args() 40 | return args 41 | 42 | def train(config, args, logger): 43 | log_path = config['log_path'] 44 | model_save_path = config['model_save_path'] 45 | os.makedirs(log_path, exist_ok=True) 46 | os.makedirs(model_save_path, exist_ok=True) 47 | batch_size = config['batch_size'] 48 | if args.tensorboard is True: 49 | writer = SummaryWriter(str(log_path)) 50 | 51 | loris = LORIS(config['model']) 52 | # load pre-trained music diffusion checkpoints 53 | autoencoder_state_dict = torch.load(config['autoencoder_path']) 54 | autoencoder_type = config['model']['autoencoder_type'] 55 | 56 | if config['model']['use_pretrain'] is True: 57 | if autoencoder_type == 'autoencoder': 58 | autoencoder_state_dict = {k: v for k, v in autoencoder_state_dict.items() if loris.autoencoder.state_dict()[k].numel() == v.numel()} 59 | loris.autoencoder.load_state_dict(autoencoder_state_dict, strict=False) 60 | elif autoencoder_type == 'diffusion': 61 | loris.diffusion.load_state_dict(autoencoder_state_dict, strict=True) 62 | elif autoencoder_type == 'cond_diffusion': 63 | loris.cond_diffusion.load_state_dict(autoencoder_state_dict, strict=False) 64 | else: 65 | raise NotImplementedError ("Unrecognised Autoencoder Type!") 66 | 67 | #### create optimizer ##### 68 | b_params = [] # backbone params 69 | a_params = [] # additional params 70 | for k, v in loris.cond_diffusion.named_parameters(): 71 | if k in autoencoder_state_dict.keys() and autoencoder_state_dict[k].numel() == v.numel(): 72 | b_params.append(v) 73 | else: 74 | a_params.append(v) 75 | params = [ 76 | {"params": a_params, "lr": config['base_lr']}, 77 | {"params": b_params, "lr": config['backbone_base_lr']}, 78 | ] 79 | logger.log_info(str(get_model_parameters_info(loris))) 80 | opt = torch.optim.AdamW(params, betas=config['betas'], weight_decay=config['weight_decay']) 81 | logger.log_info("Finish creating the optimizer.") 82 | #### creat data loader #### 83 | train_dataset = S25Dataset(audio_files=config['audio_train_path'], video_files=config['video_train_path'], motion_files=config['motion_train_path'], genre_label=config['genre_train_path'], augment=True, config=config['model']) 84 | val_dataset = S25Dataset(audio_files=config['audio_test_path'], video_files=config['video_test_path'], motion_files=config['motion_test_path'], genre_label=config['genre_test_path'], augment=False, config=config['model']) 85 | scheduler = ReduceLROnPlateauWithWarmup(opt, factor=config['lr_scheduler']['factor'], patience=config['lr_scheduler']['patience'], 86 | threshold=config['lr_scheduler']['threshold'], threshold_mode=config['lr_scheduler']['threshold_mode'], 87 | min_lr=config['lr_scheduler']['min_lr'], warmup_lr=config['lr_scheduler']['warmup_lr'], 88 | warmup=config['lr_scheduler']['warmup']) 89 | 90 | is_distributed = args.world_size > 1 91 | loris = distribute_model(loris, is_distributed) 92 | logger.log_info(f"check args.dirtributed: {is_distributed}") 93 | 94 | if args is not None and is_distributed: 95 | train_sampler = torch.utils.data.distributed.DistributedSampler(train_dataset, shuffle=True) 96 | val_sampler = torch.utils.data.distributed.DistributedSampler(val_dataset, shuffle=False) 97 | train_iters = len(train_sampler) // config['batch_size'] 98 | val_iters = len(val_sampler) // config['batch_size'] 99 | else: 100 | train_sampler = None 101 | val_sampler = None 102 | train_iters = len(train_dataset) // config['batch_size'] 103 | val_iters = len(val_dataset) // config['batch_size'] 104 | 105 | num_workers = config['num_workers'] 106 | train_loader = torch.utils.data.DataLoader(train_dataset, 107 | batch_size=config['batch_size'], 108 | shuffle=(train_sampler is None), 109 | num_workers=num_workers, 110 | pin_memory=True, 111 | sampler=train_sampler, 112 | drop_last=True) 113 | 114 | val_loader = torch.utils.data.DataLoader(val_dataset, 115 | batch_size=config['batch_size'], 116 | shuffle=False, #(val_sampler is None), 117 | num_workers=num_workers, 118 | pin_memory=True, 119 | sampler=val_sampler, 120 | drop_last=True) 121 | 122 | logger.log_info(f"Finish Initializing DataLoader, Train Dataset Len: {len(train_loader)}, Val Dataset Len: {len(val_loader)}") 123 | sys.stdout.flush() 124 | 125 | if 'clip_grad_norm' in config: 126 | clip_grad_norm = instantiate_from_config(config['clip_grad_norm']) 127 | else: 128 | clip_grad_norm = None 129 | 130 | #### start training ### 131 | min_loss = 100.00 132 | for epoch in range(1, config['max_epochs']+1): 133 | epoch_start = time.time() 134 | epoch_loss = 0.0 135 | step_num = 0 136 | for batch_idx, input in enumerate(train_loader): 137 | input['music'], input['motion'], input['video'] = input['music'].cuda(), input['motion'].cuda(), input['video'].cuda() 138 | step_num += 1 139 | sys.stdout.flush() 140 | opt.zero_grad() 141 | loss = loris(input) 142 | loss.backward() 143 | if clip_grad_norm is not None: 144 | clip_grad_norm(params) 145 | opt.step() 146 | scheduler.step(loss) 147 | epoch_loss += loss 148 | 149 | epoch_end = time.time() 150 | epoch_avg_loss = epoch_loss / step_num 151 | eta_sec = (epoch_end-epoch_start)*(config['max_epochs']-epoch-1) 152 | if epoch % config['log_interval'] == 0: 153 | logger.log_info('Train Epoch: {}\tLoss: {:.6f}\tEpoch Time: {:.1f}s\tETA: {:2d}h{:2d}min'.format( 154 | epoch, epoch_avg_loss.item(), epoch_end-epoch_start, int(eta_sec//3600), int((eta_sec%3600)//60))) 155 | if epoch % config['save_interval'] == 0 and args.rank == 0: 156 | save_path = model_save_path + 'loris_epoch' + str(epoch) + ".pt" 157 | torch.save(loris.state_dict(), save_path) 158 | if epoch_avg_loss < min_loss: 159 | save_path1 = model_save_path + "loss_min.pt" 160 | torch.save(loris.state_dict(), save_path1) 161 | min_loss = epoch_avg_loss 162 | 163 | def main(): 164 | args = parse_args() 165 | if args.seed is not None or args.cudnn_deterministic: 166 | seed_everything(args.seed, args.cudnn_deterministic) 167 | 168 | set_dist_rank(args) 169 | 170 | config_path = os.path.join(args.config_path, args.dataset+'.yaml') 171 | config = load_yaml_config(config_path) 172 | # get logger 173 | logger = Logger(args, config) 174 | logger.save_config(config) 175 | 176 | train(config, args, logger) 177 | 178 | 179 | if __name__ == '__main__': 180 | main() 181 | 182 | 183 | -------------------------------------------------------------------------------- /data/dance/dance_audio_s25_test_segment.txt: -------------------------------------------------------------------------------- 1 | yourpath/dataset/LORIS/dance/audio_s25/gKR_sFM_c09_d28_mKR1_ch02.wav 2 | yourpath/dataset/LORIS/dance/audio_s25/gHO_sFM_c09_d19_mHO5_ch06.wav 3 | yourpath/dataset/LORIS/dance/audio_s25/gMH_sFM_c09_d23_mMH2_ch10.wav 4 | yourpath/dataset/LORIS/dance/audio_s25/gJS_sFM_c07_d03_mJS1_ch02.wav 5 | yourpath/dataset/LORIS/dance/audio_s25/gJS_sFM_c06_d01_mJS1_ch07.wav 6 | yourpath/dataset/LORIS/dance/audio_s25/gKR_sFM_c01_d30_mKR3_ch21.wav 7 | yourpath/dataset/LORIS/dance/audio_s25/gKR_sFM_c02_d30_mKR2_ch17.wav 8 | yourpath/dataset/LORIS/dance/audio_s25/gWA_sFM_c02_d25_mWA5_ch06.wav 9 | yourpath/dataset/LORIS/dance/audio_s25/gMH_sFM_c08_d24_mMH4_ch19.wav 10 | yourpath/dataset/LORIS/dance/audio_s25/gPO_sFM_c04_d11_mPO2_ch14.wav 11 | yourpath/dataset/LORIS/dance/audio_s25/gPO_sFM_c07_d11_mPO5_ch13.wav 12 | yourpath/dataset/LORIS/dance/audio_s25/gPO_sFM_c03_d10_mPO1_ch02.wav 13 | yourpath/dataset/LORIS/dance/audio_s25/gLO_sFM_c09_d15_mLO1_ch16.wav 14 | yourpath/dataset/LORIS/dance/audio_s25/gBR_sFM_c03_d04_mBR0_ch01.wav 15 | yourpath/dataset/LORIS/dance/audio_s25/gJS_sFM_c04_d03_mJS2_ch03.wav 16 | yourpath/dataset/LORIS/dance/audio_s25/gHO_sFM_c02_d20_mHO0_ch08.wav 17 | yourpath/dataset/LORIS/dance/audio_s25/gBR_sFM_c06_d06_mBR4_ch20.wav 18 | yourpath/dataset/LORIS/dance/audio_s25/gHO_sFM_c09_d21_mHO2_ch17.wav 19 | yourpath/dataset/LORIS/dance/audio_s25/gPO_sFM_c07_d11_mPO2_ch10.wav 20 | yourpath/dataset/LORIS/dance/audio_s25/gLH_sFM_c08_d16_mLH3_ch07.wav 21 | yourpath/dataset/LORIS/dance/audio_s25/gBR_sFM_c04_d05_mBR5_ch14.wav 22 | yourpath/dataset/LORIS/dance/audio_s25/gBR_sFM_c06_d04_mBR3_ch04.wav 23 | yourpath/dataset/LORIS/dance/audio_s25/gMH_sFM_c04_d22_mMH5_ch06.wav 24 | yourpath/dataset/LORIS/dance/audio_s25/gJS_sFM_c09_d02_mJS1_ch02.wav 25 | yourpath/dataset/LORIS/dance/audio_s25/gBR_sFM_c04_d04_mBR3_ch04.wav 26 | yourpath/dataset/LORIS/dance/audio_s25/gHO_sFM_c09_d21_mHO3_ch21.wav 27 | yourpath/dataset/LORIS/dance/audio_s25/gJB_sFM_c01_d08_mJB2_ch10.wav 28 | yourpath/dataset/LORIS/dance/audio_s25/gHO_sFM_c04_d19_mHO2_ch07.wav 29 | yourpath/dataset/LORIS/dance/audio_s25/gLH_sFM_c09_d17_mLH3_ch11.wav 30 | yourpath/dataset/LORIS/dance/audio_s25/gWA_sFM_c08_d26_mWA3_ch11.wav 31 | yourpath/dataset/LORIS/dance/audio_s25/gJS_sFM_c06_d02_mJS2_ch03.wav 32 | yourpath/dataset/LORIS/dance/audio_s25/gKR_sFM_c05_d29_mKR4_ch12.wav 33 | yourpath/dataset/LORIS/dance/audio_s25/gHO_sFM_c03_d20_mHO2_ch10.wav 34 | yourpath/dataset/LORIS/dance/audio_s25/gKR_sFM_c08_d29_mKR4_ch12.wav 35 | yourpath/dataset/LORIS/dance/audio_s25/gLO_sFM_c05_d15_mLO4_ch19.wav 36 | yourpath/dataset/LORIS/dance/audio_s25/gHO_sFM_c08_d21_mHO1_ch16.wav 37 | yourpath/dataset/LORIS/dance/audio_s25/gBR_sFM_c05_d04_mBR1_ch02.wav 38 | yourpath/dataset/LORIS/dance/audio_s25/gPO_sFM_c05_d12_mPO5_ch21.wav 39 | yourpath/dataset/LORIS/dance/audio_s25/gLO_sFM_c01_d15_mLO0_ch15.wav 40 | yourpath/dataset/LORIS/dance/audio_s25/gPO_sFM_c08_d11_mPO3_ch11.wav 41 | yourpath/dataset/LORIS/dance/audio_s25/gLO_sFM_c01_d15_mLO4_ch21.wav 42 | yourpath/dataset/LORIS/dance/audio_s25/gHO_sFM_c02_d19_mHO3_ch04.wav 43 | yourpath/dataset/LORIS/dance/audio_s25/gLO_sFM_c06_d13_mLO5_ch06.wav 44 | yourpath/dataset/LORIS/dance/audio_s25/gBR_sFM_c04_d04_mBR2_ch03.wav 45 | yourpath/dataset/LORIS/dance/audio_s25/gMH_sFM_c08_d23_mMH0_ch08.wav 46 | yourpath/dataset/LORIS/dance/audio_s25/gHO_sFM_c01_d20_mHO1_ch09.wav 47 | yourpath/dataset/LORIS/dance/audio_s25/gKR_sFM_c01_d29_mKR0_ch08.wav 48 | yourpath/dataset/LORIS/dance/audio_s25/gJS_sFM_c08_d01_mJS3_ch04.wav 49 | yourpath/dataset/LORIS/dance/audio_s25/gJS_sFM_c03_d01_mJS1_ch07.wav 50 | yourpath/dataset/LORIS/dance/audio_s25/gPO_sFM_c09_d11_mPO5_ch13.wav 51 | yourpath/dataset/LORIS/dance/audio_s25/gKR_sFM_c05_d29_mKR1_ch09.wav 52 | yourpath/dataset/LORIS/dance/audio_s25/gJB_sFM_c09_d08_mJB4_ch12.wav 53 | yourpath/dataset/LORIS/dance/audio_s25/gLO_sFM_c01_d15_mLO5_ch20.wav 54 | yourpath/dataset/LORIS/dance/audio_s25/gLO_sFM_c08_d14_mLO5_ch14.wav 55 | yourpath/dataset/LORIS/dance/audio_s25/gKR_sFM_c01_d28_mKR4_ch05.wav 56 | yourpath/dataset/LORIS/dance/audio_s25/gMH_sFM_c05_d23_mMH2_ch10.wav 57 | yourpath/dataset/LORIS/dance/audio_s25/gHO_sFM_c09_d20_mHO1_ch09.wav 58 | yourpath/dataset/LORIS/dance/audio_s25/gJB_sFM_c08_d08_mJB4_ch12.wav 59 | yourpath/dataset/LORIS/dance/audio_s25/gLO_sFM_c02_d13_mLO2_ch03.wav 60 | yourpath/dataset/LORIS/dance/audio_s25/gLO_sFM_c08_d15_mLO4_ch19.wav 61 | yourpath/dataset/LORIS/dance/audio_s25/gKR_sFM_c04_d28_mKR2_ch03.wav 62 | yourpath/dataset/LORIS/dance/audio_s25/gWA_sFM_c07_d27_mWA4_ch19.wav 63 | yourpath/dataset/LORIS/dance/audio_s25/gKR_sFM_c05_d29_mKR2_ch10.wav 64 | yourpath/dataset/LORIS/dance/audio_s25/gWA_sFM_c04_d26_mWA4_ch12.wav 65 | yourpath/dataset/LORIS/dance/audio_s25/gBR_sFM_c01_d05_mBR5_ch14.wav 66 | yourpath/dataset/LORIS/dance/audio_s25/gPO_sFM_c03_d11_mPO4_ch12.wav 67 | yourpath/dataset/LORIS/dance/audio_s25/gHO_sFM_c06_d19_mHO2_ch03.wav 68 | yourpath/dataset/LORIS/dance/audio_s25/gKR_sFM_c02_d29_mKR3_ch11.wav 69 | yourpath/dataset/LORIS/dance/audio_s25/gPO_sFM_c09_d11_mPO0_ch08.wav 70 | yourpath/dataset/LORIS/dance/audio_s25/gBR_sFM_c04_d05_mBR3_ch10.wav 71 | yourpath/dataset/LORIS/dance/audio_s25/gJS_sFM_c04_d03_mJS4_ch12.wav 72 | yourpath/dataset/LORIS/dance/audio_s25/gPO_sFM_c06_d12_mPO4_ch19.wav 73 | yourpath/dataset/LORIS/dance/audio_s25/gLO_sFM_c06_d15_mLO0_ch15.wav 74 | yourpath/dataset/LORIS/dance/audio_s25/gKR_sFM_c05_d30_mKR5_ch20.wav 75 | yourpath/dataset/LORIS/dance/audio_s25/gHO_sFM_c09_d20_mHO2_ch10.wav 76 | yourpath/dataset/LORIS/dance/audio_s25/gWA_sFM_c01_d27_mWA5_ch20.wav 77 | yourpath/dataset/LORIS/dance/audio_s25/gKR_sFM_c02_d30_mKR5_ch20.wav 78 | yourpath/dataset/LORIS/dance/audio_s25/gPO_sFM_c09_d12_mPO5_ch21.wav 79 | yourpath/dataset/LORIS/dance/audio_s25/gPO_sFM_c02_d12_mPO5_ch20.wav 80 | yourpath/dataset/LORIS/dance/audio_s25/gLH_sFM_c05_d17_mLH1_ch09.wav 81 | yourpath/dataset/LORIS/dance/audio_s25/gJS_sFM_c03_d02_mJS4_ch09.wav 82 | yourpath/dataset/LORIS/dance/audio_s25/gWA_sFM_c09_d25_mWA4_ch05.wav 83 | yourpath/dataset/LORIS/dance/audio_s25/gHO_sFM_c01_d21_mHO0_ch15.wav 84 | yourpath/dataset/LORIS/dance/audio_s25/gMH_sFM_c07_d23_mMH0_ch14.wav 85 | yourpath/dataset/LORIS/dance/audio_s25/gJB_sFM_c03_d09_mJB1_ch21.wav 86 | yourpath/dataset/LORIS/dance/audio_s25/gBR_sFM_c02_d05_mBR1_ch08.wav 87 | yourpath/dataset/LORIS/dance/audio_s25/gHO_sFM_c09_d21_mHO0_ch15.wav 88 | yourpath/dataset/LORIS/dance/audio_s25/gMH_sFM_c07_d22_mMH4_ch05.wav 89 | yourpath/dataset/LORIS/dance/audio_s25/gJB_sFM_c02_d08_mJB5_ch13.wav 90 | yourpath/dataset/LORIS/dance/audio_s25/gJB_sFM_c08_d07_mJB3_ch07.wav 91 | yourpath/dataset/LORIS/dance/audio_s25/gJS_sFM_c07_d01_mJS1_ch07.wav 92 | yourpath/dataset/LORIS/dance/audio_s25/gMH_sFM_c08_d22_mMH4_ch05.wav 93 | yourpath/dataset/LORIS/dance/audio_s25/gLO_sFM_c03_d15_mLO0_ch15.wav 94 | yourpath/dataset/LORIS/dance/audio_s25/gPO_sFM_c05_d11_mPO5_ch13.wav 95 | yourpath/dataset/LORIS/dance/audio_s25/gPO_sFM_c07_d12_mPO3_ch18.wav 96 | yourpath/dataset/LORIS/dance/audio_s25/gBR_sFM_c02_d06_mBR4_ch20.wav 97 | yourpath/dataset/LORIS/dance/audio_s25/gHO_sFM_c03_d20_mHO5_ch13.wav 98 | yourpath/dataset/LORIS/dance/audio_s25/gJS_sFM_c06_d01_mJS2_ch03.wav 99 | yourpath/dataset/LORIS/dance/audio_s25/gBR_sFM_c07_d05_mBR4_ch13.wav 100 | yourpath/dataset/LORIS/dance/audio_s25/gLH_sFM_c04_d17_mLH0_ch08.wav 101 | yourpath/dataset/LORIS/dance/audio_s25/gJB_sFM_c05_d07_mJB2_ch03.wav 102 | yourpath/dataset/LORIS/dance/audio_s25/gWA_sFM_c05_d27_mWA0_ch15.wav 103 | yourpath/dataset/LORIS/dance/audio_s25/gHO_sFM_c09_d21_mHO3_ch18.wav 104 | yourpath/dataset/LORIS/dance/audio_s25/gJB_sFM_c03_d08_mJB3_ch11.wav 105 | yourpath/dataset/LORIS/dance/audio_s25/gPO_sFM_c06_d12_mPO1_ch16.wav 106 | yourpath/dataset/LORIS/dance/audio_s25/gJS_sFM_c06_d01_mJS0_ch01.wav 107 | yourpath/dataset/LORIS/dance/audio_s25/gJB_sFM_c07_d07_mJB1_ch02.wav 108 | yourpath/dataset/LORIS/dance/audio_s25/gBR_sFM_c07_d05_mBR3_ch10.wav 109 | yourpath/dataset/LORIS/dance/audio_s25/gWA_sFM_c08_d26_mWA0_ch08.wav 110 | yourpath/dataset/LORIS/dance/audio_s25/gJS_sFM_c07_d02_mJS4_ch09.wav 111 | yourpath/dataset/LORIS/dance/audio_s25/gMH_sFM_c08_d22_mMH3_ch04.wav 112 | yourpath/dataset/LORIS/dance/audio_s25/gJS_sFM_c04_d02_mJS5_ch10.wav 113 | yourpath/dataset/LORIS/dance/audio_s25/gBR_sFM_c04_d06_mBR5_ch19.wav 114 | yourpath/dataset/LORIS/dance/audio_s25/gLH_sFM_c02_d18_mLH2_ch17.wav 115 | yourpath/dataset/LORIS/dance/audio_s25/gJB_sFM_c08_d09_mJB4_ch19.wav 116 | yourpath/dataset/LORIS/dance/audio_s25/gLH_sFM_c08_d18_mLH5_ch20.wav 117 | yourpath/dataset/LORIS/dance/audio_s25/gJS_sFM_c08_d01_mJS2_ch03.wav 118 | yourpath/dataset/LORIS/dance/audio_s25/gMH_sFM_c09_d23_mMH0_ch08.wav 119 | yourpath/dataset/LORIS/dance/audio_s25/gMH_sFM_c02_d24_mMH2_ch17.wav 120 | yourpath/dataset/LORIS/dance/audio_s25/gLH_sFM_c01_d18_mLH2_ch17.wav 121 | yourpath/dataset/LORIS/dance/audio_s25/gHO_sFM_c02_d19_mHO4_ch05.wav 122 | yourpath/dataset/LORIS/dance/audio_s25/gBR_sFM_c03_d05_mBR3_ch10.wav 123 | yourpath/dataset/LORIS/dance/audio_s25/gLH_sFM_c09_d16_mLH0_ch01.wav 124 | yourpath/dataset/LORIS/dance/audio_s25/gHO_sFM_c07_d21_mHO2_ch17.wav 125 | yourpath/dataset/LORIS/dance/audio_s25/gWA_sFM_c08_d27_mWA0_ch15.wav 126 | yourpath/dataset/LORIS/dance/audio_s25/gWA_sFM_c02_d26_mWA3_ch11.wav 127 | yourpath/dataset/LORIS/dance/audio_s25/gHO_sFM_c07_d19_mHO2_ch07.wav 128 | yourpath/dataset/LORIS/dance/audio_s25/gJS_sFM_c04_d02_mJS2_ch03.wav 129 | yourpath/dataset/LORIS/dance/audio_s25/gPO_sFM_c09_d10_mPO0_ch01.wav 130 | yourpath/dataset/LORIS/dance/audio_s25/gPO_sFM_c07_d11_mPO3_ch11.wav 131 | yourpath/dataset/LORIS/dance/audio_s25/gKR_sFM_c04_d29_mKR0_ch08.wav 132 | yourpath/dataset/LORIS/dance/audio_s25/gBR_sFM_c02_d06_mBR3_ch17.wav 133 | yourpath/dataset/LORIS/dance/audio_s25/gPO_sFM_c02_d11_mPO0_ch08.wav 134 | yourpath/dataset/LORIS/dance/audio_s25/gJB_sFM_c02_d09_mJB4_ch19.wav 135 | yourpath/dataset/LORIS/dance/audio_s25/gMH_sFM_c01_d22_mMH0_ch01.wav 136 | yourpath/dataset/LORIS/dance/audio_s25/gWA_sFM_c01_d27_mWA3_ch18.wav 137 | yourpath/dataset/LORIS/dance/audio_s25/gMH_sFM_c08_d24_mMH3_ch18.wav 138 | yourpath/dataset/LORIS/dance/audio_s25/gPO_sFM_c06_d10_mPO0_ch01.wav 139 | yourpath/dataset/LORIS/dance/audio_s25/gWA_sFM_c01_d27_mWA0_ch15.wav 140 | yourpath/dataset/LORIS/dance/audio_s25/gLO_sFM_c02_d15_mLO0_ch15.wav 141 | yourpath/dataset/LORIS/dance/audio_s25/gMH_sFM_c03_d23_mMH5_ch13.wav 142 | yourpath/dataset/LORIS/dance/audio_s25/gJB_sFM_c07_d07_mJB0_ch01.wav 143 | yourpath/dataset/LORIS/dance/audio_s25/gJB_sFM_c02_d08_mJB2_ch10.wav 144 | yourpath/dataset/LORIS/dance/audio_s25/gLO_sFM_c09_d14_mLO3_ch11.wav 145 | yourpath/dataset/LORIS/dance/audio_s25/gJB_sFM_c08_d09_mJB2_ch17.wav 146 | yourpath/dataset/LORIS/dance/audio_s25/gLH_sFM_c03_d18_mLH2_ch17.wav 147 | yourpath/dataset/LORIS/dance/audio_s25/gLO_sFM_c06_d14_mLO1_ch09.wav 148 | yourpath/dataset/LORIS/dance/audio_s25/gWA_sFM_c05_d25_mWA0_ch01.wav 149 | yourpath/dataset/LORIS/dance/audio_s25/gPO_sFM_c06_d12_mPO5_ch20.wav 150 | yourpath/dataset/LORIS/dance/audio_s25/gJB_sFM_c03_d09_mJB0_ch15.wav 151 | yourpath/dataset/LORIS/dance/audio_s25/gKR_sFM_c06_d30_mKR4_ch19.wav 152 | yourpath/dataset/LORIS/dance/audio_s25/gMH_sFM_c04_d23_mMH0_ch14.wav 153 | yourpath/dataset/LORIS/dance/audio_s25/gJS_sFM_c07_d03_mJS5_ch14.wav 154 | yourpath/dataset/LORIS/dance/audio_s25/gMH_sFM_c03_d22_mMH0_ch01.wav 155 | yourpath/dataset/LORIS/dance/audio_s25/gMH_sFM_c04_d24_mMH4_ch19.wav 156 | yourpath/dataset/LORIS/dance/audio_s25/gMH_sFM_c07_d24_mMH5_ch20.wav 157 | yourpath/dataset/LORIS/dance/audio_s25/gLH_sFM_c06_d17_mLH4_ch12.wav 158 | yourpath/dataset/LORIS/dance/audio_s25/gJB_sFM_c04_d09_mJB1_ch16.wav 159 | yourpath/dataset/LORIS/dance/audio_s25/gBR_sFM_c01_d04_mBR1_ch02.wav 160 | yourpath/dataset/LORIS/dance/audio_s25/gLO_sFM_c04_d13_mLO3_ch04.wav 161 | yourpath/dataset/LORIS/dance/audio_s25/gMH_sFM_c06_d23_mMH4_ch12.wav 162 | yourpath/dataset/LORIS/dance/audio_s25/gBR_sFM_c09_d06_mBR4_ch20.wav 163 | yourpath/dataset/LORIS/dance/audio_s25/gMH_sFM_c08_d23_mMH0_ch14.wav 164 | yourpath/dataset/LORIS/dance/audio_s25/gHO_sFM_c07_d21_mHO3_ch21.wav 165 | yourpath/dataset/LORIS/dance/audio_s25/gBR_sFM_c09_d06_mBR2_ch16.wav 166 | yourpath/dataset/LORIS/dance/audio_s25/gWA_sFM_c04_d27_mWA3_ch18.wav 167 | yourpath/dataset/LORIS/dance/audio_s25/gWA_sFM_c03_d26_mWA3_ch11.wav 168 | yourpath/dataset/LORIS/dance/audio_s25/gWA_sFM_c01_d25_mWA4_ch05.wav 169 | yourpath/dataset/LORIS/dance/audio_s25/gHO_sFM_c02_d21_mHO1_ch16.wav 170 | yourpath/dataset/LORIS/dance/audio_s25/gLH_sFM_c02_d16_mLH4_ch05.wav 171 | yourpath/dataset/LORIS/dance/audio_s25/gBR_sFM_c03_d05_mBR4_ch13.wav 172 | yourpath/dataset/LORIS/dance/audio_s25/gKR_sFM_c01_d29_mKR2_ch10.wav 173 | yourpath/dataset/LORIS/dance/audio_s25/gBR_sFM_c01_d05_mBR3_ch10.wav 174 | yourpath/dataset/LORIS/dance/audio_s25/gLH_sFM_c09_d16_mLH4_ch05.wav 175 | yourpath/dataset/LORIS/dance/audio_s25/gLO_sFM_c02_d13_mLO4_ch07.wav 176 | yourpath/dataset/LORIS/dance/audio_s25/gPO_sFM_c08_d12_mPO3_ch18.wav 177 | yourpath/dataset/LORIS/dance/audio_s25/gMH_sFM_c01_d22_mMH4_ch05.wav 178 | yourpath/dataset/LORIS/dance/audio_s25/gPO_sFM_c08_d12_mPO0_ch15.wav 179 | yourpath/dataset/LORIS/dance/audio_s25/gJS_sFM_c05_d03_mJS0_ch01.wav 180 | yourpath/dataset/LORIS/dance/audio_s25/gBR_sFM_c09_d06_mBR1_ch15.wav 181 | yourpath/dataset/LORIS/dance/audio_s25/gLO_sFM_c03_d13_mLO0_ch01.wav 182 | yourpath/dataset/LORIS/dance/audio_s25/gLH_sFM_c08_d16_mLH3_ch04.wav 183 | yourpath/dataset/LORIS/dance/audio_s25/gBR_sFM_c04_d04_mBR1_ch02.wav 184 | yourpath/dataset/LORIS/dance/audio_s25/gWA_sFM_c07_d27_mWA3_ch18.wav 185 | yourpath/dataset/LORIS/dance/audio_s25/gJB_sFM_c03_d08_mJB2_ch10.wav 186 | yourpath/dataset/LORIS/dance/audio_s25/gPO_sFM_c07_d11_mPO4_ch12.wav 187 | yourpath/dataset/LORIS/dance/audio_s25/gLO_sFM_c09_d13_mLO2_ch03.wav 188 | yourpath/dataset/LORIS/dance/audio_s25/gLO_sFM_c05_d15_mLO1_ch16.wav 189 | yourpath/dataset/LORIS/dance/audio_s25/gWA_sFM_c08_d25_mWA4_ch05.wav 190 | -------------------------------------------------------------------------------- /data/dance/dance_i3d_s25_test_segment.txt: -------------------------------------------------------------------------------- 1 | yourpath/dataset/LORIS/dance/i3d_s25/gKR_sFM_c09_d28_mKR1_ch02.npy 2 | yourpath/dataset/LORIS/dance/i3d_s25/gHO_sFM_c09_d19_mHO5_ch06.npy 3 | yourpath/dataset/LORIS/dance/i3d_s25/gMH_sFM_c09_d23_mMH2_ch10.npy 4 | yourpath/dataset/LORIS/dance/i3d_s25/gJS_sFM_c07_d03_mJS1_ch02.npy 5 | yourpath/dataset/LORIS/dance/i3d_s25/gJS_sFM_c06_d01_mJS1_ch07.npy 6 | yourpath/dataset/LORIS/dance/i3d_s25/gKR_sFM_c01_d30_mKR3_ch21.npy 7 | yourpath/dataset/LORIS/dance/i3d_s25/gKR_sFM_c02_d30_mKR2_ch17.npy 8 | yourpath/dataset/LORIS/dance/i3d_s25/gWA_sFM_c02_d25_mWA5_ch06.npy 9 | yourpath/dataset/LORIS/dance/i3d_s25/gMH_sFM_c08_d24_mMH4_ch19.npy 10 | yourpath/dataset/LORIS/dance/i3d_s25/gPO_sFM_c04_d11_mPO2_ch14.npy 11 | yourpath/dataset/LORIS/dance/i3d_s25/gPO_sFM_c07_d11_mPO5_ch13.npy 12 | yourpath/dataset/LORIS/dance/i3d_s25/gPO_sFM_c03_d10_mPO1_ch02.npy 13 | yourpath/dataset/LORIS/dance/i3d_s25/gLO_sFM_c09_d15_mLO1_ch16.npy 14 | yourpath/dataset/LORIS/dance/i3d_s25/gBR_sFM_c03_d04_mBR0_ch01.npy 15 | yourpath/dataset/LORIS/dance/i3d_s25/gJS_sFM_c04_d03_mJS2_ch03.npy 16 | yourpath/dataset/LORIS/dance/i3d_s25/gHO_sFM_c02_d20_mHO0_ch08.npy 17 | yourpath/dataset/LORIS/dance/i3d_s25/gBR_sFM_c06_d06_mBR4_ch20.npy 18 | yourpath/dataset/LORIS/dance/i3d_s25/gHO_sFM_c09_d21_mHO2_ch17.npy 19 | yourpath/dataset/LORIS/dance/i3d_s25/gPO_sFM_c07_d11_mPO2_ch10.npy 20 | yourpath/dataset/LORIS/dance/i3d_s25/gLH_sFM_c08_d16_mLH3_ch07.npy 21 | yourpath/dataset/LORIS/dance/i3d_s25/gBR_sFM_c04_d05_mBR5_ch14.npy 22 | yourpath/dataset/LORIS/dance/i3d_s25/gBR_sFM_c06_d04_mBR3_ch04.npy 23 | yourpath/dataset/LORIS/dance/i3d_s25/gMH_sFM_c04_d22_mMH5_ch06.npy 24 | yourpath/dataset/LORIS/dance/i3d_s25/gJS_sFM_c09_d02_mJS1_ch02.npy 25 | yourpath/dataset/LORIS/dance/i3d_s25/gBR_sFM_c04_d04_mBR3_ch04.npy 26 | yourpath/dataset/LORIS/dance/i3d_s25/gHO_sFM_c09_d21_mHO3_ch21.npy 27 | yourpath/dataset/LORIS/dance/i3d_s25/gJB_sFM_c01_d08_mJB2_ch10.npy 28 | yourpath/dataset/LORIS/dance/i3d_s25/gHO_sFM_c04_d19_mHO2_ch07.npy 29 | yourpath/dataset/LORIS/dance/i3d_s25/gLH_sFM_c09_d17_mLH3_ch11.npy 30 | yourpath/dataset/LORIS/dance/i3d_s25/gWA_sFM_c08_d26_mWA3_ch11.npy 31 | yourpath/dataset/LORIS/dance/i3d_s25/gJS_sFM_c06_d02_mJS2_ch03.npy 32 | yourpath/dataset/LORIS/dance/i3d_s25/gKR_sFM_c05_d29_mKR4_ch12.npy 33 | yourpath/dataset/LORIS/dance/i3d_s25/gHO_sFM_c03_d20_mHO2_ch10.npy 34 | yourpath/dataset/LORIS/dance/i3d_s25/gKR_sFM_c08_d29_mKR4_ch12.npy 35 | yourpath/dataset/LORIS/dance/i3d_s25/gLO_sFM_c05_d15_mLO4_ch19.npy 36 | yourpath/dataset/LORIS/dance/i3d_s25/gHO_sFM_c08_d21_mHO1_ch16.npy 37 | yourpath/dataset/LORIS/dance/i3d_s25/gBR_sFM_c05_d04_mBR1_ch02.npy 38 | yourpath/dataset/LORIS/dance/i3d_s25/gPO_sFM_c05_d12_mPO5_ch21.npy 39 | yourpath/dataset/LORIS/dance/i3d_s25/gLO_sFM_c01_d15_mLO0_ch15.npy 40 | yourpath/dataset/LORIS/dance/i3d_s25/gPO_sFM_c08_d11_mPO3_ch11.npy 41 | yourpath/dataset/LORIS/dance/i3d_s25/gLO_sFM_c01_d15_mLO4_ch21.npy 42 | yourpath/dataset/LORIS/dance/i3d_s25/gHO_sFM_c02_d19_mHO3_ch04.npy 43 | yourpath/dataset/LORIS/dance/i3d_s25/gLO_sFM_c06_d13_mLO5_ch06.npy 44 | yourpath/dataset/LORIS/dance/i3d_s25/gBR_sFM_c04_d04_mBR2_ch03.npy 45 | yourpath/dataset/LORIS/dance/i3d_s25/gMH_sFM_c08_d23_mMH0_ch08.npy 46 | yourpath/dataset/LORIS/dance/i3d_s25/gHO_sFM_c01_d20_mHO1_ch09.npy 47 | yourpath/dataset/LORIS/dance/i3d_s25/gKR_sFM_c01_d29_mKR0_ch08.npy 48 | yourpath/dataset/LORIS/dance/i3d_s25/gJS_sFM_c08_d01_mJS3_ch04.npy 49 | yourpath/dataset/LORIS/dance/i3d_s25/gJS_sFM_c03_d01_mJS1_ch07.npy 50 | yourpath/dataset/LORIS/dance/i3d_s25/gPO_sFM_c09_d11_mPO5_ch13.npy 51 | yourpath/dataset/LORIS/dance/i3d_s25/gKR_sFM_c05_d29_mKR1_ch09.npy 52 | yourpath/dataset/LORIS/dance/i3d_s25/gJB_sFM_c09_d08_mJB4_ch12.npy 53 | yourpath/dataset/LORIS/dance/i3d_s25/gLO_sFM_c01_d15_mLO5_ch20.npy 54 | yourpath/dataset/LORIS/dance/i3d_s25/gLO_sFM_c08_d14_mLO5_ch14.npy 55 | yourpath/dataset/LORIS/dance/i3d_s25/gKR_sFM_c01_d28_mKR4_ch05.npy 56 | yourpath/dataset/LORIS/dance/i3d_s25/gMH_sFM_c05_d23_mMH2_ch10.npy 57 | yourpath/dataset/LORIS/dance/i3d_s25/gHO_sFM_c09_d20_mHO1_ch09.npy 58 | yourpath/dataset/LORIS/dance/i3d_s25/gJB_sFM_c08_d08_mJB4_ch12.npy 59 | yourpath/dataset/LORIS/dance/i3d_s25/gLO_sFM_c02_d13_mLO2_ch03.npy 60 | yourpath/dataset/LORIS/dance/i3d_s25/gLO_sFM_c08_d15_mLO4_ch19.npy 61 | yourpath/dataset/LORIS/dance/i3d_s25/gKR_sFM_c04_d28_mKR2_ch03.npy 62 | yourpath/dataset/LORIS/dance/i3d_s25/gWA_sFM_c07_d27_mWA4_ch19.npy 63 | yourpath/dataset/LORIS/dance/i3d_s25/gKR_sFM_c05_d29_mKR2_ch10.npy 64 | yourpath/dataset/LORIS/dance/i3d_s25/gWA_sFM_c04_d26_mWA4_ch12.npy 65 | yourpath/dataset/LORIS/dance/i3d_s25/gBR_sFM_c01_d05_mBR5_ch14.npy 66 | yourpath/dataset/LORIS/dance/i3d_s25/gPO_sFM_c03_d11_mPO4_ch12.npy 67 | yourpath/dataset/LORIS/dance/i3d_s25/gHO_sFM_c06_d19_mHO2_ch03.npy 68 | yourpath/dataset/LORIS/dance/i3d_s25/gKR_sFM_c02_d29_mKR3_ch11.npy 69 | yourpath/dataset/LORIS/dance/i3d_s25/gPO_sFM_c09_d11_mPO0_ch08.npy 70 | yourpath/dataset/LORIS/dance/i3d_s25/gBR_sFM_c04_d05_mBR3_ch10.npy 71 | yourpath/dataset/LORIS/dance/i3d_s25/gJS_sFM_c04_d03_mJS4_ch12.npy 72 | yourpath/dataset/LORIS/dance/i3d_s25/gPO_sFM_c06_d12_mPO4_ch19.npy 73 | yourpath/dataset/LORIS/dance/i3d_s25/gLO_sFM_c06_d15_mLO0_ch15.npy 74 | yourpath/dataset/LORIS/dance/i3d_s25/gKR_sFM_c05_d30_mKR5_ch20.npy 75 | yourpath/dataset/LORIS/dance/i3d_s25/gHO_sFM_c09_d20_mHO2_ch10.npy 76 | yourpath/dataset/LORIS/dance/i3d_s25/gWA_sFM_c01_d27_mWA5_ch20.npy 77 | yourpath/dataset/LORIS/dance/i3d_s25/gKR_sFM_c02_d30_mKR5_ch20.npy 78 | yourpath/dataset/LORIS/dance/i3d_s25/gPO_sFM_c09_d12_mPO5_ch21.npy 79 | yourpath/dataset/LORIS/dance/i3d_s25/gPO_sFM_c02_d12_mPO5_ch20.npy 80 | yourpath/dataset/LORIS/dance/i3d_s25/gLH_sFM_c05_d17_mLH1_ch09.npy 81 | yourpath/dataset/LORIS/dance/i3d_s25/gJS_sFM_c03_d02_mJS4_ch09.npy 82 | yourpath/dataset/LORIS/dance/i3d_s25/gWA_sFM_c09_d25_mWA4_ch05.npy 83 | yourpath/dataset/LORIS/dance/i3d_s25/gHO_sFM_c01_d21_mHO0_ch15.npy 84 | yourpath/dataset/LORIS/dance/i3d_s25/gMH_sFM_c07_d23_mMH0_ch14.npy 85 | yourpath/dataset/LORIS/dance/i3d_s25/gJB_sFM_c03_d09_mJB1_ch21.npy 86 | yourpath/dataset/LORIS/dance/i3d_s25/gBR_sFM_c02_d05_mBR1_ch08.npy 87 | yourpath/dataset/LORIS/dance/i3d_s25/gHO_sFM_c09_d21_mHO0_ch15.npy 88 | yourpath/dataset/LORIS/dance/i3d_s25/gMH_sFM_c07_d22_mMH4_ch05.npy 89 | yourpath/dataset/LORIS/dance/i3d_s25/gJB_sFM_c02_d08_mJB5_ch13.npy 90 | yourpath/dataset/LORIS/dance/i3d_s25/gJB_sFM_c08_d07_mJB3_ch07.npy 91 | yourpath/dataset/LORIS/dance/i3d_s25/gJS_sFM_c07_d01_mJS1_ch07.npy 92 | yourpath/dataset/LORIS/dance/i3d_s25/gMH_sFM_c08_d22_mMH4_ch05.npy 93 | yourpath/dataset/LORIS/dance/i3d_s25/gLO_sFM_c03_d15_mLO0_ch15.npy 94 | yourpath/dataset/LORIS/dance/i3d_s25/gPO_sFM_c05_d11_mPO5_ch13.npy 95 | yourpath/dataset/LORIS/dance/i3d_s25/gPO_sFM_c07_d12_mPO3_ch18.npy 96 | yourpath/dataset/LORIS/dance/i3d_s25/gBR_sFM_c02_d06_mBR4_ch20.npy 97 | yourpath/dataset/LORIS/dance/i3d_s25/gHO_sFM_c03_d20_mHO5_ch13.npy 98 | yourpath/dataset/LORIS/dance/i3d_s25/gJS_sFM_c06_d01_mJS2_ch03.npy 99 | yourpath/dataset/LORIS/dance/i3d_s25/gBR_sFM_c07_d05_mBR4_ch13.npy 100 | yourpath/dataset/LORIS/dance/i3d_s25/gLH_sFM_c04_d17_mLH0_ch08.npy 101 | yourpath/dataset/LORIS/dance/i3d_s25/gJB_sFM_c05_d07_mJB2_ch03.npy 102 | yourpath/dataset/LORIS/dance/i3d_s25/gWA_sFM_c05_d27_mWA0_ch15.npy 103 | yourpath/dataset/LORIS/dance/i3d_s25/gHO_sFM_c09_d21_mHO3_ch18.npy 104 | yourpath/dataset/LORIS/dance/i3d_s25/gJB_sFM_c03_d08_mJB3_ch11.npy 105 | yourpath/dataset/LORIS/dance/i3d_s25/gPO_sFM_c06_d12_mPO1_ch16.npy 106 | yourpath/dataset/LORIS/dance/i3d_s25/gJS_sFM_c06_d01_mJS0_ch01.npy 107 | yourpath/dataset/LORIS/dance/i3d_s25/gJB_sFM_c07_d07_mJB1_ch02.npy 108 | yourpath/dataset/LORIS/dance/i3d_s25/gBR_sFM_c07_d05_mBR3_ch10.npy 109 | yourpath/dataset/LORIS/dance/i3d_s25/gWA_sFM_c08_d26_mWA0_ch08.npy 110 | yourpath/dataset/LORIS/dance/i3d_s25/gJS_sFM_c07_d02_mJS4_ch09.npy 111 | yourpath/dataset/LORIS/dance/i3d_s25/gMH_sFM_c08_d22_mMH3_ch04.npy 112 | yourpath/dataset/LORIS/dance/i3d_s25/gJS_sFM_c04_d02_mJS5_ch10.npy 113 | yourpath/dataset/LORIS/dance/i3d_s25/gBR_sFM_c04_d06_mBR5_ch19.npy 114 | yourpath/dataset/LORIS/dance/i3d_s25/gLH_sFM_c02_d18_mLH2_ch17.npy 115 | yourpath/dataset/LORIS/dance/i3d_s25/gJB_sFM_c08_d09_mJB4_ch19.npy 116 | yourpath/dataset/LORIS/dance/i3d_s25/gLH_sFM_c08_d18_mLH5_ch20.npy 117 | yourpath/dataset/LORIS/dance/i3d_s25/gJS_sFM_c08_d01_mJS2_ch03.npy 118 | yourpath/dataset/LORIS/dance/i3d_s25/gMH_sFM_c09_d23_mMH0_ch08.npy 119 | yourpath/dataset/LORIS/dance/i3d_s25/gMH_sFM_c02_d24_mMH2_ch17.npy 120 | yourpath/dataset/LORIS/dance/i3d_s25/gLH_sFM_c01_d18_mLH2_ch17.npy 121 | yourpath/dataset/LORIS/dance/i3d_s25/gHO_sFM_c02_d19_mHO4_ch05.npy 122 | yourpath/dataset/LORIS/dance/i3d_s25/gBR_sFM_c03_d05_mBR3_ch10.npy 123 | yourpath/dataset/LORIS/dance/i3d_s25/gLH_sFM_c09_d16_mLH0_ch01.npy 124 | yourpath/dataset/LORIS/dance/i3d_s25/gHO_sFM_c07_d21_mHO2_ch17.npy 125 | yourpath/dataset/LORIS/dance/i3d_s25/gWA_sFM_c08_d27_mWA0_ch15.npy 126 | yourpath/dataset/LORIS/dance/i3d_s25/gWA_sFM_c02_d26_mWA3_ch11.npy 127 | yourpath/dataset/LORIS/dance/i3d_s25/gHO_sFM_c07_d19_mHO2_ch07.npy 128 | yourpath/dataset/LORIS/dance/i3d_s25/gJS_sFM_c04_d02_mJS2_ch03.npy 129 | yourpath/dataset/LORIS/dance/i3d_s25/gPO_sFM_c09_d10_mPO0_ch01.npy 130 | yourpath/dataset/LORIS/dance/i3d_s25/gPO_sFM_c07_d11_mPO3_ch11.npy 131 | yourpath/dataset/LORIS/dance/i3d_s25/gKR_sFM_c04_d29_mKR0_ch08.npy 132 | yourpath/dataset/LORIS/dance/i3d_s25/gBR_sFM_c02_d06_mBR3_ch17.npy 133 | yourpath/dataset/LORIS/dance/i3d_s25/gPO_sFM_c02_d11_mPO0_ch08.npy 134 | yourpath/dataset/LORIS/dance/i3d_s25/gJB_sFM_c02_d09_mJB4_ch19.npy 135 | yourpath/dataset/LORIS/dance/i3d_s25/gMH_sFM_c01_d22_mMH0_ch01.npy 136 | yourpath/dataset/LORIS/dance/i3d_s25/gWA_sFM_c01_d27_mWA3_ch18.npy 137 | yourpath/dataset/LORIS/dance/i3d_s25/gMH_sFM_c08_d24_mMH3_ch18.npy 138 | yourpath/dataset/LORIS/dance/i3d_s25/gPO_sFM_c06_d10_mPO0_ch01.npy 139 | yourpath/dataset/LORIS/dance/i3d_s25/gWA_sFM_c01_d27_mWA0_ch15.npy 140 | yourpath/dataset/LORIS/dance/i3d_s25/gLO_sFM_c02_d15_mLO0_ch15.npy 141 | yourpath/dataset/LORIS/dance/i3d_s25/gMH_sFM_c03_d23_mMH5_ch13.npy 142 | yourpath/dataset/LORIS/dance/i3d_s25/gJB_sFM_c07_d07_mJB0_ch01.npy 143 | yourpath/dataset/LORIS/dance/i3d_s25/gJB_sFM_c02_d08_mJB2_ch10.npy 144 | yourpath/dataset/LORIS/dance/i3d_s25/gLO_sFM_c09_d14_mLO3_ch11.npy 145 | yourpath/dataset/LORIS/dance/i3d_s25/gJB_sFM_c08_d09_mJB2_ch17.npy 146 | yourpath/dataset/LORIS/dance/i3d_s25/gLH_sFM_c03_d18_mLH2_ch17.npy 147 | yourpath/dataset/LORIS/dance/i3d_s25/gLO_sFM_c06_d14_mLO1_ch09.npy 148 | yourpath/dataset/LORIS/dance/i3d_s25/gWA_sFM_c05_d25_mWA0_ch01.npy 149 | yourpath/dataset/LORIS/dance/i3d_s25/gPO_sFM_c06_d12_mPO5_ch20.npy 150 | yourpath/dataset/LORIS/dance/i3d_s25/gJB_sFM_c03_d09_mJB0_ch15.npy 151 | yourpath/dataset/LORIS/dance/i3d_s25/gKR_sFM_c06_d30_mKR4_ch19.npy 152 | yourpath/dataset/LORIS/dance/i3d_s25/gMH_sFM_c04_d23_mMH0_ch14.npy 153 | yourpath/dataset/LORIS/dance/i3d_s25/gJS_sFM_c07_d03_mJS5_ch14.npy 154 | yourpath/dataset/LORIS/dance/i3d_s25/gMH_sFM_c03_d22_mMH0_ch01.npy 155 | yourpath/dataset/LORIS/dance/i3d_s25/gMH_sFM_c04_d24_mMH4_ch19.npy 156 | yourpath/dataset/LORIS/dance/i3d_s25/gMH_sFM_c07_d24_mMH5_ch20.npy 157 | yourpath/dataset/LORIS/dance/i3d_s25/gLH_sFM_c06_d17_mLH4_ch12.npy 158 | yourpath/dataset/LORIS/dance/i3d_s25/gJB_sFM_c04_d09_mJB1_ch16.npy 159 | yourpath/dataset/LORIS/dance/i3d_s25/gBR_sFM_c01_d04_mBR1_ch02.npy 160 | yourpath/dataset/LORIS/dance/i3d_s25/gLO_sFM_c04_d13_mLO3_ch04.npy 161 | yourpath/dataset/LORIS/dance/i3d_s25/gMH_sFM_c06_d23_mMH4_ch12.npy 162 | yourpath/dataset/LORIS/dance/i3d_s25/gBR_sFM_c09_d06_mBR4_ch20.npy 163 | yourpath/dataset/LORIS/dance/i3d_s25/gMH_sFM_c08_d23_mMH0_ch14.npy 164 | yourpath/dataset/LORIS/dance/i3d_s25/gHO_sFM_c07_d21_mHO3_ch21.npy 165 | yourpath/dataset/LORIS/dance/i3d_s25/gBR_sFM_c09_d06_mBR2_ch16.npy 166 | yourpath/dataset/LORIS/dance/i3d_s25/gWA_sFM_c04_d27_mWA3_ch18.npy 167 | yourpath/dataset/LORIS/dance/i3d_s25/gWA_sFM_c03_d26_mWA3_ch11.npy 168 | yourpath/dataset/LORIS/dance/i3d_s25/gWA_sFM_c01_d25_mWA4_ch05.npy 169 | yourpath/dataset/LORIS/dance/i3d_s25/gHO_sFM_c02_d21_mHO1_ch16.npy 170 | yourpath/dataset/LORIS/dance/i3d_s25/gLH_sFM_c02_d16_mLH4_ch05.npy 171 | yourpath/dataset/LORIS/dance/i3d_s25/gBR_sFM_c03_d05_mBR4_ch13.npy 172 | yourpath/dataset/LORIS/dance/i3d_s25/gKR_sFM_c01_d29_mKR2_ch10.npy 173 | yourpath/dataset/LORIS/dance/i3d_s25/gBR_sFM_c01_d05_mBR3_ch10.npy 174 | yourpath/dataset/LORIS/dance/i3d_s25/gLH_sFM_c09_d16_mLH4_ch05.npy 175 | yourpath/dataset/LORIS/dance/i3d_s25/gLO_sFM_c02_d13_mLO4_ch07.npy 176 | yourpath/dataset/LORIS/dance/i3d_s25/gPO_sFM_c08_d12_mPO3_ch18.npy 177 | yourpath/dataset/LORIS/dance/i3d_s25/gMH_sFM_c01_d22_mMH4_ch05.npy 178 | yourpath/dataset/LORIS/dance/i3d_s25/gPO_sFM_c08_d12_mPO0_ch15.npy 179 | yourpath/dataset/LORIS/dance/i3d_s25/gJS_sFM_c05_d03_mJS0_ch01.npy 180 | yourpath/dataset/LORIS/dance/i3d_s25/gBR_sFM_c09_d06_mBR1_ch15.npy 181 | yourpath/dataset/LORIS/dance/i3d_s25/gLO_sFM_c03_d13_mLO0_ch01.npy 182 | yourpath/dataset/LORIS/dance/i3d_s25/gLH_sFM_c08_d16_mLH3_ch04.npy 183 | yourpath/dataset/LORIS/dance/i3d_s25/gBR_sFM_c04_d04_mBR1_ch02.npy 184 | yourpath/dataset/LORIS/dance/i3d_s25/gWA_sFM_c07_d27_mWA3_ch18.npy 185 | yourpath/dataset/LORIS/dance/i3d_s25/gJB_sFM_c03_d08_mJB2_ch10.npy 186 | yourpath/dataset/LORIS/dance/i3d_s25/gPO_sFM_c07_d11_mPO4_ch12.npy 187 | yourpath/dataset/LORIS/dance/i3d_s25/gLO_sFM_c09_d13_mLO2_ch03.npy 188 | yourpath/dataset/LORIS/dance/i3d_s25/gLO_sFM_c05_d15_mLO1_ch16.npy 189 | yourpath/dataset/LORIS/dance/i3d_s25/gWA_sFM_c08_d25_mWA4_ch05.npy 190 | -------------------------------------------------------------------------------- /data/dance/dance_pose2d_s25_test_segment.txt: -------------------------------------------------------------------------------- 1 | yourpath/dataset/LORIS/dance/pose2d_s25/gKR_sFM_c09_d28_mKR1_ch02.npy 2 | yourpath/dataset/LORIS/dance/pose2d_s25/gHO_sFM_c09_d19_mHO5_ch06.npy 3 | yourpath/dataset/LORIS/dance/pose2d_s25/gMH_sFM_c09_d23_mMH2_ch10.npy 4 | yourpath/dataset/LORIS/dance/pose2d_s25/gJS_sFM_c07_d03_mJS1_ch02.npy 5 | yourpath/dataset/LORIS/dance/pose2d_s25/gJS_sFM_c06_d01_mJS1_ch07.npy 6 | yourpath/dataset/LORIS/dance/pose2d_s25/gKR_sFM_c01_d30_mKR3_ch21.npy 7 | yourpath/dataset/LORIS/dance/pose2d_s25/gKR_sFM_c02_d30_mKR2_ch17.npy 8 | yourpath/dataset/LORIS/dance/pose2d_s25/gWA_sFM_c02_d25_mWA5_ch06.npy 9 | yourpath/dataset/LORIS/dance/pose2d_s25/gMH_sFM_c08_d24_mMH4_ch19.npy 10 | yourpath/dataset/LORIS/dance/pose2d_s25/gPO_sFM_c04_d11_mPO2_ch14.npy 11 | yourpath/dataset/LORIS/dance/pose2d_s25/gPO_sFM_c07_d11_mPO5_ch13.npy 12 | yourpath/dataset/LORIS/dance/pose2d_s25/gPO_sFM_c03_d10_mPO1_ch02.npy 13 | yourpath/dataset/LORIS/dance/pose2d_s25/gLO_sFM_c09_d15_mLO1_ch16.npy 14 | yourpath/dataset/LORIS/dance/pose2d_s25/gBR_sFM_c03_d04_mBR0_ch01.npy 15 | yourpath/dataset/LORIS/dance/pose2d_s25/gJS_sFM_c04_d03_mJS2_ch03.npy 16 | yourpath/dataset/LORIS/dance/pose2d_s25/gHO_sFM_c02_d20_mHO0_ch08.npy 17 | yourpath/dataset/LORIS/dance/pose2d_s25/gBR_sFM_c06_d06_mBR4_ch20.npy 18 | yourpath/dataset/LORIS/dance/pose2d_s25/gHO_sFM_c09_d21_mHO2_ch17.npy 19 | yourpath/dataset/LORIS/dance/pose2d_s25/gPO_sFM_c07_d11_mPO2_ch10.npy 20 | yourpath/dataset/LORIS/dance/pose2d_s25/gLH_sFM_c08_d16_mLH3_ch07.npy 21 | yourpath/dataset/LORIS/dance/pose2d_s25/gBR_sFM_c04_d05_mBR5_ch14.npy 22 | yourpath/dataset/LORIS/dance/pose2d_s25/gBR_sFM_c06_d04_mBR3_ch04.npy 23 | yourpath/dataset/LORIS/dance/pose2d_s25/gMH_sFM_c04_d22_mMH5_ch06.npy 24 | yourpath/dataset/LORIS/dance/pose2d_s25/gJS_sFM_c09_d02_mJS1_ch02.npy 25 | yourpath/dataset/LORIS/dance/pose2d_s25/gBR_sFM_c04_d04_mBR3_ch04.npy 26 | yourpath/dataset/LORIS/dance/pose2d_s25/gHO_sFM_c09_d21_mHO3_ch21.npy 27 | yourpath/dataset/LORIS/dance/pose2d_s25/gJB_sFM_c01_d08_mJB2_ch10.npy 28 | yourpath/dataset/LORIS/dance/pose2d_s25/gHO_sFM_c04_d19_mHO2_ch07.npy 29 | yourpath/dataset/LORIS/dance/pose2d_s25/gLH_sFM_c09_d17_mLH3_ch11.npy 30 | yourpath/dataset/LORIS/dance/pose2d_s25/gWA_sFM_c08_d26_mWA3_ch11.npy 31 | yourpath/dataset/LORIS/dance/pose2d_s25/gJS_sFM_c06_d02_mJS2_ch03.npy 32 | yourpath/dataset/LORIS/dance/pose2d_s25/gKR_sFM_c05_d29_mKR4_ch12.npy 33 | yourpath/dataset/LORIS/dance/pose2d_s25/gHO_sFM_c03_d20_mHO2_ch10.npy 34 | yourpath/dataset/LORIS/dance/pose2d_s25/gKR_sFM_c08_d29_mKR4_ch12.npy 35 | yourpath/dataset/LORIS/dance/pose2d_s25/gLO_sFM_c05_d15_mLO4_ch19.npy 36 | yourpath/dataset/LORIS/dance/pose2d_s25/gHO_sFM_c08_d21_mHO1_ch16.npy 37 | yourpath/dataset/LORIS/dance/pose2d_s25/gBR_sFM_c05_d04_mBR1_ch02.npy 38 | yourpath/dataset/LORIS/dance/pose2d_s25/gPO_sFM_c05_d12_mPO5_ch21.npy 39 | yourpath/dataset/LORIS/dance/pose2d_s25/gLO_sFM_c01_d15_mLO0_ch15.npy 40 | yourpath/dataset/LORIS/dance/pose2d_s25/gPO_sFM_c08_d11_mPO3_ch11.npy 41 | yourpath/dataset/LORIS/dance/pose2d_s25/gLO_sFM_c01_d15_mLO4_ch21.npy 42 | yourpath/dataset/LORIS/dance/pose2d_s25/gHO_sFM_c02_d19_mHO3_ch04.npy 43 | yourpath/dataset/LORIS/dance/pose2d_s25/gLO_sFM_c06_d13_mLO5_ch06.npy 44 | yourpath/dataset/LORIS/dance/pose2d_s25/gBR_sFM_c04_d04_mBR2_ch03.npy 45 | yourpath/dataset/LORIS/dance/pose2d_s25/gMH_sFM_c08_d23_mMH0_ch08.npy 46 | yourpath/dataset/LORIS/dance/pose2d_s25/gHO_sFM_c01_d20_mHO1_ch09.npy 47 | yourpath/dataset/LORIS/dance/pose2d_s25/gKR_sFM_c01_d29_mKR0_ch08.npy 48 | yourpath/dataset/LORIS/dance/pose2d_s25/gJS_sFM_c08_d01_mJS3_ch04.npy 49 | yourpath/dataset/LORIS/dance/pose2d_s25/gJS_sFM_c03_d01_mJS1_ch07.npy 50 | yourpath/dataset/LORIS/dance/pose2d_s25/gPO_sFM_c09_d11_mPO5_ch13.npy 51 | yourpath/dataset/LORIS/dance/pose2d_s25/gKR_sFM_c05_d29_mKR1_ch09.npy 52 | yourpath/dataset/LORIS/dance/pose2d_s25/gJB_sFM_c09_d08_mJB4_ch12.npy 53 | yourpath/dataset/LORIS/dance/pose2d_s25/gLO_sFM_c01_d15_mLO5_ch20.npy 54 | yourpath/dataset/LORIS/dance/pose2d_s25/gLO_sFM_c08_d14_mLO5_ch14.npy 55 | yourpath/dataset/LORIS/dance/pose2d_s25/gKR_sFM_c01_d28_mKR4_ch05.npy 56 | yourpath/dataset/LORIS/dance/pose2d_s25/gMH_sFM_c05_d23_mMH2_ch10.npy 57 | yourpath/dataset/LORIS/dance/pose2d_s25/gHO_sFM_c09_d20_mHO1_ch09.npy 58 | yourpath/dataset/LORIS/dance/pose2d_s25/gJB_sFM_c08_d08_mJB4_ch12.npy 59 | yourpath/dataset/LORIS/dance/pose2d_s25/gLO_sFM_c02_d13_mLO2_ch03.npy 60 | yourpath/dataset/LORIS/dance/pose2d_s25/gLO_sFM_c08_d15_mLO4_ch19.npy 61 | yourpath/dataset/LORIS/dance/pose2d_s25/gKR_sFM_c04_d28_mKR2_ch03.npy 62 | yourpath/dataset/LORIS/dance/pose2d_s25/gWA_sFM_c07_d27_mWA4_ch19.npy 63 | yourpath/dataset/LORIS/dance/pose2d_s25/gKR_sFM_c05_d29_mKR2_ch10.npy 64 | yourpath/dataset/LORIS/dance/pose2d_s25/gWA_sFM_c04_d26_mWA4_ch12.npy 65 | yourpath/dataset/LORIS/dance/pose2d_s25/gBR_sFM_c01_d05_mBR5_ch14.npy 66 | yourpath/dataset/LORIS/dance/pose2d_s25/gPO_sFM_c03_d11_mPO4_ch12.npy 67 | yourpath/dataset/LORIS/dance/pose2d_s25/gHO_sFM_c06_d19_mHO2_ch03.npy 68 | yourpath/dataset/LORIS/dance/pose2d_s25/gKR_sFM_c02_d29_mKR3_ch11.npy 69 | yourpath/dataset/LORIS/dance/pose2d_s25/gPO_sFM_c09_d11_mPO0_ch08.npy 70 | yourpath/dataset/LORIS/dance/pose2d_s25/gBR_sFM_c04_d05_mBR3_ch10.npy 71 | yourpath/dataset/LORIS/dance/pose2d_s25/gJS_sFM_c04_d03_mJS4_ch12.npy 72 | yourpath/dataset/LORIS/dance/pose2d_s25/gPO_sFM_c06_d12_mPO4_ch19.npy 73 | yourpath/dataset/LORIS/dance/pose2d_s25/gLO_sFM_c06_d15_mLO0_ch15.npy 74 | yourpath/dataset/LORIS/dance/pose2d_s25/gKR_sFM_c05_d30_mKR5_ch20.npy 75 | yourpath/dataset/LORIS/dance/pose2d_s25/gHO_sFM_c09_d20_mHO2_ch10.npy 76 | yourpath/dataset/LORIS/dance/pose2d_s25/gWA_sFM_c01_d27_mWA5_ch20.npy 77 | yourpath/dataset/LORIS/dance/pose2d_s25/gKR_sFM_c02_d30_mKR5_ch20.npy 78 | yourpath/dataset/LORIS/dance/pose2d_s25/gPO_sFM_c09_d12_mPO5_ch21.npy 79 | yourpath/dataset/LORIS/dance/pose2d_s25/gPO_sFM_c02_d12_mPO5_ch20.npy 80 | yourpath/dataset/LORIS/dance/pose2d_s25/gLH_sFM_c05_d17_mLH1_ch09.npy 81 | yourpath/dataset/LORIS/dance/pose2d_s25/gJS_sFM_c03_d02_mJS4_ch09.npy 82 | yourpath/dataset/LORIS/dance/pose2d_s25/gWA_sFM_c09_d25_mWA4_ch05.npy 83 | yourpath/dataset/LORIS/dance/pose2d_s25/gHO_sFM_c01_d21_mHO0_ch15.npy 84 | yourpath/dataset/LORIS/dance/pose2d_s25/gMH_sFM_c07_d23_mMH0_ch14.npy 85 | yourpath/dataset/LORIS/dance/pose2d_s25/gJB_sFM_c03_d09_mJB1_ch21.npy 86 | yourpath/dataset/LORIS/dance/pose2d_s25/gBR_sFM_c02_d05_mBR1_ch08.npy 87 | yourpath/dataset/LORIS/dance/pose2d_s25/gHO_sFM_c09_d21_mHO0_ch15.npy 88 | yourpath/dataset/LORIS/dance/pose2d_s25/gMH_sFM_c07_d22_mMH4_ch05.npy 89 | yourpath/dataset/LORIS/dance/pose2d_s25/gJB_sFM_c02_d08_mJB5_ch13.npy 90 | yourpath/dataset/LORIS/dance/pose2d_s25/gJB_sFM_c08_d07_mJB3_ch07.npy 91 | yourpath/dataset/LORIS/dance/pose2d_s25/gJS_sFM_c07_d01_mJS1_ch07.npy 92 | yourpath/dataset/LORIS/dance/pose2d_s25/gMH_sFM_c08_d22_mMH4_ch05.npy 93 | yourpath/dataset/LORIS/dance/pose2d_s25/gLO_sFM_c03_d15_mLO0_ch15.npy 94 | yourpath/dataset/LORIS/dance/pose2d_s25/gPO_sFM_c05_d11_mPO5_ch13.npy 95 | yourpath/dataset/LORIS/dance/pose2d_s25/gPO_sFM_c07_d12_mPO3_ch18.npy 96 | yourpath/dataset/LORIS/dance/pose2d_s25/gBR_sFM_c02_d06_mBR4_ch20.npy 97 | yourpath/dataset/LORIS/dance/pose2d_s25/gHO_sFM_c03_d20_mHO5_ch13.npy 98 | yourpath/dataset/LORIS/dance/pose2d_s25/gJS_sFM_c06_d01_mJS2_ch03.npy 99 | yourpath/dataset/LORIS/dance/pose2d_s25/gBR_sFM_c07_d05_mBR4_ch13.npy 100 | yourpath/dataset/LORIS/dance/pose2d_s25/gLH_sFM_c04_d17_mLH0_ch08.npy 101 | yourpath/dataset/LORIS/dance/pose2d_s25/gJB_sFM_c05_d07_mJB2_ch03.npy 102 | yourpath/dataset/LORIS/dance/pose2d_s25/gWA_sFM_c05_d27_mWA0_ch15.npy 103 | yourpath/dataset/LORIS/dance/pose2d_s25/gHO_sFM_c09_d21_mHO3_ch18.npy 104 | yourpath/dataset/LORIS/dance/pose2d_s25/gJB_sFM_c03_d08_mJB3_ch11.npy 105 | yourpath/dataset/LORIS/dance/pose2d_s25/gPO_sFM_c06_d12_mPO1_ch16.npy 106 | yourpath/dataset/LORIS/dance/pose2d_s25/gJS_sFM_c06_d01_mJS0_ch01.npy 107 | yourpath/dataset/LORIS/dance/pose2d_s25/gJB_sFM_c07_d07_mJB1_ch02.npy 108 | yourpath/dataset/LORIS/dance/pose2d_s25/gBR_sFM_c07_d05_mBR3_ch10.npy 109 | yourpath/dataset/LORIS/dance/pose2d_s25/gWA_sFM_c08_d26_mWA0_ch08.npy 110 | yourpath/dataset/LORIS/dance/pose2d_s25/gJS_sFM_c07_d02_mJS4_ch09.npy 111 | yourpath/dataset/LORIS/dance/pose2d_s25/gMH_sFM_c08_d22_mMH3_ch04.npy 112 | yourpath/dataset/LORIS/dance/pose2d_s25/gJS_sFM_c04_d02_mJS5_ch10.npy 113 | yourpath/dataset/LORIS/dance/pose2d_s25/gBR_sFM_c04_d06_mBR5_ch19.npy 114 | yourpath/dataset/LORIS/dance/pose2d_s25/gLH_sFM_c02_d18_mLH2_ch17.npy 115 | yourpath/dataset/LORIS/dance/pose2d_s25/gJB_sFM_c08_d09_mJB4_ch19.npy 116 | yourpath/dataset/LORIS/dance/pose2d_s25/gLH_sFM_c08_d18_mLH5_ch20.npy 117 | yourpath/dataset/LORIS/dance/pose2d_s25/gJS_sFM_c08_d01_mJS2_ch03.npy 118 | yourpath/dataset/LORIS/dance/pose2d_s25/gMH_sFM_c09_d23_mMH0_ch08.npy 119 | yourpath/dataset/LORIS/dance/pose2d_s25/gMH_sFM_c02_d24_mMH2_ch17.npy 120 | yourpath/dataset/LORIS/dance/pose2d_s25/gLH_sFM_c01_d18_mLH2_ch17.npy 121 | yourpath/dataset/LORIS/dance/pose2d_s25/gHO_sFM_c02_d19_mHO4_ch05.npy 122 | yourpath/dataset/LORIS/dance/pose2d_s25/gBR_sFM_c03_d05_mBR3_ch10.npy 123 | yourpath/dataset/LORIS/dance/pose2d_s25/gLH_sFM_c09_d16_mLH0_ch01.npy 124 | yourpath/dataset/LORIS/dance/pose2d_s25/gHO_sFM_c07_d21_mHO2_ch17.npy 125 | yourpath/dataset/LORIS/dance/pose2d_s25/gWA_sFM_c08_d27_mWA0_ch15.npy 126 | yourpath/dataset/LORIS/dance/pose2d_s25/gWA_sFM_c02_d26_mWA3_ch11.npy 127 | yourpath/dataset/LORIS/dance/pose2d_s25/gHO_sFM_c07_d19_mHO2_ch07.npy 128 | yourpath/dataset/LORIS/dance/pose2d_s25/gJS_sFM_c04_d02_mJS2_ch03.npy 129 | yourpath/dataset/LORIS/dance/pose2d_s25/gPO_sFM_c09_d10_mPO0_ch01.npy 130 | yourpath/dataset/LORIS/dance/pose2d_s25/gPO_sFM_c07_d11_mPO3_ch11.npy 131 | yourpath/dataset/LORIS/dance/pose2d_s25/gKR_sFM_c04_d29_mKR0_ch08.npy 132 | yourpath/dataset/LORIS/dance/pose2d_s25/gBR_sFM_c02_d06_mBR3_ch17.npy 133 | yourpath/dataset/LORIS/dance/pose2d_s25/gPO_sFM_c02_d11_mPO0_ch08.npy 134 | yourpath/dataset/LORIS/dance/pose2d_s25/gJB_sFM_c02_d09_mJB4_ch19.npy 135 | yourpath/dataset/LORIS/dance/pose2d_s25/gMH_sFM_c01_d22_mMH0_ch01.npy 136 | yourpath/dataset/LORIS/dance/pose2d_s25/gWA_sFM_c01_d27_mWA3_ch18.npy 137 | yourpath/dataset/LORIS/dance/pose2d_s25/gMH_sFM_c08_d24_mMH3_ch18.npy 138 | yourpath/dataset/LORIS/dance/pose2d_s25/gPO_sFM_c06_d10_mPO0_ch01.npy 139 | yourpath/dataset/LORIS/dance/pose2d_s25/gWA_sFM_c01_d27_mWA0_ch15.npy 140 | yourpath/dataset/LORIS/dance/pose2d_s25/gLO_sFM_c02_d15_mLO0_ch15.npy 141 | yourpath/dataset/LORIS/dance/pose2d_s25/gMH_sFM_c03_d23_mMH5_ch13.npy 142 | yourpath/dataset/LORIS/dance/pose2d_s25/gJB_sFM_c07_d07_mJB0_ch01.npy 143 | yourpath/dataset/LORIS/dance/pose2d_s25/gJB_sFM_c02_d08_mJB2_ch10.npy 144 | yourpath/dataset/LORIS/dance/pose2d_s25/gLO_sFM_c09_d14_mLO3_ch11.npy 145 | yourpath/dataset/LORIS/dance/pose2d_s25/gJB_sFM_c08_d09_mJB2_ch17.npy 146 | yourpath/dataset/LORIS/dance/pose2d_s25/gLH_sFM_c03_d18_mLH2_ch17.npy 147 | yourpath/dataset/LORIS/dance/pose2d_s25/gLO_sFM_c06_d14_mLO1_ch09.npy 148 | yourpath/dataset/LORIS/dance/pose2d_s25/gWA_sFM_c05_d25_mWA0_ch01.npy 149 | yourpath/dataset/LORIS/dance/pose2d_s25/gPO_sFM_c06_d12_mPO5_ch20.npy 150 | yourpath/dataset/LORIS/dance/pose2d_s25/gJB_sFM_c03_d09_mJB0_ch15.npy 151 | yourpath/dataset/LORIS/dance/pose2d_s25/gKR_sFM_c06_d30_mKR4_ch19.npy 152 | yourpath/dataset/LORIS/dance/pose2d_s25/gMH_sFM_c04_d23_mMH0_ch14.npy 153 | yourpath/dataset/LORIS/dance/pose2d_s25/gJS_sFM_c07_d03_mJS5_ch14.npy 154 | yourpath/dataset/LORIS/dance/pose2d_s25/gMH_sFM_c03_d22_mMH0_ch01.npy 155 | yourpath/dataset/LORIS/dance/pose2d_s25/gMH_sFM_c04_d24_mMH4_ch19.npy 156 | yourpath/dataset/LORIS/dance/pose2d_s25/gMH_sFM_c07_d24_mMH5_ch20.npy 157 | yourpath/dataset/LORIS/dance/pose2d_s25/gLH_sFM_c06_d17_mLH4_ch12.npy 158 | yourpath/dataset/LORIS/dance/pose2d_s25/gJB_sFM_c04_d09_mJB1_ch16.npy 159 | yourpath/dataset/LORIS/dance/pose2d_s25/gBR_sFM_c01_d04_mBR1_ch02.npy 160 | yourpath/dataset/LORIS/dance/pose2d_s25/gLO_sFM_c04_d13_mLO3_ch04.npy 161 | yourpath/dataset/LORIS/dance/pose2d_s25/gMH_sFM_c06_d23_mMH4_ch12.npy 162 | yourpath/dataset/LORIS/dance/pose2d_s25/gBR_sFM_c09_d06_mBR4_ch20.npy 163 | yourpath/dataset/LORIS/dance/pose2d_s25/gMH_sFM_c08_d23_mMH0_ch14.npy 164 | yourpath/dataset/LORIS/dance/pose2d_s25/gHO_sFM_c07_d21_mHO3_ch21.npy 165 | yourpath/dataset/LORIS/dance/pose2d_s25/gBR_sFM_c09_d06_mBR2_ch16.npy 166 | yourpath/dataset/LORIS/dance/pose2d_s25/gWA_sFM_c04_d27_mWA3_ch18.npy 167 | yourpath/dataset/LORIS/dance/pose2d_s25/gWA_sFM_c03_d26_mWA3_ch11.npy 168 | yourpath/dataset/LORIS/dance/pose2d_s25/gWA_sFM_c01_d25_mWA4_ch05.npy 169 | yourpath/dataset/LORIS/dance/pose2d_s25/gHO_sFM_c02_d21_mHO1_ch16.npy 170 | yourpath/dataset/LORIS/dance/pose2d_s25/gLH_sFM_c02_d16_mLH4_ch05.npy 171 | yourpath/dataset/LORIS/dance/pose2d_s25/gBR_sFM_c03_d05_mBR4_ch13.npy 172 | yourpath/dataset/LORIS/dance/pose2d_s25/gKR_sFM_c01_d29_mKR2_ch10.npy 173 | yourpath/dataset/LORIS/dance/pose2d_s25/gBR_sFM_c01_d05_mBR3_ch10.npy 174 | yourpath/dataset/LORIS/dance/pose2d_s25/gLH_sFM_c09_d16_mLH4_ch05.npy 175 | yourpath/dataset/LORIS/dance/pose2d_s25/gLO_sFM_c02_d13_mLO4_ch07.npy 176 | yourpath/dataset/LORIS/dance/pose2d_s25/gPO_sFM_c08_d12_mPO3_ch18.npy 177 | yourpath/dataset/LORIS/dance/pose2d_s25/gMH_sFM_c01_d22_mMH4_ch05.npy 178 | yourpath/dataset/LORIS/dance/pose2d_s25/gPO_sFM_c08_d12_mPO0_ch15.npy 179 | yourpath/dataset/LORIS/dance/pose2d_s25/gJS_sFM_c05_d03_mJS0_ch01.npy 180 | yourpath/dataset/LORIS/dance/pose2d_s25/gBR_sFM_c09_d06_mBR1_ch15.npy 181 | yourpath/dataset/LORIS/dance/pose2d_s25/gLO_sFM_c03_d13_mLO0_ch01.npy 182 | yourpath/dataset/LORIS/dance/pose2d_s25/gLH_sFM_c08_d16_mLH3_ch04.npy 183 | yourpath/dataset/LORIS/dance/pose2d_s25/gBR_sFM_c04_d04_mBR1_ch02.npy 184 | yourpath/dataset/LORIS/dance/pose2d_s25/gWA_sFM_c07_d27_mWA3_ch18.npy 185 | yourpath/dataset/LORIS/dance/pose2d_s25/gJB_sFM_c03_d08_mJB2_ch10.npy 186 | yourpath/dataset/LORIS/dance/pose2d_s25/gPO_sFM_c07_d11_mPO4_ch12.npy 187 | yourpath/dataset/LORIS/dance/pose2d_s25/gLO_sFM_c09_d13_mLO2_ch03.npy 188 | yourpath/dataset/LORIS/dance/pose2d_s25/gLO_sFM_c05_d15_mLO1_ch16.npy 189 | yourpath/dataset/LORIS/dance/pose2d_s25/gWA_sFM_c08_d25_mWA4_ch05.npy 190 | -------------------------------------------------------------------------------- /data/fe/fe_audio_s25_test_segment.txt: -------------------------------------------------------------------------------- 1 | yourpath/dataset/LORIS/fe/audio_s25/ji4smBYYANs_004450_004547_seg1.wav 2 | yourpath/dataset/LORIS/fe/audio_s25/CUuRl0Bwbbc_003664_003763_seg2.wav 3 | yourpath/dataset/LORIS/fe/audio_s25/1JsRXIoR3C0_009836_009925_seg1.wav 4 | yourpath/dataset/LORIS/fe/audio_s25/f-1FbFegbuQ_003369_003472_seg2.wav 5 | yourpath/dataset/LORIS/fe/audio_s25/upaJ16I0zmQ_005247_005349_seg1.wav 6 | yourpath/dataset/LORIS/fe/audio_s25/GbUQwE9N3aM_001342_001444_seg2.wav 7 | yourpath/dataset/LORIS/fe/audio_s25/fDa0HpoXES4_003787_003883_seg2.wav 8 | yourpath/dataset/LORIS/fe/audio_s25/k8zhOvRBjGo_001034_001136_seg0.wav 9 | yourpath/dataset/LORIS/fe/audio_s25/DTedv-hhHU4_000795_000904_seg1.wav 10 | yourpath/dataset/LORIS/fe/audio_s25/f-1FbFegbuQ_003369_003472_seg1.wav 11 | yourpath/dataset/LORIS/fe/audio_s25/t7Xgg9bejOM_007868_007979_seg2.wav 12 | yourpath/dataset/LORIS/fe/audio_s25/esQQbBhuXbM_001856_001954_seg1.wav 13 | yourpath/dataset/LORIS/fe/audio_s25/e3EsDlpNo0c_002907_003007_seg1.wav 14 | yourpath/dataset/LORIS/fe/audio_s25/t7Xgg9bejOM_009086_009187_seg2.wav 15 | yourpath/dataset/LORIS/fe/audio_s25/eH-ZgOT8ASM_007496_007602_seg0.wav 16 | yourpath/dataset/LORIS/fe/audio_s25/0LtLS9wROrk_003773_003867_seg0.wav 17 | yourpath/dataset/LORIS/fe/audio_s25/X4ajWw8L19s_009605_009712_seg2.wav 18 | yourpath/dataset/LORIS/fe/audio_s25/JHqcbeKepSg_009959_010058_seg0.wav 19 | yourpath/dataset/LORIS/fe/audio_s25/CUuRl0Bwbbc_003957_004064_seg1.wav 20 | yourpath/dataset/LORIS/fe/audio_s25/wWZry3-5sF0_001634_001737_seg0.wav 21 | yourpath/dataset/LORIS/fe/audio_s25/xHBUIt-airA_001244_001340_seg0.wav 22 | yourpath/dataset/LORIS/fe/audio_s25/yz-uNJgIhk4_003134_003234_seg0.wav 23 | yourpath/dataset/LORIS/fe/audio_s25/CUuRl0Bwbbc_003495_003598_seg0.wav 24 | yourpath/dataset/LORIS/fe/audio_s25/wYbfwx93VXk_009057_009158_seg0.wav 25 | yourpath/dataset/LORIS/fe/audio_s25/yz-uNJgIhk4_000834_000945_seg2.wav 26 | yourpath/dataset/LORIS/fe/audio_s25/esQQbBhuXbM_002103_002211_seg0.wav 27 | yourpath/dataset/LORIS/fe/audio_s25/wWwc2BbO598_002330_002426_seg1.wav 28 | yourpath/dataset/LORIS/fe/audio_s25/X4ajWw8L19s_004690_004794_seg1.wav 29 | yourpath/dataset/LORIS/fe/audio_s25/GEjRXo8Dvwc_000878_000982_seg0.wav 30 | yourpath/dataset/LORIS/fe/audio_s25/wWwc2BbO598_002685_002773_seg1.wav 31 | yourpath/dataset/LORIS/fe/audio_s25/CUuRl0Bwbbc_003957_004064_seg2.wav 32 | yourpath/dataset/LORIS/fe/audio_s25/Ry5PFp-pRmA_002806_002912_seg1.wav 33 | yourpath/dataset/LORIS/fe/audio_s25/uDZVn-K4GE4_001942_002041_seg1.wav 34 | yourpath/dataset/LORIS/fe/audio_s25/VWsVUnoyUoA_007344_007444_seg1.wav 35 | yourpath/dataset/LORIS/fe/audio_s25/8YSDFKGwP4U_004951_005050_seg1.wav 36 | yourpath/dataset/LORIS/fe/audio_s25/yvZPHJu3kb0_002828_002925_seg2.wav 37 | yourpath/dataset/LORIS/fe/audio_s25/PgNRyuavbS4_008687_008786_seg2.wav 38 | yourpath/dataset/LORIS/fe/audio_s25/FNEeMvHmuEw_000197_000292_seg0.wav 39 | yourpath/dataset/LORIS/fe/audio_s25/e3EsDlpNo0c_006102_006204_seg2.wav 40 | yourpath/dataset/LORIS/fe/audio_s25/PaVNLvldLeI_009767_009870_seg0.wav 41 | yourpath/dataset/LORIS/fe/audio_s25/8jfPAvqYAs8_000862_000964_seg2.wav 42 | yourpath/dataset/LORIS/fe/audio_s25/1sPWceVH4e8_005917_006015_seg0.wav 43 | yourpath/dataset/LORIS/fe/audio_s25/fH-VYYl9elA_000904_000999_seg1.wav 44 | yourpath/dataset/LORIS/fe/audio_s25/om-qKQXxnH4_001398_001495_seg1.wav 45 | yourpath/dataset/LORIS/fe/audio_s25/jz594oTnl-k_003385_003487_seg1.wav 46 | yourpath/dataset/LORIS/fe/audio_s25/k8zhOvRBjGo_000229_000337_seg0.wav 47 | yourpath/dataset/LORIS/fe/audio_s25/zNL3kn3UBmg_001223_001318_seg0.wav 48 | yourpath/dataset/LORIS/fe/audio_s25/fDa0HpoXES4_004339_004438_seg1.wav 49 | yourpath/dataset/LORIS/fe/audio_s25/esQQbBhuXbM_004424_004529_seg0.wav 50 | yourpath/dataset/LORIS/fe/audio_s25/IWFgo-tEEs8_003363_003461_seg1.wav 51 | yourpath/dataset/LORIS/fe/audio_s25/k8zhOvRBjGo_000229_000337_seg1.wav 52 | yourpath/dataset/LORIS/fe/audio_s25/Z2T9B4qExzk_000795_000892_seg2.wav 53 | yourpath/dataset/LORIS/fe/audio_s25/ji4smBYYANs_006342_006438_seg2.wav 54 | yourpath/dataset/LORIS/fe/audio_s25/TBsWos4T4OE_002570_002671_seg1.wav 55 | yourpath/dataset/LORIS/fe/audio_s25/A0xAXXysHUo_003089_003189_seg0.wav 56 | yourpath/dataset/LORIS/fe/audio_s25/dqUNtY2GwW4_003169_003267_seg1.wav 57 | yourpath/dataset/LORIS/fe/audio_s25/v3mISBmwrUM_006480_006578_seg0.wav 58 | yourpath/dataset/LORIS/fe/audio_s25/PgNRyuavbS4_001457_001550_seg0.wav 59 | yourpath/dataset/LORIS/fe/audio_s25/OIJe8fQw7Wo_002543_002643_seg2.wav 60 | yourpath/dataset/LORIS/fe/audio_s25/A0xAXXysHUo_003897_003995_seg2.wav 61 | yourpath/dataset/LORIS/fe/audio_s25/MyrqGZXxpsY_004910_005009_seg2.wav 62 | yourpath/dataset/LORIS/fe/audio_s25/E3AHJ6-QS8M_005450_005555_seg1.wav 63 | yourpath/dataset/LORIS/fe/audio_s25/wWZry3-5sF0_000808_000908_seg1.wav 64 | yourpath/dataset/LORIS/fe/audio_s25/wYbfwx93VXk_010310_010415_seg1.wav 65 | yourpath/dataset/LORIS/fe/audio_s25/nSDRagdrJ-A_003449_003565_seg2.wav 66 | yourpath/dataset/LORIS/fe/audio_s25/BQhX6F3gpp8_007119_007222_seg2.wav 67 | yourpath/dataset/LORIS/fe/audio_s25/hibW8s4WQmQ_002302_002410_seg2.wav 68 | yourpath/dataset/LORIS/fe/audio_s25/ji4smBYYANs_004450_004547_seg0.wav 69 | yourpath/dataset/LORIS/fe/audio_s25/hibW8s4WQmQ_000534_000635_seg1.wav 70 | yourpath/dataset/LORIS/fe/audio_s25/P31Ht3H76ok_005126_005230_seg2.wav 71 | yourpath/dataset/LORIS/fe/audio_s25/BLzs5opw8uM_003532_003625_seg1.wav 72 | yourpath/dataset/LORIS/fe/audio_s25/Z0bBRwAzKe0_002034_002136_seg1.wav 73 | yourpath/dataset/LORIS/fe/audio_s25/wYbfwx93VXk_009281_009385_seg0.wav 74 | yourpath/dataset/LORIS/fe/audio_s25/wWZry3-5sF0_004473_004574_seg0.wav 75 | yourpath/dataset/LORIS/fe/audio_s25/eH-ZgOT8ASM_008137_008245_seg2.wav 76 | yourpath/dataset/LORIS/fe/audio_s25/upaJ16I0zmQ_002150_002245_seg2.wav 77 | yourpath/dataset/LORIS/fe/audio_s25/hibW8s4WQmQ_004459_004564_seg1.wav 78 | yourpath/dataset/LORIS/fe/audio_s25/Xw1UvouxVLk_003061_003161_seg2.wav 79 | yourpath/dataset/LORIS/fe/audio_s25/qGvIwgHzCH8_003934_004037_seg2.wav 80 | yourpath/dataset/LORIS/fe/audio_s25/nSDRagdrJ-A_003239_003339_seg2.wav 81 | yourpath/dataset/LORIS/fe/audio_s25/n9-yxVGYMRw_001596_001703_seg2.wav 82 | yourpath/dataset/LORIS/fe/audio_s25/gDmmqalpisc_006229_006328_seg2.wav 83 | yourpath/dataset/LORIS/fe/audio_s25/e3EsDlpNo0c_006659_006760_seg0.wav 84 | yourpath/dataset/LORIS/fe/audio_s25/eH-ZgOT8ASM_007496_007602_seg2.wav 85 | yourpath/dataset/LORIS/fe/audio_s25/k8zhOvRBjGo_001034_001136_seg1.wav 86 | yourpath/dataset/LORIS/fe/audio_s25/TBsWos4T4OE_003911_004006_seg2.wav 87 | yourpath/dataset/LORIS/fe/audio_s25/upaJ16I0zmQ_004147_004244_seg1.wav 88 | yourpath/dataset/LORIS/fe/audio_s25/EFvDqOF1sCk_002657_002760_seg1.wav 89 | yourpath/dataset/LORIS/fe/audio_s25/jz594oTnl-k_001928_002032_seg2.wav 90 | yourpath/dataset/LORIS/fe/audio_s25/esQQbBhuXbM_002103_002211_seg2.wav 91 | yourpath/dataset/LORIS/fe/audio_s25/i87qMWsFbEI_003295_003400_seg2.wav 92 | yourpath/dataset/LORIS/fe/audio_s25/EKb2MMJSoeI_002952_003052_seg2.wav 93 | yourpath/dataset/LORIS/fe/audio_s25/R9XUGR-VlTg_008869_008972_seg1.wav 94 | yourpath/dataset/LORIS/fe/audio_s25/yvZPHJu3kb0_002828_002925_seg0.wav 95 | yourpath/dataset/LORIS/fe/audio_s25/f6k7PBGgeb4_000779_000876_seg2.wav 96 | yourpath/dataset/LORIS/fe/audio_s25/0LtLS9wROrk_006690_006788_seg2.wav 97 | yourpath/dataset/LORIS/fe/audio_s25/gRgndu5MZY4_010248_010361_seg2.wav 98 | yourpath/dataset/LORIS/fe/audio_s25/IP96HTdCvWs_005209_005311_seg0.wav 99 | yourpath/dataset/LORIS/fe/audio_s25/Z2T9B4qExzk_001432_001524_seg2.wav 100 | yourpath/dataset/LORIS/fe/audio_s25/5cuxEEKyth8_003196_003295_seg2.wav 101 | yourpath/dataset/LORIS/fe/audio_s25/1sPWceVH4e8_007221_007310_seg1.wav 102 | yourpath/dataset/LORIS/fe/audio_s25/yIDi18JlgsQ_003760_003860_seg0.wav 103 | yourpath/dataset/LORIS/fe/audio_s25/5cuxEEKyth8_005592_005690_seg0.wav 104 | yourpath/dataset/LORIS/fe/audio_s25/8jfPAvqYAs8_003212_003313_seg2.wav 105 | yourpath/dataset/LORIS/fe/audio_s25/upaJ16I0zmQ_000334_000443_seg1.wav 106 | yourpath/dataset/LORIS/fe/audio_s25/GEjRXo8Dvwc_003163_003263_seg2.wav 107 | yourpath/dataset/LORIS/fe/audio_s25/1sPWceVH4e8_005281_005383_seg0.wav 108 | yourpath/dataset/LORIS/fe/audio_s25/vY-jPM995Gk_003332_003435_seg1.wav 109 | yourpath/dataset/LORIS/fe/audio_s25/CkNz9ZIQmZI_008093_008190_seg1.wav 110 | yourpath/dataset/LORIS/fe/audio_s25/5cuxEEKyth8_003441_003539_seg1.wav 111 | yourpath/dataset/LORIS/fe/audio_s25/wWwc2BbO598_002794_002897_seg2.wav 112 | yourpath/dataset/LORIS/fe/audio_s25/pDymfQS91xI_002634_002731_seg1.wav 113 | yourpath/dataset/LORIS/fe/audio_s25/gMNCwgXtQIw_004258_004363_seg0.wav 114 | yourpath/dataset/LORIS/fe/audio_s25/PgNRyuavbS4_008687_008786_seg1.wav 115 | yourpath/dataset/LORIS/fe/audio_s25/esQQbBhuXbM_001856_001954_seg2.wav 116 | yourpath/dataset/LORIS/fe/audio_s25/CUuRl0Bwbbc_003247_003355_seg1.wav 117 | yourpath/dataset/LORIS/fe/audio_s25/jABvTCCWinA_001483_001582_seg0.wav 118 | yourpath/dataset/LORIS/fe/audio_s25/qGvIwgHzCH8_002286_002387_seg0.wav 119 | yourpath/dataset/LORIS/fe/audio_s25/gRgndu5MZY4_009602_009702_seg2.wav 120 | yourpath/dataset/LORIS/fe/audio_s25/nSDRagdrJ-A_003239_003339_seg1.wav 121 | yourpath/dataset/LORIS/fe/audio_s25/hibW8s4WQmQ_001706_001811_seg0.wav 122 | yourpath/dataset/LORIS/fe/audio_s25/A0xAXXysHUo_003435_003534_seg0.wav 123 | yourpath/dataset/LORIS/fe/audio_s25/AZ4wWG6Rcak_002768_002869_seg1.wav 124 | yourpath/dataset/LORIS/fe/audio_s25/2Qw1e4-nWrk_004855_004944_seg2.wav 125 | yourpath/dataset/LORIS/fe/audio_s25/e3EsDlpNo0c_004671_004771_seg2.wav 126 | yourpath/dataset/LORIS/fe/audio_s25/2Qw1e4-nWrk_003782_003881_seg2.wav 127 | yourpath/dataset/LORIS/fe/audio_s25/om-qKQXxnH4_004830_004929_seg1.wav 128 | yourpath/dataset/LORIS/fe/audio_s25/JHqcbeKepSg_001435_001540_seg1.wav 129 | yourpath/dataset/LORIS/fe/audio_s25/yz-uNJgIhk4_001095_001199_seg2.wav 130 | yourpath/dataset/LORIS/fe/audio_s25/2AGztyrY25g_008717_008817_seg2.wav 131 | yourpath/dataset/LORIS/fe/audio_s25/yz-uNJgIhk4_001693_001795_seg1.wav 132 | yourpath/dataset/LORIS/fe/audio_s25/RjpOEHmTf7I_005447_005547_seg2.wav 133 | yourpath/dataset/LORIS/fe/audio_s25/wolPuHKrX9o_003177_003283_seg0.wav 134 | yourpath/dataset/LORIS/fe/audio_s25/BLzs5opw8uM_000201_000302_seg0.wav 135 | yourpath/dataset/LORIS/fe/audio_s25/ItBRb9LB-VI_000174_000269_seg0.wav 136 | yourpath/dataset/LORIS/fe/audio_s25/ji4smBYYANs_002250_002348_seg1.wav 137 | yourpath/dataset/LORIS/fe/audio_s25/JHqcbeKepSg_002828_002929_seg2.wav 138 | yourpath/dataset/LORIS/fe/audio_s25/R9XUGR-VlTg_008869_008972_seg0.wav 139 | yourpath/dataset/LORIS/fe/audio_s25/I1OMnMSk1Lg_003448_003549_seg1.wav 140 | yourpath/dataset/LORIS/fe/audio_s25/pDymfQS91xI_000954_001054_seg2.wav 141 | yourpath/dataset/LORIS/fe/audio_s25/X4ajWw8L19s_007072_007176_seg2.wav 142 | yourpath/dataset/LORIS/fe/audio_s25/CkNz9ZIQmZI_007316_007416_seg2.wav 143 | yourpath/dataset/LORIS/fe/audio_s25/p42w02g4Ce4_001152_001255_seg2.wav 144 | yourpath/dataset/LORIS/fe/audio_s25/I1OMnMSk1Lg_005064_005173_seg2.wav 145 | yourpath/dataset/LORIS/fe/audio_s25/PaVNLvldLeI_009767_009870_seg2.wav 146 | yourpath/dataset/LORIS/fe/audio_s25/t7Xgg9bejOM_009086_009187_seg0.wav 147 | yourpath/dataset/LORIS/fe/audio_s25/ji4smBYYANs_003210_003307_seg1.wav 148 | yourpath/dataset/LORIS/fe/audio_s25/BQhX6F3gpp8_008733_008833_seg1.wav 149 | yourpath/dataset/LORIS/fe/audio_s25/CUuRl0Bwbbc_003664_003763_seg1.wav 150 | yourpath/dataset/LORIS/fe/audio_s25/X4ajWw8L19s_001821_001922_seg0.wav 151 | yourpath/dataset/LORIS/fe/audio_s25/upaJ16I0zmQ_001062_001164_seg0.wav 152 | yourpath/dataset/LORIS/fe/audio_s25/f-1FbFegbuQ_004245_004347_seg0.wav 153 | yourpath/dataset/LORIS/fe/audio_s25/RjpOEHmTf7I_001348_001449_seg1.wav 154 | yourpath/dataset/LORIS/fe/audio_s25/X4ajWw8L19s_003808_003911_seg2.wav 155 | yourpath/dataset/LORIS/fe/audio_s25/qGvIwgHzCH8_004139_004237_seg2.wav 156 | yourpath/dataset/LORIS/fe/audio_s25/UcCTusldh6w_005149_005253_seg1.wav 157 | yourpath/dataset/LORIS/fe/audio_s25/0LtLS9wROrk_007340_007433_seg2.wav 158 | yourpath/dataset/LORIS/fe/audio_s25/WCcSXjsCVMA_007294_007391_seg1.wav 159 | yourpath/dataset/LORIS/fe/audio_s25/i87qMWsFbEI_002693_002797_seg1.wav 160 | yourpath/dataset/LORIS/fe/audio_s25/vY-jPM995Gk_003332_003435_seg0.wav 161 | yourpath/dataset/LORIS/fe/audio_s25/e3EsDlpNo0c_008138_008242_seg1.wav 162 | yourpath/dataset/LORIS/fe/audio_s25/e3EsDlpNo0c_003301_003400_seg2.wav 163 | yourpath/dataset/LORIS/fe/audio_s25/JHqcbeKepSg_002828_002929_seg0.wav 164 | yourpath/dataset/LORIS/fe/audio_s25/k8zhOvRBjGo_003899_004002_seg2.wav 165 | yourpath/dataset/LORIS/fe/audio_s25/lrwiYiFGQZE_004003_004107_seg0.wav 166 | yourpath/dataset/LORIS/fe/audio_s25/xHBUIt-airA_004870_004974_seg2.wav 167 | yourpath/dataset/LORIS/fe/audio_s25/X4ajWw8L19s_004690_004794_seg2.wav 168 | yourpath/dataset/LORIS/fe/audio_s25/Vq-w0Jk7y7g_009413_009515_seg1.wav 169 | yourpath/dataset/LORIS/fe/audio_s25/DG7upbhB1bI_001882_001986_seg0.wav 170 | yourpath/dataset/LORIS/fe/audio_s25/TCiufCzMtDs_000851_000946_seg1.wav 171 | yourpath/dataset/LORIS/fe/audio_s25/A0xAXXysHUo_003435_003534_seg2.wav 172 | yourpath/dataset/LORIS/fe/audio_s25/f6k7PBGgeb4_001273_001393_seg1.wav 173 | yourpath/dataset/LORIS/fe/audio_s25/DyZ2qj6x1UE_004939_005041_seg2.wav 174 | yourpath/dataset/LORIS/fe/audio_s25/f6k7PBGgeb4_000779_000876_seg0.wav 175 | yourpath/dataset/LORIS/fe/audio_s25/2Qw1e4-nWrk_005464_005562_seg1.wav 176 | yourpath/dataset/LORIS/fe/audio_s25/Vq-w0Jk7y7g_008817_008917_seg2.wav 177 | yourpath/dataset/LORIS/fe/audio_s25/GF8D7Dx2mhs_004533_004634_seg0.wav 178 | yourpath/dataset/LORIS/fe/audio_s25/esQQbBhuXbM_007679_007783_seg2.wav 179 | yourpath/dataset/LORIS/fe/audio_s25/2giTb7IpJDU_003853_003956_seg1.wav 180 | yourpath/dataset/LORIS/fe/audio_s25/Z2T9B4qExzk_008023_008117_seg2.wav 181 | yourpath/dataset/LORIS/fe/audio_s25/UcCTusldh6w_005149_005253_seg2.wav 182 | yourpath/dataset/LORIS/fe/audio_s25/OIJe8fQw7Wo_002543_002643_seg0.wav 183 | yourpath/dataset/LORIS/fe/audio_s25/CUuRl0Bwbbc_003247_003355_seg0.wav 184 | yourpath/dataset/LORIS/fe/audio_s25/xHBUIt-airA_007025_007127_seg2.wav 185 | yourpath/dataset/LORIS/fe/audio_s25/Ry5PFp-pRmA_002605_002708_seg1.wav 186 | yourpath/dataset/LORIS/fe/audio_s25/MVLZz2J6tcE_003013_003114_seg2.wav 187 | yourpath/dataset/LORIS/fe/audio_s25/RjpOEHmTf7I_003956_004060_seg1.wav 188 | yourpath/dataset/LORIS/fe/audio_s25/t7Xgg9bejOM_007868_007979_seg1.wav 189 | yourpath/dataset/LORIS/fe/audio_s25/TBsWos4T4OE_003911_004006_seg0.wav 190 | yourpath/dataset/LORIS/fe/audio_s25/8N3CBVAft40_001397_001488_seg2.wav 191 | yourpath/dataset/LORIS/fe/audio_s25/f-1FbFegbuQ_004879_004987_seg1.wav 192 | yourpath/dataset/LORIS/fe/audio_s25/zNL3kn3UBmg_003321_003420_seg0.wav 193 | yourpath/dataset/LORIS/fe/audio_s25/fH-VYYl9elA_000264_000365_seg1.wav 194 | yourpath/dataset/LORIS/fe/audio_s25/X4ajWw8L19s_001821_001922_seg1.wav 195 | yourpath/dataset/LORIS/fe/audio_s25/BLzs5opw8uM_003532_003625_seg2.wav 196 | -------------------------------------------------------------------------------- /data/fe/fe_audio_s50_test_segment.txt: -------------------------------------------------------------------------------- 1 | yourpath/dataset/LORIS/fe/audio_s50/xHBUIt-airA_003193_003315_seg0.wav 2 | yourpath/dataset/LORIS/fe/audio_s50/C5Yfd1IWjmM_002895_002996_seg0.wav 3 | yourpath/dataset/LORIS/fe/audio_s50/5cuxEEKyth8_001482_001576_seg0.wav 4 | yourpath/dataset/LORIS/fe/audio_s50/om-qKQXxnH4_004830_004929_seg0.wav 5 | yourpath/dataset/LORIS/fe/audio_s50/mI7pLIDnTiQ_001349_001443_seg0.wav 6 | yourpath/dataset/LORIS/fe/audio_s50/Ry5PFp-pRmA_004259_004360_seg0.wav 7 | yourpath/dataset/LORIS/fe/audio_s50/TCiufCzMtDs_001807_001906_seg0.wav 8 | yourpath/dataset/LORIS/fe/audio_s50/Z0bBRwAzKe0_002595_002690_seg0.wav 9 | yourpath/dataset/LORIS/fe/audio_s50/EKb2MMJSoeI_002450_002553_seg0.wav 10 | yourpath/dataset/LORIS/fe/audio_s50/IP96HTdCvWs_005003_005107_seg0.wav 11 | yourpath/dataset/LORIS/fe/audio_s50/JHqcbeKepSg_001435_001540_seg0.wav 12 | yourpath/dataset/LORIS/fe/audio_s50/zNL3kn3UBmg_001223_001318_seg0.wav 13 | yourpath/dataset/LORIS/fe/audio_s50/EFvDqOF1sCk_003731_003896_seg0.wav 14 | yourpath/dataset/LORIS/fe/audio_s50/VWsVUnoyUoA_007154_007246_seg0.wav 15 | yourpath/dataset/LORIS/fe/audio_s50/zNL3kn3UBmg_007548_007646_seg0.wav 16 | yourpath/dataset/LORIS/fe/audio_s50/hibW8s4WQmQ_000212_000315_seg0.wav 17 | yourpath/dataset/LORIS/fe/audio_s50/1JsRXIoR3C0_009286_009385_seg0.wav 18 | yourpath/dataset/LORIS/fe/audio_s50/0jqn1vxdhls_003284_003383_seg0.wav 19 | yourpath/dataset/LORIS/fe/audio_s50/qBlozVQ7NOc_007741_007842_seg0.wav 20 | yourpath/dataset/LORIS/fe/audio_s50/yz-uNJgIhk4_001693_001795_seg0.wav 21 | yourpath/dataset/LORIS/fe/audio_s50/X4ajWw8L19s_007434_007534_seg0.wav 22 | yourpath/dataset/LORIS/fe/audio_s50/wolPuHKrX9o_004741_004844_seg0.wav 23 | yourpath/dataset/LORIS/fe/audio_s50/aEZbP-Yephw_001131_001234_seg0.wav 24 | yourpath/dataset/LORIS/fe/audio_s50/9Mtbac7g15I_004544_004676_seg0.wav 25 | yourpath/dataset/LORIS/fe/audio_s50/eH-ZgOT8ASM_007289_007400_seg0.wav 26 | yourpath/dataset/LORIS/fe/audio_s50/Z2T9B4qExzk_001748_001847_seg0.wav 27 | yourpath/dataset/LORIS/fe/audio_s50/wolPuHKrX9o_004453_004551_seg0.wav 28 | yourpath/dataset/LORIS/fe/audio_s50/qBlozVQ7NOc_007526_007628_seg0.wav 29 | yourpath/dataset/LORIS/fe/audio_s50/ji4smBYYANs_006342_006438_seg0.wav 30 | yourpath/dataset/LORIS/fe/audio_s50/e3EsDlpNo0c_003301_003400_seg0.wav 31 | yourpath/dataset/LORIS/fe/audio_s50/CkNz9ZIQmZI_008093_008190_seg0.wav 32 | yourpath/dataset/LORIS/fe/audio_s50/Xw1UvouxVLk_002076_002181_seg0.wav 33 | yourpath/dataset/LORIS/fe/audio_s50/1Fdwuy2V9EY_009502_009601_seg0.wav 34 | yourpath/dataset/LORIS/fe/audio_s50/EKb2MMJSoeI_002952_003052_seg0.wav 35 | yourpath/dataset/LORIS/fe/audio_s50/n9-yxVGYMRw_003785_003894_seg0.wav 36 | yourpath/dataset/LORIS/fe/audio_s50/fH-VYYl9elA_001866_001961_seg0.wav 37 | yourpath/dataset/LORIS/fe/audio_s50/t7Xgg9bejOM_009086_009187_seg0.wav 38 | yourpath/dataset/LORIS/fe/audio_s50/CkNz9ZIQmZI_006383_006487_seg0.wav 39 | yourpath/dataset/LORIS/fe/audio_s50/wWZry3-5sF0_000808_000908_seg0.wav 40 | yourpath/dataset/LORIS/fe/audio_s50/VWsVUnoyUoA_008767_008866_seg0.wav 41 | yourpath/dataset/LORIS/fe/audio_s50/I1OMnMSk1Lg_005064_005173_seg0.wav 42 | yourpath/dataset/LORIS/fe/audio_s50/0LtLS9wROrk_004572_004670_seg0.wav 43 | yourpath/dataset/LORIS/fe/audio_s50/n9-yxVGYMRw_003258_003358_seg0.wav 44 | yourpath/dataset/LORIS/fe/audio_s50/ItBRb9LB-VI_000174_000269_seg0.wav 45 | yourpath/dataset/LORIS/fe/audio_s50/WCcSXjsCVMA_008136_008237_seg0.wav 46 | yourpath/dataset/LORIS/fe/audio_s50/PgNRyuavbS4_000780_000878_seg0.wav 47 | yourpath/dataset/LORIS/fe/audio_s50/RLDjrhjikT4_009888_009989_seg0.wav 48 | yourpath/dataset/LORIS/fe/audio_s50/wYbfwx93VXk_009281_009385_seg0.wav 49 | yourpath/dataset/LORIS/fe/audio_s50/k8zhOvRBjGo_000624_000728_seg0.wav 50 | yourpath/dataset/LORIS/fe/audio_s50/jz594oTnl-k_004994_005094_seg0.wav 51 | yourpath/dataset/LORIS/fe/audio_s50/Xw1UvouxVLk_003749_003861_seg0.wav 52 | yourpath/dataset/LORIS/fe/audio_s50/f-1FbFegbuQ_000356_000459_seg0.wav 53 | yourpath/dataset/LORIS/fe/audio_s50/qGvIwgHzCH8_002101_002205_seg0.wav 54 | yourpath/dataset/LORIS/fe/audio_s50/3PywNMDCvNQ_003170_003271_seg0.wav 55 | yourpath/dataset/LORIS/fe/audio_s50/Vq-w0Jk7y7g_009209_009310_seg0.wav 56 | yourpath/dataset/LORIS/fe/audio_s50/Vq-w0Jk7y7g_010575_010678_seg0.wav 57 | yourpath/dataset/LORIS/fe/audio_s50/gMNCwgXtQIw_003278_003381_seg0.wav 58 | yourpath/dataset/LORIS/fe/audio_s50/qBlozVQ7NOc_008251_008356_seg0.wav 59 | yourpath/dataset/LORIS/fe/audio_s50/gRgndu5MZY4_009808_009910_seg0.wav 60 | yourpath/dataset/LORIS/fe/audio_s50/owZ2Fv4Li8M_002479_002583_seg0.wav 61 | yourpath/dataset/LORIS/fe/audio_s50/pDymfQS91xI_002634_002731_seg0.wav 62 | yourpath/dataset/LORIS/fe/audio_s50/yz-uNJgIhk4_000834_000945_seg0.wav 63 | yourpath/dataset/LORIS/fe/audio_s50/1JsRXIoR3C0_008264_008362_seg0.wav 64 | yourpath/dataset/LORIS/fe/audio_s50/MVLZz2J6tcE_002666_002765_seg0.wav 65 | yourpath/dataset/LORIS/fe/audio_s50/yvZPHJu3kb0_004098_004200_seg0.wav 66 | yourpath/dataset/LORIS/fe/audio_s50/2AGztyrY25g_007078_007178_seg0.wav 67 | -------------------------------------------------------------------------------- /data/fe/fe_i3d_s25_test_segment.txt: -------------------------------------------------------------------------------- 1 | yourpath/dataset/LORIS/fe/i3d_s25/ji4smBYYANs_004450_004547_seg1.npy 2 | yourpath/dataset/LORIS/fe/i3d_s25/CUuRl0Bwbbc_003664_003763_seg2.npy 3 | yourpath/dataset/LORIS/fe/i3d_s25/1JsRXIoR3C0_009836_009925_seg1.npy 4 | yourpath/dataset/LORIS/fe/i3d_s25/f-1FbFegbuQ_003369_003472_seg2.npy 5 | yourpath/dataset/LORIS/fe/i3d_s25/upaJ16I0zmQ_005247_005349_seg1.npy 6 | yourpath/dataset/LORIS/fe/i3d_s25/GbUQwE9N3aM_001342_001444_seg2.npy 7 | yourpath/dataset/LORIS/fe/i3d_s25/fDa0HpoXES4_003787_003883_seg2.npy 8 | yourpath/dataset/LORIS/fe/i3d_s25/k8zhOvRBjGo_001034_001136_seg0.npy 9 | yourpath/dataset/LORIS/fe/i3d_s25/DTedv-hhHU4_000795_000904_seg1.npy 10 | yourpath/dataset/LORIS/fe/i3d_s25/f-1FbFegbuQ_003369_003472_seg1.npy 11 | yourpath/dataset/LORIS/fe/i3d_s25/t7Xgg9bejOM_007868_007979_seg2.npy 12 | yourpath/dataset/LORIS/fe/i3d_s25/esQQbBhuXbM_001856_001954_seg1.npy 13 | yourpath/dataset/LORIS/fe/i3d_s25/e3EsDlpNo0c_002907_003007_seg1.npy 14 | yourpath/dataset/LORIS/fe/i3d_s25/t7Xgg9bejOM_009086_009187_seg2.npy 15 | yourpath/dataset/LORIS/fe/i3d_s25/eH-ZgOT8ASM_007496_007602_seg0.npy 16 | yourpath/dataset/LORIS/fe/i3d_s25/0LtLS9wROrk_003773_003867_seg0.npy 17 | yourpath/dataset/LORIS/fe/i3d_s25/X4ajWw8L19s_009605_009712_seg2.npy 18 | yourpath/dataset/LORIS/fe/i3d_s25/JHqcbeKepSg_009959_010058_seg0.npy 19 | yourpath/dataset/LORIS/fe/i3d_s25/CUuRl0Bwbbc_003957_004064_seg1.npy 20 | yourpath/dataset/LORIS/fe/i3d_s25/wWZry3-5sF0_001634_001737_seg0.npy 21 | yourpath/dataset/LORIS/fe/i3d_s25/xHBUIt-airA_001244_001340_seg0.npy 22 | yourpath/dataset/LORIS/fe/i3d_s25/yz-uNJgIhk4_003134_003234_seg0.npy 23 | yourpath/dataset/LORIS/fe/i3d_s25/CUuRl0Bwbbc_003495_003598_seg0.npy 24 | yourpath/dataset/LORIS/fe/i3d_s25/wYbfwx93VXk_009057_009158_seg0.npy 25 | yourpath/dataset/LORIS/fe/i3d_s25/yz-uNJgIhk4_000834_000945_seg2.npy 26 | yourpath/dataset/LORIS/fe/i3d_s25/esQQbBhuXbM_002103_002211_seg0.npy 27 | yourpath/dataset/LORIS/fe/i3d_s25/wWwc2BbO598_002330_002426_seg1.npy 28 | yourpath/dataset/LORIS/fe/i3d_s25/X4ajWw8L19s_004690_004794_seg1.npy 29 | yourpath/dataset/LORIS/fe/i3d_s25/GEjRXo8Dvwc_000878_000982_seg0.npy 30 | yourpath/dataset/LORIS/fe/i3d_s25/wWwc2BbO598_002685_002773_seg1.npy 31 | yourpath/dataset/LORIS/fe/i3d_s25/CUuRl0Bwbbc_003957_004064_seg2.npy 32 | yourpath/dataset/LORIS/fe/i3d_s25/Ry5PFp-pRmA_002806_002912_seg1.npy 33 | yourpath/dataset/LORIS/fe/i3d_s25/uDZVn-K4GE4_001942_002041_seg1.npy 34 | yourpath/dataset/LORIS/fe/i3d_s25/VWsVUnoyUoA_007344_007444_seg1.npy 35 | yourpath/dataset/LORIS/fe/i3d_s25/8YSDFKGwP4U_004951_005050_seg1.npy 36 | yourpath/dataset/LORIS/fe/i3d_s25/yvZPHJu3kb0_002828_002925_seg2.npy 37 | yourpath/dataset/LORIS/fe/i3d_s25/PgNRyuavbS4_008687_008786_seg2.npy 38 | yourpath/dataset/LORIS/fe/i3d_s25/FNEeMvHmuEw_000197_000292_seg0.npy 39 | yourpath/dataset/LORIS/fe/i3d_s25/e3EsDlpNo0c_006102_006204_seg2.npy 40 | yourpath/dataset/LORIS/fe/i3d_s25/PaVNLvldLeI_009767_009870_seg0.npy 41 | yourpath/dataset/LORIS/fe/i3d_s25/8jfPAvqYAs8_000862_000964_seg2.npy 42 | yourpath/dataset/LORIS/fe/i3d_s25/1sPWceVH4e8_005917_006015_seg0.npy 43 | yourpath/dataset/LORIS/fe/i3d_s25/fH-VYYl9elA_000904_000999_seg1.npy 44 | yourpath/dataset/LORIS/fe/i3d_s25/om-qKQXxnH4_001398_001495_seg1.npy 45 | yourpath/dataset/LORIS/fe/i3d_s25/jz594oTnl-k_003385_003487_seg1.npy 46 | yourpath/dataset/LORIS/fe/i3d_s25/k8zhOvRBjGo_000229_000337_seg0.npy 47 | yourpath/dataset/LORIS/fe/i3d_s25/zNL3kn3UBmg_001223_001318_seg0.npy 48 | yourpath/dataset/LORIS/fe/i3d_s25/fDa0HpoXES4_004339_004438_seg1.npy 49 | yourpath/dataset/LORIS/fe/i3d_s25/esQQbBhuXbM_004424_004529_seg0.npy 50 | yourpath/dataset/LORIS/fe/i3d_s25/IWFgo-tEEs8_003363_003461_seg1.npy 51 | yourpath/dataset/LORIS/fe/i3d_s25/k8zhOvRBjGo_000229_000337_seg1.npy 52 | yourpath/dataset/LORIS/fe/i3d_s25/Z2T9B4qExzk_000795_000892_seg2.npy 53 | yourpath/dataset/LORIS/fe/i3d_s25/ji4smBYYANs_006342_006438_seg2.npy 54 | yourpath/dataset/LORIS/fe/i3d_s25/TBsWos4T4OE_002570_002671_seg1.npy 55 | yourpath/dataset/LORIS/fe/i3d_s25/A0xAXXysHUo_003089_003189_seg0.npy 56 | yourpath/dataset/LORIS/fe/i3d_s25/dqUNtY2GwW4_003169_003267_seg1.npy 57 | yourpath/dataset/LORIS/fe/i3d_s25/v3mISBmwrUM_006480_006578_seg0.npy 58 | yourpath/dataset/LORIS/fe/i3d_s25/PgNRyuavbS4_001457_001550_seg0.npy 59 | yourpath/dataset/LORIS/fe/i3d_s25/OIJe8fQw7Wo_002543_002643_seg2.npy 60 | yourpath/dataset/LORIS/fe/i3d_s25/A0xAXXysHUo_003897_003995_seg2.npy 61 | yourpath/dataset/LORIS/fe/i3d_s25/MyrqGZXxpsY_004910_005009_seg2.npy 62 | yourpath/dataset/LORIS/fe/i3d_s25/E3AHJ6-QS8M_005450_005555_seg1.npy 63 | yourpath/dataset/LORIS/fe/i3d_s25/wWZry3-5sF0_000808_000908_seg1.npy 64 | yourpath/dataset/LORIS/fe/i3d_s25/wYbfwx93VXk_010310_010415_seg1.npy 65 | yourpath/dataset/LORIS/fe/i3d_s25/nSDRagdrJ-A_003449_003565_seg2.npy 66 | yourpath/dataset/LORIS/fe/i3d_s25/BQhX6F3gpp8_007119_007222_seg2.npy 67 | yourpath/dataset/LORIS/fe/i3d_s25/hibW8s4WQmQ_002302_002410_seg2.npy 68 | yourpath/dataset/LORIS/fe/i3d_s25/ji4smBYYANs_004450_004547_seg0.npy 69 | yourpath/dataset/LORIS/fe/i3d_s25/hibW8s4WQmQ_000534_000635_seg1.npy 70 | yourpath/dataset/LORIS/fe/i3d_s25/P31Ht3H76ok_005126_005230_seg2.npy 71 | yourpath/dataset/LORIS/fe/i3d_s25/BLzs5opw8uM_003532_003625_seg1.npy 72 | yourpath/dataset/LORIS/fe/i3d_s25/Z0bBRwAzKe0_002034_002136_seg1.npy 73 | yourpath/dataset/LORIS/fe/i3d_s25/wYbfwx93VXk_009281_009385_seg0.npy 74 | yourpath/dataset/LORIS/fe/i3d_s25/wWZry3-5sF0_004473_004574_seg0.npy 75 | yourpath/dataset/LORIS/fe/i3d_s25/eH-ZgOT8ASM_008137_008245_seg2.npy 76 | yourpath/dataset/LORIS/fe/i3d_s25/upaJ16I0zmQ_002150_002245_seg2.npy 77 | yourpath/dataset/LORIS/fe/i3d_s25/hibW8s4WQmQ_004459_004564_seg1.npy 78 | yourpath/dataset/LORIS/fe/i3d_s25/Xw1UvouxVLk_003061_003161_seg2.npy 79 | yourpath/dataset/LORIS/fe/i3d_s25/qGvIwgHzCH8_003934_004037_seg2.npy 80 | yourpath/dataset/LORIS/fe/i3d_s25/nSDRagdrJ-A_003239_003339_seg2.npy 81 | yourpath/dataset/LORIS/fe/i3d_s25/n9-yxVGYMRw_001596_001703_seg2.npy 82 | yourpath/dataset/LORIS/fe/i3d_s25/gDmmqalpisc_006229_006328_seg2.npy 83 | yourpath/dataset/LORIS/fe/i3d_s25/e3EsDlpNo0c_006659_006760_seg0.npy 84 | yourpath/dataset/LORIS/fe/i3d_s25/eH-ZgOT8ASM_007496_007602_seg2.npy 85 | yourpath/dataset/LORIS/fe/i3d_s25/k8zhOvRBjGo_001034_001136_seg1.npy 86 | yourpath/dataset/LORIS/fe/i3d_s25/TBsWos4T4OE_003911_004006_seg2.npy 87 | yourpath/dataset/LORIS/fe/i3d_s25/upaJ16I0zmQ_004147_004244_seg1.npy 88 | yourpath/dataset/LORIS/fe/i3d_s25/EFvDqOF1sCk_002657_002760_seg1.npy 89 | yourpath/dataset/LORIS/fe/i3d_s25/jz594oTnl-k_001928_002032_seg2.npy 90 | yourpath/dataset/LORIS/fe/i3d_s25/esQQbBhuXbM_002103_002211_seg2.npy 91 | yourpath/dataset/LORIS/fe/i3d_s25/i87qMWsFbEI_003295_003400_seg2.npy 92 | yourpath/dataset/LORIS/fe/i3d_s25/EKb2MMJSoeI_002952_003052_seg2.npy 93 | yourpath/dataset/LORIS/fe/i3d_s25/R9XUGR-VlTg_008869_008972_seg1.npy 94 | yourpath/dataset/LORIS/fe/i3d_s25/yvZPHJu3kb0_002828_002925_seg0.npy 95 | yourpath/dataset/LORIS/fe/i3d_s25/f6k7PBGgeb4_000779_000876_seg2.npy 96 | yourpath/dataset/LORIS/fe/i3d_s25/0LtLS9wROrk_006690_006788_seg2.npy 97 | yourpath/dataset/LORIS/fe/i3d_s25/gRgndu5MZY4_010248_010361_seg2.npy 98 | yourpath/dataset/LORIS/fe/i3d_s25/IP96HTdCvWs_005209_005311_seg0.npy 99 | yourpath/dataset/LORIS/fe/i3d_s25/Z2T9B4qExzk_001432_001524_seg2.npy 100 | yourpath/dataset/LORIS/fe/i3d_s25/5cuxEEKyth8_003196_003295_seg2.npy 101 | yourpath/dataset/LORIS/fe/i3d_s25/1sPWceVH4e8_007221_007310_seg1.npy 102 | yourpath/dataset/LORIS/fe/i3d_s25/yIDi18JlgsQ_003760_003860_seg0.npy 103 | yourpath/dataset/LORIS/fe/i3d_s25/5cuxEEKyth8_005592_005690_seg0.npy 104 | yourpath/dataset/LORIS/fe/i3d_s25/8jfPAvqYAs8_003212_003313_seg2.npy 105 | yourpath/dataset/LORIS/fe/i3d_s25/upaJ16I0zmQ_000334_000443_seg1.npy 106 | yourpath/dataset/LORIS/fe/i3d_s25/GEjRXo8Dvwc_003163_003263_seg2.npy 107 | yourpath/dataset/LORIS/fe/i3d_s25/1sPWceVH4e8_005281_005383_seg0.npy 108 | yourpath/dataset/LORIS/fe/i3d_s25/vY-jPM995Gk_003332_003435_seg1.npy 109 | yourpath/dataset/LORIS/fe/i3d_s25/CkNz9ZIQmZI_008093_008190_seg1.npy 110 | yourpath/dataset/LORIS/fe/i3d_s25/5cuxEEKyth8_003441_003539_seg1.npy 111 | yourpath/dataset/LORIS/fe/i3d_s25/wWwc2BbO598_002794_002897_seg2.npy 112 | yourpath/dataset/LORIS/fe/i3d_s25/pDymfQS91xI_002634_002731_seg1.npy 113 | yourpath/dataset/LORIS/fe/i3d_s25/gMNCwgXtQIw_004258_004363_seg0.npy 114 | yourpath/dataset/LORIS/fe/i3d_s25/PgNRyuavbS4_008687_008786_seg1.npy 115 | yourpath/dataset/LORIS/fe/i3d_s25/esQQbBhuXbM_001856_001954_seg2.npy 116 | yourpath/dataset/LORIS/fe/i3d_s25/CUuRl0Bwbbc_003247_003355_seg1.npy 117 | yourpath/dataset/LORIS/fe/i3d_s25/jABvTCCWinA_001483_001582_seg0.npy 118 | yourpath/dataset/LORIS/fe/i3d_s25/qGvIwgHzCH8_002286_002387_seg0.npy 119 | yourpath/dataset/LORIS/fe/i3d_s25/gRgndu5MZY4_009602_009702_seg2.npy 120 | yourpath/dataset/LORIS/fe/i3d_s25/nSDRagdrJ-A_003239_003339_seg1.npy 121 | yourpath/dataset/LORIS/fe/i3d_s25/hibW8s4WQmQ_001706_001811_seg0.npy 122 | yourpath/dataset/LORIS/fe/i3d_s25/A0xAXXysHUo_003435_003534_seg0.npy 123 | yourpath/dataset/LORIS/fe/i3d_s25/AZ4wWG6Rcak_002768_002869_seg1.npy 124 | yourpath/dataset/LORIS/fe/i3d_s25/2Qw1e4-nWrk_004855_004944_seg2.npy 125 | yourpath/dataset/LORIS/fe/i3d_s25/e3EsDlpNo0c_004671_004771_seg2.npy 126 | yourpath/dataset/LORIS/fe/i3d_s25/2Qw1e4-nWrk_003782_003881_seg2.npy 127 | yourpath/dataset/LORIS/fe/i3d_s25/om-qKQXxnH4_004830_004929_seg1.npy 128 | yourpath/dataset/LORIS/fe/i3d_s25/JHqcbeKepSg_001435_001540_seg1.npy 129 | yourpath/dataset/LORIS/fe/i3d_s25/yz-uNJgIhk4_001095_001199_seg2.npy 130 | yourpath/dataset/LORIS/fe/i3d_s25/2AGztyrY25g_008717_008817_seg2.npy 131 | yourpath/dataset/LORIS/fe/i3d_s25/yz-uNJgIhk4_001693_001795_seg1.npy 132 | yourpath/dataset/LORIS/fe/i3d_s25/RjpOEHmTf7I_005447_005547_seg2.npy 133 | yourpath/dataset/LORIS/fe/i3d_s25/wolPuHKrX9o_003177_003283_seg0.npy 134 | yourpath/dataset/LORIS/fe/i3d_s25/BLzs5opw8uM_000201_000302_seg0.npy 135 | yourpath/dataset/LORIS/fe/i3d_s25/ItBRb9LB-VI_000174_000269_seg0.npy 136 | yourpath/dataset/LORIS/fe/i3d_s25/ji4smBYYANs_002250_002348_seg1.npy 137 | yourpath/dataset/LORIS/fe/i3d_s25/JHqcbeKepSg_002828_002929_seg2.npy 138 | yourpath/dataset/LORIS/fe/i3d_s25/R9XUGR-VlTg_008869_008972_seg0.npy 139 | yourpath/dataset/LORIS/fe/i3d_s25/I1OMnMSk1Lg_003448_003549_seg1.npy 140 | yourpath/dataset/LORIS/fe/i3d_s25/pDymfQS91xI_000954_001054_seg2.npy 141 | yourpath/dataset/LORIS/fe/i3d_s25/X4ajWw8L19s_007072_007176_seg2.npy 142 | yourpath/dataset/LORIS/fe/i3d_s25/CkNz9ZIQmZI_007316_007416_seg2.npy 143 | yourpath/dataset/LORIS/fe/i3d_s25/p42w02g4Ce4_001152_001255_seg2.npy 144 | yourpath/dataset/LORIS/fe/i3d_s25/I1OMnMSk1Lg_005064_005173_seg2.npy 145 | yourpath/dataset/LORIS/fe/i3d_s25/PaVNLvldLeI_009767_009870_seg2.npy 146 | yourpath/dataset/LORIS/fe/i3d_s25/t7Xgg9bejOM_009086_009187_seg0.npy 147 | yourpath/dataset/LORIS/fe/i3d_s25/ji4smBYYANs_003210_003307_seg1.npy 148 | yourpath/dataset/LORIS/fe/i3d_s25/BQhX6F3gpp8_008733_008833_seg1.npy 149 | yourpath/dataset/LORIS/fe/i3d_s25/CUuRl0Bwbbc_003664_003763_seg1.npy 150 | yourpath/dataset/LORIS/fe/i3d_s25/X4ajWw8L19s_001821_001922_seg0.npy 151 | yourpath/dataset/LORIS/fe/i3d_s25/upaJ16I0zmQ_001062_001164_seg0.npy 152 | yourpath/dataset/LORIS/fe/i3d_s25/f-1FbFegbuQ_004245_004347_seg0.npy 153 | yourpath/dataset/LORIS/fe/i3d_s25/RjpOEHmTf7I_001348_001449_seg1.npy 154 | yourpath/dataset/LORIS/fe/i3d_s25/X4ajWw8L19s_003808_003911_seg2.npy 155 | yourpath/dataset/LORIS/fe/i3d_s25/qGvIwgHzCH8_004139_004237_seg2.npy 156 | yourpath/dataset/LORIS/fe/i3d_s25/UcCTusldh6w_005149_005253_seg1.npy 157 | yourpath/dataset/LORIS/fe/i3d_s25/0LtLS9wROrk_007340_007433_seg2.npy 158 | yourpath/dataset/LORIS/fe/i3d_s25/WCcSXjsCVMA_007294_007391_seg1.npy 159 | yourpath/dataset/LORIS/fe/i3d_s25/i87qMWsFbEI_002693_002797_seg1.npy 160 | yourpath/dataset/LORIS/fe/i3d_s25/vY-jPM995Gk_003332_003435_seg0.npy 161 | yourpath/dataset/LORIS/fe/i3d_s25/e3EsDlpNo0c_008138_008242_seg1.npy 162 | yourpath/dataset/LORIS/fe/i3d_s25/e3EsDlpNo0c_003301_003400_seg2.npy 163 | yourpath/dataset/LORIS/fe/i3d_s25/JHqcbeKepSg_002828_002929_seg0.npy 164 | yourpath/dataset/LORIS/fe/i3d_s25/k8zhOvRBjGo_003899_004002_seg2.npy 165 | yourpath/dataset/LORIS/fe/i3d_s25/lrwiYiFGQZE_004003_004107_seg0.npy 166 | yourpath/dataset/LORIS/fe/i3d_s25/xHBUIt-airA_004870_004974_seg2.npy 167 | yourpath/dataset/LORIS/fe/i3d_s25/X4ajWw8L19s_004690_004794_seg2.npy 168 | yourpath/dataset/LORIS/fe/i3d_s25/Vq-w0Jk7y7g_009413_009515_seg1.npy 169 | yourpath/dataset/LORIS/fe/i3d_s25/DG7upbhB1bI_001882_001986_seg0.npy 170 | yourpath/dataset/LORIS/fe/i3d_s25/TCiufCzMtDs_000851_000946_seg1.npy 171 | yourpath/dataset/LORIS/fe/i3d_s25/A0xAXXysHUo_003435_003534_seg2.npy 172 | yourpath/dataset/LORIS/fe/i3d_s25/f6k7PBGgeb4_001273_001393_seg1.npy 173 | yourpath/dataset/LORIS/fe/i3d_s25/DyZ2qj6x1UE_004939_005041_seg2.npy 174 | yourpath/dataset/LORIS/fe/i3d_s25/f6k7PBGgeb4_000779_000876_seg0.npy 175 | yourpath/dataset/LORIS/fe/i3d_s25/2Qw1e4-nWrk_005464_005562_seg1.npy 176 | yourpath/dataset/LORIS/fe/i3d_s25/Vq-w0Jk7y7g_008817_008917_seg2.npy 177 | yourpath/dataset/LORIS/fe/i3d_s25/GF8D7Dx2mhs_004533_004634_seg0.npy 178 | yourpath/dataset/LORIS/fe/i3d_s25/esQQbBhuXbM_007679_007783_seg2.npy 179 | yourpath/dataset/LORIS/fe/i3d_s25/2giTb7IpJDU_003853_003956_seg1.npy 180 | yourpath/dataset/LORIS/fe/i3d_s25/Z2T9B4qExzk_008023_008117_seg2.npy 181 | yourpath/dataset/LORIS/fe/i3d_s25/UcCTusldh6w_005149_005253_seg2.npy 182 | yourpath/dataset/LORIS/fe/i3d_s25/OIJe8fQw7Wo_002543_002643_seg0.npy 183 | yourpath/dataset/LORIS/fe/i3d_s25/CUuRl0Bwbbc_003247_003355_seg0.npy 184 | yourpath/dataset/LORIS/fe/i3d_s25/xHBUIt-airA_007025_007127_seg2.npy 185 | yourpath/dataset/LORIS/fe/i3d_s25/Ry5PFp-pRmA_002605_002708_seg1.npy 186 | yourpath/dataset/LORIS/fe/i3d_s25/MVLZz2J6tcE_003013_003114_seg2.npy 187 | yourpath/dataset/LORIS/fe/i3d_s25/RjpOEHmTf7I_003956_004060_seg1.npy 188 | yourpath/dataset/LORIS/fe/i3d_s25/t7Xgg9bejOM_007868_007979_seg1.npy 189 | yourpath/dataset/LORIS/fe/i3d_s25/TBsWos4T4OE_003911_004006_seg0.npy 190 | yourpath/dataset/LORIS/fe/i3d_s25/8N3CBVAft40_001397_001488_seg2.npy 191 | yourpath/dataset/LORIS/fe/i3d_s25/f-1FbFegbuQ_004879_004987_seg1.npy 192 | yourpath/dataset/LORIS/fe/i3d_s25/zNL3kn3UBmg_003321_003420_seg0.npy 193 | yourpath/dataset/LORIS/fe/i3d_s25/fH-VYYl9elA_000264_000365_seg1.npy 194 | yourpath/dataset/LORIS/fe/i3d_s25/X4ajWw8L19s_001821_001922_seg1.npy 195 | yourpath/dataset/LORIS/fe/i3d_s25/BLzs5opw8uM_003532_003625_seg2.npy 196 | -------------------------------------------------------------------------------- /data/fe/fe_i3d_s50_test_segment.txt: -------------------------------------------------------------------------------- 1 | yourpath/dataset/LORIS/fe/i3d_s50/xHBUIt-airA_003193_003315_seg0.npy 2 | yourpath/dataset/LORIS/fe/i3d_s50/C5Yfd1IWjmM_002895_002996_seg0.npy 3 | yourpath/dataset/LORIS/fe/i3d_s50/5cuxEEKyth8_001482_001576_seg0.npy 4 | yourpath/dataset/LORIS/fe/i3d_s50/om-qKQXxnH4_004830_004929_seg0.npy 5 | yourpath/dataset/LORIS/fe/i3d_s50/mI7pLIDnTiQ_001349_001443_seg0.npy 6 | yourpath/dataset/LORIS/fe/i3d_s50/Ry5PFp-pRmA_004259_004360_seg0.npy 7 | yourpath/dataset/LORIS/fe/i3d_s50/TCiufCzMtDs_001807_001906_seg0.npy 8 | yourpath/dataset/LORIS/fe/i3d_s50/Z0bBRwAzKe0_002595_002690_seg0.npy 9 | yourpath/dataset/LORIS/fe/i3d_s50/EKb2MMJSoeI_002450_002553_seg0.npy 10 | yourpath/dataset/LORIS/fe/i3d_s50/IP96HTdCvWs_005003_005107_seg0.npy 11 | yourpath/dataset/LORIS/fe/i3d_s50/JHqcbeKepSg_001435_001540_seg0.npy 12 | yourpath/dataset/LORIS/fe/i3d_s50/zNL3kn3UBmg_001223_001318_seg0.npy 13 | yourpath/dataset/LORIS/fe/i3d_s50/EFvDqOF1sCk_003731_003896_seg0.npy 14 | yourpath/dataset/LORIS/fe/i3d_s50/VWsVUnoyUoA_007154_007246_seg0.npy 15 | yourpath/dataset/LORIS/fe/i3d_s50/zNL3kn3UBmg_007548_007646_seg0.npy 16 | yourpath/dataset/LORIS/fe/i3d_s50/hibW8s4WQmQ_000212_000315_seg0.npy 17 | yourpath/dataset/LORIS/fe/i3d_s50/1JsRXIoR3C0_009286_009385_seg0.npy 18 | yourpath/dataset/LORIS/fe/i3d_s50/0jqn1vxdhls_003284_003383_seg0.npy 19 | yourpath/dataset/LORIS/fe/i3d_s50/qBlozVQ7NOc_007741_007842_seg0.npy 20 | yourpath/dataset/LORIS/fe/i3d_s50/yz-uNJgIhk4_001693_001795_seg0.npy 21 | yourpath/dataset/LORIS/fe/i3d_s50/X4ajWw8L19s_007434_007534_seg0.npy 22 | yourpath/dataset/LORIS/fe/i3d_s50/wolPuHKrX9o_004741_004844_seg0.npy 23 | yourpath/dataset/LORIS/fe/i3d_s50/aEZbP-Yephw_001131_001234_seg0.npy 24 | yourpath/dataset/LORIS/fe/i3d_s50/9Mtbac7g15I_004544_004676_seg0.npy 25 | yourpath/dataset/LORIS/fe/i3d_s50/eH-ZgOT8ASM_007289_007400_seg0.npy 26 | yourpath/dataset/LORIS/fe/i3d_s50/Z2T9B4qExzk_001748_001847_seg0.npy 27 | yourpath/dataset/LORIS/fe/i3d_s50/wolPuHKrX9o_004453_004551_seg0.npy 28 | yourpath/dataset/LORIS/fe/i3d_s50/qBlozVQ7NOc_007526_007628_seg0.npy 29 | yourpath/dataset/LORIS/fe/i3d_s50/ji4smBYYANs_006342_006438_seg0.npy 30 | yourpath/dataset/LORIS/fe/i3d_s50/e3EsDlpNo0c_003301_003400_seg0.npy 31 | yourpath/dataset/LORIS/fe/i3d_s50/CkNz9ZIQmZI_008093_008190_seg0.npy 32 | yourpath/dataset/LORIS/fe/i3d_s50/Xw1UvouxVLk_002076_002181_seg0.npy 33 | yourpath/dataset/LORIS/fe/i3d_s50/1Fdwuy2V9EY_009502_009601_seg0.npy 34 | yourpath/dataset/LORIS/fe/i3d_s50/EKb2MMJSoeI_002952_003052_seg0.npy 35 | yourpath/dataset/LORIS/fe/i3d_s50/n9-yxVGYMRw_003785_003894_seg0.npy 36 | yourpath/dataset/LORIS/fe/i3d_s50/fH-VYYl9elA_001866_001961_seg0.npy 37 | yourpath/dataset/LORIS/fe/i3d_s50/t7Xgg9bejOM_009086_009187_seg0.npy 38 | yourpath/dataset/LORIS/fe/i3d_s50/CkNz9ZIQmZI_006383_006487_seg0.npy 39 | yourpath/dataset/LORIS/fe/i3d_s50/wWZry3-5sF0_000808_000908_seg0.npy 40 | yourpath/dataset/LORIS/fe/i3d_s50/VWsVUnoyUoA_008767_008866_seg0.npy 41 | yourpath/dataset/LORIS/fe/i3d_s50/I1OMnMSk1Lg_005064_005173_seg0.npy 42 | yourpath/dataset/LORIS/fe/i3d_s50/0LtLS9wROrk_004572_004670_seg0.npy 43 | yourpath/dataset/LORIS/fe/i3d_s50/n9-yxVGYMRw_003258_003358_seg0.npy 44 | yourpath/dataset/LORIS/fe/i3d_s50/ItBRb9LB-VI_000174_000269_seg0.npy 45 | yourpath/dataset/LORIS/fe/i3d_s50/WCcSXjsCVMA_008136_008237_seg0.npy 46 | yourpath/dataset/LORIS/fe/i3d_s50/PgNRyuavbS4_000780_000878_seg0.npy 47 | yourpath/dataset/LORIS/fe/i3d_s50/RLDjrhjikT4_009888_009989_seg0.npy 48 | yourpath/dataset/LORIS/fe/i3d_s50/wYbfwx93VXk_009281_009385_seg0.npy 49 | yourpath/dataset/LORIS/fe/i3d_s50/k8zhOvRBjGo_000624_000728_seg0.npy 50 | yourpath/dataset/LORIS/fe/i3d_s50/jz594oTnl-k_004994_005094_seg0.npy 51 | yourpath/dataset/LORIS/fe/i3d_s50/Xw1UvouxVLk_003749_003861_seg0.npy 52 | yourpath/dataset/LORIS/fe/i3d_s50/f-1FbFegbuQ_000356_000459_seg0.npy 53 | yourpath/dataset/LORIS/fe/i3d_s50/qGvIwgHzCH8_002101_002205_seg0.npy 54 | yourpath/dataset/LORIS/fe/i3d_s50/3PywNMDCvNQ_003170_003271_seg0.npy 55 | yourpath/dataset/LORIS/fe/i3d_s50/Vq-w0Jk7y7g_009209_009310_seg0.npy 56 | yourpath/dataset/LORIS/fe/i3d_s50/Vq-w0Jk7y7g_010575_010678_seg0.npy 57 | yourpath/dataset/LORIS/fe/i3d_s50/gMNCwgXtQIw_003278_003381_seg0.npy 58 | yourpath/dataset/LORIS/fe/i3d_s50/qBlozVQ7NOc_008251_008356_seg0.npy 59 | yourpath/dataset/LORIS/fe/i3d_s50/gRgndu5MZY4_009808_009910_seg0.npy 60 | yourpath/dataset/LORIS/fe/i3d_s50/owZ2Fv4Li8M_002479_002583_seg0.npy 61 | yourpath/dataset/LORIS/fe/i3d_s50/pDymfQS91xI_002634_002731_seg0.npy 62 | yourpath/dataset/LORIS/fe/i3d_s50/yz-uNJgIhk4_000834_000945_seg0.npy 63 | yourpath/dataset/LORIS/fe/i3d_s50/1JsRXIoR3C0_008264_008362_seg0.npy 64 | yourpath/dataset/LORIS/fe/i3d_s50/MVLZz2J6tcE_002666_002765_seg0.npy 65 | yourpath/dataset/LORIS/fe/i3d_s50/yvZPHJu3kb0_004098_004200_seg0.npy 66 | yourpath/dataset/LORIS/fe/i3d_s50/2AGztyrY25g_007078_007178_seg0.npy 67 | -------------------------------------------------------------------------------- /data/fe/fe_pose2d_s25_test_segment.txt: -------------------------------------------------------------------------------- 1 | yourpath/dataset/LORIS/fe/pose2d_s25/ji4smBYYANs_004450_004547_seg1.npy 2 | yourpath/dataset/LORIS/fe/pose2d_s25/CUuRl0Bwbbc_003664_003763_seg2.npy 3 | yourpath/dataset/LORIS/fe/pose2d_s25/1JsRXIoR3C0_009836_009925_seg1.npy 4 | yourpath/dataset/LORIS/fe/pose2d_s25/f-1FbFegbuQ_003369_003472_seg2.npy 5 | yourpath/dataset/LORIS/fe/pose2d_s25/upaJ16I0zmQ_005247_005349_seg1.npy 6 | yourpath/dataset/LORIS/fe/pose2d_s25/GbUQwE9N3aM_001342_001444_seg2.npy 7 | yourpath/dataset/LORIS/fe/pose2d_s25/fDa0HpoXES4_003787_003883_seg2.npy 8 | yourpath/dataset/LORIS/fe/pose2d_s25/k8zhOvRBjGo_001034_001136_seg0.npy 9 | yourpath/dataset/LORIS/fe/pose2d_s25/DTedv-hhHU4_000795_000904_seg1.npy 10 | yourpath/dataset/LORIS/fe/pose2d_s25/f-1FbFegbuQ_003369_003472_seg1.npy 11 | yourpath/dataset/LORIS/fe/pose2d_s25/t7Xgg9bejOM_007868_007979_seg2.npy 12 | yourpath/dataset/LORIS/fe/pose2d_s25/esQQbBhuXbM_001856_001954_seg1.npy 13 | yourpath/dataset/LORIS/fe/pose2d_s25/e3EsDlpNo0c_002907_003007_seg1.npy 14 | yourpath/dataset/LORIS/fe/pose2d_s25/t7Xgg9bejOM_009086_009187_seg2.npy 15 | yourpath/dataset/LORIS/fe/pose2d_s25/eH-ZgOT8ASM_007496_007602_seg0.npy 16 | yourpath/dataset/LORIS/fe/pose2d_s25/0LtLS9wROrk_003773_003867_seg0.npy 17 | yourpath/dataset/LORIS/fe/pose2d_s25/X4ajWw8L19s_009605_009712_seg2.npy 18 | yourpath/dataset/LORIS/fe/pose2d_s25/JHqcbeKepSg_009959_010058_seg0.npy 19 | yourpath/dataset/LORIS/fe/pose2d_s25/CUuRl0Bwbbc_003957_004064_seg1.npy 20 | yourpath/dataset/LORIS/fe/pose2d_s25/wWZry3-5sF0_001634_001737_seg0.npy 21 | yourpath/dataset/LORIS/fe/pose2d_s25/xHBUIt-airA_001244_001340_seg0.npy 22 | yourpath/dataset/LORIS/fe/pose2d_s25/yz-uNJgIhk4_003134_003234_seg0.npy 23 | yourpath/dataset/LORIS/fe/pose2d_s25/CUuRl0Bwbbc_003495_003598_seg0.npy 24 | yourpath/dataset/LORIS/fe/pose2d_s25/wYbfwx93VXk_009057_009158_seg0.npy 25 | yourpath/dataset/LORIS/fe/pose2d_s25/yz-uNJgIhk4_000834_000945_seg2.npy 26 | yourpath/dataset/LORIS/fe/pose2d_s25/esQQbBhuXbM_002103_002211_seg0.npy 27 | yourpath/dataset/LORIS/fe/pose2d_s25/wWwc2BbO598_002330_002426_seg1.npy 28 | yourpath/dataset/LORIS/fe/pose2d_s25/X4ajWw8L19s_004690_004794_seg1.npy 29 | yourpath/dataset/LORIS/fe/pose2d_s25/GEjRXo8Dvwc_000878_000982_seg0.npy 30 | yourpath/dataset/LORIS/fe/pose2d_s25/wWwc2BbO598_002685_002773_seg1.npy 31 | yourpath/dataset/LORIS/fe/pose2d_s25/CUuRl0Bwbbc_003957_004064_seg2.npy 32 | yourpath/dataset/LORIS/fe/pose2d_s25/Ry5PFp-pRmA_002806_002912_seg1.npy 33 | yourpath/dataset/LORIS/fe/pose2d_s25/uDZVn-K4GE4_001942_002041_seg1.npy 34 | yourpath/dataset/LORIS/fe/pose2d_s25/VWsVUnoyUoA_007344_007444_seg1.npy 35 | yourpath/dataset/LORIS/fe/pose2d_s25/8YSDFKGwP4U_004951_005050_seg1.npy 36 | yourpath/dataset/LORIS/fe/pose2d_s25/yvZPHJu3kb0_002828_002925_seg2.npy 37 | yourpath/dataset/LORIS/fe/pose2d_s25/PgNRyuavbS4_008687_008786_seg2.npy 38 | yourpath/dataset/LORIS/fe/pose2d_s25/FNEeMvHmuEw_000197_000292_seg0.npy 39 | yourpath/dataset/LORIS/fe/pose2d_s25/e3EsDlpNo0c_006102_006204_seg2.npy 40 | yourpath/dataset/LORIS/fe/pose2d_s25/PaVNLvldLeI_009767_009870_seg0.npy 41 | yourpath/dataset/LORIS/fe/pose2d_s25/8jfPAvqYAs8_000862_000964_seg2.npy 42 | yourpath/dataset/LORIS/fe/pose2d_s25/1sPWceVH4e8_005917_006015_seg0.npy 43 | yourpath/dataset/LORIS/fe/pose2d_s25/fH-VYYl9elA_000904_000999_seg1.npy 44 | yourpath/dataset/LORIS/fe/pose2d_s25/om-qKQXxnH4_001398_001495_seg1.npy 45 | yourpath/dataset/LORIS/fe/pose2d_s25/jz594oTnl-k_003385_003487_seg1.npy 46 | yourpath/dataset/LORIS/fe/pose2d_s25/k8zhOvRBjGo_000229_000337_seg0.npy 47 | yourpath/dataset/LORIS/fe/pose2d_s25/zNL3kn3UBmg_001223_001318_seg0.npy 48 | yourpath/dataset/LORIS/fe/pose2d_s25/fDa0HpoXES4_004339_004438_seg1.npy 49 | yourpath/dataset/LORIS/fe/pose2d_s25/esQQbBhuXbM_004424_004529_seg0.npy 50 | yourpath/dataset/LORIS/fe/pose2d_s25/IWFgo-tEEs8_003363_003461_seg1.npy 51 | yourpath/dataset/LORIS/fe/pose2d_s25/k8zhOvRBjGo_000229_000337_seg1.npy 52 | yourpath/dataset/LORIS/fe/pose2d_s25/Z2T9B4qExzk_000795_000892_seg2.npy 53 | yourpath/dataset/LORIS/fe/pose2d_s25/ji4smBYYANs_006342_006438_seg2.npy 54 | yourpath/dataset/LORIS/fe/pose2d_s25/TBsWos4T4OE_002570_002671_seg1.npy 55 | yourpath/dataset/LORIS/fe/pose2d_s25/A0xAXXysHUo_003089_003189_seg0.npy 56 | yourpath/dataset/LORIS/fe/pose2d_s25/dqUNtY2GwW4_003169_003267_seg1.npy 57 | yourpath/dataset/LORIS/fe/pose2d_s25/v3mISBmwrUM_006480_006578_seg0.npy 58 | yourpath/dataset/LORIS/fe/pose2d_s25/PgNRyuavbS4_001457_001550_seg0.npy 59 | yourpath/dataset/LORIS/fe/pose2d_s25/OIJe8fQw7Wo_002543_002643_seg2.npy 60 | yourpath/dataset/LORIS/fe/pose2d_s25/A0xAXXysHUo_003897_003995_seg2.npy 61 | yourpath/dataset/LORIS/fe/pose2d_s25/MyrqGZXxpsY_004910_005009_seg2.npy 62 | yourpath/dataset/LORIS/fe/pose2d_s25/E3AHJ6-QS8M_005450_005555_seg1.npy 63 | yourpath/dataset/LORIS/fe/pose2d_s25/wWZry3-5sF0_000808_000908_seg1.npy 64 | yourpath/dataset/LORIS/fe/pose2d_s25/wYbfwx93VXk_010310_010415_seg1.npy 65 | yourpath/dataset/LORIS/fe/pose2d_s25/nSDRagdrJ-A_003449_003565_seg2.npy 66 | yourpath/dataset/LORIS/fe/pose2d_s25/BQhX6F3gpp8_007119_007222_seg2.npy 67 | yourpath/dataset/LORIS/fe/pose2d_s25/hibW8s4WQmQ_002302_002410_seg2.npy 68 | yourpath/dataset/LORIS/fe/pose2d_s25/ji4smBYYANs_004450_004547_seg0.npy 69 | yourpath/dataset/LORIS/fe/pose2d_s25/hibW8s4WQmQ_000534_000635_seg1.npy 70 | yourpath/dataset/LORIS/fe/pose2d_s25/P31Ht3H76ok_005126_005230_seg2.npy 71 | yourpath/dataset/LORIS/fe/pose2d_s25/BLzs5opw8uM_003532_003625_seg1.npy 72 | yourpath/dataset/LORIS/fe/pose2d_s25/Z0bBRwAzKe0_002034_002136_seg1.npy 73 | yourpath/dataset/LORIS/fe/pose2d_s25/wYbfwx93VXk_009281_009385_seg0.npy 74 | yourpath/dataset/LORIS/fe/pose2d_s25/wWZry3-5sF0_004473_004574_seg0.npy 75 | yourpath/dataset/LORIS/fe/pose2d_s25/eH-ZgOT8ASM_008137_008245_seg2.npy 76 | yourpath/dataset/LORIS/fe/pose2d_s25/upaJ16I0zmQ_002150_002245_seg2.npy 77 | yourpath/dataset/LORIS/fe/pose2d_s25/hibW8s4WQmQ_004459_004564_seg1.npy 78 | yourpath/dataset/LORIS/fe/pose2d_s25/Xw1UvouxVLk_003061_003161_seg2.npy 79 | yourpath/dataset/LORIS/fe/pose2d_s25/qGvIwgHzCH8_003934_004037_seg2.npy 80 | yourpath/dataset/LORIS/fe/pose2d_s25/nSDRagdrJ-A_003239_003339_seg2.npy 81 | yourpath/dataset/LORIS/fe/pose2d_s25/n9-yxVGYMRw_001596_001703_seg2.npy 82 | yourpath/dataset/LORIS/fe/pose2d_s25/gDmmqalpisc_006229_006328_seg2.npy 83 | yourpath/dataset/LORIS/fe/pose2d_s25/e3EsDlpNo0c_006659_006760_seg0.npy 84 | yourpath/dataset/LORIS/fe/pose2d_s25/eH-ZgOT8ASM_007496_007602_seg2.npy 85 | yourpath/dataset/LORIS/fe/pose2d_s25/k8zhOvRBjGo_001034_001136_seg1.npy 86 | yourpath/dataset/LORIS/fe/pose2d_s25/TBsWos4T4OE_003911_004006_seg2.npy 87 | yourpath/dataset/LORIS/fe/pose2d_s25/upaJ16I0zmQ_004147_004244_seg1.npy 88 | yourpath/dataset/LORIS/fe/pose2d_s25/EFvDqOF1sCk_002657_002760_seg1.npy 89 | yourpath/dataset/LORIS/fe/pose2d_s25/jz594oTnl-k_001928_002032_seg2.npy 90 | yourpath/dataset/LORIS/fe/pose2d_s25/esQQbBhuXbM_002103_002211_seg2.npy 91 | yourpath/dataset/LORIS/fe/pose2d_s25/i87qMWsFbEI_003295_003400_seg2.npy 92 | yourpath/dataset/LORIS/fe/pose2d_s25/EKb2MMJSoeI_002952_003052_seg2.npy 93 | yourpath/dataset/LORIS/fe/pose2d_s25/R9XUGR-VlTg_008869_008972_seg1.npy 94 | yourpath/dataset/LORIS/fe/pose2d_s25/yvZPHJu3kb0_002828_002925_seg0.npy 95 | yourpath/dataset/LORIS/fe/pose2d_s25/f6k7PBGgeb4_000779_000876_seg2.npy 96 | yourpath/dataset/LORIS/fe/pose2d_s25/0LtLS9wROrk_006690_006788_seg2.npy 97 | yourpath/dataset/LORIS/fe/pose2d_s25/gRgndu5MZY4_010248_010361_seg2.npy 98 | yourpath/dataset/LORIS/fe/pose2d_s25/IP96HTdCvWs_005209_005311_seg0.npy 99 | yourpath/dataset/LORIS/fe/pose2d_s25/Z2T9B4qExzk_001432_001524_seg2.npy 100 | yourpath/dataset/LORIS/fe/pose2d_s25/5cuxEEKyth8_003196_003295_seg2.npy 101 | yourpath/dataset/LORIS/fe/pose2d_s25/1sPWceVH4e8_007221_007310_seg1.npy 102 | yourpath/dataset/LORIS/fe/pose2d_s25/yIDi18JlgsQ_003760_003860_seg0.npy 103 | yourpath/dataset/LORIS/fe/pose2d_s25/5cuxEEKyth8_005592_005690_seg0.npy 104 | yourpath/dataset/LORIS/fe/pose2d_s25/8jfPAvqYAs8_003212_003313_seg2.npy 105 | yourpath/dataset/LORIS/fe/pose2d_s25/upaJ16I0zmQ_000334_000443_seg1.npy 106 | yourpath/dataset/LORIS/fe/pose2d_s25/GEjRXo8Dvwc_003163_003263_seg2.npy 107 | yourpath/dataset/LORIS/fe/pose2d_s25/1sPWceVH4e8_005281_005383_seg0.npy 108 | yourpath/dataset/LORIS/fe/pose2d_s25/vY-jPM995Gk_003332_003435_seg1.npy 109 | yourpath/dataset/LORIS/fe/pose2d_s25/CkNz9ZIQmZI_008093_008190_seg1.npy 110 | yourpath/dataset/LORIS/fe/pose2d_s25/5cuxEEKyth8_003441_003539_seg1.npy 111 | yourpath/dataset/LORIS/fe/pose2d_s25/wWwc2BbO598_002794_002897_seg2.npy 112 | yourpath/dataset/LORIS/fe/pose2d_s25/pDymfQS91xI_002634_002731_seg1.npy 113 | yourpath/dataset/LORIS/fe/pose2d_s25/gMNCwgXtQIw_004258_004363_seg0.npy 114 | yourpath/dataset/LORIS/fe/pose2d_s25/PgNRyuavbS4_008687_008786_seg1.npy 115 | yourpath/dataset/LORIS/fe/pose2d_s25/esQQbBhuXbM_001856_001954_seg2.npy 116 | yourpath/dataset/LORIS/fe/pose2d_s25/CUuRl0Bwbbc_003247_003355_seg1.npy 117 | yourpath/dataset/LORIS/fe/pose2d_s25/jABvTCCWinA_001483_001582_seg0.npy 118 | yourpath/dataset/LORIS/fe/pose2d_s25/qGvIwgHzCH8_002286_002387_seg0.npy 119 | yourpath/dataset/LORIS/fe/pose2d_s25/gRgndu5MZY4_009602_009702_seg2.npy 120 | yourpath/dataset/LORIS/fe/pose2d_s25/nSDRagdrJ-A_003239_003339_seg1.npy 121 | yourpath/dataset/LORIS/fe/pose2d_s25/hibW8s4WQmQ_001706_001811_seg0.npy 122 | yourpath/dataset/LORIS/fe/pose2d_s25/A0xAXXysHUo_003435_003534_seg0.npy 123 | yourpath/dataset/LORIS/fe/pose2d_s25/AZ4wWG6Rcak_002768_002869_seg1.npy 124 | yourpath/dataset/LORIS/fe/pose2d_s25/2Qw1e4-nWrk_004855_004944_seg2.npy 125 | yourpath/dataset/LORIS/fe/pose2d_s25/e3EsDlpNo0c_004671_004771_seg2.npy 126 | yourpath/dataset/LORIS/fe/pose2d_s25/2Qw1e4-nWrk_003782_003881_seg2.npy 127 | yourpath/dataset/LORIS/fe/pose2d_s25/om-qKQXxnH4_004830_004929_seg1.npy 128 | yourpath/dataset/LORIS/fe/pose2d_s25/JHqcbeKepSg_001435_001540_seg1.npy 129 | yourpath/dataset/LORIS/fe/pose2d_s25/yz-uNJgIhk4_001095_001199_seg2.npy 130 | yourpath/dataset/LORIS/fe/pose2d_s25/2AGztyrY25g_008717_008817_seg2.npy 131 | yourpath/dataset/LORIS/fe/pose2d_s25/yz-uNJgIhk4_001693_001795_seg1.npy 132 | yourpath/dataset/LORIS/fe/pose2d_s25/RjpOEHmTf7I_005447_005547_seg2.npy 133 | yourpath/dataset/LORIS/fe/pose2d_s25/wolPuHKrX9o_003177_003283_seg0.npy 134 | yourpath/dataset/LORIS/fe/pose2d_s25/BLzs5opw8uM_000201_000302_seg0.npy 135 | yourpath/dataset/LORIS/fe/pose2d_s25/ItBRb9LB-VI_000174_000269_seg0.npy 136 | yourpath/dataset/LORIS/fe/pose2d_s25/ji4smBYYANs_002250_002348_seg1.npy 137 | yourpath/dataset/LORIS/fe/pose2d_s25/JHqcbeKepSg_002828_002929_seg2.npy 138 | yourpath/dataset/LORIS/fe/pose2d_s25/R9XUGR-VlTg_008869_008972_seg0.npy 139 | yourpath/dataset/LORIS/fe/pose2d_s25/I1OMnMSk1Lg_003448_003549_seg1.npy 140 | yourpath/dataset/LORIS/fe/pose2d_s25/pDymfQS91xI_000954_001054_seg2.npy 141 | yourpath/dataset/LORIS/fe/pose2d_s25/X4ajWw8L19s_007072_007176_seg2.npy 142 | yourpath/dataset/LORIS/fe/pose2d_s25/CkNz9ZIQmZI_007316_007416_seg2.npy 143 | yourpath/dataset/LORIS/fe/pose2d_s25/p42w02g4Ce4_001152_001255_seg2.npy 144 | yourpath/dataset/LORIS/fe/pose2d_s25/I1OMnMSk1Lg_005064_005173_seg2.npy 145 | yourpath/dataset/LORIS/fe/pose2d_s25/PaVNLvldLeI_009767_009870_seg2.npy 146 | yourpath/dataset/LORIS/fe/pose2d_s25/t7Xgg9bejOM_009086_009187_seg0.npy 147 | yourpath/dataset/LORIS/fe/pose2d_s25/ji4smBYYANs_003210_003307_seg1.npy 148 | yourpath/dataset/LORIS/fe/pose2d_s25/BQhX6F3gpp8_008733_008833_seg1.npy 149 | yourpath/dataset/LORIS/fe/pose2d_s25/CUuRl0Bwbbc_003664_003763_seg1.npy 150 | yourpath/dataset/LORIS/fe/pose2d_s25/X4ajWw8L19s_001821_001922_seg0.npy 151 | yourpath/dataset/LORIS/fe/pose2d_s25/upaJ16I0zmQ_001062_001164_seg0.npy 152 | yourpath/dataset/LORIS/fe/pose2d_s25/f-1FbFegbuQ_004245_004347_seg0.npy 153 | yourpath/dataset/LORIS/fe/pose2d_s25/RjpOEHmTf7I_001348_001449_seg1.npy 154 | yourpath/dataset/LORIS/fe/pose2d_s25/X4ajWw8L19s_003808_003911_seg2.npy 155 | yourpath/dataset/LORIS/fe/pose2d_s25/qGvIwgHzCH8_004139_004237_seg2.npy 156 | yourpath/dataset/LORIS/fe/pose2d_s25/UcCTusldh6w_005149_005253_seg1.npy 157 | yourpath/dataset/LORIS/fe/pose2d_s25/0LtLS9wROrk_007340_007433_seg2.npy 158 | yourpath/dataset/LORIS/fe/pose2d_s25/WCcSXjsCVMA_007294_007391_seg1.npy 159 | yourpath/dataset/LORIS/fe/pose2d_s25/i87qMWsFbEI_002693_002797_seg1.npy 160 | yourpath/dataset/LORIS/fe/pose2d_s25/vY-jPM995Gk_003332_003435_seg0.npy 161 | yourpath/dataset/LORIS/fe/pose2d_s25/e3EsDlpNo0c_008138_008242_seg1.npy 162 | yourpath/dataset/LORIS/fe/pose2d_s25/e3EsDlpNo0c_003301_003400_seg2.npy 163 | yourpath/dataset/LORIS/fe/pose2d_s25/JHqcbeKepSg_002828_002929_seg0.npy 164 | yourpath/dataset/LORIS/fe/pose2d_s25/k8zhOvRBjGo_003899_004002_seg2.npy 165 | yourpath/dataset/LORIS/fe/pose2d_s25/lrwiYiFGQZE_004003_004107_seg0.npy 166 | yourpath/dataset/LORIS/fe/pose2d_s25/xHBUIt-airA_004870_004974_seg2.npy 167 | yourpath/dataset/LORIS/fe/pose2d_s25/X4ajWw8L19s_004690_004794_seg2.npy 168 | yourpath/dataset/LORIS/fe/pose2d_s25/Vq-w0Jk7y7g_009413_009515_seg1.npy 169 | yourpath/dataset/LORIS/fe/pose2d_s25/DG7upbhB1bI_001882_001986_seg0.npy 170 | yourpath/dataset/LORIS/fe/pose2d_s25/TCiufCzMtDs_000851_000946_seg1.npy 171 | yourpath/dataset/LORIS/fe/pose2d_s25/A0xAXXysHUo_003435_003534_seg2.npy 172 | yourpath/dataset/LORIS/fe/pose2d_s25/f6k7PBGgeb4_001273_001393_seg1.npy 173 | yourpath/dataset/LORIS/fe/pose2d_s25/DyZ2qj6x1UE_004939_005041_seg2.npy 174 | yourpath/dataset/LORIS/fe/pose2d_s25/f6k7PBGgeb4_000779_000876_seg0.npy 175 | yourpath/dataset/LORIS/fe/pose2d_s25/2Qw1e4-nWrk_005464_005562_seg1.npy 176 | yourpath/dataset/LORIS/fe/pose2d_s25/Vq-w0Jk7y7g_008817_008917_seg2.npy 177 | yourpath/dataset/LORIS/fe/pose2d_s25/GF8D7Dx2mhs_004533_004634_seg0.npy 178 | yourpath/dataset/LORIS/fe/pose2d_s25/esQQbBhuXbM_007679_007783_seg2.npy 179 | yourpath/dataset/LORIS/fe/pose2d_s25/2giTb7IpJDU_003853_003956_seg1.npy 180 | yourpath/dataset/LORIS/fe/pose2d_s25/Z2T9B4qExzk_008023_008117_seg2.npy 181 | yourpath/dataset/LORIS/fe/pose2d_s25/UcCTusldh6w_005149_005253_seg2.npy 182 | yourpath/dataset/LORIS/fe/pose2d_s25/OIJe8fQw7Wo_002543_002643_seg0.npy 183 | yourpath/dataset/LORIS/fe/pose2d_s25/CUuRl0Bwbbc_003247_003355_seg0.npy 184 | yourpath/dataset/LORIS/fe/pose2d_s25/xHBUIt-airA_007025_007127_seg2.npy 185 | yourpath/dataset/LORIS/fe/pose2d_s25/Ry5PFp-pRmA_002605_002708_seg1.npy 186 | yourpath/dataset/LORIS/fe/pose2d_s25/MVLZz2J6tcE_003013_003114_seg2.npy 187 | yourpath/dataset/LORIS/fe/pose2d_s25/RjpOEHmTf7I_003956_004060_seg1.npy 188 | yourpath/dataset/LORIS/fe/pose2d_s25/t7Xgg9bejOM_007868_007979_seg1.npy 189 | yourpath/dataset/LORIS/fe/pose2d_s25/TBsWos4T4OE_003911_004006_seg0.npy 190 | yourpath/dataset/LORIS/fe/pose2d_s25/8N3CBVAft40_001397_001488_seg2.npy 191 | yourpath/dataset/LORIS/fe/pose2d_s25/f-1FbFegbuQ_004879_004987_seg1.npy 192 | yourpath/dataset/LORIS/fe/pose2d_s25/zNL3kn3UBmg_003321_003420_seg0.npy 193 | yourpath/dataset/LORIS/fe/pose2d_s25/fH-VYYl9elA_000264_000365_seg1.npy 194 | yourpath/dataset/LORIS/fe/pose2d_s25/X4ajWw8L19s_001821_001922_seg1.npy 195 | yourpath/dataset/LORIS/fe/pose2d_s25/BLzs5opw8uM_003532_003625_seg2.npy 196 | -------------------------------------------------------------------------------- /data/fe/fe_pose2d_s50_test_segment.txt: -------------------------------------------------------------------------------- 1 | yourpath/dataset/LORIS/fe/pose2d_s50/xHBUIt-airA_003193_003315.npy 2 | yourpath/dataset/LORIS/fe/pose2d_s50/C5Yfd1IWjmM_002895_002996.npy 3 | yourpath/dataset/LORIS/fe/pose2d_s50/5cuxEEKyth8_001482_001576.npy 4 | yourpath/dataset/LORIS/fe/pose2d_s50/om-qKQXxnH4_004830_004929.npy 5 | yourpath/dataset/LORIS/fe/pose2d_s50/mI7pLIDnTiQ_001349_001443.npy 6 | yourpath/dataset/LORIS/fe/pose2d_s50/Ry5PFp-pRmA_004259_004360.npy 7 | yourpath/dataset/LORIS/fe/pose2d_s50/TCiufCzMtDs_001807_001906.npy 8 | yourpath/dataset/LORIS/fe/pose2d_s50/Z0bBRwAzKe0_002595_002690.npy 9 | yourpath/dataset/LORIS/fe/pose2d_s50/EKb2MMJSoeI_002450_002553.npy 10 | yourpath/dataset/LORIS/fe/pose2d_s50/IP96HTdCvWs_005003_005107.npy 11 | yourpath/dataset/LORIS/fe/pose2d_s50/JHqcbeKepSg_001435_001540.npy 12 | yourpath/dataset/LORIS/fe/pose2d_s50/zNL3kn3UBmg_001223_001318.npy 13 | yourpath/dataset/LORIS/fe/pose2d_s50/EFvDqOF1sCk_003731_003896.npy 14 | yourpath/dataset/LORIS/fe/pose2d_s50/VWsVUnoyUoA_007154_007246.npy 15 | yourpath/dataset/LORIS/fe/pose2d_s50/zNL3kn3UBmg_007548_007646.npy 16 | yourpath/dataset/LORIS/fe/pose2d_s50/hibW8s4WQmQ_000212_000315.npy 17 | yourpath/dataset/LORIS/fe/pose2d_s50/1JsRXIoR3C0_009286_009385.npy 18 | yourpath/dataset/LORIS/fe/pose2d_s50/0jqn1vxdhls_003284_003383.npy 19 | yourpath/dataset/LORIS/fe/pose2d_s50/qBlozVQ7NOc_007741_007842.npy 20 | yourpath/dataset/LORIS/fe/pose2d_s50/yz-uNJgIhk4_001693_001795.npy 21 | yourpath/dataset/LORIS/fe/pose2d_s50/X4ajWw8L19s_007434_007534.npy 22 | yourpath/dataset/LORIS/fe/pose2d_s50/wolPuHKrX9o_004741_004844.npy 23 | yourpath/dataset/LORIS/fe/pose2d_s50/aEZbP-Yephw_001131_001234.npy 24 | yourpath/dataset/LORIS/fe/pose2d_s50/9Mtbac7g15I_004544_004676.npy 25 | yourpath/dataset/LORIS/fe/pose2d_s50/eH-ZgOT8ASM_007289_007400.npy 26 | yourpath/dataset/LORIS/fe/pose2d_s50/Z2T9B4qExzk_001748_001847.npy 27 | yourpath/dataset/LORIS/fe/pose2d_s50/wolPuHKrX9o_004453_004551.npy 28 | yourpath/dataset/LORIS/fe/pose2d_s50/qBlozVQ7NOc_007526_007628.npy 29 | yourpath/dataset/LORIS/fe/pose2d_s50/ji4smBYYANs_006342_006438.npy 30 | yourpath/dataset/LORIS/fe/pose2d_s50/e3EsDlpNo0c_003301_003400.npy 31 | yourpath/dataset/LORIS/fe/pose2d_s50/CkNz9ZIQmZI_008093_008190.npy 32 | yourpath/dataset/LORIS/fe/pose2d_s50/Xw1UvouxVLk_002076_002181.npy 33 | yourpath/dataset/LORIS/fe/pose2d_s50/1Fdwuy2V9EY_009502_009601.npy 34 | yourpath/dataset/LORIS/fe/pose2d_s50/EKb2MMJSoeI_002952_003052.npy 35 | yourpath/dataset/LORIS/fe/pose2d_s50/n9-yxVGYMRw_003785_003894.npy 36 | yourpath/dataset/LORIS/fe/pose2d_s50/fH-VYYl9elA_001866_001961.npy 37 | yourpath/dataset/LORIS/fe/pose2d_s50/t7Xgg9bejOM_009086_009187.npy 38 | yourpath/dataset/LORIS/fe/pose2d_s50/CkNz9ZIQmZI_006383_006487.npy 39 | yourpath/dataset/LORIS/fe/pose2d_s50/wWZry3-5sF0_000808_000908.npy 40 | yourpath/dataset/LORIS/fe/pose2d_s50/VWsVUnoyUoA_008767_008866.npy 41 | yourpath/dataset/LORIS/fe/pose2d_s50/I1OMnMSk1Lg_005064_005173.npy 42 | yourpath/dataset/LORIS/fe/pose2d_s50/0LtLS9wROrk_004572_004670.npy 43 | yourpath/dataset/LORIS/fe/pose2d_s50/n9-yxVGYMRw_003258_003358.npy 44 | yourpath/dataset/LORIS/fe/pose2d_s50/ItBRb9LB-VI_000174_000269.npy 45 | yourpath/dataset/LORIS/fe/pose2d_s50/WCcSXjsCVMA_008136_008237.npy 46 | yourpath/dataset/LORIS/fe/pose2d_s50/PgNRyuavbS4_000780_000878.npy 47 | yourpath/dataset/LORIS/fe/pose2d_s50/RLDjrhjikT4_009888_009989.npy 48 | yourpath/dataset/LORIS/fe/pose2d_s50/wYbfwx93VXk_009281_009385.npy 49 | yourpath/dataset/LORIS/fe/pose2d_s50/k8zhOvRBjGo_000624_000728.npy 50 | yourpath/dataset/LORIS/fe/pose2d_s50/jz594oTnl-k_004994_005094.npy 51 | yourpath/dataset/LORIS/fe/pose2d_s50/Xw1UvouxVLk_003749_003861.npy 52 | yourpath/dataset/LORIS/fe/pose2d_s50/f-1FbFegbuQ_000356_000459.npy 53 | yourpath/dataset/LORIS/fe/pose2d_s50/qGvIwgHzCH8_002101_002205.npy 54 | yourpath/dataset/LORIS/fe/pose2d_s50/3PywNMDCvNQ_003170_003271.npy 55 | yourpath/dataset/LORIS/fe/pose2d_s50/Vq-w0Jk7y7g_009209_009310.npy 56 | yourpath/dataset/LORIS/fe/pose2d_s50/Vq-w0Jk7y7g_010575_010678.npy 57 | yourpath/dataset/LORIS/fe/pose2d_s50/gMNCwgXtQIw_003278_003381.npy 58 | yourpath/dataset/LORIS/fe/pose2d_s50/qBlozVQ7NOc_008251_008356.npy 59 | yourpath/dataset/LORIS/fe/pose2d_s50/gRgndu5MZY4_009808_009910.npy 60 | yourpath/dataset/LORIS/fe/pose2d_s50/owZ2Fv4Li8M_002479_002583.npy 61 | yourpath/dataset/LORIS/fe/pose2d_s50/pDymfQS91xI_002634_002731.npy 62 | yourpath/dataset/LORIS/fe/pose2d_s50/yz-uNJgIhk4_000834_000945.npy 63 | yourpath/dataset/LORIS/fe/pose2d_s50/1JsRXIoR3C0_008264_008362.npy 64 | yourpath/dataset/LORIS/fe/pose2d_s50/MVLZz2J6tcE_002666_002765.npy 65 | yourpath/dataset/LORIS/fe/pose2d_s50/yvZPHJu3kb0_004098_004200.npy 66 | yourpath/dataset/LORIS/fe/pose2d_s50/2AGztyrY25g_007078_007178.npy 67 | -------------------------------------------------------------------------------- /data/genre/dance_s25_test.npy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenGVLab/LORIS/b5bef7d9f9f9956f59386af408bf4dc33cfbef62/data/genre/dance_s25_test.npy -------------------------------------------------------------------------------- /data/genre/dance_s25_train.npy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenGVLab/LORIS/b5bef7d9f9f9956f59386af408bf4dc33cfbef62/data/genre/dance_s25_train.npy -------------------------------------------------------------------------------- /generate_loris.py: -------------------------------------------------------------------------------- 1 | import os 2 | import numpy as np 3 | import torch 4 | import torch.nn as nn 5 | import torch.nn.functional as F 6 | from torch.utils.data import DataLoader 7 | from torch.utils.tensorboard import SummaryWriter 8 | from collections import OrderedDict 9 | import yaml 10 | import time 11 | import argparse 12 | from pathlib import Path 13 | import librosa 14 | import soundfile as sf 15 | # import noisereduce as nr 16 | import sys 17 | from d2m.dataset import S25Dataset 18 | from d2m.utils import save_sample, load_yaml_config 19 | from d2m.loris_modules import LORIS 20 | 21 | def parse_args(): 22 | parser = argparse.ArgumentParser() 23 | parser.add_argument("--config_path", default='./configs/') 24 | parser.add_argument('--dataset', default='') 25 | args = parser.parse_args() 26 | return args 27 | 28 | 29 | def generate(config): 30 | 31 | model_save_path = config['model_save_path'] 32 | sample_save_path = config['sample_save_path'] + config['ckpt_name'].split('.')[0].split('_')[1] + '_' + str(config['model']['embedding_scale']) + '_' + str(config['model']['diffusion_step']) 33 | 34 | loris = LORIS(config['model']).cuda() 35 | 36 | loris_ckpt_path = os.path.join(model_save_path, config['ckpt_name']) 37 | state_dict = torch.load(loris_ckpt_path, map_location="cpu") 38 | new_state_dict = OrderedDict() 39 | for k, v in state_dict.items(): 40 | name = k[7:] 41 | new_state_dict[name] = v 42 | loris.load_state_dict(new_state_dict, strict=True) 43 | print("*******Finish model loading******") 44 | 45 | #### create data loader #### 46 | test_dataset = S25Dataset(audio_files=config['audio_test_path'], video_files=config['video_test_path'], motion_files=config['motion_test_path'], genre_label=config['genre_test_path'], augment=False, config=config['model']) 47 | va_loader = DataLoader(test_dataset, batch_size=16) 48 | print("*******Finish data loader*******") 49 | 50 | #### generate samples #### 51 | torch.backends.cudnn.benchmark = True 52 | for j, input in enumerate(va_loader): 53 | input['music'], input['motion'], input['video'] = input['music'].cuda(), input['motion'].cuda(), input['video'].cuda() 54 | sys.stdout.flush() 55 | audio_gen_batch = loris.sample(input) 56 | for i in range(audio_gen_batch.size(0)): 57 | sys.stdout.flush() 58 | audio_gen = audio_gen_batch[i] 59 | audio_gt = input['music'][i].squeeze().cpu() 60 | comp_len = audio_gt.shape[0] - audio_gen.shape[1] 61 | audio_gen = torch.cat((audio_gen, audio_gen[:, audio_gen.shape[1]-comp_len:]), -1) 62 | print("Generating testing sample:", j*audio_gen_batch.size(0)+i+1, flush=True) 63 | if not os.path.exists(sample_save_path): 64 | os.makedirs(sample_save_path) 65 | sample_gt = 'gt_' + str(j*audio_gen_batch.size(0)+i+1) + '.wav' 66 | sample_gt = os.path.join(sample_save_path, sample_gt) 67 | sf.write(sample_gt, audio_gt.detach().cpu().numpy(), 22050) 68 | audio_gen = audio_gen.transpose(0, 1).squeeze().detach().cpu().numpy() 69 | 70 | # audio_gen = nr.reduce_noise(y=audio_gen, sr=22050) 71 | sample_gen = 'generated_'+ str(j*audio_gen_batch.size(0)+i+1) + '.wav' 72 | sample_gen = os.path.join(sample_save_path, sample_gen) 73 | sf.write(sample_gen, audio_gen, samplerate=22050) 74 | 75 | print("*******Finish generating samples*******") 76 | 77 | 78 | def main(): 79 | args = parse_args() 80 | 81 | config_dir = os.path.join(args.config_path, args.dataset+'.yaml') 82 | config = load_yaml_config(config_dir) 83 | generate(config) 84 | 85 | if __name__ == '__main__': 86 | main() 87 | 88 | -------------------------------------------------------------------------------- /imgs/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenGVLab/LORIS/b5bef7d9f9f9956f59386af408bf4dc33cfbef62/imgs/logo.png -------------------------------------------------------------------------------- /imgs/loris.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenGVLab/LORIS/b5bef7d9f9f9956f59386af408bf4dc33cfbef62/imgs/loris.png -------------------------------------------------------------------------------- /imgs/pipeline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenGVLab/LORIS/b5bef7d9f9f9956f59386af408bf4dc33cfbef62/imgs/pipeline.png -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | albumentations==1.3.0 2 | apex==0.9.10dev 3 | einops==0.4.1 4 | einops_exts==0.0.4 5 | face_recognition==1.3.0 6 | h5py==3.1.0 7 | json_tricks==3.16.1 8 | librosa==0.8.0 9 | matplotlib==3.3.4 10 | mmcv==2.0.0 11 | mmcv_full==1.3.17 12 | mmdet==2.25.1 13 | mmtrack==0.14.0 14 | model_archiver==1.0.3 15 | moviepy==1.0.3 16 | munkres==1.1.4 17 | numpy==1.19.5 18 | onnx==1.13.1 19 | onnxruntime==1.14.1 20 | opencv_python==4.7.0.72 21 | pavi==0.0.1 22 | Pillow==9.5.0 23 | psutil==5.9.4 24 | pyrender==0.1.45 25 | pytest==7.3.1 26 | pytorch_sphinx_theme==0.0.19 27 | PyYAML==6.0 28 | requests==2.27.1 29 | scipy==1.5.4 30 | seaborn==0.12.2 31 | setuptools==58.0.4 32 | smplx==0.1.28 33 | soundfile==0.12.1 34 | spacepy==0.4.1 35 | timm==0.6.12 36 | titlecase==2.4 37 | torch==1.8.0+cu111 38 | torchvision==0.9.0+cu111 39 | tqdm==4.64.1 40 | trimesh==3.21.5 41 | ts==0.5.1 42 | tensorboard 43 | typing_extensions==4.5.0 44 | xmltodict==0.13.0 45 | xtcocotools==1.13 46 | -------------------------------------------------------------------------------- /scripts/infer_dance_s25.sh: -------------------------------------------------------------------------------- 1 | python generate_loris.py \ 2 | --config_path='./configs/' \ 3 | --dataset='dance_s25' 4 | -------------------------------------------------------------------------------- /scripts/infer_fe_s25.sh: -------------------------------------------------------------------------------- 1 | python generate_loris.py \ 2 | --config_path='./configs/' \ 3 | --dataset='fe_s25' -------------------------------------------------------------------------------- /scripts/infer_fe_s50.sh: -------------------------------------------------------------------------------- 1 | python generate_loris.py \ 2 | --config_path='./configs/' \ 3 | --dataset='fe_s50' -------------------------------------------------------------------------------- /scripts/infer_fs_s25.sh: -------------------------------------------------------------------------------- 1 | python generate_loris.py \ 2 | --config_path='./configs/' \ 3 | --dataset='fs_s25' -------------------------------------------------------------------------------- /scripts/infer_fs_s50.sh: -------------------------------------------------------------------------------- 1 | python generate_loris.py \ 2 | --config_path='./configs/' \ 3 | --dataset='fs_s50' -------------------------------------------------------------------------------- /scripts/loris_dance_s25.sh: -------------------------------------------------------------------------------- 1 | python d2m_loris.py \ 2 | --config_path='./configs/' \ 3 | --dataset='dance_s25' 4 | -------------------------------------------------------------------------------- /scripts/loris_fe_s25.sh: -------------------------------------------------------------------------------- 1 | python d2m_loris.py \ 2 | --config_path='./configs/' \ 3 | --dataset='fe_s25' 4 | -------------------------------------------------------------------------------- /scripts/loris_fe_s50.sh: -------------------------------------------------------------------------------- 1 | python d2m_loris.py \ 2 | --config_path='./configs/' \ 3 | --dataset='fe_s50' 4 | -------------------------------------------------------------------------------- /scripts/loris_fs_s25.sh: -------------------------------------------------------------------------------- 1 | python d2m_loris.py \ 2 | --config_path='./configs/' \ 3 | --dataset='fs_s25' 4 | -------------------------------------------------------------------------------- /scripts/loris_fs_s50.sh: -------------------------------------------------------------------------------- 1 | python d2m_loris.py \ 2 | --config_path='./configs/' \ 3 | --dataset='fs_s50' 4 | --------------------------------------------------------------------------------