{"cells":[{"metadata":{},"cell_type":"markdown","source":"This code is a adjustament of [this work.](https://www.kaggle.com/neiromantik/dfdc-dlib-based-fake-prediction-pipeline-using-cnn)\nPlease consider giving your positive vote if this notebook is useful."},{"metadata":{"trusted":true},"cell_type":"code","source":"!pip install /kaggle/input/dfdcdataset/dlib-19.19.0-cp36-cp36m-linux_x86_64.whl","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","trusted":true},"cell_type":"code","source":"import cv2\nimport dlib\nimport glob\nimport json\nimport math\nimport pandas as pd\nimport os\nimport random\nimport statistics\nimport tqdm.notebook as tqdm\n\nfrom IPython import display\nfrom timeit import default_timer as timer\nfrom datetime import timedelta\n\nDATA_PREFIX = '/kaggle/input'\nSKIP_FRAMES = 75\n#DATA_PREFIX = '/work/dfdc-kaggle/input'\n\ndetector = dlib.cnn_face_detection_model_v1(os.path.join(DATA_PREFIX, 'dfdcdataset', 'mmod_human_face_detector.dat'))\nsp = dlib.shape_predictor(os.path.join(DATA_PREFIX, 'dfdcdataset', 'shape_predictor_5_face_landmarks.dat'))\npredictor = dlib.deep_fake_detection_model_v1(os.path.join(DATA_PREFIX, 'dfdcdataset', 'deepfake_detector.dnn'))\n\n\ndef align_face(frame, detection_sp):\n    x_center = int((detection_sp.part(0).x + detection_sp.part(2).x + detection_sp.part(4).x) / 3)\n    y_center = int((detection_sp.part(4).y + detection_sp.part(0).y + detection_sp.part(2).y) / 3)\n\n    w = 2 * abs(detection_sp.part(0).x - detection_sp.part(2).x)\n    h = w\n\n    shape = frame.shape\n    face_crop = frame[\n        max(int(y_center - h), 0):min(int(y_center + h), shape[0]),\n        max(int(x_center - w), 0):min(int(x_center + w), shape[1])\n    ]\n    return cv2.resize(face_crop, (150,150))\n\n\ndef align_face_dlib(frame, detection_sp):\n    detections = dlib.full_object_detections()\n    detections.append(detection_sp)\n    return dlib.get_face_chips(frame, detections, size=150)[0]\n\n\ndef predict_fake(face):\n    \"\"\"Analyze face and return probability of FAKE i.e. 0 for REAL and 1 for FAKE\"\"\"\n    return predictor.predict(face)[0]\n\n\ndef process_frame(frame):\n    labels = []\n    \n    dets = detector(frame, 1)\n    batch_faces = dlib.full_object_detections()\n    for k,d in enumerate(dets):\n        face = align_face_dlib(frame, sp(frame, d.rect))\n        labels.append(predict_fake(face))\n    \n    return labels\n\n\ndef process_video(video_filename):\n    \"\"\"Process video and return probability of being FAKE, i.e. extremes are 0 for REAL and 1 for FAKE\n    \"\"\"\n    frame_labels = []\n    frames = []\n\n    cap = cv2.VideoCapture(video_filename)\n    frame_count = 0\n    while cap.isOpened():\n        ret = cap.grab()\n        frame_count += 1\n        if not ret:\n            break\n\n        if frame_count % SKIP_FRAMES:\n            continue\n\n        _, frame = cap.retrieve()\n        frame_labels.extend(process_frame(frame))\n    \n    cap.release()\n    fakeness = statistics.mean(frame_labels)\n    # rescale values from 0...1 to 0.1...0.9 to avoid LogLoss penalties near extrems\n    fakeness = 0.3 + (fakeness * 0.4)\n    return fakeness\n\n\ndef single_log_loss(prediction, groundtruth):\n    return groundtruth * math.log(prediction) + (1-groundtruth) * math.log(1-prediction)\n\ndef estimate_loss(predictions, all_correct=True):\n    result = 0\n    for p in predictions:\n        if all_correct:\n            result += single_log_loss(p, 1 if p > 0.5 else 0)\n        else:\n            result += single_log_loss(p, 0 if p > 0.5 else 1)\n    return -result/len(predictions)\n\n\npredictions = []\nfilenames = glob.glob(os.path.join(DATA_PREFIX, 'deepfake-detection-challenge/test_videos/*.mp4'))\nsub = pd.read_csv(os.path.join(DATA_PREFIX, 'deepfake-detection-challenge/sample_submission.csv'))\nsub = sub.set_index('filename', drop=False)\n\nprint('Initialize submission')\nfor filename in tqdm.tqdm(filenames):\n    fn = filename.split('/')[-1]\n    sub.loc[fn, 'label'] = 0.5\n\n\nprint('CUDA usage: {}'.format(dlib.DLIB_USE_CUDA))\nfor filename in tqdm.tqdm(filenames):\n    fn = filename.split('/')[-1]\n    sub.loc[fn, 'label'] = 0.5\n\n    try:\n        start = timer()\n        prediction = process_video(filename)\n        sub.loc[fn, 'label'] = prediction\n        sub.to_csv('submission.csv', index=False)\n        predictions.append(prediction)\n        print('Processed video {}, label={}, time={}'.format(filename, prediction, timedelta(seconds=timer()-start)))\n        print('Possible lost: best={}, worse={}'.format(estimate_loss(predictions), estimate_loss(predictions, False)))\n    except Exception as error:\n        print('Failed to process {}'.format(filename))\n    \nsub.to_csv('submission.csv', index=False)","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.6.6"},"widgets":{"application/vnd.jupyter.widget-state+json":{"state":{"07055fda1ee34c5596acd433785955d3":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"IntProgressModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"IntProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"100%","description_tooltip":null,"layout":"IPY_MODEL_0e0b2dba845b466595052f14edadbc99","max":400,"min":0,"orientation":"horizontal","style":"IPY_MODEL_de35932563d8498aa661f12a5e5120b2","value":400}},"0e0b2dba845b466595052f14edadbc99":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"33a56005fc164787a75266ec428f6ac6":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_b2000f2eeac740ea980a480a1962dcdb","placeholder":"​","style":"IPY_MODEL_fb229b0eeea741e1a53e51374a83faca","value":" 400/400 [24:28&lt;00:00,  3.67s/it]"}},"3cd04dceaab94e889e1b9fb58c80a41c":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HBoxModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_d134af9b6f16474aa9918fa007997a4f","IPY_MODEL_33a56005fc164787a75266ec428f6ac6"],"layout":"IPY_MODEL_e99768b5476a426fb1fe0017c15b67c9"}},"4b7eed115a5647fa9a93941d48ac750e":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"75937b039ff94ca6bf3403bfc34caaef":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_dde5ff19d3d74c1a8bbd0b66eccde520","placeholder":"​","style":"IPY_MODEL_4b7eed115a5647fa9a93941d48ac750e","value":" 400/400 [00:07&lt;00:00, 51.16it/s]"}},"77ab44b538c94ea3bcecde02d27630cb":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HBoxModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_07055fda1ee34c5596acd433785955d3","IPY_MODEL_75937b039ff94ca6bf3403bfc34caaef"],"layout":"IPY_MODEL_eb388b46eedf4e01a0659a1bece9a975"}},"90fda97108734d448f6f1c2eab8822ca":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"ProgressStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":"initial"}},"b2000f2eeac740ea980a480a1962dcdb":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"d134af9b6f16474aa9918fa007997a4f":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"IntProgressModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"IntProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"100%","description_tooltip":null,"layout":"IPY_MODEL_f6b17bbf02db4ff28af7320ca27d263a","max":400,"min":0,"orientation":"horizontal","style":"IPY_MODEL_90fda97108734d448f6f1c2eab8822ca","value":400}},"dde5ff19d3d74c1a8bbd0b66eccde520":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"de35932563d8498aa661f12a5e5120b2":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"ProgressStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":"initial"}},"e99768b5476a426fb1fe0017c15b67c9":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"eb388b46eedf4e01a0659a1bece9a975":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"f6b17bbf02db4ff28af7320ca27d263a":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"fb229b0eeea741e1a53e51374a83faca":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}}},"version_major":2,"version_minor":0}}},"nbformat":4,"nbformat_minor":1}