{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":14389426,"sourceType":"datasetVersion","datasetId":9189739}],"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport pandas as pd\nfrom PIL import Image\nfrom tqdm import tqdm\nfrom concurrent.futures import ProcessPoolExecutor, as_completed\n\n# Constants\nINPUT_DIR = \"/kaggle/input/imagenet-object-localization-challenge/ILSVRC/Data/CLS-LOC\"\nVAL_SOL = \"/kaggle/input/imagenet-object-localization-challenge/LOC_val_solution.csv\"\nMAX_WORKERS = os.cpu_count()  # Utilizes all available CPU cores\n\ndef process_single_image(src_path, dst_path, target_size):\n    \"\"\"Worker function for a single image.\"\"\"\n    try:\n        with Image.open(src_path) as img:\n            img = img.convert('RGB')\n            img = img.resize(target_size, Image.Resampling.LANCZOS)\n            img.save(dst_path, \"JPEG\", quality=90) # Quality 90 is a sweet spot for storage\n        return True\n    except Exception as e:\n        return f\"Error {src_path}: {e}\"\n\ndef build_multithreaded(name, wnid_list, output_path, target_size=(64, 64)):\n    print(f\"\\n--- Multithreaded Build: {name} ({target_size}) ---\")\n    \n    tasks = []\n    \n    # 1. Prepare Training Tasks\n    for wnid in wnid_list:\n        src_dir = os.path.join(INPUT_DIR, \"train\", wnid)\n        dst_dir = os.path.join(output_path, \"train\", wnid)\n        os.makedirs(dst_dir, exist_ok=True)\n        \n        for img_file in os.listdir(src_dir):\n            tasks.append((\n                os.path.join(src_dir, img_file), \n                os.path.join(dst_dir, img_file), \n                target_size\n            ))\n\n    # 2. Prepare Validation Tasks\n    val_df = pd.read_csv(VAL_SOL)\n    val_df['wnid'] = val_df['PredictionString'].apply(lambda x: x.split()[0])\n    subset_val = val_df[val_df['wnid'].isin(wnid_list)]\n    \n    for _, row in subset_val.iterrows():\n        img_name = f\"{row['ImageId']}.JPEG\"\n        dst_dir = os.path.join(output_path, \"val\", row['wnid'])\n        os.makedirs(dst_dir, exist_ok=True)\n        tasks.append((\n            os.path.join(INPUT_DIR, \"val\", img_name), \n            os.path.join(dst_dir, img_name), \n            target_size\n        ))\n\n    # 3. Execute with ProcessPoolExecutor\n    print(f\"Total images to process: {len(tasks)}\")\n    with ProcessPoolExecutor(max_workers=MAX_WORKERS) as executor:\n        futures = [executor.submit(process_single_image, *t) for t in tasks]\n        for _ in tqdm(as_completed(futures), total=len(tasks), desc=f\"Building {name}\"):\n            pass\n\nall_wnids = sorted(os.listdir(os.path.join(INPUT_DIR, \"train\")))\nTINY_IMAGE_NET_WNIDS = all_wnids[:200]\n\n \nbuild_multithreaded(\"TinyImageNet\", TINY_IMAGE_NET_WNIDS, \"/kaggle/working/tiny_in\", target_size=(64, 64))\n\n# ImageNet-100\nimagenet_100_wnids = all_wnids[:100]\nbuild_multithreaded(\"ImageNet-100\", imagenet_100_wnids, \"/kaggle/working/imagenet_100\", target_size=(224, 224))","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"outputs":[],"execution_count":null}]}