{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":4104,"databundleVersionId":46661,"sourceType":"competition"},{"sourceId":7866129,"sourceType":"datasetVersion","datasetId":4614938},{"sourceId":7869237,"sourceType":"datasetVersion","datasetId":4617269}],"dockerImageVersionId":30732,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# ECHANTILLAN ","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nfrom glob import glob\nimport matplotlib.pyplot as plt\nimport cv2\nimport torch\nimport torch.nn as nn\nimport torch.optim as optim\nfrom torchvision import models, transforms\nfrom torch.utils.data import Dataset, DataLoader, Subset\n\n# Chargement des labels d'entraînement\nfile_lbl = \"/kaggle/input/diabetic-retinopathy-detection/trainLabels.csv.zip\"\ndf_train = pd.read_csv(file_lbl, sep=',')\nprint(df_train.head())\n\n# Chargement des chemins d'images d'entraînement\npaths_train = glob('/kaggle/input/diabetic-retinopathy-train-unzipped/train/*.jpeg')\n\n# Affichage d'une image d'entraînement\nimage = cv2.imread(paths_train[0])\nplt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))\nplt.show()\n\n# Transformation des images\ntransform = transforms.Compose([\n    transforms.ToPILImage(),\n    transforms.Resize((224, 224)),\n    transforms.ToTensor()\n])\n\nclass RetinopathyDataset(Dataset):\n    def __init__(self, img_paths, labels, transform=None):\n        self.img_paths = img_paths\n        self.labels = labels\n        self.transform = transform\n\n    def __len__(self):\n        return len(self.img_paths)\n\n    def __getitem__(self, idx):\n        img = cv2.imread(self.img_paths[idx])\n        img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)\n        label = self.labels[idx]\n        if self.transform:\n            img = self.transform(img)\n        return img, label\n\n# Création du DataLoader\ntrain_dataset = RetinopathyDataset(paths_train, df_train['level'].values, transform=transform)\n\n# Utiliser un échantillon réduit du dataset d'entraînement\nsubset_indices = list(range(0, len(train_dataset), 10))  # prendre 1 image sur 10 pour réduire la taille du dataset\ntrain_subset = Subset(train_dataset, subset_indices)\n\ntrain_loader = DataLoader(train_subset, batch_size=32, shuffle=True)\n\n# Charger un modèle pré-entraîné plus petit (MobileNetV2)\nmodel = models.mobilenet_v2(pretrained=True)\nmodel.classifier[1] = nn.Linear(model.classifier[1].in_features, 5)\n\n# Définir l'optimiseur et la fonction de perte\ncriterion = nn.CrossEntropyLoss()\noptimizer = optim.Adam(model.parameters(), lr=1e-4)\n\n# Boucle d'entraînement (moins d'époques pour accélérer)\nfor epoch in range(3):  # réduire le nombre d'époques\n    model.train()\n    running_loss = 0.0\n    for batch_idx, (inputs, labels) in enumerate(train_loader):\n        optimizer.zero_grad()\n        outputs = model(inputs)\n        loss = criterion(outputs, labels)\n        loss.backward()\n        optimizer.step()\n        running_loss += loss.item()\n        \n        # Afficher l'avancement de chaque batch\n        if batch_idx % 10 == 0:  # affiche tous les 10 batches\n            print(f'Epoch [{epoch+1}/{3}], Batch [{batch_idx}/{len(train_loader)}], Loss: {loss.item():.4f}')\n    \n    # Afficher la perte moyenne après chaque époque\n    print(f'Epoch {epoch+1}, Average Loss: {running_loss/len(train_loader):.4f}')\n\n# Sauvegarder le modèle\ntorch.save(model.state_dict(), 'retinopathy_model.pth')\n","metadata":{"execution":{"iopub.status.busy":"2024-06-25T20:51:40.048968Z","iopub.execute_input":"2024-06-25T20:51:40.049460Z","iopub.status.idle":"2024-06-25T21:35:40.954546Z","shell.execute_reply.started":"2024-06-25T20:51:40.049426Z","shell.execute_reply":"2024-06-25T21:35:40.952590Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas as pd\nfrom glob import glob\nimport matplotlib.pyplot as plt\nimport cv2\nimport torch\nfrom torch.utils.data import Dataset, DataLoader, Subset\nfrom torchvision import transforms, models\n\n# Charger le modèle et les données de test\npaths_test = glob('/kaggle/input/diabetic-retinopathy-test-unzipped/test/*.jpeg')\n\n# Affichage d'une image de test\nimage = cv2.imread(paths_test[0])\nplt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))\nplt.show()\n\n# Transformation des images\ntransform = transforms.Compose([\n    transforms.ToPILImage(),\n    transforms.Resize((224, 224)),\n    transforms.ToTensor()\n])\n\nclass RetinopathyDataset(Dataset):\n    def __init__(self, img_paths, labels, transform=None):\n        self.img_paths = img_paths\n        self.labels = labels\n        self.transform = transform\n\n    def __len__(self):\n        return len(self.img_paths)\n\n    def __getitem__(self, idx):\n        img = cv2.imread(self.img_paths[idx])\n        img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)\n        label = self.labels[idx]\n        if self.transform:\n            img = self.transform(img)\n        return img, label\n\n# Préparation des données de test\ntest_dataset = RetinopathyDataset(paths_test, [0]*len(paths_test), transform=transform)\n\n# Utiliser un échantillon réduit du dataset de test pour des prédictions plus rapides\nsubset_indices = list(range(0, len(test_dataset), 100))  # prendre 1 image sur 100 pour réduire la taille du dataset\ntest_subset = Subset(test_dataset, subset_indices)\ntest_loader = DataLoader(test_subset, batch_size=32, shuffle=False)\n\n# Charger le modèle sauvegardé\nmodel = models.mobilenet_v2(pretrained=False)\nmodel.classifier[1] = torch.nn.Linear(model.classifier[1].in_features, 5)\nmodel.load_state_dict(torch.load('retinopathy_model.pth'))\nmodel.eval()\n","metadata":{"execution":{"iopub.status.busy":"2024-06-25T21:59:31.205824Z","iopub.execute_input":"2024-06-25T21:59:31.206759Z","iopub.status.idle":"2024-06-25T21:59:33.731799Z","shell.execute_reply.started":"2024-06-25T21:59:31.206719Z","shell.execute_reply":"2024-06-25T21:59:33.730771Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n# Prédictions\npredictions = []\nwith torch.no_grad():\n    for batch_idx, (inputs, _) in enumerate(test_loader):\n        outputs = model(inputs)\n        _, preds = torch.max(outputs, 1)\n        predictions.extend(preds.cpu().numpy())\n        \n        # Afficher l'avancement de chaque batch\n        if batch_idx % 10 == 0:  # affiche tous les 10 batches\n            print(f'Batch [{batch_idx}/{len(test_loader)}], Predictions in progress...')\n\n# Préparation du fichier de soumission\ndf_submission = pd.read_csv('/kaggle/input/diabetic-retinopathy-detection/sampleSubmission.csv.zip', sep=',')\n# Adapter la taille du fichier de soumission à celle des prédictions\ndf_submission = df_submission.iloc[subset_indices]\ndf_submission['level'] = predictions\ndf_submission.to_csv('submission.csv', index=False)\n","metadata":{"execution":{"iopub.status.busy":"2024-06-25T21:59:37.337938Z","iopub.execute_input":"2024-06-25T21:59:37.338379Z","iopub.status.idle":"2024-06-25T22:00:47.265383Z","shell.execute_reply.started":"2024-06-25T21:59:37.338345Z","shell.execute_reply":"2024-06-25T22:00:47.264238Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas as pd\n\n# Lire le fichier de soumission généré\ndf_submission = pd.read_csv('submission.csv')\nprint(df_submission)\n","metadata":{"execution":{"iopub.status.busy":"2024-06-25T22:08:58.455141Z","iopub.execute_input":"2024-06-25T22:08:58.455578Z","iopub.status.idle":"2024-06-25T22:08:58.466664Z","shell.execute_reply.started":"2024-06-25T22:08:58.455543Z","shell.execute_reply":"2024-06-25T22:08:58.465603Z"},"trusted":true},"execution_count":null,"outputs":[]}]}