{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":39272,"databundleVersionId":4629629,"sourceType":"competition"}],"dockerImageVersionId":30587,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\nimport matplotlib.pyplot as plt \nimport seaborn as sns \nimport pydicom\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-12-01T11:50:18.627477Z","iopub.execute_input":"2023-12-01T11:50:18.627952Z","iopub.status.idle":"2023-12-01T11:52:26.266847Z","shell.execute_reply.started":"2023-12-01T11:50:18.627913Z","shell.execute_reply":"2023-12-01T11:52:26.265469Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"> **Etablissement du chemin vers les fichiers DICOM, chargement les métadonnées associées depuis le fichier CSV, et affichage des premières lignes de ces métadonnées sous forme de DataFrame.**","metadata":{}},{"cell_type":"code","source":"# Spécification du chemin vers le dossier contenant les fichiers DICOM\ndata_path = '/kaggle/input/rsna-breast-cancer-detection'\n\n# Chargement des  métadonnées\nmetadata = pd.read_csv(os.path.join(data_path, '/kaggle/input/rsna-breast-cancer-detection/train.csv'))\n\n# Affichage  des premières lignes du DataFrame\nmetadata.head()","metadata":{"execution":{"iopub.status.busy":"2023-12-01T11:53:40.966046Z","iopub.execute_input":"2023-12-01T11:53:40.966607Z","iopub.status.idle":"2023-12-01T11:53:41.182311Z","shell.execute_reply.started":"2023-12-01T11:53:40.966574Z","shell.execute_reply":"2023-12-01T11:53:41.180902Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"> **Analyse de la distribution des classes dans les données**","metadata":{}},{"cell_type":"code","source":"# Vérification de la distribution des classes\n#Comptage du nombre d'occurrences de chaque classe dans la colonne 'cancer' du DataFrame metadata\nclass_distribution = metadata['cancer'].value_counts() \n\n# Affichage de distribution des classes \n# Utilisation de la bibliothèque Seaborn pour créer le diagramme \nsns.countplot(x='cancer', data=metadata)\nplt.title('Distribution des classes')\nplt.show()\n\n# Afficher le pourcentage de chaque classe \nclass_percentage = class_distribution / class_distribution.sum() * 100\nprint(class_percentage)\n","metadata":{"execution":{"iopub.status.busy":"2023-12-01T11:53:54.480781Z","iopub.execute_input":"2023-12-01T11:53:54.481614Z","iopub.status.idle":"2023-12-01T11:53:54.77017Z","shell.execute_reply.started":"2023-12-01T11:53:54.481561Z","shell.execute_reply":"2023-12-01T11:53:54.768695Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"> **Dans la suite, on fera une visualisation de plusieurs images DICOM à partir d'un répertoire spécifié, offrant une vue d'ensemble des images associées à un patient particulier.**","metadata":{}},{"cell_type":"code","source":"# Spécification du chemin vers le répertoire contenant les fichiers DICOM\ndirectory_path = '/kaggle/input/rsna-breast-cancer-detection/train_images/10006'\n\n# Liste de tous les fichiers dans le répertoire\nfiles = os.listdir(directory_path)\n\n# Lecture du premier fichier DICOM à titre d'exemple\nfile_path = os.path.join(directory_path, files[3])\ndicom_data = pydicom.dcmread(file_path)\n\n# Affichage de l'image DICOM\nplt.imshow(dicom_data.pixel_array, cmap=plt.cm.bone)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-12-01T11:54:00.357754Z","iopub.execute_input":"2023-12-01T11:54:00.358152Z","iopub.status.idle":"2023-12-01T11:54:05.391588Z","shell.execute_reply.started":"2023-12-01T11:54:00.358119Z","shell.execute_reply":"2023-12-01T11:54:05.39047Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Spécification du chemin vers le répertoire contenant les fichiers DICOM\ndirectory_path = '/kaggle/input/rsna-breast-cancer-detection/train_images/10011'\n\n# Liste de tous les fichiers dans le répertoire\nfiles = os.listdir(directory_path)\n\n# Spécification du nombre d'images à afficher\nnum_images_to_display = len(files)\n\n# Création d'une sous-trame(subplot) pour chaque image\n# Création d'une figure avec une ligne et un nombre de sous-trames égal au nombre d'images à afficher\nfig, axes = plt.subplots(1, num_images_to_display, figsize=(15, 5))\n\n# Chargement et affichage du nombre spécifié d'images\nfor i in range(num_images_to_display):\n    file_path = os.path.join(directory_path, files[i])\n    dicom_data = pydicom.dcmread(file_path)\n    \n    # Affichage de l'image DICOM sur la sous-trame correspondante\n    axes[i].imshow(dicom_data.pixel_array, cmap=plt.cm.bone) #Affiche l'image DICOM sur la sous-trame actuelle.\n    axes[i].axis('off') #Désactive l'affichage des axes pour une meilleure visualisation.\n\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-11-27T08:12:02.17955Z","iopub.execute_input":"2023-11-27T08:12:02.179911Z","iopub.status.idle":"2023-11-27T08:12:07.922107Z","shell.execute_reply.started":"2023-11-27T08:12:02.17988Z","shell.execute_reply":"2023-11-27T08:12:07.921001Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Spécification du chemin vers le répertoire contenant les fichiers DICOM\ndirectory_path = '/kaggle/input/rsna-breast-cancer-detection/train_images/10050'\n\n# Liste de tous les fichiers dans le répertoire\nfiles = os.listdir(directory_path)\n\n# Spécification du nombre d'images à afficher\nnum_images_to_display = len(files)\n\n# Création d'une sous-trame(subplot) pour chaque image\n# Création d'une figure avec une ligne et un nombre de sous-trames égal au nombre d'images à afficher\nfig, axes = plt.subplots(1, num_images_to_display, figsize=(15, 5))\n\n#  Chargement et affichage du nombre spécifié d'images\nfor i in range(num_images_to_display):\n    file_path = os.path.join(directory_path, files[i])\n    dicom_data = pydicom.dcmread(file_path)\n    \n    #  Affichage de l'image DICOM sur la sous-trame correspondante\n    axes[i].imshow(dicom_data.pixel_array, cmap=plt.cm.bone)\n    axes[i].axis('off')\n\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-11-27T08:12:07.924132Z","iopub.execute_input":"2023-11-27T08:12:07.924986Z","iopub.status.idle":"2023-11-27T08:12:27.604253Z","shell.execute_reply.started":"2023-11-27T08:12:07.924942Z","shell.execute_reply":"2023-11-27T08:12:27.603155Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Spécification du chemin vers le répertoire contenant les fichiers DICOM\ndirectory_path = '/kaggle/input/rsna-breast-cancer-detection/train_images/10144'\n\n# Liste de tous les fichiers dans le répertoire\nfiles = os.listdir(directory_path)\n\n# Spécification du nombre d'images à afficher\nnum_images_to_display = len(files)\n\n# Création d'une sous-trame(subplot) pour chaque image\n# Création d'une figure avec une ligne et un nombre de sous-trames égal au nombre d'images à afficher\nfig, axes = plt.subplots(1, num_images_to_display, figsize=(15, 5))\n\n# Chargement et affichage du nombre spécifié d'images\nfor i in range(num_images_to_display):\n    file_path = os.path.join(directory_path, files[i])\n    dicom_data = pydicom.dcmread(file_path)\n    \n    # Affichage de l'image DICOM sur la sous-trame correspondante\n    axes[i].imshow(dicom_data.pixel_array, cmap=plt.cm.bone)\n    axes[i].axis('off')\n\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-11-27T08:12:27.605851Z","iopub.execute_input":"2023-11-27T08:12:27.606272Z","iopub.status.idle":"2023-11-27T08:12:34.816152Z","shell.execute_reply.started":"2023-11-27T08:12:27.606213Z","shell.execute_reply":"2023-11-27T08:12:34.815108Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install -q python-gdcm pylibjpeg","metadata":{"execution":{"iopub.status.busy":"2023-11-27T08:12:34.817633Z","iopub.execute_input":"2023-11-27T08:12:34.817979Z","iopub.status.idle":"2023-11-27T08:12:51.67287Z","shell.execute_reply.started":"2023-11-27T08:12:34.817948Z","shell.execute_reply":"2023-11-27T08:12:51.671345Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Spécification du chemin vers le répertoire contenant les fichiers DICOM\ndirectory_path = '/kaggle/input/rsna-breast-cancer-detection/train_images/10126'\n\n# Liste de tous les fichiers dans le répertoire\nfiles = os.listdir(directory_path)\n\n# Spécification du nombre d'images à afficher\nnum_images_to_display = len(files)\n\n# Création d'une sous-trame(subplot) pour chaque image\n# Création d'une figure avec une ligne et un nombre de sous-trames égal au nombre d'images à afficher\nfig, axes = plt.subplots(1, num_images_to_display, figsize=(15, 5))\n\n# Chargement et affichage du nombre spécifié d'images\nfor i in range(num_images_to_display):\n    file_path = os.path.join(directory_path, files[i])\n    dicom_data = pydicom.dcmread(file_path)\n    \n    # Affichage de l'image DICOM sur la sous-trame correspondante\n    axes[i].imshow(dicom_data.pixel_array, cmap=plt.cm.bone)\n    axes[i].axis('off')\n\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-12-01T12:18:19.584803Z","iopub.execute_input":"2023-12-01T12:18:19.58524Z","iopub.status.idle":"2023-12-01T12:18:36.757122Z","shell.execute_reply.started":"2023-12-01T12:18:19.585205Z","shell.execute_reply":"2023-12-01T12:18:36.756137Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"> **Le but, ensuite, est de prendre l'identifiant d'un patient, afficher le nombre d'images associées à ce patient, puis afficher ces images dans une figure avec des sous-trames.**","metadata":{}},{"cell_type":"code","source":"def rescale_img_to_hu(dicom_data):\n    # Récupérer les valeurs des pixels brutes\n    pixel_array = dicom_data.pixel_array\n    \n    # Convertir les valeurs des pixels en unités Hounsfield (HU)\n    intercept = dicom_data.RescaleIntercept\n    slope = dicom_data.RescaleSlope\n    hu_values = pixel_array * slope + intercept\n    \n    return hu_values","metadata":{"execution":{"iopub.status.busy":"2023-11-27T08:13:09.686682Z","iopub.execute_input":"2023-11-27T08:13:09.687541Z","iopub.status.idle":"2023-11-27T08:13:09.692373Z","shell.execute_reply.started":"2023-11-27T08:13:09.687507Z","shell.execute_reply":"2023-11-27T08:13:09.691404Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import glob as glob_module\nfrom pathlib import Path  # Importer la classe Path de pathlib\nimport os\nimport pydicom\nimport matplotlib.pyplot as plt\n\ndef show_images_for_patient(patient_id):\n    # Spécification du répertoire du patient\n    patient_dir = os.path.join('../input/rsna-breast-cancer-detection/train_images', str(patient_id))\n    num_images = len(glob_module.glob(f\"{patient_dir}/*\"))\n    print(f\"Nombre d'images pour le patient : {num_images}\")\n    \n    # Création d'une figure avec des sous-trames pour les images\n    fig, axs = plt.subplots(2, 2, figsize=(24, 15))\n    axs = axs.flatten()\n    \n    # Chargement et affichage des images\n    for i, img_path in enumerate(list(Path(patient_dir).iterdir())):\n        ds = pydicom.dcmread(img_path)\n        axs[i].imshow(rescale_img_to_hu(ds), cmap=\"bone\")\n\n# Appel de la fonction pour afficher les images du patient avec l'identifiant 10006\nshow_images_for_patient(10006)\n","metadata":{"execution":{"iopub.status.busy":"2023-11-27T08:13:09.693967Z","iopub.execute_input":"2023-11-27T08:13:09.694413Z","iopub.status.idle":"2023-11-27T08:13:33.035189Z","shell.execute_reply.started":"2023-11-27T08:13:09.694373Z","shell.execute_reply":"2023-11-27T08:13:33.033935Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample_sub = pd.read_csv('../input/rsna-breast-cancer-detection/sample_submission.csv')\nsample_sub","metadata":{"execution":{"iopub.status.busy":"2023-11-27T08:13:33.037301Z","iopub.execute_input":"2023-11-27T08:13:33.037737Z","iopub.status.idle":"2023-11-27T08:13:33.060492Z","shell.execute_reply.started":"2023-11-27T08:13:33.0377Z","shell.execute_reply":"2023-11-27T08:13:33.059314Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Afficher le nombre de patients\n!ls -l ../input/rsna-breast-cancer-detection/train_images | wc -l","metadata":{"execution":{"iopub.status.busy":"2023-11-27T08:13:33.062565Z","iopub.execute_input":"2023-11-27T08:13:33.063326Z","iopub.status.idle":"2023-11-27T08:13:36.496012Z","shell.execute_reply.started":"2023-11-27T08:13:33.063289Z","shell.execute_reply":"2023-11-27T08:13:36.494815Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"> **Filtrage des Données**","metadata":{}},{"cell_type":"code","source":"# Filtrer les lignes où la classe est égale à 1\npatients_malades = metadata[metadata['cancer'] == 1]\n\nif not patients_malades.empty:\n    print(\"Il y a des patients malades dans les données de la classe 1.\")\n    print(patients_malades)\nelse:\n    print(\"Aucun patient malade dans les données de la classe 1.\")","metadata":{"execution":{"iopub.status.busy":"2023-11-27T08:40:14.28514Z","iopub.execute_input":"2023-11-27T08:40:14.285571Z","iopub.status.idle":"2023-11-27T08:40:14.321362Z","shell.execute_reply.started":"2023-11-27T08:40:14.285535Z","shell.execute_reply":"2023-11-27T08:40:14.319736Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Filtrer les lignes où la classe est égale à 0\npatients_non_malades = metadata[metadata['cancer'] == 0]\n\nif not patients_non_malades.empty:\n    print(\"Il y a des patients non malades dans les données de la classe 0.\")\n    print(patients_non_malades)\nelse:\n    print(\"Aucun patient non malade dans les données de la classe 0.\")\n","metadata":{"execution":{"iopub.status.busy":"2023-11-27T08:40:17.755162Z","iopub.execute_input":"2023-11-27T08:40:17.755676Z","iopub.status.idle":"2023-11-27T08:40:17.788283Z","shell.execute_reply.started":"2023-11-27T08:40:17.755632Z","shell.execute_reply":"2023-11-27T08:40:17.786995Z"},"trusted":true},"execution_count":null,"outputs":[]}]}