{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.6.6","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":16880,"databundleVersionId":858837,"sourceType":"competition"}],"dockerImageVersionId":29845,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-11-08T06:36:59.635270Z","iopub.execute_input":"2024-11-08T06:36:59.635539Z","iopub.status.idle":"2024-11-08T06:37:00.412258Z","shell.execute_reply.started":"2024-11-08T06:36:59.635499Z","shell.execute_reply":"2024-11-08T06:37:00.411033Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport cv2\nimport numpy as np\nimport random\nimport tensorflow as tf\nfrom tensorflow.keras.applications import MobileNetV2\nfrom tensorflow.keras.layers import Dense, Dropout, GlobalAveragePooling2D\nfrom tensorflow.keras.models import Model\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\n\ndata_path = '/kaggle/input/deepfake-detection-challenge'\ncache_path = '/kaggle/working/cached_frames'\n\nface_detector = cv2.CascadeClassifier(cv2.data.haarcascades + \"haarcascade_frontalface_default.xml\")\n\ndef extract_face_from_frame(frame, face_detector):\n    gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)\n    faces = face_detector.detectMultiScale(gray_frame, scaleFactor=1.1, minNeighbors=4)\n    if len(faces) > 0:\n        x, y, w, h = faces[0]\n        return frame[y:y+h, x:x+w]\n    return None\n\ndef build_transfer_model():\n    base_model = MobileNetV2(input_shape=(112, 112, 3), include_top=False, weights='imagenet')\n    x = base_model.output\n    x = GlobalAveragePooling2D()(x)\n    x = Dense(64, activation='relu')(x) \n    x = Dropout(0.5)(x)\n    predictions = Dense(1, activation='sigmoid')(x)\n    model = Model(inputs=base_model.input, outputs=predictions)\n\n    for layer in base_model.layers:\n        layer.trainable = False\n\n    model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])\n    return model\n\ndef create_generators(cache_path, batch_size=16):\n    datagen = ImageDataGenerator(rescale=1./255, validation_split=0.2)\n\n    train_generator = datagen.flow_from_directory(\n        directory=cache_path,\n        target_size=(112, 112),\n        batch_size=batch_size,\n        class_mode='binary',\n        subset='training'\n    )\n\n    validation_generator = datagen.flow_from_directory(\n        directory=cache_path,\n        target_size=(112, 112),\n        batch_size=batch_size,\n        class_mode='binary',\n        subset='validation'\n    )\n    \n    return train_generator, validation_generator\n\nmodel = build_transfer_model()\n\ndef predict_deepfake(video_path, model, face_detector):\n    video = cv2.VideoCapture(video_path)\n    predictions = []\n\n    while True:\n        ret, frame = video.read()\n        if not ret:\n            break\n        \n        face = extract_face_from_frame(frame, face_detector)\n        if face is not None:\n            face = cv2.resize(face, (112, 112)) \n            face = np.expand_dims(face, axis=0) / 255.0 \n            \n            pred = model.predict(face, verbose=0) \n            predictions.append(pred[0][0])  \n\n    video.release()\n\n    if predictions:\n        avg_prediction = np.mean(predictions)\n        return 'Fake' if avg_prediction > 0.5 else 'Real'\n    else:\n        return \"No Face Detected\"\n\nvideo_path = '/kaggle/input/deepfake-detection-challenge/train_sample_videos/aelfnikyqj.mp4'\nresult = predict_deepfake(video_path, model, face_detector)\nprint(\"Prediction:\", result)\n","metadata":{"execution":{"iopub.status.busy":"2024-11-08T07:32:22.465422Z","iopub.execute_input":"2024-11-08T07:32:22.465777Z","iopub.status.idle":"2024-11-08T07:37:45.697311Z","shell.execute_reply.started":"2024-11-08T07:32:22.465717Z","shell.execute_reply":"2024-11-08T07:37:45.696297Z"},"trusted":true},"execution_count":null,"outputs":[]}]}