{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import json\nimport os\nimport cv2\n\nimport matplotlib.pyplot as plt\n%matplotlib inline","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"metadata_file = \"/kaggle/input/deepfake-detection-challenge/train_sample_videos/metadata.json\"\ninput_path = \"/kaggle/input/deepfake-detection-challenge/train_sample_videos/\"\nframe_save_path = \"/kaggle/input/frames/\"\n\nSTRIDE = 1.0\nMAX_IMAGE_SIZE = 1024","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def get_frames_from_video(video_file, stride=1.0):\n    \"\"\"\n    video_file - path to file\n    stride - i.e 1.0 - extract frame every second, 0.5 - extract every 0.5 seconds\n    return: list of images, list of frame times in seconds\n    \"\"\"\n    video = cv2.VideoCapture(video_file)\n    fps = video.get(cv2.CAP_PROP_FPS)\n    i = 0.\n    images = []\n    frame_times = []\n\n    while video.isOpened():\n        ret, frame = video.read()\n        if ret:\n            images.append(frame)\n            frame_times.append(i)\n            i += stride\n            video.set(1, round(i * fps))\n        else:\n            video.release()\n            break\n    return images, frame_times\n\n\ndef resize_if_necessary(image, max_size=1024):\n    \"\"\"\n    if any spatial shape of image is greater \n    than max_size, resize image such that max. spatial shape = max_size,\n    otherwise return original image\n    \"\"\"\n    if max_size is None:\n        return image\n    height, width = image.shape[:2]\n    if max([height, width]) > max_size:\n        ratio = float(max_size / max([height, width]))\n        image = cv2.resize(image, (0, 0), fx=ratio, fy=ratio, interpolation=cv2.INTER_CUBIC)\n    return image","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"with open(metadata_file) as json_file:\n    metadata = json.load(json_file)\n\nkey = list(metadata.keys())[0]\nsample_video = os.path.join(input_path, key)\n\nimages, frame_times = get_frames_from_video(sample_video, STRIDE)\nimages = [resize_if_necessary(image, MAX_IMAGE_SIZE) for image in images]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.figure(figsize=(20,10))\ncolumns = 5\nfor i, (image, frame_time) in enumerate(zip(images, frame_times)):\n    plt.subplot(len(images) / columns + 1, columns, i + 1).set_title(\"Frame time: \" + str(frame_time))\n    plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def process_video(input_path, save_path, key, stride, max_image_size):\n    video_file = os.path.join(input_path, key)\n    images, frame_times = get_frames_from_video(video_file, stride)\n    images = [resize_if_necessary(image, max_image_size) for image in images]\n    file_name, _ = key.split(\".\")\n    if not os.path.isdir(os.path.join(save_path, file_name)):\n        os.makedirs(os.path.join(save_path, file_name))\n    for image, frame_time in zip(images, frame_times):\n        image_name = str(round(frame_time, 3)).replace(\".\", \"_\")\n        cv2.imwrite(os.path.join(save_path, file_name, \"{}.jpg\".format(image_name)), image)    ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"process_video(input_path, frame_save_path, key, STRIDE, MAX_IMAGE_SIZE)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def get_folder_size(path):\n    total_size = 0\n    for dirpath, dirnames, filenames in os.walk(path):\n        for f in filenames:\n            fp = os.path.join(dirpath, f)\n            # skip if it is symbolic link\n            if not os.path.islink(fp):\n                total_size += os.path.getsize(fp)\n    return total_size","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"process_video(input_path, frame_save_path, key, STRIDE, MAX_IMAGE_SIZE)\n\nvideo_size = os.path.getsize(sample_video)\n\nimages_folder = os.path.join(frame_save_path, key.split(\".\")[0])\ntotal_images_size = get_folder_size(images_folder)\n\nprint(\"Video file size: {}\".format(video_size))\nprint(\"Total images size: {}\".format(total_images_size))\nprint(\"Ratio: {:.4f}\".format(video_size / total_images_size))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# process all video files\n# for key in metadata.keys():\n#     process_video(input_path, frame_save_path, key, STRIDE, MAX_IMAGE_SIZE)\n\n# process all video files in parallel\n# from multiprocessing import cpu_count\n# from joblib import Parallel, delayed\n# Parallel(n_jobs=cpu_count())(delayed(process_video)(input_path, frame_save_path, key, STRIDE, MAX_IMAGE_SIZE) for key in metadata.keys())","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat":4,"nbformat_minor":1}