{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":14774,"databundleVersionId":875431,"sourceType":"competition"},{"sourceId":886249,"sourceType":"datasetVersion","datasetId":472549},{"sourceId":12424715,"sourceType":"datasetVersion","datasetId":7836737},{"sourceId":12436440,"sourceType":"datasetVersion","datasetId":7844682},{"sourceId":12470620,"sourceType":"datasetVersion","datasetId":7867577},{"sourceId":12784431,"sourceType":"datasetVersion","datasetId":8082595},{"sourceId":12784670,"sourceType":"datasetVersion","datasetId":8082728},{"sourceId":12790475,"sourceType":"datasetVersion","datasetId":8086713}],"dockerImageVersionId":31090,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport torch\nimport pandas as pd\nimport numpy as np\nfrom PIL import Image\nfrom transformers import BeitImageProcessor, BeitForImageClassification\nfrom torchvision.transforms import Compose, Resize, ToTensor, Normalize\n\n# ==== 1. CONFIGURA TUS RUTAS ====\n# Carpeta donde está el modelo exportado\nmodel_checkpoint_path = \"/kaggle/input/modelos-edema-multilabel/modelos/modelo_multilabel_4_clases\"\n\n# Carpeta donde están las imágenes nuevas para inferencia\nimages_folder_path = \"/kaggle/input/dataset-edema-eyepacs-labels/eyepacs/split/test\"  # <-- modifica este path\n\n# ==== 2. CARGAR MODELO Y PROCESSOR ====\nmodel = BeitForImageClassification.from_pretrained(model_checkpoint_path)\nmodel.eval()\n\nprocessor = BeitImageProcessor.from_pretrained(model_checkpoint_path)\n\n# ==== 3. DEFINIR TRANSFORMACIONES ====\ntransforms = Compose([\n    Resize((processor.size['height'], processor.size['width'])),\n    ToTensor(),\n    Normalize(mean=processor.image_mean, std=processor.image_std)\n])\n\n# ==== 4. ETIQUETAS MULTIETIQUETA (EN ORDEN) ====\nlabel_columns = ['Normal', 'Diabetic', 'Edema1',\"Edema2\"]\n\n# ==== 5. FUNCIONES ====\ndef predict_image(image_path):\n    image = Image.open(image_path).convert(\"RGB\")\n    pixel_values = transforms(image).unsqueeze(0)  # (1, 3, H, W)\n\n    with torch.no_grad():\n        outputs = model(pixel_values=pixel_values)\n        logits = outputs.logits\n        probs = torch.sigmoid(logits).cpu().numpy()[0]\n        preds = (probs > 0.5).astype(int)\n\n    return preds, probs\n\n# ==== 6. PROCESAR TODAS LAS IMÁGENES DE LA CARPETA ====\nresults = []\n\nfor filename in os.listdir(images_folder_path):\n    if filename.lower().endswith((\".png\", \".jpg\", \".jpeg\",\".tiff\",\".tif\")):\n        full_path = os.path.join(images_folder_path, filename)\n        preds, probs = predict_image(full_path)\n\n        result = {\n            \"filename\": filename,\n            **{f\"Pred_{label}\": int(p) for label, p in zip(label_columns, preds)},\n            **{f\"Prob_{label}\": float(pr) for label, pr in zip(label_columns, probs)}\n        }\n        results.append(result)\n\n# ==== 7. GUARDAR RESULTADOS EN CSV ====\ndf = pd.DataFrame(results)\ndf.to_csv(\"resultados_inferencia_4_clases.csv\", index=False)\nprint(\"✅ Resultados guardados en 'resultados_inferencia4.csv'\")\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-08-17T18:24:01.941719Z","iopub.execute_input":"2025-08-17T18:24:01.941907Z","iopub.status.idle":"2025-08-17T18:31:12.678686Z","shell.execute_reply.started":"2025-08-17T18:24:01.941890Z","shell.execute_reply":"2025-08-17T18:31:12.677882Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport torch\nimport pandas as pd\nimport numpy as np\nfrom PIL import Image\nfrom transformers import BeitImageProcessor, BeitForImageClassification\nfrom torchvision.transforms import Compose, Resize, ToTensor, Normalize\n\n# ==== 1. CONFIGURA TUS RUTAS ====\n# Carpeta donde está el modelo exportado\nmodel_checkpoint_path = \"/kaggle/input/modelos-edema-multilabel/modelos/multilabel_edema_3_clases\"\n\n# Carpeta base donde están las imágenes\nimages_folder_path = \"/kaggle/input/dataset-multilabel-edema-3-clases/todo/todo\"  # <-- tu carpeta base\n\n# CSV con la columna 'file' (nombres de archivo de imagen)\ncsv_path = \"/kaggle/input/dataset-multilabel-edema-3-clases/test_split_20_eyepacs3.csv\"  # <-- pon aquí tu CSV\n\n# ==== 2. CARGAR MODELO Y PROCESSOR ====\nmodel = BeitForImageClassification.from_pretrained(model_checkpoint_path)\nmodel.eval()\nprocessor = BeitImageProcessor.from_pretrained(model_checkpoint_path)\n\n# ==== 3. DEFINIR TRANSFORMACIONES ====\ntransforms = Compose([\n    Resize((processor.size['height'], processor.size['width'])),\n    ToTensor(),\n    Normalize(mean=processor.image_mean, std=processor.image_std)\n])\n\n# ==== 4. ETIQUETAS MULTIETIQUETA (EN ORDEN) ====\nlabel_columns = ['Normal', 'Diabetic', 'Edema1', 'Edema2']\n\n# ==== 5. FUNCIONES ====\ndef predict_image(image_path):\n    image = Image.open(image_path).convert(\"RGB\")\n    pixel_values = transforms(image).unsqueeze(0)  # (1, 3, H, W)\n    with torch.no_grad():\n        outputs = model(pixel_values=pixel_values)\n        logits = outputs.logits\n        probs = torch.sigmoid(logits).cpu().numpy()[0]\n        preds = (probs > 0.5).astype(int)\n    return preds, probs\n\n# ==== 6. LEER LISTA DE IMÁGENES DESDE CSV (columna 'file') ====\ndf_input = pd.read_csv(csv_path)\nif 'file' not in df_input.columns:\n    raise ValueError(\"El CSV no contiene la columna requerida 'file'.\")\n\n# Normaliza a str y elimina espacios/NaN\nfilenames = df_input['file'].astype(str).str.strip().tolist()\n\n# ==== 7. PROCESAR TODAS LAS IMÁGENES LISTADAS EN EL CSV ====\nresults = []\nfor filename in filenames:\n    full_path = os.path.join(images_folder_path, filename)\n    if not os.path.isfile(full_path):\n        # Si falta el archivo, registra fila con NaN para trazabilidad\n        results.append({\n            \"file\": filename,\n            **{f\"Pred_{label}\": np.nan for label in label_columns},\n            **{f\"Prob_{label}\": np.nan for label in label_columns}\n        })\n        continue\n\n    preds, probs = predict_image(full_path)\n    result = {\n        \"file\": filename,\n        **{f\"Pred_{label}\": int(p) for label, p in zip(label_columns, preds)},\n        **{f\"Prob_{label}\": float(pr) for label, pr in zip(label_columns, probs)}\n    }\n    results.append(result)\n\n# ==== 8. GUARDAR RESULTADOS EN CSV ====\ndf_out = pd.DataFrame(results)\ndf_out.to_csv(\"resultados_inferencia_3_clases.csv\", index=False)\nprint(\"✅ Resultados guardados en 'resultados_inferencia_3_clases.csv'\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-17T18:32:51.971002Z","iopub.execute_input":"2025-08-17T18:32:51.971703Z","iopub.status.idle":"2025-08-17T18:38:35.200058Z","shell.execute_reply.started":"2025-08-17T18:32:51.971677Z","shell.execute_reply":"2025-08-17T18:38:35.199304Z"}},"outputs":[],"execution_count":null}]}