{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.11","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":4104,"databundleVersionId":46661,"sourceType":"competition"}],"dockerImageVersionId":31041,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Imports","metadata":{}},{"cell_type":"code","source":"!pip install -q diffusers transformers accelerate datasets wandb","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-05-18T08:48:05.181001Z","iopub.execute_input":"2025-05-18T08:48:05.181181Z","iopub.status.idle":"2025-05-18T08:48:05.185776Z","shell.execute_reply.started":"2025-05-18T08:48:05.181157Z","shell.execute_reply":"2025-05-18T08:48:05.184968Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# نصب ابزار لازم (در صورت نیاز)\n!apt-get install p7zip-full\n\n# # برای فایل train:\n!7z x train.zip.001 -o./train_images\n\n# # برای فایل test:\n!7z x test.zip.001 -o./test_images","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-18T08:48:05.258854Z","iopub.execute_input":"2025-05-18T08:48:05.25939Z","iopub.status.idle":"2025-05-18T08:48:05.263276Z","shell.execute_reply.started":"2025-05-18T08:48:05.259363Z","shell.execute_reply":"2025-05-18T08:48:05.262088Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install -q diffusers transformers accelerate","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-18T08:48:05.264544Z","iopub.execute_input":"2025-05-18T08:48:05.265196Z","iopub.status.idle":"2025-05-18T08:48:05.27403Z","shell.execute_reply.started":"2025-05-18T08:48:05.265171Z","shell.execute_reply":"2025-05-18T08:48:05.273276Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import glob\nimport zipfile\nimport pandas as pd\nimport os\n\nimport pandas as pd\nimport os\nfrom PIL import Image\nfrom torchvision import transforms\nfrom torch.utils.data import Dataset, DataLoader\nimport torch\nimport numpy as np\nfrom tqdm import tqdm","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-18T08:48:05.274839Z","iopub.execute_input":"2025-05-18T08:48:05.275079Z","iopub.status.idle":"2025-05-18T08:48:12.172653Z","shell.execute_reply.started":"2025-05-18T08:48:05.275056Z","shell.execute_reply":"2025-05-18T08:48:12.171883Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Extract Files","metadata":{}},{"cell_type":"code","source":"with zipfile.ZipFile(\"/kaggle/input/diabetic-retinopathy-detection/trainLabels.csv.zip\", 'r') as zip_ref:\n    zip_ref.extractall(\"./\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-18T08:48:12.174347Z","iopub.execute_input":"2025-05-18T08:48:12.174784Z","iopub.status.idle":"2025-05-18T08:48:12.177962Z","shell.execute_reply.started":"2025-05-18T08:48:12.174759Z","shell.execute_reply":"2025-05-18T08:48:12.17728Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df = pd.read_csv(\"/kaggle/working/trainLabels.csv\")\ndf.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-18T08:48:41.831663Z","iopub.execute_input":"2025-05-18T08:48:41.832195Z","iopub.status.idle":"2025-05-18T08:48:41.847152Z","shell.execute_reply.started":"2025-05-18T08:48:41.832173Z","shell.execute_reply":"2025-05-18T08:48:41.846144Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!7z x /kaggle/input/diabetic-retinopathy-detection/train.zip.001 -o/kaggle/working/train_images","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-18T08:48:12.21514Z","iopub.status.idle":"2025-05-18T08:48:12.215324Z","shell.execute_reply.started":"2025-05-18T08:48:12.215231Z","shell.execute_reply":"2025-05-18T08:48:12.21524Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!7z x /kaggle/input/diabetic-retinopathy-detection/test.zip.001 -o/kaggle/working/test_images","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-18T08:48:12.216674Z","iopub.status.idle":"2025-05-18T08:48:12.216968Z","shell.execute_reply.started":"2025-05-18T08:48:12.2168Z","shell.execute_reply":"2025-05-18T08:48:12.216817Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# # ⚙️ پارامترهای قابل تنظیم\n# IMAGE_DIR = \"/kaggle/working/train_images\"\n# CSV_PATH = \"/kaggle/working/trainLabels.csv\"\n# IMAGE_SIZE = 256  # سایز تصویر خروجی\n# NOISE_STD = 0.1   # شدت نویز گوسی\n\n\n\n# # 🎯 تعریف تبدیل‌ها\n# transform_clean = transforms.Compose([\n#     transforms.Resize((IMAGE_SIZE, IMAGE_SIZE)),\n#     transforms.ToTensor()\n# ])\n\n# # 🧾 بارگذاری فایل برچسب‌ها\n# df = pd.read_csv(CSV_PATH)\n# df['path'] = df['image'].apply(lambda x: os.path.join(IMAGE_DIR, f\"{x}.jpeg\"))\n\n# # 🧼 فقط تصاویری که واقعاً وجود دارند نگه داریم\n# df = df[df['path'].apply(os.path.exists)].reset_index(drop=True)\n\n# # 🧱 کلاس دیتاست برای PyTorch\n# class DenoiseDataset(Dataset):\n#     def __init__(self, df, transform, noise_std=0.1):\n#         self.df = df\n#         self.transform = transform\n#         self.noise_std = noise_std\n\n#     def __len__(self):\n#         return len(self.df)\n\n#     def __getitem__(self, idx):\n#         img_path = self.df.iloc[idx]['path']\n#         img = Image.open(img_path).convert('RGB')\n#         clean = self.transform(img)\n#         noise = torch.randn_like(clean) * self.noise_std\n#         noisy = (clean + noise).clamp(0, 1)\n#         return noisy, clean\n\n# # 🔁 ساخت دیتاست و dataloader برای train\n# full_ds = DenoiseDataset(df_img, transform_clean, NOISE_STD)\n\n# train_dl = DataLoader(full_ds, batch_size=8, shuffle=True)\n\n# # 🔍 تست اولیه نمایش نمونه\n# sample_noisy, sample_clean = next(iter(train_dl))\n\n# import matplotlib.pyplot as plt\n# plt.figure(figsize=(12,4))\n# for i in range(4):\n#     plt.subplot(2,4,i+1)\n#     plt.imshow(sample_clean[i].permute(1,2,0).numpy())\n#     plt.title(\"Clean\")\n#     plt.axis('off')\n\n#     plt.subplot(2,4,i+5)\n#     plt.imshow(sample_noisy[i].permute(1,2,0).numpy())\n#     plt.title(\"Noisy\")\n#     plt.axis('off')\n# plt.tight_layout()\n# plt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-18T08:48:12.217794Z","iopub.status.idle":"2025-05-18T08:48:12.217989Z","shell.execute_reply.started":"2025-05-18T08:48:12.217895Z","shell.execute_reply":"2025-05-18T08:48:12.217904Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import glob\nimport pandas as pd\n\nIMAGE_DIR = \"/kaggle/working/train_images/train\"\nall_paths = glob.glob(os.path.join(IMAGE_DIR, \"*.jpeg\"))\n\ndf_img = pd.DataFrame(all_paths, columns=['path'])\n\nprint(f\"✅ تعداد تصاویر آماده برای denoising: {len(df_img)}\")\nprint(df_img.head())\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-18T08:48:12.218984Z","iopub.status.idle":"2025-05-18T08:48:12.219183Z","shell.execute_reply.started":"2025-05-18T08:48:12.219091Z","shell.execute_reply":"2025-05-18T08:48:12.219099Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"full_ds = DenoiseDataset(df_img, transform_clean, NOISE_STD)\ntrain_dl = DataLoader(full_ds, batch_size=8, shuffle=True)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-18T08:48:12.220117Z","iopub.status.idle":"2025-05-18T08:48:12.220397Z","shell.execute_reply.started":"2025-05-18T08:48:12.220226Z","shell.execute_reply":"2025-05-18T08:48:12.220241Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nfrom diffusers import UNet2DModel, DDPMScheduler\nfrom torch.utils.data import Dataset, DataLoader\nimport torch.nn.functional as F\nfrom tqdm import tqdm\n\n# ⚙️ ساخت مدل U-Net پایه\nmodel = UNet2DModel(\n    sample_size=256,          # اندازه تصویر ورودی\n    in_channels=3,            # RGB\n    out_channels=3,           # خروجی RGB\n    layers_per_block=2,\n    block_out_channels=(64, 128, 256, 512),\n    down_block_types=(\"DownBlock2D\",)*4,\n    up_block_types=(\"UpBlock2D\",)*4,\n)\nmodel.to(\"cuda\")\n\n# 🌀 تنظیمات دیفیوژن\nscheduler = DDPMScheduler(num_train_timesteps=1000, beta_start=0.0001, beta_end=0.02)\noptimizer = torch.optim.AdamW(model.parameters(), lr=1e-4)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-18T08:48:12.221572Z","iopub.status.idle":"2025-05-18T08:48:12.221838Z","shell.execute_reply.started":"2025-05-18T08:48:12.221684Z","shell.execute_reply":"2025-05-18T08:48:12.221697Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"EPOCHS = 2  # برای شروع فقط ۲ اپوک، بعد می‌تونی افزایش بدی\n\nfor epoch in range(EPOCHS):\n    model.train()\n    loop = tqdm(train_dl, leave=False)\n    for step, (noisy_imgs, clean_imgs) in enumerate(loop):\n        noisy_imgs = noisy_imgs.to(\"cuda\")\n        clean_imgs = clean_imgs.to(\"cuda\")\n\n        # timestep ثابت برای سادگی (در حالت پیشرفته می‌تونیم random بگیریم)\n        t = torch.tensor([0] * noisy_imgs.size(0)).to(\"cuda\")\n        noise_gt = noisy_imgs - clean_imgs\n\n        # پیش‌بینی نویز\n        noise_pred = model(noisy_imgs, timestep=t).sample\n\n        loss = F.mse_loss(noise_pred, noise_gt)\n        optimizer.zero_grad()\n        loss.backward()\n        optimizer.step()\n\n        loop.set_description(f\"Epoch {epoch+1}\")\n        loop.set_postfix(loss=loss.item())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-18T08:48:12.222669Z","iopub.status.idle":"2025-05-18T08:48:12.222937Z","shell.execute_reply.started":"2025-05-18T08:48:12.22278Z","shell.execute_reply":"2025-05-18T08:48:12.222792Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from skimage.metrics import peak_signal_noise_ratio as psnr, structural_similarity as ssim\nimport matplotlib.pyplot as plt\n\nmodel.eval()\nsample_noisy, sample_clean = next(iter(train_dl))\nsample_noisy = sample_noisy.to(\"cuda\")\n\nwith torch.no_grad():\n    denoised = model(sample_noisy, timestep=torch.tensor([0]*sample_noisy.size(0)).to(\"cuda\")).sample.clamp(0, 1)\n\n# محاسبه PSNR و SSIM برای نمونه اول\ni = 0\nclean_np = sample_clean[i].permute(1,2,0).numpy()\ndenoised_np = denoised[i].permute(1,2,0).cpu().numpy()\n\nprint(f\"PSNR: {psnr(clean_np, denoised_np):.2f}\")\nprint(f\"SSIM: {ssim(clean_np, denoised_np, channel_axis=-1):.4f}\")\n\n# نمایش تصویری\nplt.figure(figsize=(12,4))\nplt.subplot(1,3,1)\nplt.imshow(sample_noisy[i].permute(1,2,0).cpu()); plt.title(\"Noisy\")\nplt.subplot(1,3,2)\nplt.imshow(denoised_np); plt.title(\"Denoised\")\nplt.subplot(1,3,3)\nplt.imshow(clean_np); plt.title(\"Original\")\nplt.tight_layout()\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-18T08:48:12.224354Z","iopub.status.idle":"2025-05-18T08:48:12.224649Z","shell.execute_reply.started":"2025-05-18T08:48:12.224516Z","shell.execute_reply":"2025-05-18T08:48:12.22453Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}