es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cargar conjunto de datos de imágenes 3D

Estoy enfrentando algunos problemas para escribir la función getitem() en mi clase de conjunto de datos. Estoy trabajando en un conjunto de datos de resonancia magnética (3D). Cada archivo consta de 160 cortes en formato DICOM. He transformado los archivos DICOM en formato PNG.

La estructura de los archivos se ve así: “/content/drive/MyDrive/mris/9114036/11288003”

Dentro del último directorio se encuentran los 160 cortes en 2D. Las etiquetas están en un archivo .csv con dos columnas, una con la identificación (por ejemplo, 9114036 en la ruta anterior) y la otra con la calificación.

El código que intenté ejecutar fue:

class MyDataset(Dataset):

def __init__(self, csv_file, root_dir, transform = None):
    self.labels_df = pd.read_csv(csv_file, sep = ';')
    self.root_dir = root_dir
    self.transform = transform

def __len__(self):
    return len(self.labels_df)

def __getitem__(self, idx):
    if torch.is_tensor(idx):
        idx = idx.tolist()

    img_name = os.path.join(self.root_dir,str(self.labels_df.iloc[idx,0]))
    image = io.imread(img_name, plugin='matplotlib')
    grade = self.labels_df.iloc[idx, 1]
    sample = {'image': image, 'grade': grade}

    if self.transform:
        sample = self.transform(sample)

    return sample

El error que obtuve cuando intenté acceder a una muestra del conjunto de datos fue:

/usr/local/lib/python3.7/dist-packages/PIL/Image.py in open(fp, mode)
2841
2842 if filename: ->
2843 fp = builtins.open(filename, "rb")
2844 exclusive_fp = True
2845 IsADirectoryError: [Errno 21] Es un directorio: '/content/drive/MyDrive/mris/9114036'

lo cual parece lógico.

Intenté usar os.walk para acceder al directorio 11288003 donde se encuentran las imágenes, pero no funcionó. Lo más probable es que mi enfoque en general esté equivocado.

¿Alguien sabe cómo escribir una clase de conjunto de datos para la naturaleza 3D de mis datos? ¿Debería usar otra transformación para los archivos DICOM en primer lugar?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está en la forma en que estás accediendo al archivo de imagen dentro del directorio. Actualmente estás intentando abrir el directorio como una imagen, por eso estás obteniendo el error “IsADirectoryError: [Errno 21] Is a directory” porque los directorios no se pueden abrir como imágenes.

    Para acceder a los archivos PNG individuales dentro del directorio, puedes usar el módulo glob para crear una lista de todas las rutas de archivos PNG y luego abrir el archivo específico basado en la variable idx. Aquí tienes una versión actualizada de tu función __getitem__():

    def __getitem__(self, idx):
        if torch.is_tensor(idx):
            idx = idx.tolist()
    
        # Obtén la ruta del directorio y la etiqueta para la muestra actual
        dir_path = os.path.join(self.root_dir, str(self.labels_df.iloc[idx, 0]))
        label = self.labels_df.iloc[idx, 1]
    
        # Usando glob para obtener una lista de todos los archivos png en el directorio
        files = glob.iglob(os.path.join(dir_path, '*.png'))
    
        # Crea una lista de tensores de imagen 2D
        images = []
        for file in files:
            image = io.imread(file)
            images.append(image)
    
        # Apila la lista de tensores de imagen 2D para crear un tensor 3D
        image_tensor = torch.stack(images, dim=0)
    
        # Crea el diccionario de la muestra
        muestra = {'imagen': image_tensor, 'etiqueta': etiqueta}
    
        if self.transform:
            muestra = self.transform(muestra)
    
        return muestra
    

    Este código utiliza el módulo glob para obtener una lista de todos los archivos PNG en el directorio, y luego lee cada archivo utilizando la función io.imread(). La lista resultante de tensores de imagen 2D se apila a lo largo de la primera dimensión para crear un tensor 3D. Finalmente, se crea el diccionario de la muestra con el tensor de imagen 3D y la etiqueta.

    En cuanto a preprocesar tus archivos DICOM, es difícil decir sin más información sobre tu conjunto de datos y lo que deseas lograr. Sin embargo, vale la pena mencionar que los archivos DICOM a menudo contienen metadatos que pueden proporcionar información importante sobre la exploración, como el ID del paciente, la fecha de la exploración y el tipo de exploración, que pueden ser útiles para ciertos análisis.Si decides trabajar directamente con archivos DICOM, puedes considerar utilizar una biblioteca como pydicom para leer y preprocesar los archivos. Alternativamente, si conviertes tus archivos DICOM a PNG, puedes considerar aplicar pasos adicionales de preprocesamiento, como la normalización, recorte o cambio de tamaño de las imágenes a un tamaño consistente.

Comments are closed.