{"metadata":{"kernelspec":{"name":"python3","display_name":"Python 3","language":"python"},"language_info":{"name":"python","version":"3.12.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"colab":{"provenance":[{"file_id":"16U1QN19QeqULHRBWRNJsUMu1AMT5jJpm","timestamp":1772874824003}],"gpuType":"T4","authorship_tag":"ABX9TyPGrA5pbLDvLf845ekKYcEF"},"accelerator":"GPU","kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceType":"competition","sourceId":127713,"databundleVersionId":15291341}],"dockerImageVersionId":31286,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nos.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' \n\nimport tensorflow as tf\nimport logging\ntf.get_logger().setLevel('ERROR')\n\nimport shutil\nfrom matplotlib import pyplot as plt\nimport numpy as np\nfrom PIL import Image\nimport pandas as pd\nimport seaborn as sns\n\nimport tensorflow as tf\nfrom sklearn.model_selection import train_test_split\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator, load_img, img_to_array\nfrom tensorflow.keras.models import Sequential, Model\nfrom tensorflow.keras.layers import InputLayer, Conv2D, MaxPooling2D, Flatten, Dense, Dropout, BatchNormalization\nfrom tensorflow.keras.callbacks import ModelCheckpoint, Callback, EarlyStopping\n\nfrom sklearn.metrics import confusion_matrix, classification_report\n\nimport warnings\nwarnings.simplefilter(action=\"ignore\", category=FutureWarning)\nwarnings.filterwarnings(\"ignore\", category=UserWarning, module=\"keras\")","metadata":{"id":"mVLWZVFqEH0c","executionInfo":{"status":"ok","timestamp":1772878153792,"user_tz":-420,"elapsed":44,"user":{"displayName":"MFJ","userId":"10403118472529632002"}},"trusted":true,"execution":{"iopub.status.busy":"2026-03-07T12:57:01.150121Z","iopub.execute_input":"2026-03-07T12:57:01.150714Z","iopub.status.idle":"2026-03-07T12:57:01.156956Z","shell.execute_reply.started":"2026-03-07T12:57:01.150686Z","shell.execute_reply":"2026-03-07T12:57:01.156197Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"base_path = \"/kaggle/input/competitions/anime-gender-classification/dataset\"\n\ntrain_data = os.path.join(base_path, \"train_images\")\ntest_data = os.path.join(base_path, \"test_images\")\nval_data = os.path.join(base_path, \"val_images\")\n\nkombine_data = \"/kaggle/working/processed_dataset\"\nos.makedirs(kombine_data, exist_ok=True)\n","metadata":{"id":"UBdb0pS4gsss","executionInfo":{"status":"ok","timestamp":1772878160153,"user_tz":-420,"elapsed":19,"user":{"displayName":"MFJ","userId":"10403118472529632002"}},"trusted":true,"execution":{"iopub.status.busy":"2026-03-07T12:57:03.672110Z","iopub.execute_input":"2026-03-07T12:57:03.672417Z","iopub.status.idle":"2026-03-07T12:57:03.676894Z","shell.execute_reply.started":"2026-03-07T12:57:03.672395Z","shell.execute_reply":"2026-03-07T12:57:03.676276Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for category in os.listdir(train_data):\n    category_dir = os.path.join(train_data, category)\n    if os.path.isdir(category_dir):\n\t      shutil.copytree(category_dir, os.path.join(kombine_data, category), dirs_exist_ok=True)\n\n\t\nfor category in os.listdir(test_data):\n    category_dir = os.path.join(test_data, category)\n    if os.path.isdir(category_dir):\n\t      shutil.copytree(category_dir, os.path.join(kombine_data, category), dirs_exist_ok=True)\n","metadata":{"id":"EvQsdYr4t61a","executionInfo":{"status":"ok","timestamp":1772878162144,"user_tz":-420,"elapsed":1059,"user":{"displayName":"MFJ","userId":"10403118472529632002"}},"trusted":true,"execution":{"iopub.status.busy":"2026-03-07T12:57:36.949695Z","iopub.execute_input":"2026-03-07T12:57:36.950464Z","iopub.status.idle":"2026-03-07T12:57:36.992750Z","shell.execute_reply.started":"2026-03-07T12:57:36.950436Z","shell.execute_reply":"2026-03-07T12:57:36.992253Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"lung_image ={}\n\ncombined_dataset_root = \"/kaggle/input/competitions/anime-gender-classification/dataset\"\n\n\nimages_directory = os.path.join(combined_dataset_root, \"train_images\")\n\n\nall_image_filenames = os.listdir(images_directory)\n\n\nm_image = [f for f in all_image_filenames if f.startswith('masculine')]\nf_image = [f for f in all_image_filenames if f.startswith('feminine')]\n\nlung_image = {\n    \"feminine\": f_image,\n    \"masculine\": m_image\n}\n\nnum_rows = len(lung_image.keys())\n\n\nfig, axs = plt.subplots(num_rows, 5, figsize=(15, 15))\n\nfor i, class_name in enumerate(lung_image.keys()):\n   \n    selected_images = np.random.choice(lung_image[class_name], min(5, len(lung_image[class_name])), replace=False)\n\n   \n    current_axs_row = axs if num_rows == 1 else axs[i]\n\n    for j, image_name in enumerate(selected_images):\n        img_path = os.path.join(images_directory, image_name)\n        img = Image.open(img_path).convert(\"L\")  \n        current_axs_row[j].imshow(img, cmap='gray')\n        current_axs_row[j].set(xlabel=class_name, xticks=[], yticks=[])\n\nfig.tight_layout()","metadata":{"id":"AE4ppfNHtGQh","executionInfo":{"status":"ok","timestamp":1772878167768,"user_tz":-420,"elapsed":5280,"user":{"displayName":"MFJ","userId":"10403118472529632002"}},"outputId":"29a2dfff-c253-40d7-b83c-496718398070","trusted":true,"execution":{"iopub.status.busy":"2026-03-07T13:01:17.931165Z","iopub.execute_input":"2026-03-07T13:01:17.931474Z","iopub.status.idle":"2026-03-07T13:01:18.951479Z","shell.execute_reply.started":"2026-03-07T13:01:17.931449Z","shell.execute_reply":"2026-03-07T13:01:18.950709Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"lung_path = \"/kaggle/input/competitions/anime-gender-classification/dataset\"\n\nfile_name = []\nlabel = []\nfull_path = []\n\nfor path,subdirs,files in os.walk(lung_path):\n  for name in files:\n    full_path.append(os.path.join(path,name))\n    label.append(path.split('/')[-1])\n    file_name.append(name)\n\ndistribusi_data = pd.DataFrame({\"path\":full_path,\"file_name\":file_name,\"label\":label})\n\nlabel = distribusi_data[\"label\"]\nplt.figure(figsize=(6,6))\nsns.set_style(\"darkgrid\")\nplot_data = sns.countplot(label)","metadata":{"id":"vdm2uV-IOPyk","executionInfo":{"status":"ok","timestamp":1772878167809,"user_tz":-420,"elapsed":17,"user":{"displayName":"MFJ","userId":"10403118472529632002"}},"outputId":"7c6d8a7b-7ebe-4ce9-9017-965ecd140497","trusted":true,"execution":{"iopub.status.busy":"2026-03-07T13:01:32.359647Z","iopub.execute_input":"2026-03-07T13:01:32.359949Z","iopub.status.idle":"2026-03-07T13:01:38.675535Z","shell.execute_reply.started":"2026-03-07T13:01:32.359924Z","shell.execute_reply":"2026-03-07T13:01:38.674812Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"distribusi_data = pd.DataFrame({\"path\":full_path,\"file_name\":file_name,\"label\":label})\ntrain_images = distribusi_data[distribusi_data['label'] == \"train_images\"]\ntrain_images.head(10)\ntrain_images.info()","metadata":{"id":"kdhGFsrBeil6","executionInfo":{"status":"ok","timestamp":1772878169132,"user_tz":-420,"elapsed":23,"user":{"displayName":"MFJ","userId":"10403118472529632002"}},"outputId":"d9b8d863-3b56-45d9-e9d8-fb66417da02d","trusted":true,"execution":{"iopub.status.busy":"2026-03-07T13:01:41.136654Z","iopub.execute_input":"2026-03-07T13:01:41.137147Z","iopub.status.idle":"2026-03-07T13:01:41.150806Z","shell.execute_reply.started":"2026-03-07T13:01:41.137120Z","shell.execute_reply":"2026-03-07T13:01:41.150108Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"image_data = []\n\ncombined_dataset_root = \"/kaggle/input/competitions/anime-gender-classification/dataset\"\nimages_directory = os.path.join(combined_dataset_root, \"train_images\")\n\nfor gender_key, filenames_list in lung_image.items():\n    for filename in filenames_list:\n        full_path = os.path.join(images_directory, filename)\n        if gender_key == \"masculine\":\n            label = \"male\"\n        elif gender_key == \"feminine\":\n            label = \"female\"\n        else:\n            label = \"unknown\"\n        image_data.append({\"path\": full_path, \"label\": label})\n\ndf = pd.DataFrame(image_data)\n\ndf[\"label\"].value_counts()\n\ntry:\n    train_val, test_df = train_test_split(df,test_size=600,random_state=42 ,stratify=df[\"label\"])\n    train_df, val_df = train_test_split(train_val,test_size=600,random_state=42,stratify= train_val[\"label\"])\n\n    print(\"\\nTrain set distribution:\")\n    print(train_df[\"label\"].value_counts())\n    print(\"\\nValidation set distribution:\")\n    print(val_df[\"label\"].value_counts())\n    print(\"\\nTest set distribution:\")\n    print(test_df[\"label\"].value_counts())\n\nexcept Exception as e:\n    print(f\"error during train_test_split\")","metadata":{"id":"zyDsp-SdG17F","executionInfo":{"status":"ok","timestamp":1772878170431,"user_tz":-420,"elapsed":48,"user":{"displayName":"MFJ","userId":"10403118472529632002"}},"outputId":"8e1b249a-8a7c-4978-ba56-67c68ccb2a2f","trusted":true,"execution":{"iopub.status.busy":"2026-03-07T13:05:00.463575Z","iopub.execute_input":"2026-03-07T13:05:00.463917Z","iopub.status.idle":"2026-03-07T13:05:00.497088Z","shell.execute_reply.started":"2026-03-07T13:05:00.463891Z","shell.execute_reply":"2026-03-07T13:05:00.496291Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"dagen = ImageDataGenerator()\n\ntrain_gen = dagen.flow_from_dataframe(\n    dataframe= train_df,\n    x_col =\"path\",\n    y_col = \"label\",\n    target_size = (128,128),\n    color_mode = \"grayscale\",\n    class_mode = \"binary\",\n    classes = [\"male\",\"female\"],\n    batch_size = 32,\n    shuffle = True\n)\n\nval_gen = dagen.flow_from_dataframe(\n    dataframe= val_df,\n    x_col =\"path\",\n    y_col = \"label\",\n    target_size = (128,128),\n    color_mode = \"grayscale\",\n    class_mode = \"binary\",\n    classes = [\"male\",\"female\"],\n    batch_size = 32,\n    shuffle = False\n)\n\ntest_gen = dagen.flow_from_dataframe(\n    dataframe= test_df,\n    x_col =\"path\",\n    y_col = \"label\",\n    target_size = (128,128),\n    color_mode = \"grayscale\",\n    class_mode = \"binary\",\n    classes = [\"male\",\"female\"],\n    batch_size = 1,\n    shuffle = False\n)","metadata":{"id":"nEa1zmNaLGCv","executionInfo":{"status":"ok","timestamp":1772878176438,"user_tz":-420,"elapsed":969,"user":{"displayName":"MFJ","userId":"10403118472529632002"}},"outputId":"300fc711-1648-44e0-bd48-690a5a0b5ea7","trusted":true,"execution":{"iopub.status.busy":"2026-03-07T13:06:08.088223Z","iopub.execute_input":"2026-03-07T13:06:08.089018Z","iopub.status.idle":"2026-03-07T13:06:16.631521Z","shell.execute_reply.started":"2026-03-07T13:06:08.088988Z","shell.execute_reply":"2026-03-07T13:06:16.630811Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model = Sequential()\n\nmodel.add(Conv2D(32, (3,3),padding=\"same\", activation=\"relu\", input_shape=(128,128,1)))\nmodel.add(BatchNormalization())\nmodel.add(MaxPooling2D(2,2))\n\nmodel.add(Conv2D(32, (4,4),padding=\"same\", activation=\"relu\"))\nmodel.add(BatchNormalization())\nmodel.add(MaxPooling2D(2,2))\n\nmodel.add(Conv2D(32, (7,7),padding=\"same\", activation=\"relu\"))\nmodel.add(BatchNormalization())\nmodel.add(MaxPooling2D(2,2))\n\nmodel.add(Flatten())\nmodel.add(Dense(128, activation=\"relu\"))\nmodel.add(Dropout(0.5))\nmodel.add(Dense(64, activation=\"relu\"))\nmodel.add(Dropout(0.5))\n\nmodel.add(Dense(1, activation=\"sigmoid\"))\n\nmodel.compile(optimizer=\"adam\", loss=\"binary_crossentropy\", metrics=[\"accuracy\"])\n\n\nprint(model.summary())","metadata":{"id":"nEa1zmNaLGCv","executionInfo":{"status":"ok","timestamp":1772878176438,"user_tz":-420,"elapsed":969,"user":{"displayName":"MFJ","userId":"10403118472529632002"}},"outputId":"300fc711-1648-44e0-bd48-690a5a0b5ea7","trusted":true,"execution":{"iopub.status.busy":"2026-03-07T13:06:28.521319Z","iopub.execute_input":"2026-03-07T13:06:28.521816Z","iopub.status.idle":"2026-03-07T13:06:28.678036Z","shell.execute_reply.started":"2026-03-07T13:06:28.521788Z","shell.execute_reply":"2026-03-07T13:06:28.677362Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"reduce_lr = tf.keras.callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.2, patience=3)\nEarly= EarlyStopping(monitor=\"val_loss\",patience=5,restore_best_weights=True)\ntrain_model = model.fit(\n    train_gen,\n    epochs=20,\n    batch_size=32,\n    validation_data=val_gen,\n    callbacks= [reduce_lr,Early]\n)","metadata":{"id":"M8fodxnvSwKZ","executionInfo":{"status":"ok","timestamp":1772878926001,"user_tz":-420,"elapsed":156024,"user":{"displayName":"MFJ","userId":"10403118472529632002"}},"outputId":"a2db9541-6311-45bd-f30b-96662aa533bf","trusted":true,"execution":{"iopub.status.busy":"2026-03-07T13:07:07.892178Z","iopub.execute_input":"2026-03-07T13:07:07.892501Z","iopub.status.idle":"2026-03-07T13:11:20.406462Z","shell.execute_reply.started":"2026-03-07T13:07:07.892474Z","shell.execute_reply":"2026-03-07T13:11:20.405865Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_gen.reset()\n\npred = model.predict(test_gen,verbose=0)\npred = pred.copy()\npred[pred <= 0.5] = 0\npred[pred > 0.5] = 1\n\n\nclass_mapping = test_gen.class_indices\n\nsorted_class_names = [k for k, v in sorted(class_mapping.items(), key=lambda item: item[1])]\nsorted_numerical_labels = [v for k, v in sorted(class_mapping.items(), key=lambda item: item[1])]\n\ncm = pd.DataFrame(data=confusion_matrix(test_gen.classes, pred, labels=sorted_numerical_labels),\n                  index=sorted_class_names,\n                  columns=sorted_class_names)\nsns.heatmap(cm,annot=True,fmt=\"d\")\n\nprint(\"\\n\")\nprint(classification_report(y_true=test_gen.classes,y_pred=pred,target_names=sorted_class_names, digits=4))\n","metadata":{"id":"j-aLkW_ypuu7","executionInfo":{"status":"ok","timestamp":1772878950360,"user_tz":-420,"elapsed":13371,"user":{"displayName":"MFJ","userId":"10403118472529632002"}},"outputId":"7085175e-cc72-45db-b966-c6508356979d","trusted":true,"execution":{"iopub.status.busy":"2026-03-07T13:11:25.451402Z","iopub.execute_input":"2026-03-07T13:11:25.452201Z","iopub.status.idle":"2026-03-07T13:11:29.344257Z","shell.execute_reply.started":"2026-03-07T13:11:25.452169Z","shell.execute_reply":"2026-03-07T13:11:29.343576Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"file_name = test_gen.filenames\n\nId = []\nfor path_str in file_name:\n  base_filename = os.path.basename(path_str)\n  Id.append(base_filename) ","metadata":{"id":"g6n3IN0YmQ_f","executionInfo":{"status":"ok","timestamp":1772877203134,"user_tz":-420,"elapsed":43,"user":{"displayName":"MFJ","userId":"10403118472529632002"}},"outputId":"0f93aae2-a8c7-4e93-a8cc-2e94126df894","trusted":true,"execution":{"iopub.status.busy":"2026-03-07T13:11:43.118573Z","iopub.execute_input":"2026-03-07T13:11:43.119197Z","iopub.status.idle":"2026-03-07T13:11:43.123359Z","shell.execute_reply.started":"2026-03-07T13:11:43.119169Z","shell.execute_reply":"2026-03-07T13:11:43.122535Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"file_name = test_gen.filenames\n\nId = []\nfor path_str in file_name:\n  base_filename = os.path.basename(path_str)\n  Id.append(base_filename)\n\n\nresult_df = pd.DataFrame({\n    \"id\":Id,\n    \"label\":pred.flatten().astype(int)\n})\n\n\nprint(result_df.head())\nresult_df.to_csv(\"prediction results(2).csv\",index=False)\n","metadata":{"id":"lZ-MppuIwslU","executionInfo":{"status":"ok","timestamp":1772877361791,"user_tz":-420,"elapsed":60,"user":{"displayName":"MFJ","userId":"10403118472529632002"}},"outputId":"cfb6353b-8d61-4afd-8668-142e127d788c","trusted":true,"execution":{"iopub.status.busy":"2026-03-07T13:12:26.295604Z","iopub.execute_input":"2026-03-07T13:12:26.296334Z","iopub.status.idle":"2026-03-07T13:12:26.305550Z","shell.execute_reply.started":"2026-03-07T13:12:26.296307Z","shell.execute_reply":"2026-03-07T13:12:26.304834Z"}},"outputs":[],"execution_count":null}]}