{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"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"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceType":"competition","sourceId":25563,"databundleVersionId":2094376},{"sourceType":"datasetVersion","sourceId":15698027,"datasetId":10055586,"databundleVersionId":16637008}],"dockerImageVersionId":31329,"isInternetEnabled":false,"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 numpy as np\nimport pandas as pd\nimport tensorflow as tf\nfrom sklearn.preprocessing import MultiLabelBinarizer\nfrom sklearn.model_selection import train_test_split\n\nBASE_DIR = \"/kaggle/input/competitions/plant-pathology-2021-fgvc8\"\nTRAIN_DIR = os.path.join(BASE_DIR, \"train_images\")\nTEST_DIR = os.path.join(BASE_DIR, \"test_images\")\n\nWEIGHTS_PATH = \"/kaggle/input/datasets/tanhaowu/efficientnetv2b0/efficientnetv2-b0_notop.h5\"\n\ntrain_df = pd.read_csv(os.path.join(BASE_DIR, \"train.csv\"))\nsample_df = pd.read_csv(os.path.join(BASE_DIR, \"sample_submission.csv\"))\n\n\nALL_LABELS = ['complex','frog_eye_leaf_spot','healthy','powdery_mildew','rust','scab']\ntrain_df['label_list'] = train_df['labels'].str.split()\nmlb = MultiLabelBinarizer(classes=ALL_LABELS)\ny_all = mlb.fit_transform(train_df['label_list']).astype(np.float32)\n\nIMG_SIZE = 224\nBATCH_SIZE = 32\nAUTOTUNE = tf.data.AUTOTUNE\n\nX_train, X_val, y_train, y_val = train_test_split(train_df['image'], y_all, test_size=0.2, random_state=42)\n\ndef load_image(path, label):\n    img = tf.io.read_file(tf.strings.join([TRAIN_DIR, \"/\", path]))\n    img = tf.image.decode_jpeg(img, 3)\n    img = tf.image.resize(img, (IMG_SIZE, IMG_SIZE)) / 255.0\n    return img, label\n\ndef load_test_image(path):\n    img = tf.io.read_file(tf.strings.join([TEST_DIR, \"/\", path]))\n    img = tf.image.decode_jpeg(img, 3)\n    img = tf.image.resize(img, (IMG_SIZE, IMG_SIZE)) / 255.0\n    return img\n\ntrain_ds = tf.data.Dataset.from_tensor_slices((X_train, y_train)).shuffle(1000).map(load_image).batch(BATCH_SIZE).prefetch(AUTOTUNE)\nval_ds = tf.data.Dataset.from_tensor_slices((X_val, y_val)).map(load_image).batch(BATCH_SIZE).prefetch(AUTOTUNE)\ntest_ds = tf.data.Dataset.from_tensor_slices(sample_df['image']).map(load_test_image).batch(BATCH_SIZE).prefetch(AUTOTUNE)\n\nbase_model = tf.keras.applications.EfficientNetV2B0(include_top=False, weights=None)\nbase_model.build((None, IMG_SIZE, IMG_SIZE, 3))\n\nbase_model.load_weights(WEIGHTS_PATH)\nbase_model.trainable = False\n\nmodel = tf.keras.Sequential([\n    tf.keras.Input(shape=(IMG_SIZE, IMG_SIZE, 3)),\n    base_model,\n    tf.keras.layers.GlobalAveragePooling2D(),\n    tf.keras.layers.Dropout(0.4),\n    tf.keras.layers.Dense(6, activation='sigmoid')\n])\n\nmodel.compile(optimizer=\"adam\", loss=\"binary_crossentropy\")\nmodel.fit(train_ds, validation_data=val_ds, epochs=3)\n\npreds = model.predict(test_ds)\nTH = 0.5\n\ndef to_label(row):\n    out = [ALL_LABELS[i] for i,p in enumerate(row) if p >= TH]\n    return \" \".join(out) if out else ALL_LABELS[np.argmax(row)]\n\nsubmission = pd.DataFrame({\n    \"image\": sample_df[\"image\"],\n    \"labels\": [to_label(p) for p in preds]\n})\nsubmission.to_csv(\"/kaggle/working/submission.csv\", index=False)\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2026-04-12T19:50:46.284940Z","iopub.execute_input":"2026-04-12T19:50:46.285731Z","iopub.status.idle":"2026-04-12T20:06:03.808050Z","shell.execute_reply.started":"2026-04-12T19:50:46.285700Z","shell.execute_reply":"2026-04-12T20:06:03.807489Z"}},"outputs":[],"execution_count":null}]}