import glob import os import yaml import json from collections import defaultdict import tqdm import pickle from tracker.utils import iou from generate_tracks import TRACKS_FILE_NAME MIN_TRACK_LENGTH = 5 IOU_THRESHOLD = 0.5 METADATA_FILE_NAME = 'metadata.json' ALIGNED_TRACKS_FILE_NAME = 'aligned_tracks.pkl' def get_track(tracks, min_track_length): good_tracks = [track for track in tracks if len(track) >= min_track_length] if len(good_tracks) == 1: return good_tracks[0] else: return None def main(): with open('config.yaml', 'r') as f: config = yaml.load(f) video_to_meta = {} for path in glob.iglob(os.path.join(config['DFDC_DATA_PATH'], '**', METADATA_FILE_NAME), recursive=True): root = os.path.basename(os.path.dirname(path)) with open(path, 'r') as f: for video, meta in json.load(f).items(): video_to_meta[os.path.join(root, video)] = meta real_video_to_fake_videos = defaultdict(list) for video in video_to_meta: root = os.path.dirname(video) meta = video_to_meta[video] if meta['label'] == 'FAKE': original_video = os.path.join(root, meta['original']) real_video_to_fake_videos[original_video].append(video) print('Total number of real videos: {}'.format(len(real_video_to_fake_videos))) print('Total number of fake videos: {}'.format(sum([len(fake_videos) for fake_videos in real_video_to_fake_videos.items()]))) with open(os.path.join(config['ARTIFACTS_PATH'], TRACKS_FILE_NAME), 'rb') as f: video_to_tracks = pickle.load(f) real_fake_aligned_tracks = [] real_videos = sorted(real_video_to_fake_videos) for real_video in tqdm.tqdm(real_videos): if real_video not in video_to_tracks: continue real_tracks = [track for track in video_to_tracks[real_video] if len(track) >= MIN_TRACK_LENGTH] for fake_video in real_video_to_fake_videos[real_video]: if fake_video not in video_to_tracks: continue fake_tracks = [track for track in video_to_tracks[fake_video] if len(track) >= MIN_TRACK_LENGTH] for real_track in real_tracks: real_frame_idx_to_bbox = {} for real_frame_idx, real_bbox in real_track: real_frame_idx_to_bbox[real_frame_idx] = real_bbox for fake_track in fake_tracks: fake_frame_idx_to_bbox = {} ious = [] for fake_frame_idx, fake_bbox in fake_track: fake_frame_idx_to_bbox[fake_frame_idx] = fake_bbox if fake_frame_idx in real_frame_idx_to_bbox: real_bbox = real_frame_idx_to_bbox[fake_frame_idx] ious.append(iou(real_bbox, fake_bbox)) if len(ious) > 0 and min(ious) > IOU_THRESHOLD: start_frame_idx = max(min(real_frame_idx_to_bbox), min(fake_frame_idx_to_bbox)) end_frame_idx = min(max(real_frame_idx_to_bbox), max(fake_frame_idx_to_bbox)) + 1 assert start_frame_idx < end_frame_idx real_fake_aligned_track = [] for frame_idx in range(start_frame_idx, end_frame_idx): real_bbox = real_frame_idx_to_bbox[frame_idx] fake_bbox = fake_frame_idx_to_bbox[frame_idx] assert iou(real_bbox, fake_bbox) > IOU_THRESHOLD real_fake_aligned_track.append((frame_idx, real_bbox, fake_bbox)) real_fake_aligned_tracks.append((real_video, fake_video, real_fake_aligned_track)) break print('Total number of tracks: {}'.format(len(real_fake_aligned_tracks))) with open(os.path.join(config['ARTIFACTS_PATH'], ALIGNED_TRACKS_FILE_NAME), 'wb') as f: pickle.dump(real_fake_aligned_tracks, f) if __name__ == '__main__': main()