{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":13836,"databundleVersionId":1718836,"isSourceIdPinned":false,"sourceType":"competition"},{"sourceId":13814249,"sourceType":"datasetVersion","datasetId":8796559},{"sourceId":13815420,"sourceType":"datasetVersion","datasetId":8797455}],"dockerImageVersionId":31193,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import tensorflow as tf\nimport pandas as pd\nimport numpy as np\nimport os\nfrom sklearn.model_selection import StratifiedKFold\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.applications.efficientnet import EfficientNetB3, preprocess_input\nfrom tensorflow.keras.layers import Dense, GlobalAveragePooling2D\nfrom tensorflow.keras.models import Model\n\nIMAGE_SIZE = 300\nBATCH_SIZE = 32\nEPOCHS = 10\n\n# ============================\n# 1) Load CSV\n# ============================\ntrain_df = pd.read_csv(\"/kaggle/input/cassava-leaf-disease-classification/train.csv\")\ntrain_df[\"label\"] = train_df[\"label\"].astype(int)\n\n# ============================\n# 2) Stratified Split (بهتر از validation_split)\n# ============================\nskf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)\n\nfor train_idx, val_idx in skf.split(train_df[\"image_id\"], train_df[\"label\"]):\n    train_data = train_df.iloc[train_idx]\n    val_data = train_df.iloc[val_idx]\n    break  # فقط Fold اول\n\n# ============================\n# 3) Augmentation\n# ============================\ndatagen = ImageDataGenerator(\n    preprocessing_function=preprocess_input,\n    rotation_range=40,\n    width_shift_range=0.25,\n    height_shift_range=0.25,\n    zoom_range=0.3,\n    shear_range=0.2,\n    horizontal_flip=True,\n    vertical_flip=True,\n    fill_mode=\"reflect\"\n)\n\ntrain_gen = datagen.flow_from_dataframe(\n    train_data,\n    directory=\"/kaggle/input/cassava-leaf-disease-classification/train_images\",\n    x_col=\"image_id\",\n    y_col=\"label\",\n    target_size=(IMAGE_SIZE, IMAGE_SIZE),\n    batch_size=BATCH_SIZE,\n    class_mode=\"raw\"\n)\n\nval_gen = datagen.flow_from_dataframe(\n    val_data,\n    directory=\"/kaggle/input/cassava-leaf-disease-classification/train_images\",\n    x_col=\"image_id\",\n    y_col=\"label\",\n    target_size=(IMAGE_SIZE, IMAGE_SIZE),\n    batch_size=BATCH_SIZE,\n    class_mode=\"raw\"\n)\n\n# ============================\n# 4) Load EfficientNetB3 + local weights\n# ============================\nbase = EfficientNetB3(\n    include_top=False,\n    input_shape=(IMAGE_SIZE, IMAGE_SIZE, 3),\n    weights=None\n)\n\nbase.load_weights(\"/kaggle/input/efficientnetb3-notop-h5/efficientnetb3_notop.h5\")\n\nx = GlobalAveragePooling2D()(base.output)\nout = Dense(5, activation=\"softmax\")(x)\n\nmodel = Model(inputs=base.input, outputs=out)\n\nmodel.compile(\n    optimizer=tf.keras.optimizers.Adam(1e-4),\n    loss=\"sparse_categorical_crossentropy\",\n    metrics=[\"accuracy\"]\n)\n\n# ============================\n# 5) Train\n# ============================\nhistory = model.fit(\n    train_gen,\n    validation_data=val_gen,\n    epochs=EPOCHS\n)\n\n# ============================\n# 6) Test-time augmentation (TTA)\n# ============================\ntest_path = \"/kaggle/input/cassava-leaf-disease-classification/test_images\"\ntest_files = os.listdir(test_path)\ntest_df = pd.DataFrame({\"image_id\": test_files})\n\ntta_gen = ImageDataGenerator(\n    preprocessing_function=preprocess_input,\n    horizontal_flip=True,\n    vertical_flip=True\n).flow_from_dataframe(\n    test_df,\n    directory=test_path,\n    x_col=\"image_id\",\n    y_col=None,\n    target_size=(IMAGE_SIZE, IMAGE_SIZE),\n    batch_size=BATCH_SIZE,\n    class_mode=None,\n    shuffle=False\n)\n\npreds_list = []\nTTA_STEPS = 5\n\nfor i in range(TTA_STEPS):\n    preds = model.predict(tta_gen)\n    preds_list.append(preds)\n\nfinal_preds = np.mean(preds_list, axis=0)\nfinal_preds = np.argmax(final_preds, axis=1)\n\n# ============================\n# 7) Submission\n# ============================\nsub = pd.read_csv(\"/kaggle/input/cassava-leaf-disease-classification/sample_submission.csv\")\nsub[\"label\"] = final_preds\nsub.to_csv(\"/kaggle/working/submission.csv\", index=False)\n\nprint(\">>> DONE: submission.csv created!\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-21T09:57:56.897102Z","iopub.execute_input":"2025-11-21T09:57:56.897685Z","iopub.status.idle":"2025-11-21T11:24:14.817521Z","shell.execute_reply.started":"2025-11-21T09:57:56.897657Z","shell.execute_reply":"2025-11-21T11:24:14.815386Z"}},"outputs":[],"execution_count":null}]}