{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":87323,"databundleVersionId":9934427,"sourceType":"competition"}],"dockerImageVersionId":30823,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# 1. Install and import libraries","metadata":{}},{"cell_type":"code","source":"!pip install autogluon\n\nimport pandas as pd\nimport numpy as np\nimport cv2\nfrom PIL import Image, ImageStat\nimport autogluon.multimodal as agmm\nimport os\n\nos.environ[\"CUDA_VISIBLE_DEVICES\"] = \"0\"","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-11T10:21:48.057554Z","iopub.status.idle":"2025-01-11T10:21:48.057803Z","shell.execute_reply":"2025-01-11T10:21:48.057702Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 2. Loading DataFrames","metadata":{}},{"cell_type":"code","source":"# Paths to csv\ntrain = pd.read_csv('/kaggle/input/cidaut-ai-fake-scene-classification-2024/train.csv')\ntest = pd.read_csv('/kaggle/input/cidaut-ai-fake-scene-classification-2024/sample_submission.csv')\n\n# Paths to images\ntrain_path = '/kaggle/input/cidaut-ai-fake-scene-classification-2024/Train/'\ntest_path = '/kaggle/input/cidaut-ai-fake-scene-classification-2024/Test/'\n\n# Update paths in DataFrames\ntrain['image'] = train['image'].apply(lambda x: os.path.join(train_path, x))\ntest['image'] = test['image'].apply(lambda x: os.path.join(test_path, x))\n\n# Binary encode the labels\ncls_to_idx = {'editada': 0, 'real': 1}\ntrain['label'] = train['label'].map(cls_to_idx)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-11T10:21:48.058810Z","iopub.status.idle":"2025-01-11T10:21:48.059130Z","shell.execute_reply":"2025-01-11T10:21:48.058999Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 3. Define Feature Functions","metadata":{}},{"cell_type":"code","source":"# Blurriness feature using Laplacian variance\ndef blurriness(im_file):\n    im = cv2.imread(im_file, cv2.IMREAD_GRAYSCALE)\n    return cv2.Laplacian(im, cv2.CV_64F).var()\n\n# Noise levels feature using standard deviation of residuals\ndef noise_level(im_file):\n    \"\"\"Calculate noise level as the standard deviation of residuals.\"\"\"\n    im = cv2.imread(im_file, cv2.IMREAD_GRAYSCALE)\n    blurred = cv2.GaussianBlur(im, (5, 5), 0)\n    residual = im - blurred\n    return np.std(residual)\n\n# Brightness feature using cv2\ndef brightness(im_file):\n    im = cv2.imread(im_file, cv2.IMREAD_GRAYSCALE)\n    return np.mean(im)\n\n# Entropy feature using cv2\ndef entropy(im_file):\n    im = cv2.imread(im_file, cv2.IMREAD_GRAYSCALE)\n    histogram = cv2.calcHist([im], [0], None, [256], [0, 256]).flatten()\n    hist_sum = np.sum(histogram)\n    histogram = histogram / hist_sum  # Normalize histogram\n    histogram = histogram[histogram > 0]  # Avoid log(0)\n    return -np.sum(histogram * np.log2(histogram))\n\n# Feature extraction\ndef extract_features(df):\n    blurs, noises, brightnesses, entropies = [], [], [], []\n    for path in df['image']:\n        blurs.append(blurriness(path))\n        noises.append(noise_level(path))\n        brightnesses.append(brightness(path))\n        entropies.append(entropy(path))\n    return blurs, noises, brightnesses, entropies","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-11T10:21:48.060062Z","iopub.status.idle":"2025-01-11T10:21:48.060393Z","shell.execute_reply":"2025-01-11T10:21:48.060241Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 4. Extract Features","metadata":{}},{"cell_type":"code","source":"train['blurriness'], train['noise_level'], train['brightness'], train['entropy'] = extract_features(train)\ntest['blurriness'], test['noise_level'], test['brightness'], test['entropy'] = extract_features(test)\n\n# Normalize features\nfrom sklearn.preprocessing import MinMaxScaler\nscaler = MinMaxScaler()\nfeature_cols = ['blurriness', 'noise_level', 'brightness', 'entropy']\ntrain[feature_cols] = scaler.fit_transform(train[feature_cols])\ntest[feature_cols] = scaler.transform(test[feature_cols])\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-11T10:21:48.061102Z","iopub.status.idle":"2025-01-11T10:21:48.061441Z","shell.execute_reply":"2025-01-11T10:21:48.061319Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 5. Model training","metadata":{}},{"cell_type":"code","source":"# AutoGluon Model\npredictor = agmm.MultiModalPredictor(\n    label='label',\n    eval_metric='roc_auc',\n    problem_type='binary',\n    presets='best_quality'  # Optimized settings for high-quality results\n)\n\n# Train the model\npredictor.fit(\n    train_data=train\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-11T10:32:12.832953Z","iopub.execute_input":"2025-01-11T10:32:12.833334Z","iopub.status.idle":"2025-01-11T10:38:18.372017Z","shell.execute_reply.started":"2025-01-11T10:32:12.833299Z","shell.execute_reply":"2025-01-11T10:38:18.370708Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 6. Generate Predictions","metadata":{}},{"cell_type":"code","source":"preds = predictor.predict(test.drop(columns='label'), as_pandas=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-11T10:38:23.439128Z","iopub.execute_input":"2025-01-11T10:38:23.439453Z","iopub.status.idle":"2025-01-11T10:38:30.223898Z","shell.execute_reply.started":"2025-01-11T10:38:23.439428Z","shell.execute_reply":"2025-01-11T10:38:30.223050Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 7. Prepare Submission","metadata":{}},{"cell_type":"code","source":"sub = pd.read_csv('/kaggle/input/cidaut-ai-fake-scene-classification-2024/sample_submission.csv')\n\nsub['label'] = preds\nsub.to_csv('submission.csv', index=False)\nprint(sub.head())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-11T10:38:54.243317Z","iopub.execute_input":"2025-01-11T10:38:54.243802Z","iopub.status.idle":"2025-01-11T10:38:54.258532Z","shell.execute_reply.started":"2025-01-11T10:38:54.243756Z","shell.execute_reply":"2025-01-11T10:38:54.257576Z"}},"outputs":[],"execution_count":null}]}