{"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"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"#Librerías necesarias\n\nimport numpy as np\nimport pandas as pd \nimport os\nimport seaborn as sns\nimport matplotlib.pyplot as plt\nimport keras\nimport cv2\nimport torchvision.transforms as transforms\nimport torch\nimport torch.nn as nn\nimport torchvision.models as models\nfrom torch.utils.data import DataLoader, Dataset","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-05-28T17:39:43.655421Z","iopub.execute_input":"2023-05-28T17:39:43.655878Z","iopub.status.idle":"2023-05-28T17:39:58.462811Z","shell.execute_reply.started":"2023-05-28T17:39:43.655850Z","shell.execute_reply":"2023-05-28T17:39:58.461888Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Se muestra la estructura del directorio que contiene el dataset\nprint(os.listdir(\"../input/aptos2019-blindness-detection\"))\n\n#Creamos las variables que contendran los ficheros csv de train y test\ndf_train = pd.read_csv('../input/aptos2019-blindness-detection/train.csv')\ndf_test = pd.read_csv('../input/aptos2019-blindness-detection/test.csv')\n\n#Vemos el número de muestras\nprint(\"Longitud de train: \", len(df_train))\nprint(\"Longitud de test: \", len(df_test))\n\ndf_train.head()","metadata":{"execution":{"iopub.status.busy":"2023-05-28T17:40:01.178869Z","iopub.execute_input":"2023-05-28T17:40:01.179798Z","iopub.status.idle":"2023-05-28T17:40:01.234787Z","shell.execute_reply.started":"2023-05-28T17:40:01.179757Z","shell.execute_reply":"2023-05-28T17:40:01.233847Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Etiquetas para sustituir los números por nivel de la enfermedad ocular\nlabel_title = {\"0\" : \"No DR\",\"1\" : \"Mild\",\"2\" : \"Moderate\",\"3\" :\"Severe\",\"4\" : \"Proliferative DR\"}\n\n#Gráfico 1\ndf_train.hist()\n\n#Gráfico 2\nf, ax = plt.subplots(figsize=(8, 5))\nax = sns.countplot(x=\"diagnosis\", data=df_train, palette=\"mako\")\nax.set(xlabel='Diagnóstico', ylabel='Cuenta')\n#Mostrar las etiquetas personalizadas\nax.set_xticklabels([label_title[str(i)] for i in range(5)])\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-05-28T17:40:07.862926Z","iopub.execute_input":"2023-05-28T17:40:07.863304Z","iopub.status.idle":"2023-05-28T17:40:08.433116Z","shell.execute_reply.started":"2023-05-28T17:40:07.863273Z","shell.execute_reply":"2023-05-28T17:40:08.432234Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sns.set_style(\"white\")\nplt.figure(figsize=[15, 12])\n\n#Bucle para recorrer 5 diagnosticos\nfor diag_type in range(5):\n    #Seleccionamos 4 imagenes de cada tipo\n    img_names = df_train.loc[df_train['diagnosis'] == diag_type, 'id_code'].iloc[:4]\n    \n    #Iteramos sobre las imagenes de cada tipo, añadiendo el tipo de diagnóstico y su ID para comprobar\n    for i, img_name in enumerate(img_names):\n        img = cv2.imread(\"../input/aptos2019-blindness-detection/train_images/%s.png\" % img_name)[...,[2, 1, 0]]\n        plt.subplot(4, 5, (i*5) + diag_type + 1)\n        plt.imshow(img)\n        plt.title(label_title[str(diag_type)] + '\\nID: ' + img_name)\n\nplt.tight_layout()\nplt.show()\n","metadata":{"execution":{"iopub.status.busy":"2023-05-28T17:40:12.727314Z","iopub.execute_input":"2023-05-28T17:40:12.727755Z","iopub.status.idle":"2023-05-28T17:40:31.737499Z","shell.execute_reply.started":"2023-05-28T17:40:12.727718Z","shell.execute_reply":"2023-05-28T17:40:31.736153Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Tamaño de imagen requerido por ResNet-50\nimage_size = 224\n\n# Transformaciones para redimensionar y normalizar las imágenes\ntransform = transforms.Compose([\n    transforms.ToPILImage(),\n    transforms.Resize((image_size, image_size)),\n    transforms.ToTensor(),\n    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])\n])\n\n# Preprocesamiento de las imágenes de entrenamiento\ntrain_images = []\nfor img_name in df_train['id_code']:\n    img_path = \"../input/aptos2019-blindness-detection/train_images/%s.png\" % img_name\n    img = cv2.imread(img_path)\n    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)\n    img = transform(img)\n    train_images.append(img)\n\n# Preprocesamiento de las imágenes de prueba\ntest_images = []\nfor img_name in df_test['id_code']:\n    img_path = \"../input/aptos2019-blindness-detection/test_images/%s.png\" % img_name\n    img = cv2.imread(img_path)\n    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)\n    img = transform(img)\n    test_images.append(img)\n","metadata":{"execution":{"iopub.status.busy":"2023-05-28T17:40:49.789167Z","iopub.execute_input":"2023-05-28T17:40:49.789537Z","iopub.status.idle":"2023-05-28T17:50:09.798777Z","shell.execute_reply.started":"2023-05-28T17:40:49.789504Z","shell.execute_reply":"2023-05-28T17:50:09.797781Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Definir dataset\nclass CustomDataset(Dataset):\n    def __init__(self, images, labels):\n        self.images = images\n        self.labels = labels\n    \n    def __len__(self):\n        return len(self.images)\n    \n    def __getitem__(self, idx):\n        image = self.images[idx]\n        label = self.labels[idx]\n        return image, label\n\n# Crear dataset de entrenamiento\ntrain_dataset = CustomDataset(train_images, df_train['diagnosis'])\n\n# Definir hiperparámetros\nbatch_size = 32\nlearning_rate = 0.001\nnum_epochs = 10\n\n# Crear dataloader\ntrain_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)\n\n# Cargar modelo ResNet-50 pre-entrenado\nmodel = models.resnet50(pretrained=True)\nnum_features = model.fc.in_features\nmodel.fc = nn.Linear(num_features, 5)  # Capa de salida con 5 clases\n\n# Enviar modelo y datos a la GPU si está disponible\ndevice = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\nmodel = model.to(device)\n\n# Definir función de pérdida y optimizador\ncriterion = nn.CrossEntropyLoss()\noptimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)\n\n# Entrenamiento del modelo\ntotal_step = len(train_loader)\nfor epoch in range(num_epochs):\n    for i, (images, labels) in enumerate(train_loader):\n        # Enviar imágenes y etiquetas a la GPU si está disponible\n        images = images.to(device)\n        labels = labels.to(device)\n        \n        # Forward pass\n        outputs = model(images)\n        loss = criterion(outputs, labels)\n        \n        # Backward pass y optimización\n        optimizer.zero_grad()\n        loss.backward()\n        optimizer.step()\n        \n        if (i+1) % 10 == 0:\n            print(f'Epoch [{epoch+1}/{num_epochs}], Step [{i+1}/{total_step}], Loss: {loss.item():.4f}')\n\n# Evaluación del modelo\nmodel.eval()\nwith torch.no_grad():\n    correct = 0\n    total = 0\n    for images, labels in train_loader:  # Utilizar el dataloader de entrenamiento para la evaluación\n        # Enviar imágenes y etiquetas a la GPU si está disponible\n        images = images.to(device)\n        labels = labels.to(device)\n        \n        outputs = model(images)\n        _, predicted = torch.max(outputs.data, 1)\n        total += labels.size(0)\n        correct += (predicted == labels).sum().item()\n    \n    accuracy = 100 * correct / total\n    print(f'Accuracy on train set: {accuracy:.2f}%')\n\n","metadata":{"execution":{"iopub.status.busy":"2023-05-25T15:10:31.678592Z","iopub.execute_input":"2023-05-25T15:10:31.679280Z","iopub.status.idle":"2023-05-25T15:17:01.050888Z","shell.execute_reply.started":"2023-05-25T15:10:31.679247Z","shell.execute_reply":"2023-05-25T15:17:01.049617Z"},"trusted":true},"execution_count":null,"outputs":[]}]}