{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.6.6","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[],"dockerImageVersionId":28755,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"from pathlib import Path\nimport pandas as pd\nimport shutil\nimport os\n\n# ============================================================\n# CONFIG\n# ============================================================\n\nSHARD_ID = 2   # <-- đổi thành 0,1,2,...,14\n\n# Tìm index notebook input của bạn.\n# Sửa tên folder này nếu Kaggle mount với tên khác.\nINDEX_ROOT = Path(\"/kaggle/input/notebooks/phanbtho/index-img-net\")\n\nSHARD_INDEX = INDEX_ROOT / \"shard_index.csv\"\n\n# ImageNet competition input\nIMAGENET_ROOT = Path(\n    \"/kaggle/input/competitions/\"\n    \"imagenet-object-localization-challenge\"\n)\n\nIMAGE_ROOT = IMAGENET_ROOT / \"ILSVRC/Data/CLS-LOC/train\"\nANN_ROOT   = IMAGENET_ROOT / \"ILSVRC/Annotations/CLS-LOC/train\"\n\n# Output của shard notebook\nOUT_ROOT = Path(\"/kaggle/working\")\n\nIMAGE_OUT = OUT_ROOT / \"train\"\nANN_OUT   = OUT_ROOT / \"annotations\"\n\nIMAGE_OUT.mkdir(parents=True, exist_ok=True)\nANN_OUT.mkdir(parents=True, exist_ok=True)\n\n\n# ============================================================\n# READ SHARD INDEX\n# ============================================================\n\nshard_df = pd.read_csv(SHARD_INDEX)\n\nrow = shard_df[shard_df[\"id\"] == SHARD_ID]\n\nif len(row) != 1:\n    raise ValueError(\n        f\"Expected exactly one shard with id={SHARD_ID}, \"\n        f\"found {len(row)}\"\n    )\n\nrow = row.iloc[0]\n\nfolders = row[\"folders\"].split(\"|\")\n\nprint(\"========================================\")\nprint(f\"SHARD {SHARD_ID}\")\nprint(\"========================================\")\nprint(\"Classes :\", len(folders))\nprint(\"Images  :\", row[\"num_images\"])\nprint(\"Size    :\", f\"{row['size_gib']:.3f} GiB\")\nprint()\n\nprint(\"Folders:\")\nfor folder in folders:\n    print(\" \", folder)\n\n\n# ============================================================\n# COPY CLASS FOLDERS\n# ============================================================\n\nprint(\"\\n========================================\")\nprint(\"COPY IMAGES\")\nprint(\"========================================\")\n\nfor i, folder in enumerate(folders, start=1):\n\n    src = IMAGE_ROOT / folder\n    dst = IMAGE_OUT / folder\n\n    if not src.exists():\n        raise FileNotFoundError(\n            f\"Image folder does not exist: {src}\"\n        )\n\n    print(\n        f\"[{i:3d}/{len(folders)}] \"\n        f\"Copying {folder} ...\"\n    )\n\n    shutil.copytree(\n        src,\n        dst,\n        dirs_exist_ok=True\n    )\n\n\n# ============================================================\n# COPY ANNOTATIONS IF THEY EXIST\n# ============================================================\n\n# print(\"\\n========================================\")\n# print(\"COPY ANNOTATIONS\")\n# print(\"========================================\")\n\n# ann_copied = 0\n# ann_missing = 0\n\n# for i, folder in enumerate(folders, start=1):\n\n#     src = ANN_ROOT / folder\n#     dst = ANN_OUT / folder\n\n    # if not src.exists():\n    #     ann_missing += 1\n    #     continue\n\n    # print(\n    #     f\"[{i:3d}/{len(folders)}] \"\n    #     f\"Copying annotation {folder} ...\"\n    # )\n\n    # shutil.copytree(\n    #     src,\n    #     dst,\n    #     dirs_exist_ok=True\n    # )\n\n    # ann_copied += 1\n\n\n# ============================================================\n# VERIFY\n# ============================================================\n\n# print(\"\\n========================================\")\n# print(\"VERIFY\")\n# print(\"========================================\")\n\n# num_images = 0\n\n# for folder in folders:\n#     folder_path = IMAGE_OUT / folder\n\n#     for file in folder_path.iterdir():\n#         if file.is_file() and file.suffix.lower() in {\n#             \".jpeg\", \".jpg\"\n#         }:\n#             num_images += 1\n\n# print(\"Expected images :\", row[\"num_images\"])\n# print(\"Copied images   :\", num_images)\n\n# if num_images != row[\"num_images\"]:\n#     raise RuntimeError(\n#         f\"Image count mismatch: \"\n#         f\"expected {row['num_images']}, \"\n#         f\"got {num_images}\"\n#     )\n\n# print(\"Annotation folders copied:\", ann_copied)\n# print(\"Annotation folders missing:\", ann_missing)\n\n# print(\"\\nDONE.\")\n# print(\"Images:\", IMAGE_OUT)\n# print(\"Annotations:\", ANN_OUT)","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"outputs":[],"execution_count":null}]}