from glob import glob def find_run_dir(run_name: str) -> str: runs = list(glob(f"runs/*/{run_name}", recursive=True)) if len(runs) == 0: raise FileNotFoundError(f"Directory for run '{run_name}' is not found") if len(runs) > 1: raise FileExistsError(f"Multiple directories found for run '{run_name}': {runs}") return runs[0] # Extend list definition with map function class Files(list): def __init__(self, *files): # If a single non-string iterable is passed, use it directly; otherwise treat args as items if len(files) == 1 and not isinstance(files[0], (str, bytes)): super().__init__(files[0]) else: super().__init__(files) def map(self, func): return Files(map(func, self)) def unique(self): return Files(sorted(set(self))) def cat(self, other): return Files(self + other) class FF: """https://arxiv.org/abs/1901.08971""" class DF: test = Files( "config/datasets/FF/test/DF.txt", "config/datasets/FF/test/real.txt", ) class F2F: test = Files( "config/datasets/FF/test/F2F.txt", "config/datasets/FF/test/real.txt", ) class FS: test = Files( "config/datasets/FF/test/FS.txt", "config/datasets/FF/test/real.txt", ) class NT: test = Files( "config/datasets/FF/test/NT.txt", "config/datasets/FF/test/real.txt", ) def to_train(f) -> str: return f.replace("/test/", "/train/") def to_val(f) -> str: return f.replace("/test/", "/val/") def to_x1_5(f) -> str: return f.replace("/FF/", "/FF-x1.5/") def to_x2(f) -> str: return f.replace("/FF/", "/FF-x2.0/") def to_rmbg_x1_5(f) -> str: return f.replace("/FF/", "/FF-rmbg-x1.5/") test = Files(DF.test + F2F.test + FS.test + NT.test).unique() train = test.map(to_train) val = test.map(to_val) class CDFv2: """https://arxiv.org/abs/1909.12962""" test = Files( "config/datasets/CDFv2/test/Celeb-synthesis.txt", "config/datasets/CDFv2/test/YouTube-real.txt", "config/datasets/CDFv2/test/Celeb-real.txt", ) # It is not an official validation set but generated from {all}\{test} files # using scripts/datasets/create_validation_set.py val = Files( "config/datasets/CDFv2/val/Celeb-synthesis.txt", "config/datasets/CDFv2/val/YouTube-real.txt", "config/datasets/CDFv2/val/Celeb-real.txt", ) my_train = Files( "config/datasets/CDFv2/my-train/Celeb-synthesis.txt", "config/datasets/CDFv2/my-train/YouTube-real.txt", "config/datasets/CDFv2/my-train/Celeb-real.txt", ) class CDFv3: """https://arxiv.org/abs/2507.18015v1""" class FS: """Face-swap""" class CDFv2: test = Files( "config/datasets/CDFv3/test/Celeb-DF-v2.txt", "config/datasets/CDFv3/test/Celeb-real.txt", "config/datasets/CDFv3/test/YouTube-real.txt", ) class BlendFace: test = Files( "config/datasets/CDFv3/test/BlendFace.txt", "config/datasets/CDFv3/test/Celeb-real.txt", "config/datasets/CDFv3/test/YouTube-real.txt", ) class GHOST: test = Files( "config/datasets/CDFv3/test/GHOST.txt", "config/datasets/CDFv3/test/Celeb-real.txt", "config/datasets/CDFv3/test/YouTube-real.txt", ) class HifiFace: test = Files( "config/datasets/CDFv3/test/HifiFace.txt", "config/datasets/CDFv3/test/Celeb-real.txt", "config/datasets/CDFv3/test/YouTube-real.txt", ) class InSwapper: test = Files( "config/datasets/CDFv3/test/InSwapper.txt", "config/datasets/CDFv3/test/Celeb-real.txt", "config/datasets/CDFv3/test/YouTube-real.txt", ) class MobileFaceSwap: test = Files( "config/datasets/CDFv3/test/MobileFaceSwap.txt", "config/datasets/CDFv3/test/Celeb-real.txt", "config/datasets/CDFv3/test/YouTube-real.txt", ) class SimSwap: test = Files( "config/datasets/CDFv3/test/SimSwap.txt", "config/datasets/CDFv3/test/Celeb-real.txt", "config/datasets/CDFv3/test/YouTube-real.txt", ) class UniFace: test = Files( "config/datasets/CDFv3/test/UniFace.txt", "config/datasets/CDFv3/test/Celeb-real.txt", "config/datasets/CDFv3/test/YouTube-real.txt", ) test = Files( CDFv2.test + BlendFace.test + GHOST.test + HifiFace.test + InSwapper.test + MobileFaceSwap.test + SimSwap.test + UniFace.test ).unique() class FR: """Face Reenectment""" class DaGAN: test = Files( "config/datasets/CDFv3/test/DaGAN.txt", "config/datasets/CDFv3/test/Celeb-real.txt", "config/datasets/CDFv3/test/YouTube-real.txt", ) class FSRT: test = Files( "config/datasets/CDFv3/test/FSRT.txt", "config/datasets/CDFv3/test/Celeb-real.txt", "config/datasets/CDFv3/test/YouTube-real.txt", ) class HyperReenact: test = Files( "config/datasets/CDFv3/test/HyperReenact.txt", "config/datasets/CDFv3/test/Celeb-real.txt", "config/datasets/CDFv3/test/YouTube-real.txt", ) class LIA: test = Files( "config/datasets/CDFv3/test/LIA.txt", "config/datasets/CDFv3/test/Celeb-real.txt", "config/datasets/CDFv3/test/YouTube-real.txt", ) class LivePortrait: test = Files( "config/datasets/CDFv3/test/LivePortrait.txt", "config/datasets/CDFv3/test/Celeb-real.txt", "config/datasets/CDFv3/test/YouTube-real.txt", ) class MCNET: test = Files( "config/datasets/CDFv3/test/MCNET.txt", "config/datasets/CDFv3/test/Celeb-real.txt", "config/datasets/CDFv3/test/YouTube-real.txt", ) class TPSMM: test = Files( "config/datasets/CDFv3/test/TPSMM.txt", "config/datasets/CDFv3/test/Celeb-real.txt", "config/datasets/CDFv3/test/YouTube-real.txt", ) test = Files( DaGAN.test + FSRT.test + HyperReenact.test + LIA.test + LivePortrait.test + MCNET.test + TPSMM.test ).unique() class TF: """Talking Face""" class AniTalker: test = Files( "config/datasets/CDFv3/test/AniTalker.txt", "config/datasets/CDFv3/test/Celeb-real.txt", "config/datasets/CDFv3/test/YouTube-real.txt", ) class EchoMimic: test = Files( "config/datasets/CDFv3/test/EchoMimic.txt", "config/datasets/CDFv3/test/Celeb-real.txt", "config/datasets/CDFv3/test/YouTube-real.txt", ) class EDTalk: test = Files( "config/datasets/CDFv3/test/EDTalk.txt", "config/datasets/CDFv3/test/Celeb-real.txt", "config/datasets/CDFv3/test/YouTube-real.txt", ) class FLOAT: test = Files( "config/datasets/CDFv3/test/FLOAT.txt", "config/datasets/CDFv3/test/Celeb-real.txt", "config/datasets/CDFv3/test/YouTube-real.txt", ) class IP_LAP: test = Files( "config/datasets/CDFv3/test/IP_LAP.txt", "config/datasets/CDFv3/test/Celeb-real.txt", "config/datasets/CDFv3/test/YouTube-real.txt", ) class Real3DPortrait: test = Files( "config/datasets/CDFv3/test/Real3DPortrait.txt", "config/datasets/CDFv3/test/Celeb-real.txt", "config/datasets/CDFv3/test/YouTube-real.txt", ) class SadTalker: test = Files( "config/datasets/CDFv3/test/SadTalker.txt", "config/datasets/CDFv3/test/Celeb-real.txt", "config/datasets/CDFv3/test/YouTube-real.txt", ) test = Files( AniTalker.test + EchoMimic.test + EDTalk.test + FLOAT.test + IP_LAP.test + Real3DPortrait.test + SadTalker.test ).unique() def to_train(f) -> str: return f.replace("/test/", "/train/") def to_my_val(f) -> str: return f.replace("/test/", "/my-val/") def to_x1_5(f) -> str: return f.replace("/CDFv3/", "/CDFv3-x1.5/") def to_x2(f) -> str: return f.replace("/CDFv3/", "/CDFv3-x2.0/") def to_rmbg_x1_5(f) -> str: return f.replace("/CDFv3/", "/CDFv3-rmbg-x1.5/") def to_x1_3_th0_5_all(f) -> str: return f.replace("/CDFv3/", "/CDFv3-x1.3-th0.5-all/") test = Files(FS.test + FR.test + TF.test).unique() train = test.map(to_train) my_val = test.map(to_my_val) @classmethod def get_test_dict(cls) -> dict[str, list[str]]: return { "CDFv3": cls.test, "CDFv3-FS": cls.FS.test, "CDFv3-FR": cls.FR.test, "CDFv3-TF": cls.TF.test, "CDFv3-FS-CDFv2": cls.FS.CDFv2.test, "CDFv3-FS-BlendFace": cls.FS.BlendFace.test, "CDFv3-FS-GHOST": cls.FS.GHOST.test, "CDFv3-FS-HifiFace": cls.FS.HifiFace.test, "CDFv3-FS-InSwapper": cls.FS.InSwapper.test, "CDFv3-FS-MobileFaceSwap": cls.FS.MobileFaceSwap.test, "CDFv3-FS-SimSwap": cls.FS.SimSwap.test, "CDFv3-FS-UniFace": cls.FS.UniFace.test, "CDFv3-FR-DaGAN": cls.FR.DaGAN.test, "CDFv3-FR-FSRT": cls.FR.FSRT.test, "CDFv3-FR-HyperReenact": cls.FR.HyperReenact.test, "CDFv3-FR-LIA": cls.FR.LIA.test, "CDFv3-FR-LivePortrait": cls.FR.LivePortrait.test, "CDFv3-FR-MCNET": cls.FR.MCNET.test, "CDFv3-FR-TPSMM": cls.FR.TPSMM.test, "CDFv3-TF-AniTalker": cls.TF.AniTalker.test, "CDFv3-TF-EchoMimic": cls.TF.EchoMimic.test, "CDFv3-TF-EDTalk": cls.TF.EDTalk.test, "CDFv3-TF-FLOAT": cls.TF.FLOAT.test, "CDFv3-TF-IP_LAP": cls.TF.IP_LAP.test, "CDFv3-TF-Real3DPortrait": cls.TF.Real3DPortrait.test, "CDFv3-TF-SadTalker": cls.TF.SadTalker.test, } class DFD: test = Files( "config/datasets/DFD/fake.txt", "config/datasets/DFD/real.txt", ) class DFDC: test = Files( "config/datasets/DFDC/test/fake.txt", "config/datasets/DFDC/test/real.txt", ) class FSh: """ FSh: https://github.com/maum-ai/faceshifter FF++: https://github.com/ondyari/FaceForensics """ test = Files( "config/datasets/FSh/test/fake.txt", "config/datasets/FSh/test/real.txt", ) class UADFV: """https://arxiv.org/abs/1806.02877""" test = Files( "config/datasets/UADFD/fake.txt", "config/datasets/UADFD/real.txt", ) class DFDM: """https://arxiv.org/abs/2202.12951""" test = Files( "config/datasets/DFDM/all/dfaker.txt", "config/datasets/DFDM/all/dfl.txt", "config/datasets/DFDM/all/iae.txt", "config/datasets/DFDM/all/lightweight.txt", "config/datasets/CDFv2/all/Celeb-real.txt", ) class FFIW: """https://arxiv.org/abs/2103.16076""" test = Files( "config/datasets/FFIW/test-fake.txt", "config/datasets/FFIW/test-real.txt", ) val = Files( "config/datasets/FFIW/val-fake.txt", "config/datasets/FFIW/val-real.txt", ) train = Files( "config/datasets/FFIW/train-fake.txt", "config/datasets/FFIW/train-real.txt", ) # My subsets of FFIW train_subset_1024 = Files( "config/datasets/FFIW/subsets/train-fake-subset-1024.txt", "config/datasets/FFIW/subsets/train-real-subset-1024.txt", ) # My subsets of FFIW created using scripts/datasets/FFIW/create_FFIW_subset.py train_subset_2048 = Files( "config/datasets/FFIW/subset-2048/train-fake.txt", "config/datasets/FFIW/subset-2048/train-real.txt", ) class DeepSpeak_v1_1: """https://arxiv.org/abs/2408.05366""" test = Files( "config/datasets/DeepSpeak-1.1/test/test-facefusion_gan.txt", "config/datasets/DeepSpeak-1.1/test/test-facefusion_live.txt", "config/datasets/DeepSpeak-1.1/test/test-facefusion.txt", "config/datasets/DeepSpeak-1.1/test/test-real.txt", "config/datasets/DeepSpeak-1.1/test/test-retalking.txt", "config/datasets/DeepSpeak-1.1/test/test-wav2lip.txt", ) train = test.map(lambda x: x.replace("/test/test-", "/train/train-")) # DeepSpeak-1.1 has a train folder. my-val is sampled from train my_val = test.map(lambda x: x.replace("/test/test-", "/my-val/val-")) # DeepSpeak-1.1 has a train folder. my-val is sampled from train, my-train is train \ my-val my_train = test.map(lambda x: x.replace("/test/test-", "/my-train/train-")) class DeepSpeak_v2: """https://arxiv.org/abs/2408.05366""" test = Files( "config/datasets/DeepSpeak-2.0/test/test-diff2lip.txt", "config/datasets/DeepSpeak-2.0/test/test-facefusion.txt", "config/datasets/DeepSpeak-2.0/test/test-hellomeme.txt", "config/datasets/DeepSpeak-2.0/test/test-latentsync.txt", "config/datasets/DeepSpeak-2.0/test/test-liveportrait.txt", "config/datasets/DeepSpeak-2.0/test/test-memo.txt", "config/datasets/DeepSpeak-2.0/test/test-real.txt", ) train = test.map(lambda x: x.replace("/test/test-", "/train/train-")) # DeepSpeak-2.0 has a train folder. my-val is sampled from train my_val = test.map(lambda x: x.replace("/test/test-", "/my-val/val-")) # DeepSpeak-2.0 has a train folder. my-val is sampled from train, my-train is train \ my-val my_train = test.map(lambda x: x.replace("/test/test-", "/my-train/train-")) class KoDF: """https://arxiv.org/abs/2103.10094""" test = Files( "config/datasets/KoDF/real.txt", "config/datasets/KoDF/fake-audio-driven.txt", "config/datasets/KoDF/fake-dffs.txt", "config/datasets/KoDF/fake-dfl.txt", "config/datasets/KoDF/fake-fo.txt", "config/datasets/KoDF/fake-fsgan.txt", ) adversarial = Files( "config/datasets/KoDF/fake-adv.txt", "config/datasets/KoDF/real-adv.txt", ) class FaceFusion: """Dataset created by VRG group""" class FF: train = Files( "config/datasets/FaceFusion/train/ff_inswapper_128_fp16.txt", ) class CDF: test = Files( "config/datasets/FaceFusion/test/cdf_hififace_unofficial_256.txt", "config/datasets/FaceFusion/test/cdf_inswapper_128_fp16.txt", "config/datasets/CDFv2/test/YouTube-real.txt", "config/datasets/CDFv2/test/Celeb-real.txt", ) class VRG: """Dataset created by VRG group""" class CSFD: files = Files( "config/datasets/CSFD/real.txt", ) class AVSpeech: files = Files( "config/datasets/AVSpeech/real.txt", ) class FakeAVCeleb: """https://arxiv.org/abs/2108.05080""" test = Files( "config/datasets/FakeAVCeleb/FV-FA-faceswap-wav2lip.txt", "config/datasets/FakeAVCeleb/FV-FA-fsgan-wav2lip.txt", "config/datasets/FakeAVCeleb/FV-FA-wav2lip.txt", "config/datasets/FakeAVCeleb/FV-RA-faceswap.txt", "config/datasets/FakeAVCeleb/FV-RA-fsgan.txt", "config/datasets/FakeAVCeleb/FV-RA-wav2lip.txt", "config/datasets/FakeAVCeleb/RV-RA-real.txt", ) class FV_RA_WL: test = Files( "config/datasets/FakeAVCeleb/FV-RA-wav2lip.txt", "config/datasets/FakeAVCeleb/RV-RA-real.txt", ) class FV_FA_FS: test = Files( "config/datasets/FakeAVCeleb/FV-FA-faceswap-wav2lip.txt", "config/datasets/FakeAVCeleb/RV-RA-real.txt", ) class FV_FA_GAN: test = Files( "config/datasets/FakeAVCeleb/FV-FA-fsgan-wav2lip.txt", "config/datasets/FakeAVCeleb/RV-RA-real.txt", ) class FV_FA_WL: test = Files( "config/datasets/FakeAVCeleb/FV-FA-wav2lip.txt", "config/datasets/FakeAVCeleb/RV-RA-real.txt", ) class PolyGlotFake: """https://arxiv.org/abs/2405.08838""" test = Files( "config/datasets/PolyGlotFake/real-ar.txt", "config/datasets/PolyGlotFake/real-en.txt", "config/datasets/PolyGlotFake/real-es.txt", "config/datasets/PolyGlotFake/real-fr.txt", "config/datasets/PolyGlotFake/real-ja.txt", "config/datasets/PolyGlotFake/real-ru.txt", "config/datasets/PolyGlotFake/real-zh.txt", "config/datasets/PolyGlotFake/ar2en_Wav2Lip.txt", "config/datasets/PolyGlotFake/ar2en_video_retalking.txt", "config/datasets/PolyGlotFake/ar2es_Wav2Lip.txt", "config/datasets/PolyGlotFake/ar2es_video_retalking.txt", "config/datasets/PolyGlotFake/ar2fr_Wav2Lip.txt", "config/datasets/PolyGlotFake/ar2fr_video_retalking.txt", "config/datasets/PolyGlotFake/ar2ja_Wav2Lip.txt", "config/datasets/PolyGlotFake/ar2ja_video_retalking.txt", "config/datasets/PolyGlotFake/ar2ru_Wav2Lip.txt", "config/datasets/PolyGlotFake/ar2ru_video_retalking.txt", "config/datasets/PolyGlotFake/ar2zh_Wav2Lip.txt", "config/datasets/PolyGlotFake/ar2zh_video_retalking.txt", "config/datasets/PolyGlotFake/en2ar_Wav2Lip.txt", "config/datasets/PolyGlotFake/en2ar_video_retalking.txt", "config/datasets/PolyGlotFake/en2es_Wav2Lip.txt", "config/datasets/PolyGlotFake/en2es_video_retalking.txt", "config/datasets/PolyGlotFake/en2fr_Wav2Lip.txt", "config/datasets/PolyGlotFake/en2fr_video_retalking.txt", "config/datasets/PolyGlotFake/en2ja_Wav2Lip.txt", "config/datasets/PolyGlotFake/en2ja_video_retalking.txt", "config/datasets/PolyGlotFake/en2ru_Wav2Lip.txt", "config/datasets/PolyGlotFake/en2ru_video_retalking.txt", "config/datasets/PolyGlotFake/en2zh_Wav2Lip.txt", "config/datasets/PolyGlotFake/en2zh_video_retalking.txt", "config/datasets/PolyGlotFake/es2ar_Wav2Lip.txt", "config/datasets/PolyGlotFake/es2ar_video_retalking.txt", "config/datasets/PolyGlotFake/es2en_Wav2Lip.txt", "config/datasets/PolyGlotFake/es2en_video_retalking.txt", "config/datasets/PolyGlotFake/es2fr_Wav2Lip.txt", "config/datasets/PolyGlotFake/es2fr_video_retalking.txt", "config/datasets/PolyGlotFake/es2ja_Wav2Lip.txt", "config/datasets/PolyGlotFake/es2ja_video_retalking.txt", "config/datasets/PolyGlotFake/es2ru_Wav2Lip.txt", "config/datasets/PolyGlotFake/es2ru_video_retalking.txt", "config/datasets/PolyGlotFake/es2zh_Wav2Lip.txt", "config/datasets/PolyGlotFake/es2zh_video_retalking.txt", "config/datasets/PolyGlotFake/fr2ar_Wav2Lip.txt", "config/datasets/PolyGlotFake/fr2ar_video_retalking.txt", "config/datasets/PolyGlotFake/fr2en_Wav2Lip.txt", "config/datasets/PolyGlotFake/fr2en_video_retalking.txt", "config/datasets/PolyGlotFake/fr2es_Wav2Lip.txt", "config/datasets/PolyGlotFake/fr2es_video_retalking.txt", "config/datasets/PolyGlotFake/fr2ja_Wav2Lip.txt", "config/datasets/PolyGlotFake/fr2ja_video_retalking.txt", "config/datasets/PolyGlotFake/fr2ru_Wav2Lip.txt", "config/datasets/PolyGlotFake/fr2ru_video_retalking.txt", "config/datasets/PolyGlotFake/fr2zh_Wav2Lip.txt", "config/datasets/PolyGlotFake/fr2zh_video_retalking.txt", "config/datasets/PolyGlotFake/ja2ar_Wav2Lip.txt", "config/datasets/PolyGlotFake/ja2ar_video_retalking.txt", "config/datasets/PolyGlotFake/ja2en_Wav2Lip.txt", "config/datasets/PolyGlotFake/ja2en_video_retalking.txt", "config/datasets/PolyGlotFake/ja2es_Wav2Lip.txt", "config/datasets/PolyGlotFake/ja2es_video_retalking.txt", "config/datasets/PolyGlotFake/ja2fr_Wav2Lip.txt", "config/datasets/PolyGlotFake/ja2fr_video_retalking.txt", "config/datasets/PolyGlotFake/ja2ru_Wav2Lip.txt", "config/datasets/PolyGlotFake/ja2ru_video_retalking.txt", "config/datasets/PolyGlotFake/ja2zh_Wav2Lip.txt", "config/datasets/PolyGlotFake/ja2zh_video_retalking.txt", "config/datasets/PolyGlotFake/ru2ar_Wav2Lip.txt", "config/datasets/PolyGlotFake/ru2ar_video_retalking.txt", "config/datasets/PolyGlotFake/ru2en_Wav2Lip.txt", "config/datasets/PolyGlotFake/ru2en_video_retalking.txt", "config/datasets/PolyGlotFake/ru2es_Wav2Lip.txt", "config/datasets/PolyGlotFake/ru2es_video_retalking.txt", "config/datasets/PolyGlotFake/ru2fr_Wav2Lip.txt", "config/datasets/PolyGlotFake/ru2fr_video_retalking.txt", "config/datasets/PolyGlotFake/ru2ja_Wav2Lip.txt", "config/datasets/PolyGlotFake/ru2zh_Wav2Lip.txt", "config/datasets/PolyGlotFake/ru2zh_video_retalking.txt", "config/datasets/PolyGlotFake/zh2ar_Wav2Lip.txt", "config/datasets/PolyGlotFake/zh2ar_video_retalking.txt", "config/datasets/PolyGlotFake/zh2en_Wav2Lip.txt", "config/datasets/PolyGlotFake/zh2en_video_retalking.txt", "config/datasets/PolyGlotFake/zh2es_Wav2Lip.txt", "config/datasets/PolyGlotFake/zh2es_video_retalking.txt", "config/datasets/PolyGlotFake/zh2fr_Wav2Lip.txt", "config/datasets/PolyGlotFake/zh2fr_video_retalking.txt", "config/datasets/PolyGlotFake/zh2ja_Wav2Lip.txt", "config/datasets/PolyGlotFake/zh2ru_Wav2Lip.txt", "config/datasets/PolyGlotFake/zh2ru_video_retalking.txt", ) class IDForge_v1: """https://arxiv.org/abs/2401.11764""" train = Files( "config/datasets/IDForge-v1/train/train-face_tts_infoswap.txt", "config/datasets/IDForge-v1/train/train-face_tts_roop.txt", "config/datasets/IDForge-v1/train/train-face_tts_simswap.txt", "config/datasets/IDForge-v1/train/train-real.txt", ) val = Files( "config/datasets/IDForge-v1/val/val-face_tts_infoswap.txt", "config/datasets/IDForge-v1/val/val-face_tts_roop.txt", "config/datasets/IDForge-v1/val/val-face_tts_simswap.txt", "config/datasets/IDForge-v1/val/val-real.txt", ) test = Files( "config/datasets/IDForge-v1/test/test-face_tts_infoswap.txt", "config/datasets/IDForge-v1/test/test-face_tts_roop.txt", "config/datasets/IDForge-v1/test/test-face_tts_simswap.txt", "config/datasets/IDForge-v1/test/test-real.txt", ) class DF40: """https://arxiv.org/abs/2406.13495""" class CDF: class SadTalker: test = Files( "config/datasets/DF40/test/test_cdf_sadtalker.txt", "config/datasets/CDFv2/test/YouTube-real.txt", "config/datasets/CDFv2/test/Celeb-real.txt", ) class FOMM: test = Files( "config/datasets/DF40/test/test_cdf_fomm.txt", "config/datasets/CDFv2/test/YouTube-real.txt", "config/datasets/CDFv2/test/Celeb-real.txt", ) class FaceDancer: test = Files( "config/datasets/DF40/test/test_cdf_facedancer.txt", "config/datasets/CDFv2/test/YouTube-real.txt", "config/datasets/CDFv2/test/Celeb-real.txt", ) class MobileSwap: test = Files( "config/datasets/DF40/test/test_cdf_mobileswap.txt", "config/datasets/CDFv2/test/YouTube-real.txt", "config/datasets/CDFv2/test/Celeb-real.txt", ) class SimSwap: test = Files( "config/datasets/DF40/test/test_cdf_simswap.txt", "config/datasets/CDFv2/test/YouTube-real.txt", "config/datasets/CDFv2/test/Celeb-real.txt", ) class InSwapper: test = Files( "config/datasets/DF40/test/test_cdf_inswap.txt", "config/datasets/CDFv2/test/YouTube-real.txt", "config/datasets/CDFv2/test/Celeb-real.txt", ) class Uniface: test = Files( "config/datasets/DF40/test/test_cdf_uniface.txt", "config/datasets/CDFv2/test/YouTube-real.txt", "config/datasets/CDFv2/test/Celeb-real.txt", ) class FFv2: """ FaceFusion v2 dataset created by VRG group """ class FF: train = Files( "config/datasets/FF/train/real.txt", "config/datasets/FFv2/train/FF_blendswap_256.txt", "config/datasets/FFv2/train/FF_ghost_1_256.txt", # "config/datasets/FFv2/train/FF_ghost_2_256.txt", # "config/datasets/FFv2/train/FF_ghost_3_256.txt", "config/datasets/FFv2/train/FF_hififace_unofficial_256.txt", "config/datasets/FFv2/train/FF_hyperswap_1a_256.txt", # "config/datasets/FFv2/train/FF_hyperswap_1c_256.txt", "config/datasets/FFv2/train/FF_inswapper_128_fp16.txt", # "config/datasets/FFv2/train/FF_inswapper_128.txt", "config/datasets/FFv2/train/FF_simswap_256.txt", # "config/datasets/FFv2/train/FF_simswap_unofficial_512.txt", "config/datasets/FFv2/train/FF_uniface_256.txt", ) class SS: train = Files( "config/datasets/FF/train/real.txt", "config/datasets/FFv2/train/SS_blendswap_256.txt", "config/datasets/FFv2/train/SS_ghost_1_256.txt", # "config/datasets/FFv2/train/SS_ghost_2_256.txt", # "config/datasets/FFv2/train/SS_ghost_3_256.txt", "config/datasets/FFv2/train/SS_hififace_unofficial_256.txt", "config/datasets/FFv2/train/SS_hyperswap_1a_256.txt", # "config/datasets/FFv2/train/SS_hyperswap_1c_256.txt", "config/datasets/FFv2/train/SS_inswapper_128_fp16.txt", # "config/datasets/FFv2/train/SS_inswapper_128.txt", "config/datasets/FFv2/train/SS_simswap_256.txt", # "config/datasets/FFv2/train/SS_simswap_unofficial_512.txt", "config/datasets/FFv2/train/SS_uniface_256.txt", ) if __name__ == "__main__": import pandas as pd def get_video(file_path: str) -> str: return file_path.split("/")[-2] val_files = [ # *CDFv3.test.map(CDFv3.to_train).map(CDFv3.to_x1_5), # *FF.train.map(FF.to_x1_5), # *FF.train.map(FF.to_rmbg_x1_5), # *CDFv3.train.map(CDFv3.to_x1_3_th0_5_all), # *DeepSpeak_v1_1.train # *DeepSpeak_v2.train.cat(DeepSpeak_v1_1.train) *FF.train.map(lambda x: x.replace("/FF/", "/FF-x1.3-th0.5-all/subset/1st-frame/")), *DeepSpeak_v1_1.train.map(lambda x: x.replace("/DeepSpeak-1.1/", "/DeepSpeak-1.1/subset/1st-frame/")), *DeepSpeak_v2.train.map(lambda x: x.replace("/DeepSpeak-2.0/", "/DeepSpeak-2.0/subset/1st-frame/")), *FFIW.train.map(lambda x: x.replace("/FFIW/", "/FFIW/subset/1st-frame/")), ] total_videos = 0 for file in val_files: # read with pandas df = pd.read_csv(file, names=["files"]) df["video"] = df["files"].apply(lambda x: get_video(x)) # unique values unique_videos = df["video"].unique() print(f"Unique videos in {file} : {len(unique_videos)}") total_videos += len(unique_videos) print(f"Total unique videos: {total_videos}")