{"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":"nvidiaTeslaT4","dataSources":[{"sourceId":87323,"databundleVersionId":9934427,"sourceType":"competition"},{"sourceId":10312087,"sourceType":"datasetVersion","datasetId":6383739},{"sourceId":215619891,"sourceType":"kernelVersion"}],"dockerImageVersionId":30823,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":":# Christmas-Metafeatures-Pseudolabels-Blending Update 🎄🎁🎅\n\n1. I based my notebook by improvement of this wonderful public kernel: https://www.kaggle.com/code/xbar19/predicting-fake-images-using-their-brightness\n\n   \n2. I added new features such as\n   *  Mean FFT value (Fast Fourier Transform): Fake images may have artifacts in the frequency domain.\n\n   \nwhich was selected from other images' metafeatures by Catboost feature_importance.\n\n3. Then I improved score by using pseudolabels trick (I trained model on features, which was predicted on test data, which were added to train dataset)\n4. And finally I blended result with output of other great notebooks: https://www.kaggle.com/code/ucas0v0zhuoqunli/cidaut-fake-scenes-starter-kit/notebook\n   \n#### And Merry Christmas to you, Kagglers, and a Happy New Year!   ","metadata":{}},{"cell_type":"code","source":"%%capture\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-01-08T10:44:33.803348Z","iopub.execute_input":"2025-01-08T10:44:33.803672Z","iopub.status.idle":"2025-01-08T10:44:35.751824Z","shell.execute_reply.started":"2025-01-08T10:44:33.803638Z","shell.execute_reply":"2025-01-08T10:44:35.751180Z"},"_kg_hide-input":true,"_kg_hide-output":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"<h1 align='center'>1. Install AutoGluon</h1>","metadata":{}},{"cell_type":"code","source":"%%capture\n\n!pip install autogluon","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-08T10:44:35.752532Z","iopub.execute_input":"2025-01-08T10:44:35.752757Z","iopub.status.idle":"2025-01-08T10:45:21.229551Z","shell.execute_reply.started":"2025-01-08T10:44:35.752739Z","shell.execute_reply":"2025-01-08T10:45:21.228662Z"},"_kg_hide-output":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"<h1 align=\"center\">2. Importing libraries</h1>","metadata":{}},{"cell_type":"code","source":"import autogluon.multimodal as agmm\nfrom PIL import Image, ImageStat\nimport os\nimport cv2\nimport numpy as np\nimport pandas as pd\nfrom joblib import Parallel, delayed\nfrom tqdm import tqdm\nimport os\nimport torch.multiprocessing as mp\nimport autogluon.multimodal as agmm\nfrom skimage.feature import local_binary_pattern, hog\nfrom scipy.fftpack import fft2","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-08T10:45:21.230416Z","iopub.execute_input":"2025-01-08T10:45:21.230622Z","iopub.status.idle":"2025-01-08T10:45:44.927928Z","shell.execute_reply.started":"2025-01-08T10:45:21.230604Z","shell.execute_reply":"2025-01-08T10:45:44.927149Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"<h1 align='center'>3. Loading dataframes</h1>","metadata":{}},{"cell_type":"code","source":"train = 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\ntrain_path = '/kaggle/input/cidaut-ai-fake-scene-classification-2024/Train/'\ntest_path = '/kaggle/input/cidaut-ai-fake-scene-classification-2024/Test/'","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-08T10:45:44.929641Z","iopub.execute_input":"2025-01-08T10:45:44.930181Z","iopub.status.idle":"2025-01-08T10:45:44.951309Z","shell.execute_reply.started":"2025-01-08T10:45:44.930158Z","shell.execute_reply":"2025-01-08T10:45:44.950735Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"<h1 align='center'>4. Formatting dataframes</h1>","metadata":{}},{"cell_type":"code","source":"# label binary encoding\ncls_to_idx = {'editada': 0, 'real': 1}\n\ntrain['label'] = [cls_to_idx[x] for x in train['label'].values]\n\ntrain['label'].head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-08T10:45:44.952604Z","iopub.execute_input":"2025-01-08T10:45:44.952895Z","iopub.status.idle":"2025-01-08T10:45:44.965296Z","shell.execute_reply.started":"2025-01-08T10:45:44.952847Z","shell.execute_reply":"2025-01-08T10:45:44.964650Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train['image'] = train_path + train['image']\ntest['image'] = test_path + test['image']\n\ntrain['image'].iloc[0], test['image'].iloc[0]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-08T10:45:44.966094Z","iopub.execute_input":"2025-01-08T10:45:44.966344Z","iopub.status.idle":"2025-01-08T10:45:44.980882Z","shell.execute_reply.started":"2025-01-08T10:45:44.966315Z","shell.execute_reply":"2025-01-08T10:45:44.980187Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"<h1 align='center'>5. Extracting metafeatures </h1>","metadata":{}},{"cell_type":"code","source":"def brightness( im_file ):\n   im = Image.open(im_file).convert('L')\n   stat = ImageStat.Stat(im)\n   return stat.mean[0]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-08T10:45:44.981502Z","iopub.execute_input":"2025-01-08T10:45:44.981682Z","iopub.status.idle":"2025-01-08T10:45:44.993473Z","shell.execute_reply.started":"2025-01-08T10:45:44.981666Z","shell.execute_reply":"2025-01-08T10:45:44.992927Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"The function was taken from here:\n\nhttps://stackoverflow.com/questions/3490727/what-are-some-methods-to-analyze-image-brightness-using-python","metadata":{"_kg_hide-input":true}},{"cell_type":"code","source":"def get_all_brightness(df):\n    brights = []\n    for path in df['image'].values:\n        brights.append(brightness(path))\n    return brights\n\ntrain['brightness'] = get_all_brightness(train)\ntest['brightness'] = get_all_brightness(test)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-08T10:45:44.994034Z","iopub.execute_input":"2025-01-08T10:45:44.994296Z","iopub.status.idle":"2025-01-08T10:45:55.644370Z","shell.execute_reply.started":"2025-01-08T10:45:44.994277Z","shell.execute_reply":"2025-01-08T10:45:55.643411Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Other metafunctions that have been tried:![Unknown.png](attachment:ae6d7659-be1d-4210-b28d-116c8f418a99.png)","metadata":{},"attachments":{"ae6d7659-be1d-4210-b28d-116c8f418a99.png":{"image/png":"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e/duVapUSTNmzCjU+N9//71+++03bdq0SW+//bZGjx6t1q1bq3Tp0tq+fbv69Omjl156Sb/++qsk6cqVK2revLlcXV21efNmJSYmysXFRS1atNDly5clSefPn1f37t31448/atu2bQoMDFTLli11/vx5i7Hj4uLUsWNH7d+/Xy1btlSXLl105syZm9aak5OjrKwsiwUAAAAACspgMplM1i7iXtKwYUPl5uZq8+bN5rbatWurcePGatKkiaKjo5WamipfX19J0qFDh1StWjXt2LFDtWrV0uOPP67IyEi9//775v3r1aun7OxsJSUl3Xb8Hj16aOPGjfrll19kZ3ftvzk88sgjKlu2rDZt2iRJys3Nlbu7u+bMmaNOnTrpk08+0dixY5WcnCyDwSBJunz5sjw8PPTVV1/pySefzDdOXl6ePDw89Omnn6p169aSrs20jhgxQm+++aYk6cKFC3JxcdGqVavUokWLG9YbGxuruLi4fO2+gxbLzuh02/N9kKRNaGXtEgAAAIC7JisrS+7u7srMzJSbm9tN+zHTegfCwsIs1suXL6+TJ08qOTlZvr6+5sAqSVWrVpWHh4eSk5MlSSkpKapdu7bF/n9fv51q1aqZA6sklStXTqGhoeZ1e3t7eXl56eTJk5Kkffv26ejRo3J1dZWLi4tcXFzk6empS5cu6dixY5Kk33//Xb1791ZgYKDc3d3l5uam7Oxspaen3/TcnZ2d5ebmZh7nRoYNG6bMzEzzcuLEiUKdKwAAAIAHWwlrF3AvKlmypMW6wWBQXl6eVce/VU3Z2dl69NFHtXDhwnzH8vb2liR1795dp0+f1rRp0+Tn5yej0ag6deqYbx++1di3Onej0Sij0VjwkwMAAACAv2CmtQiFhIToxIkTFrOJhw4d0rlz51S1alVJUnBwsHbu3Gmx39/Xi1rNmjV15MgRlS1bVlWqVLFY3N3dJUmJiYkaMGCAWrZsqWrVqsloNOrUqVPFWhcAAAAA3A6htQg1bdpUoaGh6tKli/bs2aMdO3aoW7duatCggSIjIyVJ/fv319y5czV//nwdOXJEY8eO1f79+83PmhaHLl26qEyZMnrqqae0efNmpaamauPGjRowYID5ZU2BgYH6+OOPlZycrO3bt6tLly5ydHQstpoAAAAAoCAIrUXIYDDo66+/VunSpfXEE0+oadOmCggI0Oef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AAD8HaH1HwgPD1eTJk0UGhqq5s2b68knn9S///1vlS5d+ob9k5OTFRYWZg6AklSnTp0Cj5eSkqJatWpZtNWuXTtfv1KlSiksLMy8fuDAAeXm5iooKMiiX05Ojry8vCRJ+/bt0/79+7Vw4ULzdpPJpLy8PKWmpiokJESSLI5rMBjk4+OjkydP3rTmYcOGaciQIeb1rKws+fr6FuR0AQAAAIDQ+k/Y29tr7dq12rJli7777ju99957Gj58uLZv327VuhwdHWUwGMzr2dnZsre31+7du2Vvb2/R18XFxdznpZde0oABA/Idr1KlSua/S5YsabHNYDDc8kVPRqNRRqPxjs4DAAAAAAit/5DBYFBUVJSioqI0atQo+fn5admyZSpVqpRyc3Mt+oaEhOjjjz/WpUuXzLOt27ZtK/BYwcHBWrlypUXbzp07b7tfRESEcnNzdfLkSdWvX/+GfWrWrKlDhw6pSpUqBa4HAAAAAIobL2L6B7Zv3674+Hjt2rVL6enpWrp0qf744w+FhITI399f+/fvV0pKik6dOqUrV67o2WeflcFgUO/evXXo0CGtXLlSkydPLvB4L730kn7++We9/vrrOnz4sBYvXqyEhARJsphZ/bugoCB16dJF3bp109KlS5WamqodO3Zo/PjxWrFihaRrz6du2bJF/fr1U1JSko4cOaKvv/4634uYAAAAAOBuIrT+A25ubtq0aZNatmypoKAgjRgxQlOmTFF0dLR69+6t4OBgRUZGytvbW4mJiXJxcdE333yjAwcOKCIiQsOHD9fEiRMLPF7lypW1ZMkSLV26VGFhYZoxY4b57cG3uwV33rx56tatm1599VUFBwerbdu22rlzp/nW37CwMP3www86fPiw6tevr4iICI0aNcr84iYAAAAAsAaDyWQyWbsI3Llx48Zp5syZOnHihLVLKZCsrCy5u7vLd9Bi2RmdimWMtAmtiuW4AAAAAIrO9WyQmZkpNze3m/bjmdZ7zPTp01WrVi15eXkpMTFRb731FrfwAgAAALhvcXuwDenTp49cXFxuuPTp00eSdOTIET311FOqWrWq3nzzTb366quKjY21buEAAAAAUEy4PdiGnDx5UllZWTfc5ubmprJly97liooetwcDAAAAkAp+ezChFXdVQf9hAgAAALi/FTQbcHswAAAAAMBmEVoBAAAAADaL0AoAAAAA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"}}},{"cell_type":"code","source":"%%time\n\ndef extract_image_features(image_path):\n    # Load image\n    image = cv2.imread(image_path)\n    if image is None:\n        raise ValueError(\"Image not found or invalid path\")\n\n    # Convert to grayscale\n    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)\n    hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)\n    features = {}\n    \n    # Frequency domain analysis (FFT mean and std)\n    f_transform = np.abs(fft2(gray))\n    f_transform = np.fft.fftshift(f_transform)\n    features['fft_mean'] = np.mean(f_transform)\n    return pd.Series(features)\n\ndf_train = train['image'].apply(extract_image_features)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-08T10:45:55.645498Z","iopub.execute_input":"2025-01-08T10:45:55.645823Z","iopub.status.idle":"2025-01-08T10:46:20.664142Z","shell.execute_reply.started":"2025-01-08T10:45:55.645792Z","shell.execute_reply":"2025-01-08T10:46:20.663334Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_train.head(5)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-08T10:46:20.665149Z","iopub.execute_input":"2025-01-08T10:46:20.665458Z","iopub.status.idle":"2025-01-08T10:46:20.678522Z","shell.execute_reply.started":"2025-01-08T10:46:20.665422Z","shell.execute_reply":"2025-01-08T10:46:20.677617Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_new = pd.concat([train, df_train], axis=1)\ndf_test = test['image'].apply(extract_image_features)\n\ntrain_new = pd.concat([train, df_train], axis=1)\ntest_new = pd.concat([test, df_test], axis=1)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-08T10:46:20.679493Z","iopub.execute_input":"2025-01-08T10:46:20.679810Z","iopub.status.idle":"2025-01-08T10:46:26.975965Z","shell.execute_reply.started":"2025-01-08T10:46:20.679778Z","shell.execute_reply":"2025-01-08T10:46:26.975290Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_new.head(4)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-08T10:46:26.976671Z","iopub.execute_input":"2025-01-08T10:46:26.976922Z","iopub.status.idle":"2025-01-08T10:46:26.985483Z","shell.execute_reply.started":"2025-01-08T10:46:26.976898Z","shell.execute_reply":"2025-01-08T10:46:26.984701Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"<h1 align='center'>6. Training model</h1>","metadata":{}},{"cell_type":"markdown","source":"<h1 align='center'> 7. Predict labels/ Pseudolabels trick</h1>","metadata":{}},{"cell_type":"code","source":"os.environ[\"CUDA_VISIBLE_DEVICES\"] = \"0\"  # Укажите устройство, если нужно\n\n# Настройка многопроцессорности\nmp.set_start_method('spawn', force=True)\n\n# Создание и обучение модели\npredictor_base = agmm.MultiModalPredictor(label=\"label\", eval_metric=\"auc\")\npredictor_base.fit(train_data=train_new)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-08T10:46:26.987726Z","iopub.execute_input":"2025-01-08T10:46:26.987991Z","iopub.status.idle":"2025-01-08T10:54:08.828315Z","shell.execute_reply.started":"2025-01-08T10:46:26.987970Z","shell.execute_reply":"2025-01-08T10:54:08.827408Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_data = test_new\ntest_data[\"label\"] = predictor_base.predict(test_new)\ntest_data[\"pseudo_confidence\"] = predictor_base.predict_proba(test_new).max(axis=1)\n\nconfident_pseudo_data = test_data[test_data[\"pseudo_confidence\"] > 0.9]\n# confident_pseudo_data.shape\n\ncombined_data = pd.concat([train_new, confident_pseudo_data], ignore_index=True)\n\npredictor_refined = agmm.MultiModalPredictor(label=\"label\", eval_metric=\"auc\")\n\npredictor_refined.fit(train_data=combined_data)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-08T10:54:08.829300Z","iopub.execute_input":"2025-01-08T10:54:08.829521Z","iopub.status.idle":"2025-01-08T10:54:36.741253Z","shell.execute_reply.started":"2025-01-08T10:54:08.829501Z","shell.execute_reply":"2025-01-08T10:54:36.740447Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_mistaking = test_data[test_data[\"pseudo_confidence\"] < 0.9]\ntest_mistaking_true = test_mistaking[test_mistaking[\"pseudo_confidence\"] > 0.827]\ntest_mistaking_false = test_mistaking[test_mistaking[\"pseudo_confidence\"] < 0.827]\ntest_mistaking_false['label'] = test_mistaking_false['label'].apply(lambda x: 1 if x == 0 else 0)\ntest_mistaking_fine = pd.concat([test_mistaking_true, test_mistaking_false])\ntest_mistaking_fine","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-08T11:15:55.197647Z","iopub.execute_input":"2025-01-08T11:15:55.198005Z","iopub.status.idle":"2025-01-08T11:15:55.214411Z","shell.execute_reply.started":"2025-01-08T11:15:55.197976Z","shell.execute_reply":"2025-01-08T11:15:55.213492Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"preds = predictor_refined.predict_proba(test_new.drop(columns='label'), as_pandas=False)[:, 1]","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"<h1 align='center'> 7. Make Blending </h1>","metadata":{}},{"cell_type":"code","source":"sub1 = pd.read_csv(\"/kaggle/input/cidaut-ai-fake-scene-classification-2024/sample_submission.csv\")\nsub1['label'] = preds\nsub2 = pd.read_csv('/kaggle/input/submission2/submission (2).csv')\n\nsub1['label'] = round( (1/2) * sub1['label'] + (1/2) * sub2['label'])\n\ntest_mistaking_fine = test_mistaking_fine.set_index(test_mistaking_fine.index)\nsub1 = sub1.set_index(sub1.index)\nsub1.update(test_mistaking_fine['label'])\n\nsub1.head(10)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"<h1 align='center'>8. Save submission</h1>","metadata":{}},{"cell_type":"code","source":"sub1.to_csv('submission.csv', index=False)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"\n<span style='font-size:24pt' align='center'>🎅 UPVOTE PLEASE, I WOULD REALLY APPRECIATE THIS! ❤️</span>","metadata":{}}]}